diff --git a/cucumber-report.html b/cucumber-report.html
new file mode 100644
index 0000000..f1e5130
--- /dev/null
+++ b/cucumber-report.html
@@ -0,0 +1,59 @@
+
+
+
+ Cucumber
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/cucumber-report.json b/cucumber-report.json
new file mode 100644
index 0000000..3a6ce13
--- /dev/null
+++ b/cucumber-report.json
@@ -0,0 +1,232 @@
+[
+ {
+ "description": " As a user,\n I want to upload photos from my device to create a post,\n so that I can share my memories",
+ "elements": [
+ {
+ "description": "",
+ "id": "upload-feature-workflow;complete-the-full-4-step-upload-wizard",
+ "keyword": "Scenario",
+ "line": 9,
+ "name": "Complete the full 4-step upload wizard",
+ "steps": [
+ {
+ "keyword": "Before",
+ "hidden": true,
+ "result": {
+ "status": "passed",
+ "duration": 465061791
+ }
+ },
+ {
+ "arguments": [],
+ "keyword": "Given ",
+ "line": 7,
+ "name": "that I am logged in as \"testexample@example.com",
+ "result": {
+ "status": "undefined",
+ "duration": 0
+ }
+ },
+ {
+ "arguments": [],
+ "keyword": "When ",
+ "line": 10,
+ "name": "I navigate to the upload page",
+ "match": {
+ "location": "file:/Users/kianbaghai/Desktop/memento/features/step_definitions/uploadPost.steps.js:29"
+ },
+ "result": {
+ "status": "skipped",
+ "duration": 0
+ }
+ },
+ {
+ "arguments": [],
+ "keyword": "And ",
+ "line": 11,
+ "name": "I upload an image file",
+ "match": {
+ "location": "file:/Users/kianbaghai/Desktop/memento/features/step_definitions/uploadPost.steps.js:34"
+ },
+ "result": {
+ "status": "skipped",
+ "duration": 0
+ }
+ },
+ {
+ "arguments": [],
+ "keyword": "And ",
+ "line": 12,
+ "name": "I wait for the upload preview to appear",
+ "match": {
+ "location": "file:/Users/kianbaghai/Desktop/memento/features/step_definitions/uploadPost.steps.js:40"
+ },
+ "result": {
+ "status": "skipped",
+ "duration": 0
+ }
+ },
+ {
+ "arguments": [],
+ "keyword": "And ",
+ "line": 13,
+ "name": "I click \"Next: Caption & Location\"",
+ "match": {
+ "location": "file:/Users/kianbaghai/Desktop/memento/features/step_definitions/uploadPost.steps.js:51"
+ },
+ "result": {
+ "status": "skipped",
+ "duration": 0
+ }
+ },
+ {
+ "arguments": [],
+ "keyword": "And ",
+ "line": 14,
+ "name": "I fill in the caption with \"Test post from Cucumber\"",
+ "match": {
+ "location": "file:/Users/kianbaghai/Desktop/memento/features/step_definitions/uploadPost.steps.js:56"
+ },
+ "result": {
+ "status": "skipped",
+ "duration": 0
+ }
+ },
+ {
+ "arguments": [],
+ "keyword": "And ",
+ "line": 15,
+ "name": "I fill in the location with \"San Francisco\"",
+ "match": {
+ "location": "file:/Users/kianbaghai/Desktop/memento/features/step_definitions/uploadPost.steps.js:60"
+ },
+ "result": {
+ "status": "skipped",
+ "duration": 0
+ }
+ },
+ {
+ "arguments": [],
+ "keyword": "And ",
+ "line": 16,
+ "name": "I select the first location suggestion",
+ "match": {
+ "location": "file:/Users/kianbaghai/Desktop/memento/features/step_definitions/uploadPost.steps.js:64"
+ },
+ "result": {
+ "status": "skipped",
+ "duration": 0
+ }
+ },
+ {
+ "arguments": [],
+ "keyword": "And ",
+ "line": 17,
+ "name": "I click \"Next: Categories\"",
+ "match": {
+ "location": "file:/Users/kianbaghai/Desktop/memento/features/step_definitions/uploadPost.steps.js:51"
+ },
+ "result": {
+ "status": "skipped",
+ "duration": 0
+ }
+ },
+ {
+ "arguments": [],
+ "keyword": "And ",
+ "line": 18,
+ "name": "I select the first category",
+ "match": {
+ "location": "file:/Users/kianbaghai/Desktop/memento/features/step_definitions/uploadPost.steps.js:70"
+ },
+ "result": {
+ "status": "skipped",
+ "duration": 0
+ }
+ },
+ {
+ "arguments": [],
+ "keyword": "And ",
+ "line": 19,
+ "name": "I click \"Review & Submit\"",
+ "match": {
+ "location": "file:/Users/kianbaghai/Desktop/memento/features/step_definitions/uploadPost.steps.js:51"
+ },
+ "result": {
+ "status": "skipped",
+ "duration": 0
+ }
+ },
+ {
+ "arguments": [],
+ "keyword": "And ",
+ "line": 20,
+ "name": "I scroll to the bottom of the page",
+ "match": {
+ "location": "file:/Users/kianbaghai/Desktop/memento/features/step_definitions/uploadPost.steps.js:78"
+ },
+ "result": {
+ "status": "skipped",
+ "duration": 0
+ }
+ },
+ {
+ "arguments": [],
+ "keyword": "And ",
+ "line": 21,
+ "name": "I click \"Create Post\"",
+ "match": {
+ "location": "file:/Users/kianbaghai/Desktop/memento/features/step_definitions/uploadPost.steps.js:51"
+ },
+ "result": {
+ "status": "skipped",
+ "duration": 0
+ }
+ },
+ {
+ "arguments": [],
+ "keyword": "Then ",
+ "line": 22,
+ "name": "I should be redirected to the feed page",
+ "match": {
+ "location": "file:/Users/kianbaghai/Desktop/memento/features/step_definitions/uploadPost.steps.js:84"
+ },
+ "result": {
+ "status": "skipped",
+ "duration": 0
+ }
+ },
+ {
+ "arguments": [],
+ "keyword": "And ",
+ "line": 23,
+ "name": "the post with caption \"Test post from Cucumber\" should be visible",
+ "match": {
+ "location": "file:/Users/kianbaghai/Desktop/memento/features/step_definitions/uploadPost.steps.js:89"
+ },
+ "result": {
+ "status": "skipped",
+ "duration": 0
+ }
+ },
+ {
+ "keyword": "After",
+ "hidden": true,
+ "result": {
+ "status": "passed",
+ "duration": 25473417
+ }
+ }
+ ],
+ "tags": [],
+ "type": "scenario"
+ }
+ ],
+ "id": "upload-feature-workflow",
+ "line": 1,
+ "keyword": "Feature",
+ "name": "Upload Feature Workflow",
+ "tags": [],
+ "uri": "features/uploadPost.feature"
+ }
+]
\ No newline at end of file
diff --git a/cucumber.js b/cucumber.js
new file mode 100644
index 0000000..d2e1c39
--- /dev/null
+++ b/cucumber.js
@@ -0,0 +1,7 @@
+module.exports = {
+ default: {
+ require: ["features/step_definitions/**/*.js"],
+ format: ["progress-bar", "html:cucumber-report.html"],
+ formatOptions: { snippetInterface: "async-await" },
+ },
+};
diff --git a/features/comment.feature b/features/comment.feature
new file mode 100644
index 0000000..ff85e8f
--- /dev/null
+++ b/features/comment.feature
@@ -0,0 +1,13 @@
+Feature: Commenting on a post
+ As a user,
+ I want to comment on a post on my feed,
+ so that I can have greater connection with the posts
+
+ Background:
+ Given I am logged in as "testexample@example.com"
+
+ Scenario: Comment on a post
+ When I navigate to the feed page
+ And I type in the "Add a comment..." Field
+ And I submit the comment
+ Then the comment should appear under the post
\ No newline at end of file
diff --git a/features/likePost.feature b/features/likePost.feature
new file mode 100644
index 0000000..4c8d480
--- /dev/null
+++ b/features/likePost.feature
@@ -0,0 +1,17 @@
+Feature: Liking a post
+ As a user,
+ I want to like and comment on a post on my feed,
+ so that I can have greater connection with the posts
+
+ Background:
+ Given I am logged in as "testexample@example.com"
+
+ Scenario: Like a post
+ When I navigate to the feed page
+ And I click the like button on the first post
+ Then the like button should now say "unlike"
+
+ Scenario: Unlike a post
+ When I navigate to the feed page
+ And I click the unlike button on the first post
+ Then the like button should now say "like"
\ No newline at end of file
diff --git a/features/step_definitions/commands.steps.js b/features/step_definitions/commands.steps.js
new file mode 100644
index 0000000..542c0cc
--- /dev/null
+++ b/features/step_definitions/commands.steps.js
@@ -0,0 +1,148 @@
+import { Given, When, Then, Before, After } from "@cucumber/cucumber";
+import { chromium } from "playwright";
+import path from "path";
+import { expect } from "@playwright/test";
+
+let browser;
+let page;
+
+Before(async function () {
+ browser = await chromium.launch();
+ page = await browser.newPage();
+});
+
+After(async function () {
+ await page.close();
+ await browser.close();
+});
+
+// Background step
+Given("I am logged in as {string}", async (email) => {
+ await page.goto("http://localhost:3000/login");
+ await page.fill('input[name="email"]', email);
+ await page.fill('input[name="password"]', "TestPassword123!");
+ await page.click('button[type="submit"]');
+ await page.waitForURL("http://localhost:3000/feed");
+});
+
+// Navigation
+When("I navigate to the upload page", async () => {
+ await page.goto("http://localhost:3000/upload");
+});
+
+// File upload
+When("I upload an image file", async () => {
+ const filePath = path.resolve("client/public/captionlocstep.png");
+ const fileInput = page.locator('input[type="file"]');
+ await fileInput.setInputFiles(filePath);
+});
+
+When("I wait for the upload preview to appear", async () => {
+ // Wait for the preview container to appear first
+ await page.waitForSelector('[class*="previewContainer"]', { timeout: 10000 });
+ // Then wait for the image to be visible
+ const previewImage = page.locator('img[alt="image-0"]');
+ await expect(previewImage).toBeVisible({ timeout: 15000 });
+});
+
+Then("the preview image should be visible", async () => {
+ const previewImage = page.locator('img[alt="image-0"]');
+ await expect(previewImage).toBeVisible();
+});
+
+// Navigation through steps
+When("I click {string}", async (buttonText) => {
+ await page.click(`button:has-text("${buttonText}")`);
+});
+
+// Form filling
+When("I fill in the caption with {string}", async (caption) => {
+ await page.getByPlaceholder("Caption (required)").fill(caption);
+});
+
+When("I fill in the location with {string}", async (location) => {
+ await page.getByPlaceholder("Location (required)").fill(location);
+});
+
+When("I select the first location suggestion", async () => {
+ const suggestion = page.locator('[class*="suggestionItem"]').first();
+ await expect(suggestion).toBeVisible({ timeout: 10000 });
+ await suggestion.click();
+});
+
+When("I select the first category", async () => {
+ const firstCategory = page.locator('input[type="checkbox"]').first();
+ if (await firstCategory.isVisible()) {
+ await firstCategory.check();
+ }
+});
+
+// Page actions
+When("I scroll to the bottom of the page", async () => {
+ await page.evaluate(() => window.scrollTo(0, document.body.scrollHeight));
+ await page.waitForTimeout(300);
+});
+
+// Assertions
+Then("I should be redirected to the feed page", async () => {
+ await page.waitForURL("http://localhost:3000/feed", { timeout: 5000 });
+ expect(page.url()).toBe("http://localhost:3000/feed");
+});
+
+Then("the post with caption {string} should be visible", async (caption) => {
+ const postCaption = page.locator(`text=${caption}`).first();
+ await postCaption.scrollIntoViewIfNeeded();
+ await expect(postCaption).toBeVisible({ timeout: 10000 });
+});
+
+// ===== LIKE POST STEPS =====
+
+// Navigation for feed
+When("I navigate to the feed page", async () => {
+ await page.goto("http://localhost:3000/feed");
+});
+
+// Like button steps
+When("I click the like button on the first post", async () => {
+ const likeButton = page.locator('button:has-text("Like")').first();
+ await likeButton.waitFor({ state: "visible", timeout: 5000 });
+ await likeButton.click();
+ // Wait for state change
+ await page.waitForTimeout(500);
+});
+
+When("I click the unlike button on the first post", async () => {
+ const unlikeButton = page.locator('button:has-text("Unlike")').first();
+ await unlikeButton.waitFor({ state: "visible", timeout: 5000 });
+ await unlikeButton.click();
+ // Wait for state change
+ await page.waitForTimeout(500);
+});
+
+Then("the like button should now say {string}", async (buttonText) => {
+ const button = page.locator(`button:has-text("${buttonText}")`).first();
+ await expect(button).toBeVisible({ timeout: 5000 });
+});
+
+// ===== COMMENT POST STEPS =====
+
+When("I type in the {string} Field", async (placeholder) => {
+ const commentInput = page
+ .locator(`input[placeholder="${placeholder}"]`)
+ .first();
+ await commentInput.scrollIntoViewIfNeeded();
+ await commentInput.waitFor({ state: "visible" });
+ const commentText = `Great post! ${Date.now()}`;
+ await commentInput.fill(commentText);
+});
+
+When("I submit the comment", async () => {
+ const postBtn = page.locator('button:has-text("Post")').first();
+ await postBtn.click();
+});
+
+Then("the comment should appear under the post", async () => {
+ await expect(page.locator("text=Great post!")).toBeVisible({
+ timeout: 10000,
+ });
+});
diff --git a/features/uploadPost.feature b/features/uploadPost.feature
new file mode 100644
index 0000000..3da9318
--- /dev/null
+++ b/features/uploadPost.feature
@@ -0,0 +1,23 @@
+Feature: Upload Feature Workflow
+ As a user,
+ I want to upload photos from my device to create a post,
+ so that I can share my memories
+
+ Background:
+ Given I am logged in as "testexample@example.com"
+
+ Scenario: Complete the full 4-step upload wizard
+ When I navigate to the upload page
+ And I upload an image file
+ And I wait for the upload preview to appear
+ And I click "Next: Caption & Location"
+ And I fill in the caption with "Test post from Cucumber"
+ And I fill in the location with "San Francisco"
+ And I select the first location suggestion
+ And I click "Next: Categories"
+ And I select the first category
+ And I click "Review & Submit"
+ And I scroll to the bottom of the page
+ And I click "Create Post"
+ Then I should be redirected to the feed page
+ And the post with caption "Test post from Cucumber" should be visible
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index ccc0205..48372d2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -13,11 +13,38 @@
"embla-carousel-react": "^8.6.0"
},
"devDependencies": {
+ "@cucumber/cucumber": "^12.3.0",
+ "@cucumber/pretty-formatter": "^2.4.1",
"@playwright/test": "^1.57.0",
"baseline-browser-mapping": "^2.8.32",
"concurrently": "^8.2.2"
}
},
+ "node_modules/@babel/code-frame": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
+ "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.27.1",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
+ "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/@babel/runtime": {
"version": "7.28.4",
"dev": true,
@@ -26,6 +53,367 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@colors/colors": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
+ "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": ">=0.1.90"
+ }
+ },
+ "node_modules/@cucumber/ci-environment": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/@cucumber/ci-environment/-/ci-environment-12.0.0.tgz",
+ "integrity": "sha512-SqCEnbCNl3zCXCFpqGUuoaSNhLC0jLw4tKeFcAxTw9MD/QRlJjeAC/fyvVLFuXuSq0OunJlFfxLu+Z3HE+oLPg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@cucumber/cucumber": {
+ "version": "12.3.0",
+ "resolved": "https://registry.npmjs.org/@cucumber/cucumber/-/cucumber-12.3.0.tgz",
+ "integrity": "sha512-36cIyplE1iDl12s4k6lBVpceua8tKLklFTf7CUITPrNHTLlQ/KBr7NYUUHviPzCbj2Ox3BPTZ6qkSLd6WMvVQg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@cucumber/ci-environment": "12.0.0",
+ "@cucumber/cucumber-expressions": "18.0.1",
+ "@cucumber/gherkin": "37.0.0",
+ "@cucumber/gherkin-streams": "6.0.0",
+ "@cucumber/gherkin-utils": "10.0.0",
+ "@cucumber/html-formatter": "22.2.0",
+ "@cucumber/junit-xml-formatter": "0.9.0",
+ "@cucumber/message-streams": "4.0.1",
+ "@cucumber/messages": "31.0.0",
+ "@cucumber/pretty-formatter": "1.0.1",
+ "@cucumber/tag-expressions": "8.1.0",
+ "assertion-error-formatter": "^3.0.0",
+ "capital-case": "^1.0.4",
+ "chalk": "^4.1.2",
+ "cli-table3": "0.6.5",
+ "commander": "^14.0.0",
+ "debug": "^4.3.4",
+ "error-stack-parser": "^2.1.4",
+ "figures": "^3.2.0",
+ "glob": "^13.0.0",
+ "has-ansi": "^4.0.1",
+ "indent-string": "^4.0.0",
+ "is-installed-globally": "^0.4.0",
+ "is-stream": "^2.0.0",
+ "knuth-shuffle-seeded": "^1.0.6",
+ "lodash.merge": "^4.6.2",
+ "lodash.mergewith": "^4.6.2",
+ "luxon": "3.7.2",
+ "mime": "^3.0.0",
+ "mkdirp": "^3.0.0",
+ "mz": "^2.7.0",
+ "progress": "^2.0.3",
+ "read-package-up": "^12.0.0",
+ "semver": "7.7.3",
+ "string-argv": "0.3.1",
+ "supports-color": "^8.1.1",
+ "type-fest": "^4.41.0",
+ "util-arity": "^1.1.0",
+ "yaml": "^2.2.2",
+ "yup": "1.7.1"
+ },
+ "bin": {
+ "cucumber-js": "bin/cucumber.js"
+ },
+ "engines": {
+ "node": "20 || 22 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/cucumber"
+ }
+ },
+ "node_modules/@cucumber/cucumber-expressions": {
+ "version": "18.0.1",
+ "resolved": "https://registry.npmjs.org/@cucumber/cucumber-expressions/-/cucumber-expressions-18.0.1.tgz",
+ "integrity": "sha512-NSid6bI+7UlgMywl5octojY5NXnxR9uq+JisjOrO52VbFsQM6gTWuQFE8syI10KnIBEdPzuEUSVEeZ0VFzRnZA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "regexp-match-indices": "1.0.2"
+ }
+ },
+ "node_modules/@cucumber/cucumber/node_modules/@cucumber/pretty-formatter": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@cucumber/pretty-formatter/-/pretty-formatter-1.0.1.tgz",
+ "integrity": "sha512-A1lU4VVP0aUWdOTmpdzvXOyEYuPtBDI0xYwYJnmoMDplzxMdhcHk86lyyvYDoMoPzzq6OkOE3isuosvUU4X7IQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^5.0.0",
+ "cli-table3": "^0.6.0",
+ "figures": "^3.2.0",
+ "ts-dedent": "^2.0.0"
+ },
+ "peerDependencies": {
+ "@cucumber/cucumber": ">=7.0.0",
+ "@cucumber/messages": "*"
+ }
+ },
+ "node_modules/@cucumber/cucumber/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@cucumber/cucumber/node_modules/commander": {
+ "version": "14.0.2",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.2.tgz",
+ "integrity": "sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@cucumber/cucumber/node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@cucumber/cucumber/node_modules/mime": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz",
+ "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/@cucumber/gherkin": {
+ "version": "37.0.0",
+ "resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-37.0.0.tgz",
+ "integrity": "sha512-vKJVJ6h4HCktG870wgYUUskNpFxbFI0WmAkVLPTz1LlLwJX7/KOBqFcr2/L3u0pPoHjbLRW+IpbiXLT2T13/wg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@cucumber/messages": ">=31.0.0 <32"
+ }
+ },
+ "node_modules/@cucumber/gherkin-streams": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/@cucumber/gherkin-streams/-/gherkin-streams-6.0.0.tgz",
+ "integrity": "sha512-HLSHMmdDH0vCr7vsVEURcDA4WwnRLdjkhqr6a4HQ3i4RFK1wiDGPjBGVdGJLyuXuRdJpJbFc6QxHvT8pU4t6jw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "commander": "14.0.0",
+ "source-map-support": "0.5.21"
+ },
+ "bin": {
+ "gherkin-javascript": "bin/gherkin"
+ },
+ "peerDependencies": {
+ "@cucumber/gherkin": ">=22.0.0",
+ "@cucumber/message-streams": ">=4.0.0",
+ "@cucumber/messages": ">=17.1.1"
+ }
+ },
+ "node_modules/@cucumber/gherkin-streams/node_modules/commander": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.0.tgz",
+ "integrity": "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@cucumber/gherkin-utils": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/@cucumber/gherkin-utils/-/gherkin-utils-10.0.0.tgz",
+ "integrity": "sha512-BcujlDT343GXXNrMPl3ws6Il3zs8dQw3Yp/d3HnOJF8i2snGGgiapoTbko7MdvAt7ivDL7SDo+e1d5Cnpl3llA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@cucumber/gherkin": "^34.0.0",
+ "@cucumber/messages": "^29.0.0",
+ "@teppeis/multimaps": "3.0.0",
+ "commander": "14.0.0",
+ "source-map-support": "^0.5.21"
+ },
+ "bin": {
+ "gherkin-utils": "bin/gherkin-utils"
+ }
+ },
+ "node_modules/@cucumber/gherkin-utils/node_modules/@cucumber/gherkin": {
+ "version": "34.0.0",
+ "resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-34.0.0.tgz",
+ "integrity": "sha512-659CCFsrsyvuBi/Eix1fnhSheMnojSfnBcqJ3IMPNawx7JlrNJDcXYSSdxcUw3n/nG05P+ptCjmiZY3i14p+tA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@cucumber/messages": ">=19.1.4 <29"
+ }
+ },
+ "node_modules/@cucumber/gherkin-utils/node_modules/@cucumber/gherkin/node_modules/@cucumber/messages": {
+ "version": "28.1.0",
+ "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-28.1.0.tgz",
+ "integrity": "sha512-2LzZtOwYKNlCuNf31ajkrekoy2M4z0Z1QGiPH40n4gf5t8VOUFb7m1ojtR4LmGvZxBGvJZP8voOmRqDWzBzYKA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/uuid": "10.0.0",
+ "class-transformer": "0.5.1",
+ "reflect-metadata": "0.2.2",
+ "uuid": "11.1.0"
+ }
+ },
+ "node_modules/@cucumber/gherkin-utils/node_modules/@cucumber/messages": {
+ "version": "29.0.1",
+ "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-29.0.1.tgz",
+ "integrity": "sha512-aAvIYfQD6/aBdF8KFQChC3CQ1Q+GX9orlR6GurGiX6oqaCnBkxA4WU3OQUVepDynEFrPayerqKRFcAMhdcXReQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "class-transformer": "0.5.1",
+ "reflect-metadata": "0.2.2"
+ }
+ },
+ "node_modules/@cucumber/gherkin-utils/node_modules/commander": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.0.tgz",
+ "integrity": "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@cucumber/html-formatter": {
+ "version": "22.2.0",
+ "resolved": "https://registry.npmjs.org/@cucumber/html-formatter/-/html-formatter-22.2.0.tgz",
+ "integrity": "sha512-fUNC/KngTIz+hAQ2Yr4XjdYq+MO60PwK9SidxBQ54jNI1Vw7erlgsPq0TOWneCIvdjU3qp+YDqYG1hw3zuUuDA==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@cucumber/messages": ">=18"
+ }
+ },
+ "node_modules/@cucumber/junit-xml-formatter": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/@cucumber/junit-xml-formatter/-/junit-xml-formatter-0.9.0.tgz",
+ "integrity": "sha512-WF+A7pBaXpKMD1i7K59Nk5519zj4extxY4+4nSgv5XLsGXHDf1gJnb84BkLUzevNtp2o2QzMG0vWLwSm8V5blw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@cucumber/query": "^14.0.1",
+ "@teppeis/multimaps": "^3.0.0",
+ "luxon": "^3.5.0",
+ "xmlbuilder": "^15.1.1"
+ },
+ "peerDependencies": {
+ "@cucumber/messages": "*"
+ }
+ },
+ "node_modules/@cucumber/message-streams": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@cucumber/message-streams/-/message-streams-4.0.1.tgz",
+ "integrity": "sha512-Kxap9uP5jD8tHUZVjTWgzxemi/0uOsbGjd4LBOSxcJoOCRbESFwemUzilJuzNTB8pcTQUh8D5oudUyxfkJOKmA==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@cucumber/messages": ">=17.1.1"
+ }
+ },
+ "node_modules/@cucumber/messages": {
+ "version": "31.0.0",
+ "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-31.0.0.tgz",
+ "integrity": "sha512-Dqhatp4AjMsH9SREfWz3Q8nlGuwJMTW7YAW5L3OzRId86ZUEu/a8vIL1RO2c0agQefuBS2SVH9fEZ66ovrMYRA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "class-transformer": "0.5.1",
+ "reflect-metadata": "0.2.2"
+ }
+ },
+ "node_modules/@cucumber/pretty-formatter": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@cucumber/pretty-formatter/-/pretty-formatter-2.4.1.tgz",
+ "integrity": "sha512-HomNZWTO7CqP44PNHOtguPqpHteIKzxyZNjFiuWKUXJ+DDTwLcdlBY2gIuP4BxEt9Q5AMu4ahde2Syo1elmTJQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@cucumber/query": "^14.0.0"
+ },
+ "peerDependencies": {
+ "@cucumber/messages": "*"
+ }
+ },
+ "node_modules/@cucumber/query": {
+ "version": "14.6.0",
+ "resolved": "https://registry.npmjs.org/@cucumber/query/-/query-14.6.0.tgz",
+ "integrity": "sha512-bPbfpkDsFCBn95erh3un76QViPqGAo3T7iYews0yA3/JRNoV009s7acxxY+f+OMABPFl0TJVIZlvqX+KayQ+Eg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@teppeis/multimaps": "3.0.0",
+ "lodash.sortby": "^4.7.0"
+ },
+ "peerDependencies": {
+ "@cucumber/messages": "*"
+ }
+ },
+ "node_modules/@cucumber/tag-expressions": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@cucumber/tag-expressions/-/tag-expressions-8.1.0.tgz",
+ "integrity": "sha512-UFeOVUyc711/E7VHjThxMwg3jbGod9TlbM1gxNixX/AGDKg82Eha4cE0tKki3GGUs7uB2NyI+hQAuhB8rL2h5A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@isaacs/balanced-match": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz",
+ "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/@isaacs/brace-expansion": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz",
+ "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@isaacs/balanced-match": "^4.0.1"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
"node_modules/@playwright/test": {
"version": "1.57.0",
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.57.0.tgz",
@@ -42,6 +430,30 @@
"node": ">=18"
}
},
+ "node_modules/@teppeis/multimaps": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@teppeis/multimaps/-/multimaps-3.0.0.tgz",
+ "integrity": "sha512-ID7fosbc50TbT0MK0EG12O+gAP3W3Aa/Pz4DaTtQtEvlc9Odaqi0de+xuZ7Li2GtK4HzEX7IuRWS/JmZLksR3Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/@types/normalize-package-data": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz",
+ "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/uuid": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz",
+ "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/after": {
"version": "0.8.1",
"resolved": "https://registry.npmjs.org/after/-/after-0.8.1.tgz",
@@ -69,11 +481,30 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
+ "node_modules/any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/arraybuffer.slice": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz",
"integrity": "sha512-6ZjfQaBSy6CuIH0+B0NrxMfDE5VIOCP/5gOqSpEIsaAZx9/giszzrXg6PZ7G51U/n88UmlAgYLNQ9wAnII7PJA=="
},
+ "node_modules/assertion-error-formatter": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/assertion-error-formatter/-/assertion-error-formatter-3.0.0.tgz",
+ "integrity": "sha512-6YyAVLrEze0kQ7CmJfUgrLHb+Y7XghmL2Ie7ijVa2Y9ynP3LV+VDiwFk62Dn0qtqbmY0BT0ss6p1xxpiF2PYbQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "diff": "^4.0.1",
+ "pad-right": "^0.2.2",
+ "repeat-string": "^1.6.1"
+ }
+ },
"node_modules/async": {
"version": "0.2.10",
"resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
@@ -154,6 +585,13 @@
"node": ">=0.8.0"
}
},
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/callsite": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
@@ -162,6 +600,18 @@
"node": "*"
}
},
+ "node_modules/capital-case": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz",
+ "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3",
+ "upper-case-first": "^2.0.2"
+ }
+ },
"node_modules/chalk": {
"version": "4.1.2",
"dev": true,
@@ -188,6 +638,29 @@
"node": ">=8"
}
},
+ "node_modules/class-transformer": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz",
+ "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cli-table3": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz",
+ "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "string-width": "^4.2.0"
+ },
+ "engines": {
+ "node": "10.* || >= 12.*"
+ },
+ "optionalDependencies": {
+ "@colors/colors": "1.5.0"
+ }
+ },
"node_modules/client": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/client/-/client-0.0.1.tgz",
@@ -372,6 +845,16 @@
"node": ">=0.4.0"
}
},
+ "node_modules/diff": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
+ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
"node_modules/embla-carousel": {
"version": "8.6.0",
"license": "MIT"
@@ -437,6 +920,16 @@
"utf8": "2.0.0"
}
},
+ "node_modules/error-stack-parser": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz",
+ "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "stackframe": "^1.3.4"
+ }
+ },
"node_modules/escalade": {
"version": "3.2.0",
"dev": true,
@@ -445,6 +938,16 @@
"node": ">=6"
}
},
+ "node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
"node_modules/eyes": {
"version": "0.1.8",
"resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
@@ -453,6 +956,35 @@
"node": "> 0.1.90"
}
},
+ "node_modules/figures": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+ "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "escape-string-regexp": "^1.0.5"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/find-up-simple": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz",
+ "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/forever-agent": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.2.0.tgz",
@@ -505,12 +1037,69 @@
"node": "*"
}
},
- "node_modules/global": {
+ "node_modules/glob": {
+ "version": "13.0.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.0.tgz",
+ "integrity": "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "minimatch": "^10.1.1",
+ "minipass": "^7.1.2",
+ "path-scurry": "^2.0.0"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/global": {
"version": "2.0.1",
"resolved": "https://github.com/component/global/archive/v2.0.1.tar.gz",
"integrity": "sha512-O91OcV/NbdmQJPHaRu2ekSP7bqFRLWgqSwaJvqHPZHUwmHBagQYTOra29+LnzzG3lZkXH1ANzHzfCxtAPM9HMA==",
"license": "MIT"
},
+ "node_modules/global-dirs": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz",
+ "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ini": "2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/has-ansi": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-4.0.1.tgz",
+ "integrity": "sha512-Qr4RtTm30xvEdqUXbSBVWDu+PrTokJOwe/FU+VdfJPk+MXAPoeOzKpRyrDTnZIJwAkQ4oBLTU53nu0HrkF/Z2A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-ansi/node_modules/ansi-regex": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
+ "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/has-binary-data": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/has-binary-data/-/has-binary-data-0.1.1.tgz",
@@ -561,11 +1150,57 @@
"node": "0.8.x"
}
},
+ "node_modules/hosted-git-info": {
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.2.tgz",
+ "integrity": "sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "lru-cache": "^11.1.0"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/index-to-position": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz",
+ "integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/indexof": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
"integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg=="
},
+ "node_modules/ini": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
+ "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/is-fullwidth-code-point": {
"version": "3.0.0",
"dev": true,
@@ -574,12 +1209,59 @@
"node": ">=8"
}
},
+ "node_modules/is-installed-globally": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
+ "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "global-dirs": "^3.0.0",
+ "is-path-inside": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/isarray": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
"integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
"license": "MIT"
},
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/json-stringify-safe": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-3.0.0.tgz",
@@ -592,22 +1274,155 @@
"integrity": "sha512-KA+GHhYTLTo7Ri4DyjwUgW8kn98AYtVZtBC94qL5yD0ZSYct8/eF8qBmTNyk+gPE578bKeIL4WBq+MUyd1I26g==",
"deprecated": "Please use the native JSON object instead of JSON 3"
},
+ "node_modules/knuth-shuffle-seeded": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/knuth-shuffle-seeded/-/knuth-shuffle-seeded-1.0.6.tgz",
+ "integrity": "sha512-9pFH0SplrfyKyojCLxZfMcvkhf5hH0d+UwR9nTVJ/DDQJGuzcXjTwB7TP7sDfehSudlGGaOLblmEWqv04ERVWg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "seed-random": "~2.2.0"
+ }
+ },
"node_modules/lodash": {
"version": "4.17.21",
"dev": true,
"license": "MIT"
},
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.mergewith": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz",
+ "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lower-case": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
+ "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "11.2.4",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.4.tgz",
+ "integrity": "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/luxon": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz",
+ "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/mime": {
"version": "1.2.11",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz",
"integrity": "sha512-Ysa2F/nqTNGHhhm9MV8ure4+Hc+Y8AWiqUdHxsO7xu8zc92ND9f3kpALHjaP026Ft17UfxrMt95c50PLUeynBw=="
},
+ "node_modules/minimatch": {
+ "version": "10.1.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.1.tgz",
+ "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/brace-expansion": "^5.0.0"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz",
+ "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "mkdirp": "dist/cjs/src/bin.js"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
"node_modules/nan": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/nan/-/nan-0.3.2.tgz",
"integrity": "sha512-V9/Pyy5Oelv6vVJP9X+dAzU3IO19j6YXrJnODHxP2h54hTvfFQGahdsQV6Ule/UukiEJk1SkQ/aUyWUm61RBQw==",
"license": "MIT"
},
+ "node_modules/no-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
+ "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "lower-case": "^2.0.2",
+ "tslib": "^2.0.3"
+ }
+ },
"node_modules/node-uuid": {
"version": "1.4.8",
"resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz",
@@ -617,6 +1432,21 @@
"uuid": "bin/uuid"
}
},
+ "node_modules/normalize-package-data": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-8.0.0.tgz",
+ "integrity": "sha512-RWk+PI433eESQ7ounYxIp67CYuVsS1uYSonX3kA6ps/3LWfjVQa/ptEg6Y3T6uAMq1mWpX9PQ+qx+QaHpsc7gQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "hosted-git-info": "^9.0.0",
+ "semver": "^7.3.5",
+ "validate-npm-package-license": "^3.0.4"
+ },
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
+ },
"node_modules/oauth-sign": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.2.0.tgz",
@@ -625,6 +1455,16 @@
"node": "*"
}
},
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/object-component": {
"version": "0.0.3",
"resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
@@ -638,6 +1478,37 @@
"node": ">=0.4.0"
}
},
+ "node_modules/pad-right": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/pad-right/-/pad-right-0.2.2.tgz",
+ "integrity": "sha512-4cy8M95ioIGolCoMmm2cMntGR1lPLEbOMzOKu8bzjuJP6JpzEMQcDHmh7hHLYGgob+nKe1YHFMaG4V59HQa89g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "repeat-string": "^1.5.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz",
+ "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.26.2",
+ "index-to-position": "^1.1.0",
+ "type-fest": "^4.39.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/parsejson": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.1.tgz",
@@ -665,6 +1536,30 @@
"better-assert": "~1.0.0"
}
},
+ "node_modules/path-scurry": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.1.tgz",
+ "integrity": "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^11.0.0",
+ "minipass": "^7.1.2"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/pkginfo": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz",
@@ -714,6 +1609,23 @@
"node": ">= 0.6"
}
},
+ "node_modules/progress": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/property-expr": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz",
+ "integrity": "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/q": {
"version": "0.9.7",
"resolved": "https://registry.npmjs.org/q/-/q-0.9.7.tgz",
@@ -741,6 +1653,113 @@
"node": ">=0.10.0"
}
},
+ "node_modules/read-package-up": {
+ "version": "12.0.0",
+ "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-12.0.0.tgz",
+ "integrity": "sha512-Q5hMVBYur/eQNWDdbF4/Wqqr9Bjvtrw2kjGxxBbKLbx8bVCL8gcArjTy8zDUuLGQicftpMuU0riQNcAsbtOVsw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "find-up-simple": "^1.0.1",
+ "read-pkg": "^10.0.0",
+ "type-fest": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/read-package-up/node_modules/type-fest": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.3.0.tgz",
+ "integrity": "sha512-d9CwU93nN0IA1QL+GSNDdwLAu1Ew5ZjTwupvedwg3WdfoH6pIDvYQ2hV0Uc2nKBLPq7NB5apCx57MLS5qlmO5g==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "dependencies": {
+ "tagged-tag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/read-pkg": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-10.0.0.tgz",
+ "integrity": "sha512-A70UlgfNdKI5NSvTTfHzLQj7NJRpJ4mT5tGafkllJ4wh71oYuGm/pzphHcmW4s35iox56KSK721AihodoXSc/A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/normalize-package-data": "^2.4.4",
+ "normalize-package-data": "^8.0.0",
+ "parse-json": "^8.3.0",
+ "type-fest": "^5.2.0",
+ "unicorn-magic": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/read-pkg/node_modules/type-fest": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.3.0.tgz",
+ "integrity": "sha512-d9CwU93nN0IA1QL+GSNDdwLAu1Ew5ZjTwupvedwg3WdfoH6pIDvYQ2hV0Uc2nKBLPq7NB5apCx57MLS5qlmO5g==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "dependencies": {
+ "tagged-tag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/reflect-metadata": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz",
+ "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/regexp-match-indices": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regexp-match-indices/-/regexp-match-indices-1.0.2.tgz",
+ "integrity": "sha512-DwZuAkt8NF5mKwGGER1EGh2PRqyvhRhhLviH+R8y8dIuaQROlUfXjt4s9ZTXstIsSkptf06BSvwcEmmfheJJWQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "regexp-tree": "^0.1.11"
+ }
+ },
+ "node_modules/regexp-tree": {
+ "version": "0.1.27",
+ "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz",
+ "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "regexp-tree": "bin/regexp-tree"
+ }
+ },
+ "node_modules/repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
"node_modules/request": {
"version": "2.16.6",
"resolved": "https://registry.npmjs.org/request/-/request-2.16.6.tgz",
@@ -787,6 +1806,26 @@
"tslib": "^2.1.0"
}
},
+ "node_modules/seed-random": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/seed-random/-/seed-random-2.2.0.tgz",
+ "integrity": "sha512-34EQV6AAHQGhoc0tn/96a9Fsi6v2xdqe/dMUwljGRaFOzR3EgRmECvD0O8vi8X+/uQ50LGHfkNu/Eue5TPKZkQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/semver": {
+ "version": "7.7.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+ "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/shell-quote": {
"version": "1.8.3",
"dev": true,
@@ -848,10 +1887,67 @@
"json3": "3.2.6"
}
},
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
"node_modules/spawn-command": {
"version": "0.0.2",
"dev": true
},
+ "node_modules/spdx-correct": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
+ "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-exceptions": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
+ "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==",
+ "dev": true,
+ "license": "CC-BY-3.0"
+ },
+ "node_modules/spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-license-ids": {
+ "version": "3.0.22",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.22.tgz",
+ "integrity": "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==",
+ "dev": true,
+ "license": "CC0-1.0"
+ },
"node_modules/stack-trace": {
"version": "0.0.10",
"resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
@@ -861,6 +1957,23 @@
"node": "*"
}
},
+ "node_modules/stackframe": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
+ "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/string-argv": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz",
+ "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6.19"
+ }
+ },
"node_modules/string-width": {
"version": "4.2.3",
"dev": true,
@@ -899,6 +2012,49 @@
"url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
+ "node_modules/tagged-tag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz",
+ "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "any-promise": "^1.0.0"
+ }
+ },
+ "node_modules/thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "thenify": ">= 3.1.0 < 4"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/tiny-case": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz",
+ "integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/tinycolor": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/tinycolor/-/tinycolor-0.0.1.tgz",
@@ -912,6 +2068,13 @@
"resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.3.tgz",
"integrity": "sha512-JQk/QMS4oHyU2VufVeyjN25dcnZnr1PV1pa1oKSj7l5tVO9WrU62og3fYzB3mrgJZZgBxdrrA/v6iZzMDuyFYw=="
},
+ "node_modules/toposort": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz",
+ "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/tree-kill": {
"version": "1.2.2",
"dev": true,
@@ -920,6 +2083,16 @@
"tree-kill": "cli.js"
}
},
+ "node_modules/ts-dedent": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz",
+ "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.10"
+ }
+ },
"node_modules/tslib": {
"version": "2.8.1",
"dev": true,
@@ -933,17 +2106,85 @@
"node": "*"
}
},
+ "node_modules/type-fest": {
+ "version": "4.41.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz",
+ "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/underscore": {
"version": "1.13.7",
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.7.tgz",
"integrity": "sha512-GMXzWtsc57XAtguZgaQViUOzs0KTkk8ojr3/xAxXLITqf/3EMwxC0inyETfDFjH/Krbhuep0HNbbjI9i/q3F3g==",
"license": "MIT"
},
+ "node_modules/unicorn-magic": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz",
+ "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/upper-case-first": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz",
+ "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.3"
+ }
+ },
"node_modules/utf8": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/utf8/-/utf8-2.0.0.tgz",
"integrity": "sha512-jWXHr+bQ8RsWazLzVY3V7XACPTbBHYSg/VoDVok+DBQk5ULm0AuBCNb9tGmjq2H+znnkBFwjhzzCbn9G3xlYcA=="
},
+ "node_modules/util-arity": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/util-arity/-/util-arity-1.1.0.tgz",
+ "integrity": "sha512-kkyIsXKwemfSy8ZEoaIz06ApApnWsk5hQO0vLjZS6UkBiGiW++Jsyb8vSBoc0WKlffGoGs5yYy/j5pp8zckrFA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/uuid": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz",
+ "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==",
+ "dev": true,
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/esm/bin/uuid"
+ }
+ },
+ "node_modules/validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
"node_modules/winston": {
"version": "0.7.3",
"resolved": "https://registry.npmjs.org/winston/-/winston-0.7.3.tgz",
@@ -995,6 +2236,16 @@
"node": ">=0.4.0"
}
},
+ "node_modules/xmlbuilder": {
+ "version": "15.1.1",
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz",
+ "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
"node_modules/xmlhttprequest": {
"version": "1.5.0",
"resolved": "https://github.com/LearnBoost/node-XMLHttpRequest/archive/0f36d0b5ebc03d85f860d42a64ae9791e1daa433.tar.gz",
@@ -1011,6 +2262,22 @@
"node": ">=10"
}
},
+ "node_modules/yaml": {
+ "version": "2.8.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz",
+ "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/eemeli"
+ }
+ },
"node_modules/yargs": {
"version": "17.7.2",
"dev": true,
@@ -1035,6 +2302,32 @@
"engines": {
"node": ">=12"
}
+ },
+ "node_modules/yup": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/yup/-/yup-1.7.1.tgz",
+ "integrity": "sha512-GKHFX2nXul2/4Dtfxhozv701jLQHdf6J34YDh2cEkpqoo8le5Mg6/LrdseVLrFarmFygZTlfIhHx/QKfb/QWXw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "property-expr": "^2.0.5",
+ "tiny-case": "^1.0.3",
+ "toposort": "^2.0.2",
+ "type-fest": "^2.19.0"
+ }
+ },
+ "node_modules/yup/node_modules/type-fest": {
+ "version": "2.19.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
+ "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
}
}
}
diff --git a/package.json b/package.json
index 7bc049a..f52bd69 100644
--- a/package.json
+++ b/package.json
@@ -10,14 +10,19 @@
"build": "cd client && npm run build",
"install-client": "cd client && npm install",
"install-server": "cd server && npm install",
- "install-all": "npm run install-client && npm run install-server"
+ "install-all": "npm run install-client && npm run install-server",
+ "test": "playwright test",
+ "test:cucumber": "cucumber-js",
+ "test:cucumber:ui": "cucumber-js --format html:cucumber-report.html"
},
"keywords": [],
"author": "",
"license": "MIT",
"devDependencies": {
- "baseline-browser-mapping": "^2.8.32",
+ "@cucumber/cucumber": "^12.3.0",
+ "@cucumber/pretty-formatter": "^2.4.1",
"@playwright/test": "^1.57.0",
+ "baseline-browser-mapping": "^2.8.32",
"concurrently": "^8.2.2"
},
"dependencies": {
diff --git a/playwright-report/data/5fbc3860a2e451333f768b5b68467688862ab41a.png b/playwright-report/data/5fbc3860a2e451333f768b5b68467688862ab41a.png
new file mode 100644
index 0000000..71d45d6
Binary files /dev/null and b/playwright-report/data/5fbc3860a2e451333f768b5b68467688862ab41a.png differ
diff --git a/playwright-report/data/760708c2a8f5d6f49409e13a436696e446fafd09.png b/playwright-report/data/760708c2a8f5d6f49409e13a436696e446fafd09.png
new file mode 100644
index 0000000..22dba14
Binary files /dev/null and b/playwright-report/data/760708c2a8f5d6f49409e13a436696e446fafd09.png differ
diff --git a/playwright-report/index.html b/playwright-report/index.html
index d4d8a04..e83c73e 100644
--- a/playwright-report/index.html
+++ b/playwright-report/index.html
@@ -82,4 +82,4 @@