diff --git a/.cypress-cucumber-preprocessorrc.json b/.cypress-cucumber-preprocessorrc.json new file mode 100644 index 00000000..7a577bd6 --- /dev/null +++ b/.cypress-cucumber-preprocessorrc.json @@ -0,0 +1,4 @@ +{ + "stepDefinitions": "e2e/**/*.spec.ts", + "filterSpecs": true +} diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml new file mode 100644 index 00000000..041160cc --- /dev/null +++ b/.github/workflows/playwright.yml @@ -0,0 +1,27 @@ +name: Playwright Tests +on: + push: + branches: [ main, master ] + pull_request: + branches: [ main, master ] +jobs: + test: + timeout-minutes: 60 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 16 + - name: Install dependencies + run: npm ci + - name: Install Playwright Browsers + run: npx playwright install --with-deps + - name: Run Playwright tests + run: npx playwright test + - uses: actions/upload-artifact@v3 + if: always() + with: + name: playwright-report + path: playwright-report/ + retention-days: 30 diff --git a/.gitignore b/.gitignore index 77908842..69f3da52 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,8 @@ # testing /coverage +/cypress/screenshots/ +/cypress/videos/ # next.js /.next/ @@ -40,3 +42,9 @@ src/generated/ /public/favicon.ico playwright-report/ .cache/ +/test-results/ +/playwright-report/ +/playwright/.cache/ +/test-results/ +/playwright-report/ +/playwright/.cache/ diff --git a/cucumber-messages.ndjson b/cucumber-messages.ndjson new file mode 100644 index 00000000..7de54efc --- /dev/null +++ b/cucumber-messages.ndjson @@ -0,0 +1,48 @@ +{"testRunStarted":{"timestamp":{"seconds":1677524506,"nanos":399000000}}} +{"source":{"data":"# language: nl\n## step \"0\"\nFunctionaliteit: Landingspagina\n\n@e2e\nScenario: Ik wil zien wat ik van de huwelijksplanner van Utrecht kan verwachten\nGegeven dat ik op de \"utrecht huwelijksplanner\" pagina ben\nDan zie ik de heading \"Regel je huwelijk of geregistreerd partnerschap\" \n En zie ik de heading \"Welke stappen kun je verwachten?\"\n En zie ik een lijst met verwachte stappen voor al de trouwopties\n En zie ik een \"Meer informatie\" infobox \n En zie ik een \"Start\" button die zich gedraagd als link\n\n@e2e\nScenario: Ik wil de huwelijksplanner kunnen starten\nGegeven dat ik op de \"utrecht huwelijksplanner\" pagina ben\nWanneer ik op de \"Start\" link klik\nDan word ik naar de \"/trouw-opties\" pagina gestuurd \n En ben ik op stap \"1\"\n\nScenario: Ik wil naar de homepagina van Utrecht kunnen gaan via het broodkruimel menu\nGegeven dat ik op de \"utrecht huwelijksplanner\" pagina ben\n En dat ik een broodkruimel menu zie\nWanneer ik op de \"Home\" link klik\nDan word ik naar de homepagina van de gemeente Utrecht gestuurd","uri":"features-cucumber/landing-pagina.feature","mediaType":"text/x.cucumber.gherkin+plain"}} +{"gherkinDocument":{"feature":{"tags":[],"location":{"line":3,"column":1},"language":"nl","keyword":"Functionaliteit","name":"Landingspagina","description":"","children":[{"scenario":{"id":"11e9d994-be3e-46d3-8f8b-0ab60860bf81","tags":[{"location":{"line":5,"column":1},"name":"@e2e","id":"6a5e8b27-3f06-4f01-affe-fed9391c699c"}],"location":{"line":6,"column":1},"keyword":"Scenario","name":"Ik wil zien wat ik van de huwelijksplanner van Utrecht kan verwachten","description":"","steps":[{"id":"80d30a2f-1ed2-4dd5-917e-749f9df5a33d","location":{"line":7,"column":1},"keyword":"Gegeven ","keywordType":"Context","text":"dat ik op de \"utrecht huwelijksplanner\" pagina ben"},{"id":"b8c0762d-24d1-4107-964e-53cbba4c1e36","location":{"line":8,"column":1},"keyword":"Dan ","keywordType":"Outcome","text":"zie ik de heading \"Regel je huwelijk of geregistreerd partnerschap\""},{"id":"5e2e0883-7776-464e-9fed-abecad787c06","location":{"line":9,"column":5},"keyword":"En ","keywordType":"Conjunction","text":"zie ik de heading \"Welke stappen kun je verwachten?\""},{"id":"1b0e7566-47ee-4551-bf96-0be4e8bbaa89","location":{"line":10,"column":5},"keyword":"En ","keywordType":"Conjunction","text":"zie ik een lijst met verwachte stappen voor al de trouwopties"},{"id":"579a1da7-cae9-434d-b964-d3bbb67faef2","location":{"line":11,"column":5},"keyword":"En ","keywordType":"Conjunction","text":"zie ik een \"Meer informatie\" infobox"},{"id":"7027c51a-28e0-4bd2-bd2a-e562543c3e7a","location":{"line":12,"column":5},"keyword":"En ","keywordType":"Conjunction","text":"zie ik een \"Start\" button die zich gedraagd als link"}],"examples":[]}},{"scenario":{"id":"4d3600d4-6949-4c06-ba95-d196222425fe","tags":[{"location":{"line":14,"column":1},"name":"@e2e","id":"c0bfd69a-eb62-47c9-9bd1-d09446340da1"}],"location":{"line":15,"column":1},"keyword":"Scenario","name":"Ik wil de huwelijksplanner kunnen starten","description":"","steps":[{"id":"e84612d7-9937-4bdb-beca-4c41eb322b87","location":{"line":16,"column":1},"keyword":"Gegeven ","keywordType":"Context","text":"dat ik op de \"utrecht huwelijksplanner\" pagina ben"},{"id":"57a33170-5a66-4f5b-9335-fa260336a6ea","location":{"line":17,"column":1},"keyword":"Wanneer ","keywordType":"Action","text":"ik op de \"Start\" link klik"},{"id":"40625f65-3ec9-40c3-af9f-8194a759a3c1","location":{"line":18,"column":1},"keyword":"Dan ","keywordType":"Outcome","text":"word ik naar de \"/trouw-opties\" pagina gestuurd"},{"id":"884b6db5-c2d3-4334-b9ba-2e6b37176b2b","location":{"line":19,"column":5},"keyword":"En ","keywordType":"Conjunction","text":"ben ik op stap \"1\""}],"examples":[]}},{"scenario":{"id":"2aa330f4-7dc8-4c12-bd99-935fa5aea7ae","tags":[],"location":{"line":21,"column":1},"keyword":"Scenario","name":"Ik wil naar de homepagina van Utrecht kunnen gaan via het broodkruimel menu","description":"","steps":[{"id":"ab966c99-20d8-4d11-9f2a-def7b2c67171","location":{"line":22,"column":1},"keyword":"Gegeven ","keywordType":"Context","text":"dat ik op de \"utrecht huwelijksplanner\" pagina ben"},{"id":"e2f649a2-2107-460d-a189-92348aea8d7a","location":{"line":23,"column":5},"keyword":"En ","keywordType":"Conjunction","text":"dat ik een broodkruimel menu zie"},{"id":"a1bb3cd5-c8c6-43f9-b404-3cf3e261e6d3","location":{"line":24,"column":1},"keyword":"Wanneer ","keywordType":"Action","text":"ik op de \"Home\" link klik"},{"id":"bfffee69-9c59-45f0-a89f-77cd5f56c52f","location":{"line":25,"column":1},"keyword":"Dan ","keywordType":"Outcome","text":"word ik naar de homepagina van de gemeente Utrecht gestuurd"}],"examples":[]}}]},"comments":[{"location":{"line":2,"column":1},"text":"## step \"0\""}],"uri":"features-cucumber/landing-pagina.feature"}} +{"pickle":{"id":"a4678684-a62b-4c7e-975c-ec234df40e68","uri":"features-cucumber/landing-pagina.feature","astNodeIds":["11e9d994-be3e-46d3-8f8b-0ab60860bf81"],"tags":[{"name":"@e2e","astNodeId":"6a5e8b27-3f06-4f01-affe-fed9391c699c"}],"name":"Ik wil zien wat ik van de huwelijksplanner van Utrecht kan verwachten","language":"nl","steps":[{"id":"cc3b5384-79ed-4c06-ab2d-d2481b14569d","text":"dat ik op de \"utrecht huwelijksplanner\" pagina ben","type":"Context","astNodeIds":["80d30a2f-1ed2-4dd5-917e-749f9df5a33d"]},{"id":"ad614330-7406-4235-b6fa-889d2009f22e","text":"zie ik de heading \"Regel je huwelijk of geregistreerd partnerschap\"","type":"Outcome","astNodeIds":["b8c0762d-24d1-4107-964e-53cbba4c1e36"]},{"id":"4eddd767-0c20-461e-bfe3-7d24cc5fc385","text":"zie ik de heading \"Welke stappen kun je verwachten?\"","type":"Outcome","astNodeIds":["5e2e0883-7776-464e-9fed-abecad787c06"]},{"id":"9b22f631-a51f-4bdc-9f36-03954edf276e","text":"zie ik een lijst met verwachte stappen voor al de trouwopties","type":"Outcome","astNodeIds":["1b0e7566-47ee-4551-bf96-0be4e8bbaa89"]},{"id":"718e662a-ba92-4514-bcd0-c5304789e21a","text":"zie ik een \"Meer informatie\" infobox","type":"Outcome","astNodeIds":["579a1da7-cae9-434d-b964-d3bbb67faef2"]},{"id":"4eaefc43-326c-4a56-83ee-75759e6c49d1","text":"zie ik een \"Start\" button die zich gedraagd als link","type":"Outcome","astNodeIds":["7027c51a-28e0-4bd2-bd2a-e562543c3e7a"]}]}} +{"pickle":{"id":"f8f5ef84-754a-4c1e-901d-6e9147a0e893","uri":"features-cucumber/landing-pagina.feature","astNodeIds":["4d3600d4-6949-4c06-ba95-d196222425fe"],"tags":[{"name":"@e2e","astNodeId":"c0bfd69a-eb62-47c9-9bd1-d09446340da1"}],"name":"Ik wil de huwelijksplanner kunnen starten","language":"nl","steps":[{"id":"8370125c-aeb7-4653-9e47-e27a339f8adf","text":"dat ik op de \"utrecht huwelijksplanner\" pagina ben","type":"Context","astNodeIds":["e84612d7-9937-4bdb-beca-4c41eb322b87"]},{"id":"1330574a-5d48-470e-a9a2-df456459f618","text":"ik op de \"Start\" link klik","type":"Action","astNodeIds":["57a33170-5a66-4f5b-9335-fa260336a6ea"]},{"id":"bb57abf2-bbaf-468f-8266-3e0e6fae7963","text":"word ik naar de \"/trouw-opties\" pagina gestuurd","type":"Outcome","astNodeIds":["40625f65-3ec9-40c3-af9f-8194a759a3c1"]},{"id":"590f2d3a-4e3b-401b-b509-79413654a3f5","text":"ben ik op stap \"1\"","type":"Outcome","astNodeIds":["884b6db5-c2d3-4334-b9ba-2e6b37176b2b"]}]}} +{"pickle":{"id":"cf62756d-9a3f-40d6-a82c-12462490027e","uri":"features-cucumber/landing-pagina.feature","astNodeIds":["2aa330f4-7dc8-4c12-bd99-935fa5aea7ae"],"tags":[],"name":"Ik wil naar de homepagina van Utrecht kunnen gaan via het broodkruimel menu","language":"nl","steps":[{"id":"762a85c1-7922-46c2-a760-8ceb26e2842f","text":"dat ik op de \"utrecht huwelijksplanner\" pagina ben","type":"Context","astNodeIds":["ab966c99-20d8-4d11-9f2a-def7b2c67171"]},{"id":"e2fa6dfc-c48b-47f8-8a4d-f11b21574967","text":"dat ik een broodkruimel menu zie","type":"Context","astNodeIds":["e2f649a2-2107-460d-a189-92348aea8d7a"]},{"id":"879dbae9-b96c-47fa-903b-12ae0befa767","text":"ik op de \"Home\" link klik","type":"Action","astNodeIds":["a1bb3cd5-c8c6-43f9-b404-3cf3e261e6d3"]},{"id":"6416a13a-2f88-4cda-9b7f-87f53ba59c45","text":"word ik naar de homepagina van de gemeente Utrecht gestuurd","type":"Outcome","astNodeIds":["bfffee69-9c59-45f0-a89f-77cd5f56c52f"]}]}} +{"stepDefinition":{"id":"df7bfa86-6a12-494a-b15a-85b9b123e478","pattern":{"source":"a step","type":"CUCUMBER_EXPRESSION"},"sourceReference":{"uri":"not available","location":{"line":0}}}} +{"stepDefinition":{"id":"58811953-d729-42ff-87f4-70b933a49c31","pattern":{"source":"a step","type":"CUCUMBER_EXPRESSION"},"sourceReference":{"uri":"not available","location":{"line":0}}}} +{"stepDefinition":{"id":"c2783b4b-a439-46cf-81e3-2ff46da35773","pattern":{"source":"a step","type":"CUCUMBER_EXPRESSION"},"sourceReference":{"uri":"not available","location":{"line":0}}}} +{"stepDefinition":{"id":"b66fdc27-a2db-46d0-a162-b43a7a77cb99","pattern":{"source":"a step","type":"CUCUMBER_EXPRESSION"},"sourceReference":{"uri":"not available","location":{"line":0}}}} +{"stepDefinition":{"id":"98b38db2-3058-4419-9585-5c556200fd7c","pattern":{"source":"a step","type":"CUCUMBER_EXPRESSION"},"sourceReference":{"uri":"not available","location":{"line":0}}}} +{"stepDefinition":{"id":"9dca4608-fd25-4bdd-ba80-5af493d6c5ca","pattern":{"source":"a step","type":"CUCUMBER_EXPRESSION"},"sourceReference":{"uri":"not available","location":{"line":0}}}} +{"testCase":{"id":"7849b5a8-569b-475e-bae3-cd33610e1233","pickleId":"a4678684-a62b-4c7e-975c-ec234df40e68","testSteps":[{"id":"cc3b5384-79ed-4c06-ab2d-d2481b14569d","pickleStepId":"cc3b5384-79ed-4c06-ab2d-d2481b14569d","stepDefinitionIds":["df7bfa86-6a12-494a-b15a-85b9b123e478"]},{"id":"ad614330-7406-4235-b6fa-889d2009f22e","pickleStepId":"ad614330-7406-4235-b6fa-889d2009f22e","stepDefinitionIds":["58811953-d729-42ff-87f4-70b933a49c31"]},{"id":"4eddd767-0c20-461e-bfe3-7d24cc5fc385","pickleStepId":"4eddd767-0c20-461e-bfe3-7d24cc5fc385","stepDefinitionIds":["c2783b4b-a439-46cf-81e3-2ff46da35773"]},{"id":"9b22f631-a51f-4bdc-9f36-03954edf276e","pickleStepId":"9b22f631-a51f-4bdc-9f36-03954edf276e","stepDefinitionIds":["b66fdc27-a2db-46d0-a162-b43a7a77cb99"]},{"id":"718e662a-ba92-4514-bcd0-c5304789e21a","pickleStepId":"718e662a-ba92-4514-bcd0-c5304789e21a","stepDefinitionIds":["98b38db2-3058-4419-9585-5c556200fd7c"]},{"id":"4eaefc43-326c-4a56-83ee-75759e6c49d1","pickleStepId":"4eaefc43-326c-4a56-83ee-75759e6c49d1","stepDefinitionIds":["9dca4608-fd25-4bdd-ba80-5af493d6c5ca"]}]}} +{"stepDefinition":{"id":"32edfec5-0d5f-4318-a6c6-068452bafc43","pattern":{"source":"a step","type":"CUCUMBER_EXPRESSION"},"sourceReference":{"uri":"not available","location":{"line":0}}}} +{"stepDefinition":{"id":"fb28e844-fb6a-4921-ba23-f7234d62ba71","pattern":{"source":"a step","type":"CUCUMBER_EXPRESSION"},"sourceReference":{"uri":"not available","location":{"line":0}}}} +{"stepDefinition":{"id":"5dfa088f-9029-4b83-accd-8fbd5a5b81c6","pattern":{"source":"a step","type":"CUCUMBER_EXPRESSION"},"sourceReference":{"uri":"not available","location":{"line":0}}}} +{"stepDefinition":{"id":"02b9d624-8883-4239-b10d-03dd571749a5","pattern":{"source":"a step","type":"CUCUMBER_EXPRESSION"},"sourceReference":{"uri":"not available","location":{"line":0}}}} +{"testCase":{"id":"50e25f8c-23cf-4f3f-ad61-aaf6b85d95eb","pickleId":"f8f5ef84-754a-4c1e-901d-6e9147a0e893","testSteps":[{"id":"8370125c-aeb7-4653-9e47-e27a339f8adf","pickleStepId":"8370125c-aeb7-4653-9e47-e27a339f8adf","stepDefinitionIds":["32edfec5-0d5f-4318-a6c6-068452bafc43"]},{"id":"1330574a-5d48-470e-a9a2-df456459f618","pickleStepId":"1330574a-5d48-470e-a9a2-df456459f618","stepDefinitionIds":["fb28e844-fb6a-4921-ba23-f7234d62ba71"]},{"id":"bb57abf2-bbaf-468f-8266-3e0e6fae7963","pickleStepId":"bb57abf2-bbaf-468f-8266-3e0e6fae7963","stepDefinitionIds":["5dfa088f-9029-4b83-accd-8fbd5a5b81c6"]},{"id":"590f2d3a-4e3b-401b-b509-79413654a3f5","pickleStepId":"590f2d3a-4e3b-401b-b509-79413654a3f5","stepDefinitionIds":["02b9d624-8883-4239-b10d-03dd571749a5"]}]}} +{"stepDefinition":{"id":"e63474df-aabb-41fb-9b68-a4566cae734f","pattern":{"source":"a step","type":"CUCUMBER_EXPRESSION"},"sourceReference":{"uri":"not available","location":{"line":0}}}} +{"stepDefinition":{"id":"510b4145-173c-4f5b-9947-9c5d0ed8d9fc","pattern":{"source":"a step","type":"CUCUMBER_EXPRESSION"},"sourceReference":{"uri":"not available","location":{"line":0}}}} +{"stepDefinition":{"id":"57fbea86-e642-4489-83a7-6f391a3e0173","pattern":{"source":"a step","type":"CUCUMBER_EXPRESSION"},"sourceReference":{"uri":"not available","location":{"line":0}}}} +{"stepDefinition":{"id":"b62d6ff7-02f3-43d1-bf44-6057235f3935","pattern":{"source":"a step","type":"CUCUMBER_EXPRESSION"},"sourceReference":{"uri":"not available","location":{"line":0}}}} +{"testCase":{"id":"db7639a1-f3c0-4033-acf4-258abd74d0a5","pickleId":"cf62756d-9a3f-40d6-a82c-12462490027e","testSteps":[{"id":"762a85c1-7922-46c2-a760-8ceb26e2842f","pickleStepId":"762a85c1-7922-46c2-a760-8ceb26e2842f","stepDefinitionIds":["e63474df-aabb-41fb-9b68-a4566cae734f"]},{"id":"e2fa6dfc-c48b-47f8-8a4d-f11b21574967","pickleStepId":"e2fa6dfc-c48b-47f8-8a4d-f11b21574967","stepDefinitionIds":["510b4145-173c-4f5b-9947-9c5d0ed8d9fc"]},{"id":"879dbae9-b96c-47fa-903b-12ae0befa767","pickleStepId":"879dbae9-b96c-47fa-903b-12ae0befa767","stepDefinitionIds":["57fbea86-e642-4489-83a7-6f391a3e0173"]},{"id":"6416a13a-2f88-4cda-9b7f-87f53ba59c45","pickleStepId":"6416a13a-2f88-4cda-9b7f-87f53ba59c45","stepDefinitionIds":["b62d6ff7-02f3-43d1-bf44-6057235f3935"]}]}} +{"testCaseStarted":{"id":"2e20ef29-e88e-43c9-afbe-f06a5c8c3bd0","testCaseId":"7849b5a8-569b-475e-bae3-cd33610e1233","attempt":0,"timestamp":{"seconds":1677524507,"nanos":412000000}}} +{"testStepStarted":{"testStepId":"cc3b5384-79ed-4c06-ab2d-d2481b14569d","testCaseStartedId":"2e20ef29-e88e-43c9-afbe-f06a5c8c3bd0","timestamp":{"seconds":1677524507,"nanos":418000000}}} +{"testStepFinished":{"testStepId":"cc3b5384-79ed-4c06-ab2d-d2481b14569d","testCaseStartedId":"2e20ef29-e88e-43c9-afbe-f06a5c8c3bd0","testStepResult":{"status":"PASSED","duration":{"seconds":0,"nanos":167000000}},"timestamp":{"seconds":1677524507,"nanos":585000000}}} +{"testStepStarted":{"testStepId":"ad614330-7406-4235-b6fa-889d2009f22e","testCaseStartedId":"2e20ef29-e88e-43c9-afbe-f06a5c8c3bd0","timestamp":{"seconds":1677524507,"nanos":585000000}}} +{"testStepFinished":{"testStepId":"ad614330-7406-4235-b6fa-889d2009f22e","testCaseStartedId":"2e20ef29-e88e-43c9-afbe-f06a5c8c3bd0","testStepResult":{"status":"PASSED","duration":{"seconds":0,"nanos":18000000}},"timestamp":{"seconds":1677524507,"nanos":603000000}}} +{"testStepStarted":{"testStepId":"4eddd767-0c20-461e-bfe3-7d24cc5fc385","testCaseStartedId":"2e20ef29-e88e-43c9-afbe-f06a5c8c3bd0","timestamp":{"seconds":1677524507,"nanos":603000000}}} +{"testStepFinished":{"testStepId":"4eddd767-0c20-461e-bfe3-7d24cc5fc385","testCaseStartedId":"2e20ef29-e88e-43c9-afbe-f06a5c8c3bd0","testStepResult":{"status":"PASSED","duration":{"seconds":0,"nanos":11000000}},"timestamp":{"seconds":1677524507,"nanos":614000000}}} +{"testStepStarted":{"testStepId":"9b22f631-a51f-4bdc-9f36-03954edf276e","testCaseStartedId":"2e20ef29-e88e-43c9-afbe-f06a5c8c3bd0","timestamp":{"seconds":1677524507,"nanos":614000000}}} +{"testStepFinished":{"testStepId":"9b22f631-a51f-4bdc-9f36-03954edf276e","testCaseStartedId":"2e20ef29-e88e-43c9-afbe-f06a5c8c3bd0","testStepResult":{"status":"PASSED","duration":{"seconds":0,"nanos":10000000}},"timestamp":{"seconds":1677524507,"nanos":624000000}}} +{"testStepStarted":{"testStepId":"718e662a-ba92-4514-bcd0-c5304789e21a","testCaseStartedId":"2e20ef29-e88e-43c9-afbe-f06a5c8c3bd0","timestamp":{"seconds":1677524507,"nanos":624000000}}} +{"testStepFinished":{"testStepId":"718e662a-ba92-4514-bcd0-c5304789e21a","testCaseStartedId":"2e20ef29-e88e-43c9-afbe-f06a5c8c3bd0","testStepResult":{"status":"PASSED","duration":{"seconds":0,"nanos":14000000}},"timestamp":{"seconds":1677524507,"nanos":638000000}}} +{"testStepStarted":{"testStepId":"4eaefc43-326c-4a56-83ee-75759e6c49d1","testCaseStartedId":"2e20ef29-e88e-43c9-afbe-f06a5c8c3bd0","timestamp":{"seconds":1677524507,"nanos":638000000}}} +{"testStepFinished":{"testStepId":"4eaefc43-326c-4a56-83ee-75759e6c49d1","testCaseStartedId":"2e20ef29-e88e-43c9-afbe-f06a5c8c3bd0","testStepResult":{"status":"PASSED","duration":{"seconds":0,"nanos":9000000}},"timestamp":{"seconds":1677524507,"nanos":647000000}}} +{"testCaseFinished":{"testCaseStartedId":"2e20ef29-e88e-43c9-afbe-f06a5c8c3bd0","timestamp":{"seconds":1677524507,"nanos":648000000},"willBeRetried":false}} +{"testCaseStarted":{"id":"f96bb423-a149-42a0-b016-5f1534d7e81b","testCaseId":"50e25f8c-23cf-4f3f-ad61-aaf6b85d95eb","attempt":0,"timestamp":{"seconds":1677524507,"nanos":670000000}}} +{"testStepStarted":{"testStepId":"8370125c-aeb7-4653-9e47-e27a339f8adf","testCaseStartedId":"f96bb423-a149-42a0-b016-5f1534d7e81b","timestamp":{"seconds":1677524507,"nanos":676000000}}} +{"testStepFinished":{"testStepId":"8370125c-aeb7-4653-9e47-e27a339f8adf","testCaseStartedId":"f96bb423-a149-42a0-b016-5f1534d7e81b","testStepResult":{"status":"PASSED","duration":{"seconds":0,"nanos":61000000}},"timestamp":{"seconds":1677524507,"nanos":737000000}}} +{"testStepStarted":{"testStepId":"1330574a-5d48-470e-a9a2-df456459f618","testCaseStartedId":"f96bb423-a149-42a0-b016-5f1534d7e81b","timestamp":{"seconds":1677524507,"nanos":738000000}}} +{"testStepFinished":{"testStepId":"1330574a-5d48-470e-a9a2-df456459f618","testCaseStartedId":"f96bb423-a149-42a0-b016-5f1534d7e81b","testStepResult":{"status":"PASSED","duration":{"seconds":0,"nanos":111000000}},"timestamp":{"seconds":1677524507,"nanos":849000000}}} +{"testStepStarted":{"testStepId":"bb57abf2-bbaf-468f-8266-3e0e6fae7963","testCaseStartedId":"f96bb423-a149-42a0-b016-5f1534d7e81b","timestamp":{"seconds":1677524507,"nanos":849000000}}} +{"testStepFinished":{"testStepId":"bb57abf2-bbaf-468f-8266-3e0e6fae7963","testCaseStartedId":"f96bb423-a149-42a0-b016-5f1534d7e81b","testStepResult":{"status":"PASSED","duration":{"seconds":0,"nanos":5000000}},"timestamp":{"seconds":1677524507,"nanos":854000000}}} +{"testStepStarted":{"testStepId":"590f2d3a-4e3b-401b-b509-79413654a3f5","testCaseStartedId":"f96bb423-a149-42a0-b016-5f1534d7e81b","timestamp":{"seconds":1677524507,"nanos":854000000}}} +{"testStepFinished":{"testStepId":"590f2d3a-4e3b-401b-b509-79413654a3f5","testCaseStartedId":"f96bb423-a149-42a0-b016-5f1534d7e81b","testStepResult":{"status":"PASSED","duration":{"seconds":0,"nanos":4000000}},"timestamp":{"seconds":1677524507,"nanos":858000000}}} +{"testCaseFinished":{"testCaseStartedId":"f96bb423-a149-42a0-b016-5f1534d7e81b","timestamp":{"seconds":1677524507,"nanos":859000000},"willBeRetried":false}} +{"testRunFinished":{"timestamp":{"seconds":1677524509,"nanos":305000000}}} diff --git a/cucumber-report.json b/cucumber-report.json new file mode 100644 index 00000000..e69de29b diff --git a/cypress.config.ts b/cypress.config.ts new file mode 100644 index 00000000..28900c6c --- /dev/null +++ b/cypress.config.ts @@ -0,0 +1,28 @@ +import { defineConfig } from 'cypress'; +import createBundler from '@bahmutov/cypress-esbuild-preprocessor'; +import { addCucumberPreprocessorPlugin } from '@badeball/cypress-cucumber-preprocessor'; +import createEsbuildPlugin from '@badeball/cypress-cucumber-preprocessor/esbuild'; + +export default defineConfig({ + e2e: { + baseUrl: 'http://localhost:3000', + //baseUrl: 'https://utrecht-huwelijksplanner.frameless.io/', + specPattern: 'features-cucumber/**/*.feature', + async setupNodeEvents( + on: Cypress.PluginEvents, + config: Cypress.PluginConfigOptions, + ): Promise { + // This is required for the preprocessor to be able to generate JSON reports after each run, and more, + await addCucumberPreprocessorPlugin(on, config); + on( + 'file:preprocessor', + createBundler({ + plugins: [createEsbuildPlugin(config)], + }), + ); + + // Make sure to return the config object as it might have been modified by the plugin. + return config; + }, + }, +}); diff --git a/cypress/fixtures/example.json b/cypress/fixtures/example.json new file mode 100644 index 00000000..02e42543 --- /dev/null +++ b/cypress/fixtures/example.json @@ -0,0 +1,5 @@ +{ + "name": "Using fixtures to represent data", + "email": "hello@cypress.io", + "body": "Fixtures are a great way to mock data for responses to routes" +} diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts new file mode 100644 index 00000000..b1694903 --- /dev/null +++ b/cypress/support/commands.ts @@ -0,0 +1,39 @@ +import '@testing-library/cypress/add-commands'; + +/// +// *********************************************** +// This example commands.ts shows you how to +// create various custom commands and overwrite +// existing commands. +// +// For more comprehensive examples of custom +// commands please read more here: +// https://on.cypress.io/custom-commands +// *********************************************** +// +// +// -- This is a parent command -- +// Cypress.Commands.add('login', (email, password) => { ... }) +// +// +// -- This is a child command -- +// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) +// +// +// -- This is a dual command -- +// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) +// +// +// -- This will overwrite an existing command -- +// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) +// +// declare global { +// namespace Cypress { +// interface Chainable { +// login(email: string, password: string): Chainable +// drag(subject: string, options?: Partial): Chainable +// dismiss(subject: string, options?: Partial): Chainable +// visit(originalFn: CommandOriginalFn, url: string, options: Partial): Chainable +// } +// } +// } diff --git a/cypress/support/e2e.ts b/cypress/support/e2e.ts new file mode 100644 index 00000000..f80f74f8 --- /dev/null +++ b/cypress/support/e2e.ts @@ -0,0 +1,20 @@ +// *********************************************************** +// This example support/e2e.ts is processed and +// loaded automatically before your test files. +// +// This is a great place to put global configuration and +// behavior that modifies Cypress. +// +// You can change the location of this file or turn off +// automatically serving support files with the +// 'supportFile' configuration option. +// +// You can read more here: +// https://on.cypress.io/configuration +// *********************************************************** + +// Import commands.js using ES2015 syntax: +import './commands' + +// Alternatively you can use CommonJS syntax: +// require('./commands') \ No newline at end of file diff --git a/e2e/common-given.spec.ts b/e2e/common-given.spec.ts new file mode 100644 index 00000000..d00b9768 --- /dev/null +++ b/e2e/common-given.spec.ts @@ -0,0 +1,97 @@ +import { Given as Gegeven } from '@badeball/cypress-cucumber-preprocessor'; + +Gegeven('dat ik op de {string} pagina ben', (path: string) => { + if (path === 'utrecht huwelijksplanner') { + cy.visit('/'); + } else { + cy.visit(path); + } +}); + +//this was giving an error +Gegeven('ik zie de heading {string}', (headingtitle: string) => { + cy.findByRole('heading', { name: headingtitle }).should('be.visible'); + //cy.findByRole('heading', { name: text }).as('heading').should('be.visible'); + //expect(cy.findByRole('heading', { name: headingtitle })).to.be.visible(); +}); + +// this was giving an error +Gegeven('ik ben op stap {string}', (stepNumber: string) => { + //cy.findByRole('paragraph', { name: /Stap 1 van [0-9]/i }).should('be.visible'); + //expect(cy.findByText(/Stap [0-9] van [0-9]/i)).to.be.visible(); + //expect(cy.findByText(new RegExp(`Stap ${step} van [0-9]`, 'i'))).to.be.visible(); + cy.findByText(new RegExp(`Stap ${stepNumber} van [0-9]+`, 'i')).should('be.visible'); +}); +//Playwright equivalent +//const step1 = await page.getByRole('paragraph', { name: /Stap 1 van [0-9]/i }); +//expect(step1).toBeDefined(); + +//!!!Empty tests written just so Cypress doesn't complain +Gegeven('ik heb de {string} geselecteerd', (datum: string) => { + cy.log('TODO: FIXME: wachten op een datumprikker'); + cy.log(datum); + //cy.pause(); + //datum prikker selecteren input type date + //waarde invullen 14/04/2021 +}); + +// Gegeven('ik heb een beschikbare tijdslot geselecteerd', () => { +// if (cy.get('[type="radio"]').first().check()) { +// return true; +// } +// cy.should('be.true'); +// // radio value true? should be visible?? +// // return 'pending'; +// // cy.pause(); +// }); + +Gegeven( + 'ik heb een beschikbare {string} geselecteerd voor een {string} huwelijk', + (tijd: string, typeHuwelijk: string) => { + cy.log(tijd); + cy.log(typeHuwelijk); + + if (typeHuwelijk === 'Eenvoudig') { + // look for an element with the text + // 'Flits/balie-huwelijk — Stadskantoor', save it as @pimplemees + cy.findByText('Flits/balie-huwelijk — Stadskantoor').as('pimplemees'); + + // get the @pimplemees element + // find it's siblings (two divs containing 2 children each: an input and a label) + // then look inside those siblings for a label with the "tijd". + cy.get('@pimplemees') + .siblings() + .children() + .contains(tijd) // finds a label with 'tijd' (12:00 - 12:15) + .as('timeSlot'); + + // then click that label to check the checkbox + cy.get('@timeSlot').click(); + } else if (typeHuwelijk === 'Uitgebreid') { + cy.findByText('Flits/balie-huwelijk — Stadskantoor').as('uitgebreid'); + cy.get('@uitgebreid') + .siblings() + .children() + .contains(tijd) // finds a label with 'tijd' (12:00 - 12:15) + .as('timeSlot'); + cy.get('@timeSlot').click(); + } + }, +); + +Gegeven('ik kan een {string} button zien', (text: string) => { + cy.findByRole('button', { name: text }).should('be.visible'); +}); + +Gegeven('er is een {string} datum prikker op de pagina', (datumType: string) => { + cy.log('TODO: FIXME: wachten op een datumprikker'); + cy.log(datumType); + // cy.findByLabelText(datumType).as('datePicker').should('be.visible'); + // cy.get('@datePicker').should(`have.attr`, `type`, `date`); +}); + +Gegeven('ik kan de beschikbare trouwdata zien', () => { + cy.log('TODO: FIXME: wachten op een datumprikker'); + // return 'pending'; + // cy.pause(); +}); diff --git a/e2e/common-then.spec.ts b/e2e/common-then.spec.ts new file mode 100644 index 00000000..b0541ce6 --- /dev/null +++ b/e2e/common-then.spec.ts @@ -0,0 +1,124 @@ +import { Then as Dan } from '@badeball/cypress-cucumber-preprocessor'; + +Dan('zie ik de heading {string}', (text: string) => { + cy.findByRole('heading', { name: text }).as('heading').should('be.visible'); + //expect(cy.findByRole('heading', { name: headingtitle })).to.be.visible(); +}); + +Dan('ben ik op stap {string}', (stepNumber: string) => { + //cy.findByText(/Stap [0-9] van [0-9]/i).should('include.text', `Stap ${stepNumber}`); + cy.findByText(new RegExp(`Stap ${stepNumber} van [0-9]+`, 'i')).should('be.visible'); +}); + +Dan('zie ik een {string} button', (text: string) => { + cy.findByRole('button', { name: text }).should('have.class', 'utrecht-button'); +}); + +Dan('word ik naar de {string} pagina gestuurd', (path: string) => { + // console.log(cy.location('pathname')); + // console.log(path); + // cy.url().should('include', path); + + if (path === 'trouw-opties/huwelijk') { + throw new Error( + 'TODO: FIXME: De bug zorgt dat we niet kan werken https://github.com/frameless/utrecht-huwelijksplanner/issues/147', + ); + } else { + cy.log(path); + cy.location('pathname').should('include', path); + } + //expect(cy.url()).to.include(path); +}); + +Dan('is er een {string} datum prikker op de pagina', (datumType: string) => { + cy.findByLabelText(datumType).as('datePicker').should('be.visible'); + // cy.get('@datePicker').its('type').should('equal', 'date'); + + cy.get('@datePicker').should(`have.attr`, `type`, `date`); + + // cy.get('@datePicker').invoke('attr', 'type').should('equal', 'date'); +}); + +Dan('kan ik de beschikbare trouwdatums zien', () => { + cy.log('TODO: FIXME: wachten op een datumprikker'); +}); + +Dan('zie ik tijdslot checkbox opties voor trouwen op de geselecteerde dag', () => { + cy.get('time').should('be.visible'); + // cy.get('[data-test-id="test-example"]').should('have.length', 6) <- for reference +}); + +// Dan('de tijdslot checkbox wordt geselecteerd', () => { +// if (cy.get('[type="radio"]').first().check()) { +// return true; +// cy.get('@datePicker').should(`have.attr`, `type`, `date`); +// } +// cy.should('be.true'); +// // radio value true? should be visible?? +// // return 'pending'; +// // cy.pause(); +//REPLACEMENT SEE BELOW +// }); + +Dan('de tijdslot checkbox wordt geselecteerd', () => { + cy.get('[type="radio"]').first().as('first-radio-button'); + + cy.get('@first-radio-button').should('be.checked'); +}); + +Dan( + 'zie ik het correcte {string} huwelijk met de vroeger geselecteerde {string} en {string} combinatie', + (typeHuwelijk: string, datum: string, tijd: string) => { + cy.log(datum, tijd, typeHuwelijk); + + cy.get('.utrecht-spotlight-section').should('contain', typeHuwelijk); + + // .should('contain', typeHuwelijk); + + // datum is written like yyyy-mm-dd, but we want to look for + // day month year + // cy.get('.utrecht-spotlight-section > :nth-child(2)').contains(datum); + + // cy.get('[datetime]').contains(datum); + // + + // get an element that has a datetime attribute + // and then check it has a datetime attribute + // with the value '2021-04-14' + // cy.get('[datetime]').should(`have.attr`, `datetime`, datum); + + // get an element with a datetime attribute with CSS attribute selectors + // whose value starts with '2021-04-14' + //cy.get(`[datetime^=${datum}]`).should('be.visible'); + + cy.get('.utrecht-spotlight-section time').should('have.attr', 'datetime').and('contain', datum); + + // cy.get('.utrecht-spotlight-section').should('contain', '10:00 - 10:10'); + cy.get('.utrecht-spotlight-section').should('contain', tijd); + //'Locatie Stadskantoor - Eenvoudig huwelijkwoensdag 14 april 2021, 10:00 - 10:10Kosten: € 168,00'; + }, +); + +// +// Extra tests voor commented Scenarios +Dan('zie ik een {string} infobox', (heading: string) => { + cy.findByRole('heading', { name: heading }) + .parent() + .should('match', 'aside') + .and('have.class', 'utrecht-spotlight-section') + .and('have.class', 'utrecht-spotlight-section--info'); +}); + +Dan('zie ik een {string} button die zich gedraagd als link', (text: string) => { + cy.findByRole('link', { name: text }) + .should('have.class', 'utrecht-button-link') + .and('have.class', 'utrecht-button-link--primary-action'); +}); + +Dan('kan ik geen datum selecteren', () => { + cy.log('TODO: FIXME: wachten op een datumprikker'); +}); + +Dan('ik krijg een melding om een datum tussen een jaar te selecteren', () => { + cy.log('TODO: FIXME: wachten op een datumprikker'); +}); diff --git a/e2e/common-when.spec.ts b/e2e/common-when.spec.ts new file mode 100644 index 00000000..99e30640 --- /dev/null +++ b/e2e/common-when.spec.ts @@ -0,0 +1,46 @@ +import { When as Wanneer } from '@badeball/cypress-cucumber-preprocessor'; + +Wanneer('ik op de {string} button klik', (text: string) => { + cy.findByRole('button', { name: text }).click(); +}); + +Wanneer('ik op de {string} datum prikker klik', (text: string) => { + cy.findByLabelText(text).click(); + cy.log('TODO: FIXME: wachten op een datumprikker'); +}); + +Wanneer('ik het {string} datum prikker gefocust heb', (text: string) => { + cy.findByLabelText(text).focus(); + // cy.focused().click(); + cy.log('TODO: FIXME: wachten op een datumprikker'); +}); + +Wanneer('ik een beschikbare {string} heb geselecteerd', (text: string) => { + cy.findByLabelText(text).type('2021-04-14'); + //This passes because it says Trouwdatum next to the datum prikker + cy.log('TODO: FIXME: wachten op een datumprikker'); +}); + +Wanneer('ik op de gewenste tijdslot checkbox klik', () => { + cy.get('[type="radio"]').first().check(); + // return 'pending'; + // cy.pause(); +}); + +//////The button is actually a link but somehow the code below doesn't select it nor click anything +Wanneer('ik op de {string} link klik', (text: string) => { + cy.get('utrecht-digid-button a').findByText(text).click(); + // Previously tried: cy.findByRole('link', { name: text }).click(); +}); +// //////suggested test from cypress, doesn't work either +// Dan('word ik naar de DigID {string} pagina gestuurd', function (string) { +// return 'pending'; +// }); + +Wanneer('ik op de externe {string} link klik', (text: string) => { + cy.findByRole('link', { name: text }).invoke('attr', 'href').as('clicked-external-link'); +}); + +Wanneer('ik probeer een datum over een jaar te selecteren', () => { + cy.log('TODO: FIXME: wachten op een datumprikker'); +}); diff --git a/e2e/eenvoudig-huwelijk.spec.ts b/e2e/eenvoudig-huwelijk.spec.ts new file mode 100644 index 00000000..aa92f283 --- /dev/null +++ b/e2e/eenvoudig-huwelijk.spec.ts @@ -0,0 +1 @@ +import { Given as Gegeven, Then as Dan } from '@badeball/cypress-cucumber-preprocessor'; diff --git a/e2e/landing-page.spec.ts b/e2e/landing-page.spec.ts new file mode 100644 index 00000000..beb11e71 --- /dev/null +++ b/e2e/landing-page.spec.ts @@ -0,0 +1,5 @@ +import { Then as Dan } from '@badeball/cypress-cucumber-preprocessor'; + +Dan('zie ik een lijst met verwachte stappen voor al de trouwopties', () => { + cy.get('@heading').parent().findByRole('list').should('be.visible'); +}); diff --git a/e2e/navigation.spec.ts b/e2e/navigation.spec.ts new file mode 100644 index 00000000..34f5f81b --- /dev/null +++ b/e2e/navigation.spec.ts @@ -0,0 +1,9 @@ +import { Then as Dan, Given as Gegeven } from '@badeball/cypress-cucumber-preprocessor'; + +Gegeven('dat ik een broodkruimel menu zie', () => { + cy.findByRole('navigation', { name: 'Kruimelpad' }).should('have.class', 'utrecht-breadcrumb'); +}); + +Dan('word ik naar de homepagina van de gemeente Utrecht gestuurd', () => { + cy.get('@clicked-external-link').should('match', /https?:\/\/utrecht\.nl\/$/); +}); diff --git a/features-cucumber/eenvoudig-huwelijk.feature b/features-cucumber/eenvoudig-huwelijk.feature new file mode 100644 index 00000000..50dcc9b9 --- /dev/null +++ b/features-cucumber/eenvoudig-huwelijk.feature @@ -0,0 +1,138 @@ +# language: nl + +Functionaliteit: Eenvoudig huwelijk/partnerschap + +@e2e +## stap "1" +Scenario: Ik wil zien dat ik op de trouw-opties pagina ben +Gegeven dat ik op de "/trouw-opties" pagina ben +Dan zie ik de heading "Trouwen of geregistreerd partnerschap" +Dan ben ik op stap "1" +Dan zie ik een "Trouwen plannen" button + +@e2e +Scenario: Ik wil een huwelijk als trouw optie kiezen +Gegeven dat ik op de "/trouw-opties" pagina ben +Wanneer ik op de "Trouwen plannen" button klik +Dan word ik naar de "trouw-opties/huwelijk" pagina gestuurd +# Dan ben ik op stap "2" +# Soms krijg ik "trouw-opties/undefined" +# FIXME: De bug zorgt dat we niet kan werken https://github.com/frameless/utrecht-huwelijksplanner/issues/147 + +## stap "2" +@e2e +Scenario: Ik wil zien dat ik op de trouw-opties/huwelijk pagina ben +Gegeven dat ik op de "trouw-opties/huwelijk" pagina ben +Dan zie ik de heading "Wanneer en hoe" +Dan ben ik op stap "2" +Dan is er een "Trouwdatum" datum prikker op de pagina +#FIXME: Fixen als de datumprikker gemaakt is + +@e2e +Scenario: Ik wil zien op welk datum ik kan trouwen door op de kalendericoon te klikken +Gegeven dat ik op de "trouw-opties/huwelijk" pagina ben +Wanneer ik op de "Trouwdatum" datum prikker klik +Dan kan ik de beschikbare trouwdatums zien +#FIXME: DIT KUNNEN WE TESTEN ALS DE CUSTOM DATUM PRIKKER HEBBEN/ZIEN + +@e2e +Scenario: Ik wil zien op welk datum ik kan trouwen door een datum in te vullen +Gegeven dat ik op de "trouw-opties/huwelijk" pagina ben +Wanneer ik het "Trouwdatum" datum prikker gefocust heb +Dan kan ik de beschikbare trouwdatums zien +# Dan kan ik een datum handmatig invullen in de "Trouwdatum" datum prikker +# Dan ik kan de beschikbare tijdsloten voor de ingevulde datum zien +#FIXME: DIT KUNNEN WE TESTEN ALS DE CUSTOM DATUM PRIKKER HEBBEN/ZIEN + +# Scenario: Ik kan mijn gekozen trouwdatum niet selecteren +# Gegeven dat ik ben op de "trouw opties huwelijk" pagina +# Wanneer ik probeer een niet beschikbare dag te selecteren +# Dan zie ik dat ik dat dag niet selecteren kan + +# Scenario: Ik kan tijdsloten voor mijn gekozen trouwdatum niet selecteren +# Gegeven dat ik ben op de "trouw opties huwelijk" pagina +# En ik zie de heading "Wanneer en Hoe" +# En ik ben op stap "2" +# En er is een "Trouwdatum" datum prikker op de pagina +# En ik wil binnen de komende twee weken trouwen +# En ik heb de datum prikker geopend +# Wanneer ik probeer een niet beschikbare dag in te vullen +# Dan zie ik dat er geen tijdsloten checkbox opties op de pagina verschijnen + +# Scenario: Ik wil een trouwdatum selecteren +# Gegeven dat ik ben op de "trouw opties huwelijk" pagina +# En ik zie de heading "Wanneer en Hoe" +# En ik ben op stap "2" +# En er is een "Trouwdatum" datum prikker op de pagina +# En er zijn beschikbare data voor trouwen +# Wanneer ik een beschikbare dag selecteer +# Dan wordt de datum op de datum prikker gezet + +@e2e +Scenario: Ik wil een tijdslot zien voor de geselecteerde dag +Gegeven dat ik op de "trouw-opties/huwelijk" pagina ben +Wanneer ik een beschikbare "Trouwdatum" heb geselecteerd +Dan zie ik tijdslot checkbox opties voor trouwen op de geselecteerde dag +#FIXME: DIT KUNNEN WE TESTEN ALS DE CUSTOM DATUM PRIKKER HEBBEN/ZIEN + +# @e2e +# Scenario: Ik wil een tijdslot selecteren +# Gegeven dat ik op de "trouw-opties/huwelijk" pagina ben +# En ik heb een beschikbare dag geselecteerd +# Wanneer ik op de gewenste tijdslot checkbox klik +# Dan de tijdslot checkbox wordt geselecteerd +# #the dan confirms the 1st radio button has been clicked + +# @e2e +# Scenario: Ik wil mijn gewenste tijd en datum bevestigen +# Gegeven dat ik op de "trouw-opties/huwelijk" pagina ben +# En ik heb een beschikbare tijdslot geselecteerd +# Wanneer ik op de "Ja, dit wil ik!" button klik +# Dan word ik naar de "voorgenomen-huwelijk" pagina gestuurd +# Dan ben ik op stap "3" +# Dan zie ik de correcte vroeger geselecteerde "tijd en datum" combinatie + +@e2e @wip +Abstract Scenario: Ik wil mijn gewenste tijd en datum bevestigen + Gegeven dat ik op de "trouw-opties/huwelijk" pagina ben + En ik heb de "" geselecteerd + En ik heb een beschikbare "" geselecteerd voor een "" huwelijk + Wanneer ik op de "Ja, dit wil ik!" button klik + Dan word ik naar de "voorgenomen-huwelijk" pagina gestuurd + Dan ben ik op stap "3" + Dan zie ik het correcte "" huwelijk met de vroeger geselecteerde "" en "" combinatie + Voorbeelden: + | datum | tijd | type | + | 2021-04-14 | 12:00 – 12:15 | Eenvoudig | + | 2021-04-14 | 13:30 – 13:45 | Eenvoudig | + | 2021-04-14 | 12:00 – 12:15 | Uitgebreid | + + +# Scenario: Ik wil over een jaar trouwen +# Gegeven dat ik op de "trouw-opties/huwelijk" pagina ben +# En er is een "Trouwdatum" datum prikker op de pagina +# En ik kan de beschikbare trouwdata zien +# Wanneer ik probeer een datum over een jaar te selecteren +# Dan kan ik geen datum selecteren +# En ik krijg een melding om een datum tussen een jaar te selecteren +#FIXME: Fixen als de datumprikker gemaakt is + +## stap "3" + +@e2e @wip +Scenario: Ik wil naar de DigID login pagina +Gegeven dat ik op de "voorgenomen-huwelijk" pagina ben +Wanneer ik op de "Inloggen met DigiD" link klik +Dan word ik naar de "login" pagina gestuurd +#TODO: add "real" DigID address + +Scenario: Ik wil Partner 1 met DigID inloggen +Gegeven ik ben op de DigID Login pagina +# Inloggen bij DigID stap " " 3 + En Partner 1 heeft een DigID + En ik zie de DigID Inloggen interface + En ik zie de DigID inloggen opties buttons +# <---Meer info TBD +Wanneer ik klik op een van de inloggen opties +Dan Partner 1 word ingelogd met DigID + En ik word naar de Persoonsgegevens voor Partner 1 pagina gestuurd \ No newline at end of file diff --git a/features-cucumber/landing-pagina.feature b/features-cucumber/landing-pagina.feature new file mode 100644 index 00000000..d0b7f812 --- /dev/null +++ b/features-cucumber/landing-pagina.feature @@ -0,0 +1,20 @@ +# language: nl +## step "0" +@e2e +Functionaliteit: Landingspagina + +#@e2e +Scenario: Ik wil zien wat ik van de huwelijksplanner van Utrecht kan verwachten +Gegeven dat ik op de "utrecht huwelijksplanner" pagina ben +Dan zie ik de heading "Regel je huwelijk of geregistreerd partnerschap" + En zie ik de heading "Welke stappen kun je verwachten?" + En zie ik een lijst met verwachte stappen voor al de trouwopties + En zie ik een "Meer informatie" infobox + En zie ik een "Start" button die zich gedraagd als link + +#@e2e +Scenario: Ik wil de huwelijksplanner kunnen starten +Gegeven dat ik op de "utrecht huwelijksplanner" pagina ben +Wanneer ik op de "Start" link klik +Dan word ik naar de "/trouw-opties" pagina gestuurd + En ben ik op stap "1" diff --git a/features-cucumber/navigatie.feature b/features-cucumber/navigatie.feature new file mode 100644 index 00000000..6f9c280e --- /dev/null +++ b/features-cucumber/navigatie.feature @@ -0,0 +1,10 @@ +# language: nl +Functionaliteit: Navigatie + +@e2e +Scenario: Ik wil naar de homepagina van Utrecht kunnen gaan via het broodkruimel menu +Gegeven dat ik op de "utrecht huwelijksplanner" pagina ben + En dat ik een broodkruimel menu zie +Wanneer ik op de externe "Home" link klik +Dan word ik naar de homepagina van de gemeente Utrecht gestuurd + diff --git a/features-cucumber/test.feature b/features-cucumber/test.feature new file mode 100644 index 00000000..0e9b9d20 --- /dev/null +++ b/features-cucumber/test.feature @@ -0,0 +1,725 @@ +# language: nl +Functionaliteit: Gratis Huwelijk + +## stap "0" +@e2e +Scenario: Ik wil een huwelijk plannen proces beginnen +Gegeven dat ik op de "utrecht huwelijksplanner" pagina ben + En ik zie de heading "Regel je huwelijk of geregistreerd partnerschap" + #En ik ben op stap "0" + En ik kan een "Start" button zien +Wanneer ik op de "Start" button klik +Dan word ik naar de "trouw opties" pagina gestuurd + En ik ben op stap 1 + #add quotation marks around the "1" + +## stap "1" +Scenario: Ik wil een huwelijk als trouw optie kiezen +Gegeven dat ik ben op de "/trouw-opties" pagina + En ik zie de heading "Trouwen of geregistreerd partnerschap" + En ik ben op stap "1" + En ik kan een "Trouwen plannen" button zien +Wanneer ik op de "Trouwen plannen" button klik +Dan word ik naar de "trouw opties huwelijk" pagina gestuurd + En ik ben op stap "2" + +## stap "2" +Scenario: Ik wil zien op welk datum ik kan trouwen door op de kalendericoon te klikken +Gegeven dat ik ben op de "trouw opties huwelijk" pagina + En ik zie de heading "Wanneer en Hoe" + En ik ben op stap "2" + En er is een "Trouwdatum" datum prikker op de pagina +Wanneer ik op de kalender icon klik +Dan kan ik de beschikbare trouwdatums zien + +Scenario: Ik wil zien op welk datum ik kan trouwen door een datum in te vullen +Gegeven dat ik ben op de "trouw opties huwelijk" pagina + En ik zie de heading "Wanneer en Hoe" + En ik ben op stap "2" + En er is een "Trouwdatum" datum prikker op de pagina +Wanneer ik het "Trouwdatum" datum prikker gefocust heb +Dan kan ik een datum handmatig invullen in de "Trouwdatum" datum prikker + En ik kan de beschikbare tijdsloten voor de ingevulde datum zien + +Scenario: Ik kan mijn gekozen trouwdatum niet selecteren +Gegeven dat ik ben op de "trouw opties huwelijk" pagina + En ik zie de heading "Wanneer en Hoe" + En ik ben op stap "2" + En er is een "Trouwdatum" datum prikker op de pagina + En ik wil binnen de komende twee weken trouwen + En ik de kalender icon heb geklikt + En ik kan de beschikbare trouwdatums zien +Wanneer ik probeer een niet beschikbare dag te selecteren +Dan zie ik dat ik dat dag niet selecteren kan + +Scenario: Ik kan tijdsloten voor mijn gekozen trouwdatum niet selecteren +Gegeven dat ik ben op de "trouw opties huwelijk" pagina + En ik zie de heading "Wanneer en Hoe" + En ik ben op stap "2" + En er is een "Trouwdatum" datum prikker op de pagina + En ik wil binnen de komende twee weken trouwen + En ik heb de datum prikker geopend +Wanneer ik probeer een niet beschikbare dag in te vullen +Dan zie ik dat er geen tijdsloten checkbox opties op de pagina verschijnen + +Scenario: Ik wil een trouwdatum selecteren +Gegeven dat ik ben op de "trouw opties huwelijk" pagina + En ik zie de heading "Wanneer en Hoe" + En ik ben op stap "2" + En er is een "Trouwdatum" datum prikker op de pagina + En er zijn beschikbare data voor trouwen +Wanneer ik een beschikbare dag selecteer +Dan wordt de datum op de datum prikker gezet + +Scenario: Ik wil een tijdslot selecteren +Gegeven dat ik ben op de "trouw opties huwelijk" pagina + En ik zie de heading "Wanneer en Hoe" + En ik ben op stap "2" + En er is een "Trouwdatum" datum prikker op de pagina + En ik heb een beschikbare dag geselecteerd + En ik zie tijdslot checkbox opties voor trouwen op de geselecteerde dag +Wanneer ik op de gewenste tijdslot checkbox klik +Dan de tijdslot checkbox wordt geselecteerd + +Scenario: Ik wil mijn gewenste tijd een datum bevestigen +Gegeven dat ik ben op de "trouw opties huwelijk" pagina + En ik zie de heading "Wanneer en Hoe" + En ik ben op stap "2" + En er is een "Trouwdatum" datum prikker op de pagina + En ik heb een beschikbare dag geselecteerd + En ik heb een beschikbare tijdslot geselecteerd + En ik kan een "Ja, dit wil ik!" button zien +Wanneer ik op de "Ja, dit wil ik!" button klik +Dan word ik naar de "voorgenomen huwelijk" pagina gestuurd + En ik ben op stap "3" + +Scenario: Ik wil in over een jaar trouwen +Gegeven dat ik ben op de "trouw opties huwelijk" pagina + En ik zie de heading "Wanneer en Hoe" + En ik ben op stap "2" + En er is een "Trouwdatum" datum prikker op de pagina + En ik kan de beschikbare trouwdatums zien +Wanneer ik probeer een datum over een jaar te selecteren +Dan kan ik geen datum selecteren + En ik krijg een melding om een datum tussen een jaar te selecteren + +## stap "3" +Scenario: Ik wil naar de DigID login pagina +Gegeven dat ik ben op de Voorgenomen Huwelijk pagina #Eenvoudig trouwen stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik zie een Inloggen met DigID button +Wanneer ik op de button klikt +Dan ik word naar de DigID login pagina doorgestuurd + #stap " " 3 + +Scenario: Ik wil Partner 1 met DigID inloggen +Gegeven dat ik ben op de DigID Login pagina + #Inloggen bij DigID stap " " 3 + En Partner 1 heeft een DigID + En ik zie de DigID Inloggen interface + En ik zie de DigID inloggen opties buttons + #<---Meer info TBD +Wanneer ik klik op een van de inloggen opties +Dan Partner 1 word ingelogd met DigID + En ik word naar de Persoonsgegevens voor Partner 1 pagina gestuurd + +Scenario: Ik wil de DigID inloggen annuleren +Gegeven dat ik ben op de DigID login pagina + #Inloggen bij DigID stap " " 3 + En ik zie de DigID Inloggen interface + En ik zie een Annuleren button +Wanneer ik klik op de Annuleren button +Dan ik word teruggestuurd naar de Voorgenomen Huwelijk pagina + +Scenario: Ik wil een DigID hebben +Gegeven dat ik ben op de DigID Login pagina + #Inloggen bij DigID stap " " 3 + En ik heb geen DigID + En ik zie de Nog geen DigID? Vraag uw DigiD aan link op de pagina +Wanneer ik klik op de link +Dan ik word naar een pagina waarin ik een DigID kan krijgen gestuurd + +Scenario: Ik wil de basisgegevens van Partner 1 bevestigen +Gegeven dat ik ben op de Persoonsgegevens voor Partner 1 pagina + # stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En De persoonsgegevens van Partner 1 zijn juist + En De adresgegevens van Partner 1 zijn juist + +Scenario: De basis gegevens van Partner 1 kloppen niet +Gegeven dat ik ben op de Persoonsgegevens voor Partner 1 pagina + #Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En De basisgegevens van Partner 1 zijn niet juist + En ik zie een Neem contact op met de gemeente link +Wanneer ik op de Neem contact op met de gemeente link klikt +Dan ik word naar de Persoonsgegevens opvragen of aanpassen (BRP) pagina gestuurd + +Scenario: Ik wil het telefoonnummer van Partner 1 invullen +Gegeven dat ik ben op de Persoonsgegevens voor Partner 1 pagina + #Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En ik zie een input field voor het telefoonnummer van Partner 1 +Wanneer ik in de input field het telefoonnummer van Partner 1 invul +Dan Het ingevulde nummer wordt gecontroleerd voor geldigheid + +Scenario: Ik wil het telefoonnummer van Partner 1 bewerken +Gegeven dat ik ben op de Persoonsgegevens voor Partner 1 pagina + #Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En ik zie een input field voor het telefoonnummer van Partner 1 + En ik heb al een nummer in de input field ingevuld +Wanneer ik in de input field klik +Dan Kan ik het ingevulde nummer bewerken + En Het ingevulde nummer wordt gecontroleerd voor geldigheid + +Scenario: Ik wil de email van Partner 1 invullen +Gegeven dat ik ben op de Persoonsgegevens pagina + #Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En ik zie een input field voor de email van Partner 1 +Wanneer ik in de input field de email van Partner 1 invul +Dan Het ingevulde email wordt gecontroleerd voor geldigheid + +Scenario: Ik wil de email van Partner 1 bewerken +Gegeven dat ik ben op de Persoonsgegevens pagina + #Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En ik zie een input field voor de email van Partner 1 + En ik heb al een email in de input field ingevuld +Wanneer ik in de input field klik +Dan Kan ik het ingevulde email bewerken + En Het ingevulde email wordt gecontroleerd voor geldigheid + +Scenario: Ik Partner 1 wil verklaren dat ik niet getrouwd ben +Gegeven dat ik ben op de Persoonsgegevens pagina + #Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En ik zie een checkbox voor de alleenstaand verklaring van Partner 1 +Wanneer ik op de checkbox klikt +Dan Het checkbox wordt ingevuld + +Scenario: Ik Partner 1 wil mijn alleenstaand verklaring terugnemen +Gegeven dat ik ben op de Persoonsgegevens pagina + #Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En ik zie een gecheckte checkbox voor de alleenstaand verklaring van Partner 1 +Wanneer ik op de checkbox klikt +Dan Het checkbox wordt leeg + +Scenario: Ik Partner 1 wil verklaren dat ik niet binnen mijn familie ga trouwen +Gegeven dat ik ben op de Persoonsgegevens pagina + #Melding Voorgenomen Huwelijk stap " " 3 + En ik zie een checkbox voor de niet familie trouwen verklaring voor Partner 1 +Wanneer ik op de checkbox klikt +Dan Het checkbox wordt ingevuld + +Scenario: Ik Partner 1 wil mijn verklaring dat ik niet binnen mijn familie ga trouwen terugnemen +Gegeven dat ik ben op de Persoonsgegevens pagina + #Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En ik zie een gecheckte checkbox voor de niet familie trouwen verklaring van Partner 1 +Wanneer ik op de checkbox klikt +Dan Het checkbox wordt leeg + +Scenario: Ik Partner 1 wil iemand in mijn familie trouwen +Gegeven dat ik ben op de Persoonsgegevens pagina + #Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En ik zie een checkbox voor de niet familie trouwen verklaring van Partner 1 + En ik zie een Meer Informatie sectie met contactmogelijkheden links +Wanneer ik op de Bel 14 030 link klikt +Dan ik neem contact met de gemeente zodat ik Partner 1 een familieleden kan trouwen + +Scenario: Ik Partner 1 wil iemand in mijn familie trouwen +Gegeven dat ik ben op de Persoonsgegevens pagina + #Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En ik zie een checkbox voor de niet familie trouwen verklaring van Partner 1 + En ik zie een Meer Informatie sectie met contactmogelijkheden links +Wanneer ik op de Chat met ons link klikt +Dan ik neem contact met de gemeente zodat ik Partner 1 een familieleden kan trouwen + +Scenario: Ik Partner 1 wil al de gegevens in het formulier bevestigen +Gegeven dat ik ben op de Persoonsgegevens pagina + #Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En ik zie een checkbox voor de gegevensbevestiging van Partner 1 + En Al de ingevulde gegevens in het formulier kloppen +Wanneer ik op de gegevensbevestiging checkbox klikt +Dan Het checkbox wordt ingevuld + +Scenario: Ik Partner 1 wil mijn bevestiging dat al de gegevens in het formulier kloppen terugnemen +Gegeven dat ik ben op de Persoonsgegevens pagina + #Melding Voorgenomen Huwelijk stap " " 3 + En ik zie een ingevulde checkbox voor de gegevensbevestiging van Partner 1 +Wanneer ik op de checkbox klikt +Dan De checkbox wordt leeg + +Scenario: Ik Partner 1 wil mijn contactgegevens opslaan +Gegeven dat ik ben op de Persoonsgegevens pagina + #Melding Voorgenomen Huwelijk stap " " 3 + #En ik heb al mijn contactgegevens ingevuld + En ik heb al de verklaring checkboxes ingevuld + En ik heb de gegevensbevestiging checkbox ingevuld + En ik zie een Contactgegevens opslaan button +Wanneer ik op de Contactgegevens opslaan button klikt +Dan ik word naar de Voorgenomen Huwelijk Partner pagina gestuurd + +Scenario: Ik Partner 1 wil mijn contactgegevens opslaan +Gegeven dat ik ben op de Persoonsgegevens pagina + #Melding Voorgenomen Huwelijk stap " " 3 + #En ik heb al mijn contactgegevens ingevuld + En ik zie de verklaring en bevestiging checkboxes op de pagina + En ik heb nog niet de alleenstaandenverklaring checkbox ingevuld + En ik zie een Contactgegevens opslaan button +Wanneer ik op de Contactgegevens opslaan button klikt +Dan ik krijg een Please tick this box if you want to proceed popup + #Wat is de naam van dit in het Nederlands? + +Scenario: Ik Partner 1 wil mijn contactgegevens opslaan +Gegeven dat ik ben op de Persoonsgegevens pagina + #Melding Voorgenomen Huwelijk stap " " 3 + #En ik heb al mijn contactgegevens ingevuld + En ik zie de verklaring en bevestiging checkboxes op de pagina + En ik heb nog niet de alleenstaandenverklaring checkbox ingevuld + En ik zie een Contactgegevens opslaan button + En ik heb de Contactgegevens opslaan button geklikt + En ik heb een Please tick this box if you want to proceed popup gekregen +Wanneer ik op de alleenstaandenverklaring checkbox klikt +Dan De alleenstaand verklaring checkbox wordt ingevuld + #Wat is de naam van dit in het Nederlands? + + +Scenario: Ik Partner 1 wil mijn contactgegevens opslaan +Gegeven dat ik ben op de Persoonsgegevens pagina + #Melding Voorgenomen Huwelijk stap " " 3 + #En ik heb al mijn contactgegevens ingevuld + En ik zie de verklaring en bevestiging checkboxes op de pagina + En ik heb nog niet de verklaring dat ik niet binnen mijn familie ga trouwen checkbox ingevuld + En ik zie een Contactgegevens opslaan button +Wanneer ik op de Contactgegevens opslaan button klikt +Dan ik krijg een Please tick this box if you want to proceed popup + #Wat is de naam van dit in het Nederlands? + +Scenario: Ik Partner 1 wil mijn contactgegevens opslaan +Gegeven dat ik ben op de Persoonsgegevens pagina + #Melding Voorgenomen Huwelijk stap " " 3 + #En ik heb al mijn contactgegevens ingevuld + En ik zie de verklaring en bevestiging checkboxes op de pagina + En ik heb nog niet de verklaring dat ik niet binnen mijn familie ga trouwen checkbox ingevuld + En ik zie een Contactgegevens opslaan button + En ik heb de Contactgegevens opslaan button geklikt + En ik heb een Please tick this box if you want to proceed popup gekregen +Wanneer ik op de verklaring dat ik niet binnen mijn familie ga trouwen verklaring checkbox klikt +Dan De verklaring dat ik niet binnen mijn familie ga trouwen checkbox wordt ingevuld + #Wat is de naam van dit in het Nederlands? + +Scenario: Ik Partner 1 wil mijn contactgegevens opslaan +Gegeven dat ik ben op de Persoonsgegevens pagina + #Melding Voorgenomen Huwelijk stap " " 3 + #En ik heb al mijn contactgegevens ingevuld + En ik zie de verklaring en bevestiging checkboxes op de pagina + En ik heb nog niet de bevestiging dat al de gegevens in het formulier kloppen checkbox ingevuld + En ik zie een Contactgegevens opslaan button +Wanneer ik op de Contactgegevens opslaan button klikt +Dan ik krijg een Please tick this box if you want to proceed popup + #Wat is de naam van dit in het Nederlands? + +Scenario: Ik Partner 1 wil mijn contactgegevens opslaan +Gegeven dat ik ben op de Persoonsgegevens pagina + #Melding Voorgenomen Huwelijk stap " " 3 + #En ik heb al mijn contactgegevens ingevuld + En ik zie de verklaring en bevestiging checkboxes op de pagina + En ik heb nog niet de bevestiging dat al de gegevens in het formulier kloppen checkbox ingevuld + En ik zie een Contactgegevens opslaan button + En ik heb de Contactgegevens opslaan button geklikt + En ik heb een Please tick this box if you want to proceed popup gekregen +Wanneer ik op de bevestiging dat al de gegevens in het formulier kloppen checkbox klikt +Dan De bevestiging dat al de gegevens in het formulier kloppen checkbox wordt ingevuld + #Wat is de naam van dit in het Nederlands? + +Scenario: Ik wil Partner 2 voor de huwelijk melden +Gegeven dat ik ben op de Persoonsgegevens pagina + #Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En ik zie een Partner inloggen met DigID button +Wanneer ik op de Partner inloggen met DigID button klikt +Dan ik word naar de DigIDlogin pagina doorgestuurd + #stap " " 3 +#-----!!! +Scenario: Ik wil Partner 2 met DigID inloggen +Gegeven dat ik ben op de DigID login pagina + #Inloggen bij DigID stap " " 3 +Wanneer ik login met een DigID + En Het is een ander login als dat van partner 1 +Dan Mijn partner wordt ingelogd met DigID +!!! +Scenario: Ik wil Partner 1 met DigID inloggen +Gegeven dat ik ben op de DigID Login pagina + + #Inloggen bij DigID stap " " 3 + En Partner 1 heeft een DigID + En ik zie de DigID Inloggen interface + En ik zie de DigID inloggen opties buttons + #<---Meer info TBD +Wanneer ik klik op een van de inloggen opties +Dan Partner 1 word ingelogd met DigID + En ik word naar de Persoonsgegevens voor Partner 1 pagina gestuurd + +Scenario: Ik wil mijn partner voor de huwelijk melden!!! +Gegeven dat ik ben op de Persoonsgegevens pagina + #Eenvoudig trouwen stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En ik zie een mail een uitnodiging aan je partner link +Wanneer ik op de link klikt +Dan ik word naar de Partner Uitnodigen pagina doorgestuurd +#stap " " 3 + +Scenario: Ik wil mijn partners gegevens invullen voor een DigID login uitnodiging +Gegeven dat ik ben op de Partner Uitnodigen pagina + #Eenvoudig trouwen stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En ik zie een name input field + En ik zie een email input field + En ik zie een Verstuur uitnodiging button +Wanneer ik de input fields invul +Dan Word de ingevulde informatie laten zien op de input fields + #stap " " 3 + +Scenario: Ik wil mijn partner een uitnodiging voor een DigID login sturen +Gegeven dat ik ben op de Partner Uitnodigen pagina + #Eenvoudig trouwen stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En ik heb de partner gegevens input fields ingevuld +Wanneer ik op de Verstuur uitnodiging button klik +Dan Word een uitnodiging voor en DigID login email naar mijn partner gestuurd + En ik word naar de Partner Success pagina gestuurd + #stap " " 3 + +Scenario: Ik wil mijn email bekijken +Gegeven dat ik ben op de Partner Success pagina + #Eenvoudig trouwen stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En ik zie een text waarin staat we wachten voor de login van partner 2 + En ik zie een button Bekijk e-mail voor aanvrager +Wanneer ik op de button klikt +Dan ik word naar de Aanvrager email pagina gestuurd + #stap " " 3 + +Scenario: Ik wil met de huwelijksaanvraag doorgaan +Gegeven dat ik ben op de Aanvrager email pagina + #Eenvoudig trouwen stap " " 3 + En ik zie de correcte naam van partner 1 + En ik zie een button Doorgaan huwelijksaanvraag +Wanneer ik op de button klikt +Dan ik word naar de Getuigen pagina gestuurd#stap " " 3 + +Scenario: Ik wil de email van mijn partner bekijken +Gegeven dat ik ben op de Partner Success pagina + #Eenvoudig trouwen stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En ik zie een text waarin staat we wachten voor de login van partner 2 + En ik zie een button Bekijk e-mail voor partner +Wanneer ik op de button klikt +Dan ik word naar de Invitation Email Partner pagina gestuurd + #stap " " 3 + +Scenario: Partner 2 met DigID inloggen +Gegeven dat ik ben op de Invitation Email Partner pagina + #Eenvoudig trouwen stap " " 3 + En ik zie de correcte naam van partner 2 + En ik zie een button Inloggen met DigID +Wanneer ik op de button klikt +Dan ik word naar de DigIDlogin pagina doorgestuurd + #stap " " 3 + +Scenario: Ik wil een DigID inloggen uitnodiging per email naar partner 2 stuuren +Gegeven dat ik ben op de Persoonsgegevens pagina voor Partner 2 + #Eenvoudig trouwen stap " " 3 + En ik zie een name input field + En ik zie een email input field +Wanneer ik de gegevens van partner 2 invul +Dan Het getypte email wordt gecontroleerd voor geldigheid + #stap " " 3 + En ik krijg een bevestiging dat de e-mail is verzonden + +!!!!! +Scenario: Ik, Partner 2, wil mijn basisgegevens bevestigen*** +Gegeven dat ik ben op de Persoonsgegevens pagina voor Partner 2 + #Eenvoudig trouwen stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En Mijn persoonsgegevens zijn juist + En Mijn adresgegevens zijn juist + +Scenario: Ik, Partner 2, wil mijn gegevens bevestigen +Gegeven dat ik ben op de Persoonsgegevens pagina voor Partner 2 + #Eenvoudig trouwen stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En Mijn gegevens zijn niet juist +Wanneer ik op Neem contact op met de gemeente klikt +Dan ik word naar een pagina waarin ik mijn gegevens kan laten bekend zijn gestuurd + +Scenario: Ik, Partner 2, wil mijn telefoonnummer invullen +Gegeven dat ik ben op de Persoonsgegevens pagina voor Partner 2 + #Eenvoudig trouwen stap " " 3 + En ik zie een input field voor mijn telefoonnummer +Wanneer ik in een input field mijn telefoonnummer invul +Dan Het getypte nummer wordt gecontroleerd voor geldigheid + +Scenario: Ik, Partner 2, wil mijn email invullen +Gegeven dat ik ben op de Persoonsgegevens pagina voor Partner 2 + #Eenvoudig trouwen stap " " 3 + En ik zie een input field voor mijn email +Wanneer ik in een input field mijn email invul +Dan De getypte email wordt gecontroleerd voor geldigheid + +Scenario: Ik, Partner 2, wil verklaren dat ik niet getrouwd ben +Gegeven dat ik ben op de Persoonsgegevens pagina voor Partner 2 + #Eenvoudig trouwen stap " " 3 + En ik zie een checkbox voor de alleenstaEn verklaring +Wanneer ik op de checkbox tikt +Dan Het checkbox wordt ingevuld + +Scenario: Ik, Partner 2, wil verklaren dat ik niet binnen mijn familie ga trouwen +Gegeven dat ik ben op de Persoonsgegevens pagina voor Partner 2 + #Eenvoudig trouwen stap " " 3 + En ik zie een checkbox voor de niet familie trouwen verklaring +Wanneer ik op de checkbox tikt +Dan Het checkbox wordt ingevuld + +Scenario: Ik, Partner 2, wil iemand in mijn familie trouwen +Gegeven dat ik ben op de Persoonsgegevens pagina voor Partner 2 +#Eenvoudig trouwen stap " " 3 + En ik zie een checkbox voor de niet familie trouwen verklaring + En ik zie een Meer Informatie sectie met contactmogelijkheden links +Wanneer ik op een van de contactmogelijkehen links klikt +Dan ik neem contact met de gemeente om mijn familieleden te kunnen trouwen + +Scenario: Ik, Partner 2, wil al de gegevens in het formulier bevestigen +Gegeven dat ik ben op de Persoonsgegevens pagina voor Partner 2 + #Eenvoudig trouwen stap " " 3 + En Al de ingevulde gegevens in het formulier kloppen +Wanneer ik op de gegevensbevestiging checkbox tikt +Dan Het checkbox wordt ingevuld + +Scenario: Ik, Partner 2, wil mijn contactgegevens opslaan +Gegeven dat ik ben op de Persoonsgegevens pagina voor Partner 2 + #Eenvoudig trouwen stap " " 3 + En ik heb al mijn contactgegevens ingevuld + En ik heb al de verklering checkboxes getikt +Wanneer ik op de Contactgegevens opslaan button klikt +Dan ik word naar een pagina waarin ik kan bevestigen de gegevens van Partner 2 zijn gekoppeld met die van Partner 1 gestuurd + +Scenario: Gekoppeling van gegevens bevestigen +Gegeven dat ik ben op de Persoonsgegevens Succes pagina voor Partner 2 + #Eenvoudig trouwen stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En ik zie de kosten voor de huwelijk + En ik zie een text waar het staat de gegevens van de twee partners aijn gekoppeld + + +Scenario: Ik, wil getuigen uitnodigen +Gegeven dat ik ben op de Persoonsgegevens Succes pagina voor Partner 2 + #Eenvoudig trouwen stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En ik zie de kosten voor de huwelijk + En ik zie een text waar het staat de gegevens van de twee partners aijn gekoppeld +Wanneer ik op de Nodig getuigen uit button klikt +Dan ik word naar de Getuigen pagina gestuurd#stap " " 3 + +Scenario: Getuigen gegevens invullen +Gegeven dat ik ben op de Getuigen pagina + #Eenvoudig trouwen stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En ik zie de kosten voor de huwelijk + En ik zie tussen 2 en 4 input field sets voor de namen en emails van de getuigen +Wanneer ik in een input field klik +Dan Kan ik de input fields met de gegevens van de getuigen invullen + #stap " " 3 + +Scenario: Getuigens email controlleren +Gegeven dat ik ben op de Getuigen pagina + #Eenvoudig trouwen stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En ik zie de kosten voor de huwelijk + En ik zie tussen 2 en 4 input field sets voor de namen en emails van de getuigen +Wanneer ik in een input field klik +Dan Kan ik de gegevens van de getuigen invullen + #stap " " 3 + En De getypte email wordt gecontroleerd voor geldigheid + +Scenario: Verzenden van getuigen uitnodigingen +Gegeven dat ik ben op de Getuigen pagina + #Eenvoudig trouwen stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En ik zie de kosten voor de huwelijk + En ik heb tenminste 1 paar van input fields ingevuld + En De ingevulde email is geldig +Wanneer ik op de Verstuur uitnodiging button klikt +Dan ik word naar de Getuigen Succes pagina gestuurd + #stap " " 3 + +Scenario: Ik wil de gemeente laten mijn huwelijks verzoek checken +Gegeven dat ik ben op de Getuigen Succes pagina + #Eenvoudig trouwen stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En ik zie de kosten voor de huwelijk +Wanneer ik op de Laat de gemeente checken en ga betalen button klikt +Dan ik word naar de Voorgenomen Huwelijk Checken pagina gestuurd + #stap " " 3 +#Hoelang moet man wachten? Ga ik direct naar de volgende pagina zoals bij de draft website? Wat gebeurt als er iets mis is (email, phonecall, anders)? +#-----!!! +Scenario: Ik wil voor mij huwelijk betalen +Gegeven dat ik ben op de Voorgenomen Huwelijk Checken pagina + #Eenvoudig trouwen stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En ik zie de kosten voor de huwelijk +Wanneer ik op de Ga betalen button klikt +Dan ik word naar de Voorgenomen Huwelijk Betalen pagina gestuurd + #stap " " 3 + +Scenario: Ik wil met iDEAL voor mij huwelijk betalen +Gegeven dat ik ben op de Voorgenomen Huwelijk Betalen pagina + #Eenvoudig trouwen stap " " 3 + En ik zie Gemeente Utrecht als de correcte begunstigde + En ik zie de kosten voor de huwelijk +Wanneer ik op de icoon van mijn bank X klikt +Dan ik word naar de X bank betaling pagina gestuurd + #stap " " 3 + +Scenario: Ik wil mijn betaling with bank X voltooien +Gegeven dat ik ben op de Betalen Succes pagina + #Eenvoudig trouwen stap " " 3 + En X + En X +Wanneer X +Dan ik word naar de X bank betaling pagina gestuurd + #stap " " 3 + +Scenario: Ik wil mijn huwelijk betaling ontvangen bevestigen +Gegeven dat ik ben op de Betalen Succes pagina + #Eenvoudig trouwen stap " " 5 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En ik zie de kosten voor de huwelijk + En ik zie als text GELUKT Betaling ontvangen + +Scenario: Ik wil informatie over het Stadskantoor Utrecht locatie +Gegeven dat ik ben op de Betalen Succes pagina + #Eenvoudig trouwen stap " " 5 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En ik zie de kosten voor de huwelijk + En ik zie als text GELUKT Betaling ontvangen +Wanneer ik op de link Stadskantoor Utrecht link klikt +Dan ik word naar de Contact Stadskantoor pagina gestuurd + #stap " " 5 + +Scenario: Ik wil de huwelijk annuleeren +Gegeven dat ik ben op de Betalen Succes pagina + #Eenvoudig trouwen stap " " 5 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En ik zie de kosten voor de huwelijk + En ik zie als text GELUKT Betaling ontvangen +Wanneer ik op de Annuleer huwelijk link klikt +Dan ik word naar de Huwelijksplanner Cancel pagina gestuurd + #stap " " 5 + +Scenario: Ik wil de huwelijksreservering annuleeren +Gegeven dat ik ben op de Huwelijksplanner Cancel pagina + #Eenvoudig trouwen stap " " 5 +Wanneer ik op de Annuleer reservering button klikt +Dan ik word naar de "Annuleer reservering bevestiging" pagina gestuurd + #stap " " 5 + +Scenario: Ik wil de huwelijksreservering annuleeren +Gegeven dat ik ben op de Huwelijksplanner Cancel pagina + #Eenvoudig trouwen stap " " 5 +Wanneer ik op de Nee, ik wil terug naar het overzicht button klikt +Dan ik word naar de Betalen Succes pagina gestuurd + #stap " " 5 + +Scenario: Ik wil de gegevens van Partner 1 aanpassen +Gegeven dat ik ben op de Betalen Succes pagina + #Eenvoudig trouwen stap " " 5 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En ik zie de kosten voor de huwelijk + En ik zie als text GELUKT Betaling ontvangen +Wanneer ik op een van de Aanpassen links van de contactgegevens van Partner 1 klikt +Dan ik word naar de Persoonsgegevens voor Partner 1 pagina gestuurd + # stap " " 3 + +Scenario: Ik wil terug gaan naar de Melding Voorgenomen Huwelijk pagina gaan +Gegeven dat ik ben op de Persoonsgegevens voor Partner 1 pagina + #Eenvoudig trouwen stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En ik heb voor de huwelijk al betaald + En ik zie een link Ga terug naar de Melding Voorgenomen Huwelijk pagina +Wanneer ik op de Ga terug naar de Melding Voorgenomen Huwelijk pagina klikt +Dan ik word naar de Betalen Succes pagina gestuurd + # stap " " 5 + +Scenario: Ik wil de gegevens van Partner 2 aanpassen +Gegeven dat ik ben op de Betalen Succes pagina + #Eenvoudig trouwen stap " " 5 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En ik zie de kosten voor de huwelijk + En ik zie als text GELUKT Betaling ontvangen +Wanneer ik op een van de Aanpassen links van de contactgegevens van Partner 2 klikt +Dan ik word naar de Persoonsgegevens voor Partner 2 pagina gestuurd + # stap " " 3 + +Scenario: Ik wil terug gaan naar de Melding Voorgenomen Huwelijk pagina gaan +Gegeven dat ik ben op de Persoonsgegevens voor Partner 2 pagina + #Eenvoudig trouwen stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En ik heb voor de huwelijk al betaald + En ik zie een link Ga terug naar de Melding Voorgenomen Huwelijk pagina +Wanneer ik op de Ga terug naar de Melding Voorgenomen Huwelijk pagina klikt +Dan ik word naar de Betalen Succes pagina gestuurd + # stap " " 5 + +Scenario: Ik wil de gegevens van getuige 1 aanpassen +Gegeven dat ik ben op de Betalen Succes pagina + #Eenvoudig trouwen stap " " 5 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En ik zie de kosten voor de huwelijk + En ik zie als text GELUKT Betaling ontvangen +Wanneer ik op een van de Aanpassen links van de contactgegevens van Getuigen 1 klikt +Dan ik word naar de Getuigen pagina gestuurd + # stap " " 3 + En De gegeven van getuig 1 verwezen door de geklikte link wordt gefocuseerd + +Scenario: Ik wil de gegevens van getuige 2 aanpassen +Gegeven dat ik ben op de Betalen Succes pagina + #Eenvoudig trouwen stap " " 5 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En ik zie de kosten voor de huwelijk + En ik zie als text GELUKT Betaling ontvangen +Wanneer ik op een van de Aanpassen links van de contactgegevens van Getuigen 1 klikt +Dan ik word naar de Getuigen pagina gestuurd + # stap " " 3 + En De gegeven van getuig 2 verwezen door de geklikte link wordt gefocuseerd + +Scenario: Ik wil de gegevens van getuige 3 aanpassen +Gegeven dat ik ben op de Betalen Succes pagina + #Eenvoudig trouwen stap " " 5 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En ik zie de kosten voor de huwelijk + En ik zie als text GELUKT Betaling ontvangen + En Er zijn contactgegevens voorhanden voor Getuig 3 +Wanneer ik op een van de Aanpassen links van de contactgegevens van Getuigen 1 klikt +Dan ik word naar de Getuigen pagina gestuurd + # stap " " 3 + En De gegeven van getuig 3 verwezen door de geklikte link wordt gefocuseerd + +Scenario: Ik wil de gegevens van getuige 4 aanpassen +Gegeven dat ik ben op de Betalen Succes pagina + #Eenvoudig trouwen stap " " 5 + En ik zie de correcte vroeger geselecteerde tijd een datum combinatie + En ik zie de kosten voor de huwelijk + En ik zie als text GELUKT Betaling ontvangen + En Er zijn contactgegevens voorhanden voor Getuig 4 +Wanneer ik op een van de Aanpassen links van de contactgegevens van Getuigen 1 klikt +Dan ik word naar de Getuigen pagina gestuurd + # stap " " 3 + En De gegeven van getuig 3 verwezen door de geklikte link wordt gefocuseerd diff --git a/features/README.md b/features/README.md new file mode 100644 index 00000000..299afcb2 --- /dev/null +++ b/features/README.md @@ -0,0 +1,114 @@ +# Richtlijnen voor het schrijven van feature files van de huwelijksplanner + +## Bronnen waarop de scenarios zijn gebaseerd + +[Utrecht Huwelijksplanner Frameless](https://utrecht-huwelijksplanner.frameless.io/) + +[Huwelijksplanner gemeente Utrecht (MVP)](https://github.com/frameless/wiki/wiki/Huwelijksplanner-gemeente-Utrecht) + +## Voorbeeld Scenario + +``` +## step "1" +Scenario: Ik wil een huwelijk als trouw optie kiezen +Gegeven dat ik ben op de "trouw opties" pagina +En ik zie de heading "Trouwen of geregistreerd partnerschap" +En ik ben op step "1" +En ik kan een "Trouwen plannen" button zien +Wanneer ik op de "Trouwen plannen" button klik +Dan word ik naar de "trouw opties huwelijk" pagina gestuurd +En ik ben op step "2" + +``` + +## Richtlijnen + +### Gherkin Keywords + +1. De Gherkin keywords Functionaliteit en Scenario worden altijd gevolgd door een `:`. +2. Het eerste woord na elke Functionaliteit en Scenario Gherkin keyword krijgt een hoofdletter. +3. Het eerste woord na elk andere Gherkin keywoord krijgt een kleine letter. + +### Web pagina's + +1. De woorden waaruit de naam van de pagina bestaat, zijn afkomstig van de url van dezelfde pagina, na de `/` symbool. +2. De woorden waaruit de naam van de pagina bestaat, worden zonder `-` geschreven met een spatie ertussen. +3. De namen van de paginas worden in kleine letters geschreven. +4. De namen van de paginas worden altijd geschreven tussen `" "`. +5. De namen van de paginas tussen dubbele aanhalingstekens worden altijd gevolgd door het woord `pagina` met een spatie ertussen. + +#### Voorbeeld + +``` +https://utrecht-huwelijksplanner.frameless.io/trouw-opties + +Gegeven dat ik ben op de "trouw opties" pagina +``` + +### Headings + +1. De woorden waaruit de naam van de heading bestaat, zijn afkomstig van de heading van dezelfde pagina. +2. De woorden waaruit de naam van de heading bestaat, zijn geschreven zoals ze op de website verschijnen met inachtneming van spaties, symbolen en hoofdletters. +3. De naam van de heading is altijd geschreven tussen `" "`. +4. Voor de naam van de heading tussen dubbele aanhalingstekens komt altijd het woord `heading` met een spatie ertussen. + +#### Voorbeeld + +``` +

Trouwen of geregistreerd partnerschap

+ +En ik zie de heading "Trouwen of geregistreerd partnerschap" +``` + +### Steps + +1. De scenarios zijn gegroepeerd per stap van de huwelijksplanner. +2. Elke stap groep is aangegeven met een comment Voorbeeld: `## step "1" `. +3. Elk scenario geeft aan in welke stap de gebruiker zich momenteel bevindt binnen het `Gegeven` codeblock voorafgegaan aan het keywoord `En`. +4. Als de stap verandert binnen een scenario staat dat binnen het `Dan` codeblock met het keywoord `En`. +5. Het nummer van elke stap wordt als cijfer gegeven tussen `" "`. +6. Het nummer van elke stap wordt altijd voorafgegaan door het woord `step` met een spatie ertussen. + +#### Voorbeeld + +``` +Dan word ik naar de "trouw opties huwelijk" pagina gestuurd + En ik ben op step "2" +``` + +### Buttons + +1. Een button wordt aangegeven met de tekst zoals deze op de button staat. +2. De button tekst in het scenario is precies hetzelfde als op de website. Dus inclusief hoofdletters, kleine letters, spaties en symbolen. +3. De namen van een buttons worden altijd geschreven tussen `" "`. +4. De namen van een button tussen haakjes wordt altijd gevolgd door het woord `button` met een spatie ertussen. + +#### Voorbeeld + +``` + + +En ik kan een "Trouwen plannen" button zien +Wanneer ik op de "Trouwen plannen" button klik +``` + +### Links + +1. Een link wordt aangegeven met de tekst zoals deze op de link staat. +2. De link tekst in het scenario is precies hetzelfde als op de website. Dus inclusief hoofdletters, kleine letters, spaties en symbolen. +3. De namen van de links worden altijd geschreven tussen `" "`. +4. De namen van de links tussen dubbele aanhalingstekens worden altijd gevolgd door het woord `link` met een spatie ertussen. + +#### Voorbeeld + +``` +Neem contact op met de gemeente + +En ik zie een "Neem contact op met de gemeente" link +``` + +## Extra Rules + +1. Het document wordt in het Nederlands geschreven. +2. De feature files zijn in Gherkin geschreven. +3. De scenario's zijn standaard vanuit het perspectief van `Partner 1` geschreven. Wanneer het scenario vanuit een ander perspectief is, staat dat in het `Gegeven` codeblock. diff --git a/features/eenvoudig-huwelijk.feature b/features/eenvoudig-huwelijk.feature new file mode 100644 index 00000000..53f18fe2 --- /dev/null +++ b/features/eenvoudig-huwelijk.feature @@ -0,0 +1,4 @@ +# language: nl + +Functionaliteit: Eenvoudig huwelijk/partnerschap +Scenario: \ No newline at end of file diff --git a/features/flits-balie-huwelijk.feature b/features/flits-balie-huwelijk.feature new file mode 100644 index 00000000..221d0e67 --- /dev/null +++ b/features/flits-balie-huwelijk.feature @@ -0,0 +1,4 @@ +# language: nl + +Functionaliteit: Flits- en baliehuwelijk/partnerschap, variant op eenvoudig +Scenario: \ No newline at end of file diff --git a/features/geregistreerd-partnerschap.feature b/features/geregistreerd-partnerschap.feature new file mode 100644 index 00000000..140f0bea --- /dev/null +++ b/features/geregistreerd-partnerschap.feature @@ -0,0 +1,36 @@ +Functionaliteit: Geregistreerd partnerschap +Scenario: Ik wil een geregistreerd partnerschap plannen +Gegeven dat ik ben op de "trouw opties" pagina + En ik zie de heading "Trouwen of geregistreerd partnerschap" + //En ik ben op step "0" + En ik kan een "Geregistreerd partnerschap plannen" button zien +Wanneer ik op de "Geregistreerd partnerschap plannen" button klik +Dan word ik naar de "trouw opties geregistreerd partnerschap" pagina gestuurd + En ik ben op step "2" +#Hypothetisch geval waarin ik vanaf het allereerste begin het +#type bruiloft kan kiezen dat ik wil. +#In dit geval, een Geregistreerd Partnerschap + + +# language: nl + +## step "0" +Functionaliteit: Gratis Geregistreerd Partnerschap +Scenario: Ik wil een geregistreerd partnerschap plannen proces beginnen +Gegeven dat ik ben op de "utrecht huwelijksplanner" pagina + En ik zie de heading "Regel je huwelijk of geregistreerd partnerschap" + //En ik ben op step "0" + En ik kan een "Start" button zien +Wanneer ik op de "Start" button klik +Dan word ik naar de "trouw opties" pagina gestuurd + En ik ben op step "1" + +## step "1" +Scenario: Ik wil een geregistreerd partnerschap als trouw optie kiezen +Gegeven ik ben op de "trouw opties" pagina + En ik zie de heading "Trouwen of geregistreerd partnerschap" + En ik ben op step "1" + En ik kan een "Geregistreerd partnerschap plannen" button zien +Wanneer ik op de "Geregistreerd partnerschap plannen" button klik +Dan word ik naar de "trouw opties geregistreerd partnerschap" pagina gestuurd + En ik ben op step "2" \ No newline at end of file diff --git a/features/landing-pagina.feature b/features/landing-pagina.feature new file mode 100644 index 00000000..b11c6550 --- /dev/null +++ b/features/landing-pagina.feature @@ -0,0 +1,41 @@ +# language: nl +## step "0" +Functionaliteit: Overzicht van huwelijksmogelijkheden +Scenario: Ik wil een huwelijk of geregistreerd partnerschap plannen +Gegeven dat ik ben op de "utrecht huwelijksplanner" pagina + En ik zie de heading "Regel je huwelijk of geregistreerd partnerschap" + En ik kan een "Start" button zien +Wanneer ik op de "Start" button klik +Dan word ik naar de "trouw opties" pagina gestuurd + En ik ben op step "1" + +## step "0" +Functionaliteit: Gratis Huwelijk +Scenario: Ik wil een gratis huwelijk plannen +Gegeven dat ik ben op de "utrecht huwelijksplanner" pagina + En ik zie de heading "Regel je gratis huwelijk" + + En ik kan een "Start" button zien +Wanneer ik op de "Start" button klik +Dan word ik naar de "trouw opties" pagina gestuurd + En ik ben op step "1" + +## step "0" +Functionaliteit: Overzicht van huwelijksmogelijkheden +Scenario: Ik wil een huwelijk of geregistreerd partnerschap plannen +Gegeven dat ik ben op de "utrecht huwelijksplanner" pagina + En ik zie de heading "Regel je huwelijk of geregistreerd partnerschap" + En ik zie een lijst met verwachte stappen voor al de trouwopties + En ik zie een "Meer informatie" infobox + En ik kan een "Start" button zien +Wanneer ik op de "Start" button klik +Dan word ik naar de "trouw opties" pagina gestuurd + En ben ik op step "1" + +#https://utrecht-huwelijksplanner.frameless.io/en +#Hier zou ik kunnen zien: +#wat kan ik verwachten +#waar krijg ik meer informatie +#wat moet ik hebben/weten voor ik begin +#startknop +# NEEDS CLEANING! \ No newline at end of file diff --git a/features/missing.feature b/features/missing.feature new file mode 100644 index 00000000..810aef59 --- /dev/null +++ b/features/missing.feature @@ -0,0 +1,36 @@ +# Waar komt het totaalbedrag van? +# Kan het totaalbedrag niet juist zijn? +# Krijg de gebruiker nooit een prijsverdeling (wat heeft wat gekost)? --> Wishlist + + +# Hoelang blijft de user sessie (met al de informatie) actief? +# -Wat als de user offline gaat? +# -Wat als de user nog niet ingelogd is? +# -Wat als ik bezig was de gemeente aan het contacteren omdat mijn gegevens niet juist op de pagina waren? + +# Als 2 personen dezelfde datum kiezen, wie krijg er het? +# -De persoon dat 0.0001ms eerder heeft geklikt? <- +# -De persoon dat eerst betaalt? + +# Waar is Step 4? + +# Krijg ik een melding (en wanneer) als ik nog niet genoeg getuigen heeft uitgenodigd en de datumgrens nadert? +# Krijg ik een melding dat ik over de datumgrens van de getuigensuitnodigingen ben? +# En wat als de getuigengrens verlopen is maar de aanmeldgrens voor een huwelijk niet + +# Wat gebeurt als mijn betaling mislukt? krijg ik een melding daarover? + +# Wat gebeurt als een getuigen niet wil meedoen? +# - En dan heb ik niet de min 2 getuigen nodig voor de huwelijk. Krijg ik dan meer tijd om een nieuwe getuigen te vinden? + +# Wat gebeurt als ik mijn extra wil annuleren? + +# Wat als de geselecteerde aangeboden extra niet beschikbaar is? + +# iDEAL betaling testen, is dit mogelijk? + +# Gegeven of Stel als keyword gebruiken + +# Gegeven of Stel als keyword gebruiken + + diff --git a/features/test.feature b/features/test.feature new file mode 100644 index 00000000..93ab0ba5 --- /dev/null +++ b/features/test.feature @@ -0,0 +1,642 @@ +# language: nl + +Functionaliteit: Gratis Huwelijk +@e2e +## stap "0" +Scenario: Ik wil een huwelijk plannen proces beginnen +Gegeven dat ik ben op de "utrecht huwelijksplanner" pagina + En ik zie de heading "Regel je huwelijk of geregistreerd partnerschap" + //En ik ben op stap "0" + En ik kan een "Start" button zien +Wanneer ik op de "Start" button klik +Dan word ik naar de "trouw opties" pagina gestuurd + En ik ben op stap 1 + #add quotation marks around the "1" + +## stap "1" +Scenario: Ik wil een huwelijk als trouw optie kiezen +Gegeven dat ik ben op de "/trouw-opties" pagina + En ik zie de heading "Trouwen of geregistreerd partnerschap" + En ik ben op stap "1" + En ik kan een "Trouwen plannen" button zien +Wanneer ik op de "Trouwen plannen" button klik +Dan word ik naar de "trouw opties huwelijk" pagina gestuurd + En ik ben op stap "2" + +## stap "2" +Scenario: Ik wil zien op welk datum ik kan trouwen door op de kalendericoon te klikken +Gegeven dat ik ben op de "trouw opties huwelijk" pagina + En ik zie de heading "Wanneer en Hoe" + En ik ben op stap "2" + En er is een "Trouwdatum" datum prikker op de pagina +Wanneer ik op de kalender icon klik +Dan kan ik de beschikbare trouwdatums zien + +Scenario: Ik wil zien op welk datum ik kan trouwen door een datum in te vullen +Gegeven dat ik ben op de "trouw opties huwelijk" pagina + En ik zie de heading "Wanneer en Hoe" + En ik ben op stap "2" + En er is een "Trouwdatum" datum prikker op de pagina +Wanneer ik het "Trouwdatum" datum prikker gefocussed heb +Dan kan ik een datum handmatig invullen in de "Trouwdatum" datum prikker + En ik kan de beschikbare tijdslots voor de ingevulde datum zien + +Scenario: Ik kan mijn gekozen trouwdatum niet selecteren +Gegeven dat ik ben op de "trouw opties huwelijk" pagina + En ik zie de heading "Wanneer en Hoe" + En ik ben op stap "2" + En er is een "Trouwdatum" datum prikker op de pagina + En ik wil binnen de komende twee weken trouwen + En ik de kalender icon heb geklikt + En ik kan de beschikbare trouwdatums zien +Wanneer ik probeer een niet beschikbaar dag te selecteeren +Dan zie ik dat ik dat dag niet selecteren kan + +Scenario: Ik kan tijdslots voor mijn gekozen trouwdatum niet selecteren +Gegeven dat ik ben op de "trouw opties huwelijk" pagina + En ik zie de heading "Wanneer en Hoe" + En ik ben op stap "2" + En er is een "Trouwdatum" datum prikker op de pagina + En ik wil binnen de komende twee weken trouwen + En ik heb het datum prikker gefocuseerd +Wanneer ik probeer een niet beschikbare dag intevullen +Dan zie ik dat er geen tijdslots checkbox opties op de pagina verschijnen + +Scenario: Ik wil een trouwdatum selecteren +Gegeven dat ik ben op de "trouw opties huwelijk" pagina + En ik zie de heading "Wanneer en Hoe" + En ik ben op stap "2" + En er is een "Trouwdatum" datum prikker op de pagina + En er zijn beschikbare data voor trouwen +Wanneer ik een beschikbare dag selecteer +Dan wordt de datum op de datum prikker gezet + +Scenario: Ik wil een tijdslot selecteren +Gegeven dat ik ben op de "trouw opties huwelijk" pagina + En ik zie de heading "Wanneer en Hoe" + En ik ben op stap "2" + En er is een "Trouwdatum" datum prikker op de pagina + En ik heb een beschikbare dag geselecteerd + En ik zie tijdslot checkbox opties voor trouwen op de geselecteerde dag +Wanneer ik op de gewenste tijdslot checkbox klik +Dan de tijdslot checkbox wordt geselecteerd + +Scenario: Ik wil mijn gewenste tijd een datum bevestigen +Gegeven dat ik ben op de "trouw opties huwelijk" pagina + En ik zie de heading "Wanneer en Hoe" + En ik ben op stap "2" + En er is een "Trouwdatum" datum prikker op de pagina + En ik heb een beschikbare dag geselecteerd + En ik heb een beschikbare tijdslot geselecteerd + En ik kan een "Ja, dit wil ik!" button zien +Wanneer ik op de "Ja, dit wil ik!" button klik +Dan word ik naar de "voorgenomen huwelijk" pagina gestuurd + En ik ben op stap "3" + +Scenario: Ik wil in over een jaar trouwen +Gegeven dat ik ben op de "trouw opties huwelijk" pagina + En ik zie de heading "Wanneer en Hoe" + En ik ben op stap "2" + En er is een "Trouwdatum" datum prikker op de pagina + En ik kan de beschikbare trouwdatums zien +Wanneer ik probeer een datum over een jaar te selecteren +Dan kan ik geen datum selecteren + En ik krijg een melding om een datum tussen een jaar te selecteren + +## stap "3" +Scenario: Ik wil naar de DigID login pagina +Gegeven dat ik ben op de Voorgenomen Huwelijk pagina #Eenvoudig trouwen stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik zie een Inloggen met DigID button +Wanneer ik op de button klikt +Dan ik word naar de DigID login pagina doorgestuurd #stap " " 3 + +Scenario: Ik wil Partner 1 met DigID inloggen +Gegeven dat ik ben op de DigID Login pagina #Inloggen bij DigID stap " " 3 + En Partner 1 heeft een DigID konto + En ik zie de DigID Inloggen interface + En ik zie de DigID inloggen opties buttons #<---Meer info TBD +Wanneer ik klik op een van de inloggen opties +Dan Partner 1 word ingeloggd met DigID + En ik word naar de Persoonsgegevens voor Partner 1 pagina gestuurd + +Scenario: Ik wil de DigID inloggen annuleren +Gegeven dat ik ben op de DigID login pagina #Inloggen bij DigID stap " " 3 + En ik zie de DigID Inloggen interface + En ik zie een Annuleren button +Wanneer ik klik op de Annuleren button +Dan ik word teruggestuurd naar de Voorgenomen Huwelijk pagina + +Scenario: Ik wil een DigID konto hebben +Gegeven dat ik ben op de DigID Login pagina #Inloggen bij DigID stap " " 3 + En ik heb geen DigID konto + En ik zie de Nog geen DigID? Vraag uw DigiD aan link op de pagina +Wanneer ik klik op de link +Dan ik word naar een pagina waarin ik een DigID kan krijgen gestuurd + +Scenario: Ik wil de basisgegevens van Partner 1 bevestigen +Gegeven dat ik ben op de Persoonsgegevens voor Partner 1 pagina # stap " " 3 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En De persoonsgegevens van Partner 1 zijn juist + En De adresgegevens van Partner 1 zijn juist + +Scenario: De basis gegevens van Partner 1 kloppen niet +Gegeven dat ik ben op de Persoonsgegevens voor Partner 1 pagina #Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En De basisgegevens van Partner 1 zijn niet juist + En ik zie een Neem contact op met de gemeente link +Wanneer ik op de Neem contact op met de gemeente link klikt +Dan ik word naar de Persoonsgegevens opvragen of aanpassen (BRP) pagina gestuurd + +Scenario: Ik wil het telefoonnummer van Partner 1 invullen +Gegeven dat ik ben op de Persoonsgegevens voor Partner 1 pagina #Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En ik zie een input field voor het telefoonnummer van Partner 1 +Wanneer ik in de input field het telefoonnummer van Partner 1 invullt +Dan Het ingevulde nummer wordt gecontroleerd voor geldigheid + +Scenario: Ik wil het telefoonnummer van Partner 1 bewerken +Gegeven dat ik ben op de Persoonsgegevens voor Partner 1 pagina #Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En ik zie een input field voor het telefoonnummer van Partner 1 + En ik heb al een nummer in de input field ingevuld +Wanneer ik in de input field klik +Dan Kan ik het ingevulde nummer bewerken + En Het ingevulde nummer wordt gecontroleerd voor geldigheid + +Scenario: Ik wil de email van Partner 1 invullen +Gegeven dat ik ben op de Persoonsgegevens pagina #Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En ik zie een input field voor de email van Partner 1 +Wanneer ik in de input field de email van Partner 1 invullt +Dan Het ingevulde email wordt gecontroleerd voor geldigheid + +Scenario: Ik wil de email van Partner 1 bewerken +Gegeven dat ik ben op de Persoonsgegevens pagina #Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En ik zie een input field voor de email van Partner 1 + En ik heb al een email in de input field ingevuld +Wanneer ik in de input field klik +Dan Kan ik het ingevulde email bewerken + En Het ingevulde email wordt gecontroleerd voor geldigheid + +Scenario: Ik Partner 1 wil verklaren dat ik niet getrouwd ben +Gegeven dat ik ben op de Persoonsgegevens pagina #Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En ik zie een checkbox voor de alleenstaand verklaring van Partner 1 +Wanneer ik op de checkbox klikt +Dan Het checkbox wordt ingevuld + +Scenario: Ik Partner 1 wil mijn alleenstaand verklaring terugnemen +Gegeven dat ik ben op de Persoonsgegevens pagina #Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En ik zie een getikte checkbox voor de alleenstaand verklaring van Partner 1 +Wanneer ik op de checkbox klikt +Dan Het checkbox wordt leeg + +Scenario: Ik Partner 1 wil verklaren dat ik niet binnen mijn familie ga trouwen +Gegeven dat ik ben op de Persoonsgegevens pagina #Melding Voorgenomen Huwelijk stap " " 3 + En ik zie een checkbox voor de niet familie trouwen verklaring voor Partner 1 +Wanneer ik op de checkbox klikt +Dan Het checkbox wordt ingevuld + +Scenario: Ik Partner 1 wil mijn verklaring dat ik niet binnen mijn familie ga trouwen terugnemen +Gegeven dat ik ben op de Persoonsgegevens pagina #Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En ik zie een getikte checkbox voor de niet familie trouwen verklaring van Partner 1 +Wanneer ik op de checkbox klikt +Dan Het checkbox wordtleeg + +Scenario: Ik Partner 1 wil iemand in mijn familie trouwen +Gegeven dat ik ben op de Persoonsgegevens pagina #Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En ik zie een checkbox voor de niet familie trouwen verklaring van Partner 1 + En ik zie een Meer Informatie sectie met contactmogelijkheden links +Wanneer ik op de Bel 14 030 link klikt +Dan ik neem contact met de gemeente zodat ik Partner 1 een familieleden kan trouwen + +Scenario: Ik Partner 1 wil iemand in mijn familie trouwen +Gegeven dat ik ben op de Persoonsgegevens pagina #Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En ik zie een checkbox voor de niet familie trouwen verklaring van Partner 1 + En ik zie een Meer Informatie sectie met contactmogelijkheden links +Wanneer ik op de Chat met ons link klikt +Dan ik neem contact met de gemeente zodat ik Partner 1 een familieleden kan trouwen + +Scenario: Ik Partner 1 wil al de gegevens in het formulier bevestigen +Gegeven dat ik ben op de Persoonsgegevens pagina #Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En ik zie een checkbox voor de gegevensbevestiging van Partner 1 + En Al de ingevulde gegevens in het formulier kloppen +Wanneer ik op de gegevensbevestiging checkbox klikt +Dan Het checkbox wordt ingevuld + +Scenario: Ik Partner 1 wil mijn bevestiging dat al de gegevens in het formulier kloppen terugnemen +Gegeven dat ik ben op de Persoonsgegevens pagina #Melding Voorgenomen Huwelijk stap " " 3 + En ik zie een ingevulde checkbox voor de gegevensbevestiging van Partner 1 +Wanneer ik op de checkbox klikt +Dan De checkbox wordt leeg + +Scenario: Ik Partner 1 wil mijn contactgegevens opslaan +Gegeven dat ik ben op de Persoonsgegevens pagina #Melding Voorgenomen Huwelijk stap " " 3 + #En ik heb al mijn contactgegevens ingevuld + En ik heb al de verklaring checkboxes ingevuld + En ik heb de gegevensbevestiging checkbox ingevuld + En ik zie een Contactgegevens opslaan button +Wanneer ik op de Contactgegevens opslaan button klikt +Dan ik word naar de Voorgenomen Huwelijk Partner pagina gestuurd + +Scenario: Ik Partner 1 wil mijn contactgegevens opslaan +Gegeven dat ik ben op de Persoonsgegevens pagina #Melding Voorgenomen Huwelijk stap " " 3 + #En ik heb al mijn contactgegevens ingevuld + En ik zie de verklaring en bevestiging checkboxes op de pagina + En ik heb nog niet de allenstand verklaring checkbox ingevuld + En ik zie een Contactgegevens opslaan button +Wanneer ik op de Contactgegevens opslaan button klikt +Dan ik krijg een Please tick this box if you want to proceed popup #Wat is de naam van dit in het Nederlands? + +Scenario: Ik Partner 1 wil mijn contactgegevens opslaan +Gegeven dat ik ben op de Persoonsgegevens pagina #Melding Voorgenomen Huwelijk stap " " 3 + #En ik heb al mijn contactgegevens ingevuld + En ik zie de verklaring en bevestiging checkboxes op de pagina + En ik heb nog niet de allenstand verklaring checkbox ingevuld + En ik zie een Contactgegevens opslaan button + En ik heb de Contactgegevens opslaan button geklikt + En ik heb een Please tick this box if you want to proceed popup gekgregen +Wanneer ik op de allenstand verklaring checkbox klikt +Dan De alleenstaand verklaring checkbox wordt ingevuld #Wat is de naam van dit in het Nederlands? + + +Scenario: Ik Partner 1 wil mijn contactgegevens opslaan +Gegeven dat ik ben op de Persoonsgegevens pagina #Melding Voorgenomen Huwelijk stap " " 3 + #En ik heb al mijn contactgegevens ingevuld + En ik zie de verklaring en bevestiging checkboxes op de pagina + En ik heb nog niet de verklaring dat ik niet binnen mijn familie ga trouwen checkbox ingevuld + En ik zie een Contactgegevens opslaan button +Wanneer ik op de Contactgegevens opslaan button klikt +Dan ik krijg een Please tick this box if you want to proceed popup #Wat is de naam van dit in het Nederlands? + +Scenario: Ik Partner 1 wil mijn contactgegevens opslaan +Gegeven dat ik ben op de Persoonsgegevens pagina #Melding Voorgenomen Huwelijk stap " " 3 + #En ik heb al mijn contactgegevens ingevuld + En ik zie de verklaring en bevestiging checkboxes op de pagina + En ik heb nog niet de verklaring dat ik niet binnen mijn familie ga trouwen checkbox ingevuld + En ik zie een Contactgegevens opslaan button + En ik heb de Contacgegevens opslaan button geklikt + En ik heb een Please tick this box if you want to proceed popup gekgregen +Wanneer ik op de verklaring dat ik niet binnen mijn familie ga trouwen verklaring checkbox klikt +Dan De verklaring dat ik niet binnen mijn familie ga trouwen checkbox wordt ingevuld #Wat is de naam van dit in het Nederlands? + +Scenario: Ik Partner 1 wil mijn contactgegevens opslaan +Gegeven dat ik ben op de Persoonsgegevens pagina #Melding Voorgenomen Huwelijk stap " " 3 + #En ik heb al mijn contactgegevens ingevuld + En ik zie de verklaring en bevestiging checkboxes op de pagina + En ik heb nog niet de bevestiging dat al de gegevens in het formulier kloppen checkbox ingevuld + En ik zie een Contactgegevens opslaan button +Wanneer ik op de Contactgegevens opslaan button klikt +Dan ik krijg een Please tick this box if you want to proceed popup #Wat is de naam van dit in het Nederlands? + +Scenario: Ik Partner 1 wil mijn contactgegevens opslaan +Gegeven dat ik ben op de Persoonsgegevens pagina #Melding Voorgenomen Huwelijk stap " " 3 + #En ik heb al mijn contactgegevens ingevuld + En ik zie de verklaring en bevestiging checkboxes op de pagina + En ik heb nog niet de bevestiging dat al de gegevens in het formulier kloppen checkbox ingevuld + En ik zie een Contactgegevens opslaan button + En ik heb de Contacgegevens opslaan button geklikt + En ik heb een Please tick this box if you want to proceed popup gekgregen +Wanneer ik op de bevestiging dat al de gegevens in het formulier kloppen checkbox klikt +Dan De bevestiging dat al de gegevens in het formulier kloppen checkbox wordt ingevuld #Wat is de naam van dit in het Nederlands? + +Scenario: Ik wil Partner 2 voor de huwelijk melden +Gegeven dat ik ben op de Persoonsgegevens pagina #Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En ik zie een Partner inloggen met DigID button +Wanneer ik op de Partner inloggen met DigID button klikt +Dan ik word naar de DigIDlogin pagina doorgestuurd #stap " " 3 +#-----!!! +Scenario: Ik wil Partner 2 met DigID inloggen +Gegeven dat ik ben op de DigID login pagina #Inloggen bij DigID stap " " 3 +Wanneer ik login met een DigID konto + En Het is een ander login als dat van partner 1 +Dan Mijn partner wordt ingeloggd met DigID +!!! +Scenario: Ik wil Partner 1 met DigID inloggen +Gegeven dat ik ben op de DigID Login pagina #Inloggen bij DigID stap " " 3 + En Partner 1 heeft een DigID konto + En ik zie de DigID Inloggen interface + En ik zie de DigID inloggen opties buttons #<---Meer info TBD +Wanneer ik klik op een van de inloggen opties +Dan Partner 1 word ingeloggd met DigID + En ik word naar de Persoonsgegevens voor Partner 1 pagina gestuurd + +Scenario: Ik wil mijn partner voor de huwelijk melden!!! +Gegeven dat ik ben op de Persoonsgegevens pagina #Eenvoudig trouwen stap " " 3 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En ik zie een mail een uitnodiging aan je partner link +Wanneer ik op de link klikt +Dan ik word naar de Partner Uitnodigen pagina doorgestuurd #stap " " 3 + +Scenario: Ik wil mijn partners gegevens invullen voor een DigID login uitnodiging +Gegeven dat ik ben op de Partner Uitnodigen pagina #Eenvoudig trouwen stap " " 3 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En ik zie een name input field + En ik zie een email input field + En ik zie een Verstuur uitnodiging button +Wanneer ik de input fields invul +Dan Word de ingevulde informatie laten zien op de input fields #stap " " 3 + +Scenario: Ik wil mijn partner een uitnodiging voor een DigID login sturen +Gegeven dat ik ben op de Partner Uitnodigen pagina #Eenvoudig trouwen stap " " 3 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En ik heb de partner gegevens input fields ingevuld +Wanneer ik op de Verstuur uitnodiging button klik +Dan Word een uitnodiging voor en DigID login email naar mijn partner gestuurd + En ik word naar de Partner Success pagina gestuurd #stap " " 3 + +Scenario: Ik wil mijn email bekijken +Gegeven dat ik ben op de Partner Success pagina #Eenvoudig trouwen stap " " 3 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En ik zie een text waarin staat we wachten voor de login van partner 2 + En ik zie een button Bekijk e-mail voor aanvrager +Wanneer ik op de button klikt +Dan ik word naar de Aanvrager email pagina gestuurd #stap " " 3 + +Scenario: Ik wil met de huwelijksaanvraag doorgaan +Gegeven dat ik ben op de Aanvrager email pagina #Eenvoudig trouwen stap " " 3 + En ik zie de correcte naam van partner 1 + En ik zie een button Doorgaan huwelijksaanvraag +Wanneer ik op de button klikt +Dan ik word naar de Getuigen pagina gestuurd#stap " " 3 + +Scenario: Ik wil de email van mijn partner bekijken +Gegeven dat ik ben op de Partner Success pagina #Eenvoudig trouwen stap " " 3 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En ik zie een text waarin staat we wachten voor de login van partner 2 + En ik zie een button Bekijk e-mail voor partner +Wanneer ik op de button klikt +Dan ik word naar de Invitation Email Partner pagina gestuurd #stap " " 3 + +Scenario: Partner 2 met DigID inloggen +Gegeven dat ik ben op de Invitation Email Partner pagina #Eenvoudig trouwen stap " " 3 + En ik zie de correcte naam van partner 2 + En ik zie een button Inloggen met DigID +Wanneer ik op de button klikt +Dan ik word naar de DigIDlogin pagina doorgestuurd #stap " " 3 + +Scenario: Ik wil een DigID inloggen uitnodiging per email naar partner 2 stuuren +Gegeven dat ik ben op de Persoonsgegevens pagina voor Partner 2 #Eenvoudig trouwen stap " " 3 + En ik zie een name input field + En ik zie een email input field +Wanneer ik de gegevens van partner 2 invul +Dan Het getypte email wordt gecontroleerd voor geldigheid #stap " " 3 + En ik krijg een bevestiging dat de e-mail is verzonden + +!!!!! +Scenario: Ik, Partner 2, wil mijn basisgegevens bevestigen*** +Gegeven dat ik ben op de Persoonsgegevens pagina voor Partner 2 #Eenvoudig trouwen stap " " 3 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En Mijn persoonsgegevens zijn juist + En Mijn adresgegevens zijn juist + +Scenario: Ik, Partner 2, wil mijn gegevens bevestigen +Gegeven dat ik ben op de Persoonsgegevens pagina voor Partner 2 #Eenvoudig trouwen stap " " 3 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En Mijn gegevens zijn niet juist +Wanneer ik op Neem contact op met de gemeente klikt +Dan ik word naar een pagina waarin ik mijn gegevens kan laten bekend zijn gestuurd + +Scenario: Ik, Partner 2, wil mijn telefoonnummer invullen +Gegeven dat ik ben op de Persoonsgegevens pagina voor Partner 2 #Eenvoudig trouwen stap " " 3 + En ik zie een input field voor mijn telefoonnummer +Wanneer ik in een input field mijn telefoonnummer invul +Dan Het getypte nummer wordt gecontroleerd voor geldigheid + +Scenario: Ik, Partner 2, wil mijn email invullen +Gegeven dat ik ben op de Persoonsgegevens pagina voor Partner 2 #Eenvoudig trouwen stap " " 3 + En ik zie een input field voor mijn email +Wanneer ik in een input field mijn email invul +Dan De getypte email wordt gecontroleerd voor geldigheid + +Scenario: Ik, Partner 2, wil verklaren dat ik niet getrouwd ben +Gegeven dat ik ben op de Persoonsgegevens pagina voor Partner 2 #Eenvoudig trouwen stap " " 3 + En ik zie een checkbox voor de alleenstaEn verklaring +Wanneer ik op de checkbox tikt +Dan Het checkbox wordt ingevuld + +Scenario: Ik, Partner 2, wil verklaren dat ik niet binnen mijn familie ga trouwen +Gegeven dat ik ben op de Persoonsgegevens pagina voor Partner 2 #Eenvoudig trouwen stap " " 3 + En ik zie een checkbox voor de niet familie trouwen verklaring +Wanneer ik op de checkbox tikt +Dan Het checkbox wordt ingevuld + +Scenario: Ik, Partner 2, wil iemand in mijn familie trouwen +Gegeven dat ik ben op de Persoonsgegevens pagina voor Partner 2#Eenvoudig trouwen stap " " 3 + En ik zie een checkbox voor de niet familie trouwen verklaring + En ik zie een Meer Informatie sectie met contactmogelijkheden links +Wanneer ik op een van de contactmogelijkehen links klikt +Dan ik neem contact met de gemeente om mijn familieleden te kunnen trouwen + +Scenario: Ik, Partner 2, wil al de gegevens in het formulier bevestigen +Gegeven dat ik ben op de Persoonsgegevens pagina voor Partner 2 #Eenvoudig trouwen stap " " 3 + En Al de ingevulde gegevens in het formulier kloppen +Wanneer ik op de gegevensbevestiging checkbox tikt +Dan Het checkbox wordt ingevuld + +Scenario: Ik, Partner 2, wil mijn contactgegevens opslaan +Gegeven dat ik ben op de Persoonsgegevens pagina voor Partner 2 #Eenvoudig trouwen stap " " 3 + En ik heb al mijn contactgegevens ingevuld + En ik heb al de verklering checkboxes getikt +Wanneer ik op de Contactgegevens opslaan button klikt +Dan ik word naar een pagina waarin ik kan bevestigen de gegevens van Partner 2 zijn gekoppeld met die van Partner 1 gestuurd + +Scenario: Gekoppeling van gegevens bevestigen +Gegeven dat ik ben op de Persoonsgegevens Succes pagina voor Partner 2 #Eenvoudig trouwen stap " " 3 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En ik zie de kosten voor de huwelijk + En ik zie een text waar het staat de gegevens van de twee partners aijn gekoppeld + + +Scenario: Ik, wil getuigen uitnodigen +Gegeven dat ik ben op de Persoonsgegevens Succes pagina voor Partner 2 #Eenvoudig trouwen stap " " 3 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En ik zie de kosten voor de huwelijk + En ik zie een text waar het staat de gegevens van de twee partners aijn gekoppeld +Wanneer ik op de Nodig getuigen uit button klikt +Dan ik word naar de Getuigen pagina gestuurd#stap " " 3 + +Scenario: Getuigen gegevens invullen +Gegeven dat ik ben op de Getuigen pagina #Eenvoudig trouwen stap " " 3 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En ik zie de kosten voor de huwelijk + En ik zie tussen 2 en 4 input field sets voor de namen en emails van de getuigen +Wanneer ik in een input field klik +Dan Kan ik de input fields met de gegevens van de getuigen invullen #stap " " 3 + +Scenario: Getuigens email controlleren +Gegeven dat ik ben op de Getuigen pagina #Eenvoudig trouwen stap " " 3 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En ik zie de kosten voor de huwelijk + En ik zie tussen 2 en 4 input field sets voor de namen en emails van de getuigen +Wanneer ik in een input field klik +Dan Kan ik de gegevens van de getuigen invullen #stap " " 3 + En De getypte email wordt gecontroleerd voor geldigheid + +Scenario: Verzenden van getuigen uitnodigingen +Gegeven dat ik ben op de Getuigen pagina #Eenvoudig trouwen stap " " 3 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En ik zie de kosten voor de huwelijk + En ik heb tenminste 1 paar van input fields ingevuld + En De ingevulde email is geldig +Wanneer ik op de Verstuur uitnodiging button klikt +Dan ik word naar de Getuigen Succes pagina gestuurd #stap " " 3 + +Scenario: Ik wil de gemeente laten mijn huwelijks verzoek checken +Gegeven dat ik ben op de Getuigen Succes pagina #Eenvoudig trouwen stap " " 3 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En ik zie de kosten voor de huwelijk +Wanneer ik op de Laat de gemeente checken en ga betalen button klikt +Dan ik word naar de Voorgenomen Huwelijk Checken pagina gestuurd #stap " " 3 +#Hoelang moet man wachten? Ga ik direct naar de volgende pagina zoals bij de draft website? Wat gebeurt als er iets mis is (email, phonecall, anders)? +#-----!!! +Scenario: Ik wil voor mij huwelijk betalen +Gegeven dat ik ben op de Voorgenomen Huwelijk Checken pagina #Eenvoudig trouwen stap " " 3 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En ik zie de kosten voor de huwelijk +Wanneer ik op de Ga betalen button klikt +Dan ik word naar de Voorgenomen Huwelijk Betalen pagina gestuurd #stap " " 3 + +Scenario: Ik wil met iDEAL voor mij huwelijk betalen +Gegeven dat ik ben op de Voorgenomen Huwelijk Betalen pagina #Eenvoudig trouwen stap " " 3 + En ik zie Gemeente Utrecht als de korrekte begunstigde + En ik zie de kosten voor de huwelijk +Wanneer ik op de icoon van mijn bank X klikt +Dan ik word naar de X bank betaling pagina gestuurd #stap " " 3 + +Scenario: Ik wil mijn betaling with bank X voltooien +Gegeven dat ik ben op de Betalen Succes pagina #Eenvoudig trouwen stap " " 3 + En X + En X +Wanneer X +Dan ik word naar de X bank betaling pagina gestuurd #stap " " 3 + +Scenario: Ik wil mijn huwelijk betaling ontvangen bevestigen +Gegeven dat ik ben op de Betalen Succes pagina #Eenvoudig trouwen stap " " 5 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En ik zie de kosten voor de huwelijk + En ik zie als text GELUKT Betaling ontvangen + +Scenario: Ik wil informatie over het Stadskantoor Utrecht locatie +Gegeven dat ik ben op de Betalen Succes pagina #Eenvoudig trouwen stap " " 5 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En ik zie de kosten voor de huwelijk + En ik zie als text GELUKT Betaling ontvangen +Wanneer ik op de link Stadskantoor Utrecht link klikt +Dan ik word naar de Contact Stadskantoor pagina gestuurd #stap " " 5 + +Scenario: Ik wil de huwelijk annuleeren +Gegeven dat ik ben op de Betalen Succes pagina #Eenvoudig trouwen stap " " 5 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En ik zie de kosten voor de huwelijk + En ik zie als text GELUKT Betaling ontvangen +Wanneer ik op de Annuleer huwelijk link klikt +Dan ik word naar de Huwelijksplanner Cancel pagina gestuurd #stap " " 5 + +Scenario: Ik wil de huwelijksreservering annuleeren +Gegeven dat ik ben op de Huwelijksplanner Cancel pagina #Eenvoudig trouwen stap " " 5 +Wanneer ik op de Annuleer reservering button klikt +Dan ik word naar de "Annuleer reservering bevestiging" pagina gestuurd #stap " " 5 + +Scenario: Ik wil de huwelijksreservering annuleeren +Gegeven dat ik ben op de Huwelijksplanner Cancel pagina #Eenvoudig trouwen stap " " 5 +Wanneer ik op de Nee, ik wil terug naar het overzicht button klikt +Dan ik word naar de Betalen Succes pagina gestuurd #stap " " 5 + +Scenario: Ik wil de gegevens van Partner 1 aanpassen +Gegeven dat ik ben op de Betalen Succes pagina #Eenvoudig trouwen stap " " 5 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En ik zie de kosten voor de huwelijk + En ik zie als text GELUKT Betaling ontvangen +Wanneer ik op een van de Aanpassen links van de contactgegevens van Partner 1 klikt +Dan ik word naar de Persoonsgegevens voor Partner 1 pagina gestuurd # stap " " 3 + +Scenario: Ik wil terug gaan naar de Melding Voorgenomen Huwelijk pagina gaan +Gegeven dat ik ben op de Persoonsgegevens voor Partner 1 pagina #Eenvoudig trouwen stap " " 3 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En ik heb voor de huwelijk al betaald + En ik zie een link Ga terug naar de Melding Voorgenomen Huwelijk pagina +Wanneer ik op de Ga terug naar de Melding Voorgenomen Huwelijk pagina klikt +Dan ik word naar de Betalen Succes pagina gestuurd # stap " " 5 + +Scenario: Ik wil de gegevens van Partner 2 aanpassen +Gegeven dat ik ben op de Betalen Succes pagina #Eenvoudig trouwen stap " " 5 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En ik zie de kosten voor de huwelijk + En ik zie als text GELUKT Betaling ontvangen +Wanneer ik op een van de Aanpassen links van de contactgegevens van Partner 2 klikt +Dan ik word naar de Persoonsgegevens voor Partner 2 pagina gestuurd # stap " " 3 + +Scenario: Ik wil terug gaan naar de Melding Voorgenomen Huwelijk pagina gaan +Gegeven dat ik ben op de Persoonsgegevens voor Partner 2 pagina #Eenvoudig trouwen stap " " 3 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En ik heb voor de huwelijk al betaald + En ik zie een link Ga terug naar de Melding Voorgenomen Huwelijk pagina +Wanneer ik op de Ga terug naar de Melding Voorgenomen Huwelijk pagina klikt +Dan ik word naar de Betalen Succes pagina gestuurd # stap " " 5 + +Scenario: Ik wil de gegevens van getuige 1 aanpassen +Gegeven dat ik ben op de Betalen Succes pagina #Eenvoudig trouwen stap " " 5 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En ik zie de kosten voor de huwelijk + En ik zie als text GELUKT Betaling ontvangen +Wanneer ik op een van de Aanpassen links van de contactgegevens van Getuigen 1 klikt +Dan ik word naar de Getuigen pagina gestuurd # stap " " 3 + En De gegeven van getuig 1 verwezen door de geklikte link wordt gefocuseerd + +Scenario: Ik wil de gegevens van getuige 2 aanpassen +Gegeven dat ik ben op de Betalen Succes pagina #Eenvoudig trouwen stap " " 5 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En ik zie de kosten voor de huwelijk + En ik zie als text GELUKT Betaling ontvangen +Wanneer ik op een van de Aanpassen links van de contactgegevens van Getuigen 1 klikt +Dan ik word naar de Getuigen pagina gestuurd # stap " " 3 + En De gegeven van getuig 2 verwezen door de geklikte link wordt gefocuseerd + +Scenario: Ik wil de gegevens van getuige 3 aanpassen +Gegeven dat ik ben op de Betalen Succes pagina #Eenvoudig trouwen stap " " 5 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En ik zie de kosten voor de huwelijk + En ik zie als text GELUKT Betaling ontvangen + En Er zijn contactgegevens voorhanden voor Getuig 3 +Wanneer ik op een van de Aanpassen links van de contactgegevens van Getuigen 1 klikt +Dan ik word naar de Getuigen pagina gestuurd # stap " " 3 + En De gegeven van getuig 3 verwezen door de geklikte link wordt gefocuseerd + +Scenario: Ik wil de gegevens van getuige 4 aanpassen +Gegeven dat ik ben op de Betalen Succes pagina #Eenvoudig trouwen stap " " 5 + En ik zie de korrekte vroeger geselecteerde tijd een datum combinatie + En ik zie de kosten voor de huwelijk + En ik zie als text GELUKT Betaling ontvangen + En Er zijn contactgegevens voorhanden voor Getuig 4 +Wanneer ik op een van de Aanpassen links van de contactgegevens van Getuigen 1 klikt +Dan ik word naar de Getuigen pagina gestuurd # stap " " 3 + En De gegeven van getuig 3 verwezen door de geklikte link wordt gefocuseerd + +*Should there be a version of this for partner 1 and another for Partner 2?? +line 235 partner 2 +* is the getuig uitnodiging pagina voor elk partner anders? IT'S THE SAME +* witnesses webpage does not allow input +-- +* If I right click open a button, will my data still be there in the new window? ScenarioGUERKIN ANNOTATIONS POSSIBLE ?? +* line 340 ?? missing part is automatic part is "manual 1 pag succes one page niet succes page wait pagina" +cancel extra boekje goedkopere huwelijk voor elk los ding scenario +* line X hoe kan ik mijn betaling cancellen? +* line 377 english version says Cancel de ceremony, dutch version says Annuleer huwelijk :/ +* line 382 shouldn't it say " Annuleer huwelijk reservering" instead? like in the next scenario WEIRD INFO STILL THERE DATE COMES LATER +* line 391 links 404 +* back to wedding extras... +write as i would it expect it to be +aanpassen links to specif related page linked +#not real sites between "" +*line 395 zou dit linken aan de vorige pagina van stap 3? want dan moet man nog een keer al de andere stapen doorlopen PLUS, man komt terug naar de betaling pagina, maar mat heeft al betaald +* line 427 getuigen wat als de user de gegevens voor getuigens 1 en 3 of 3 en 4 invuuld (not in order)? mag dat? worden de getuigen geregistreerd als 3 en 4 of worden ze gemaakt naar 1 en 2? +* line 18 andere feature file for geregistreerde partnerschap??? \ No newline at end of file diff --git a/features/testnl.feature b/features/testnl.feature new file mode 100644 index 00000000..ae33f0f4 --- /dev/null +++ b/features/testnl.feature @@ -0,0 +1,727 @@ +# language: nl +Functionaliteit: Gratis Huwelijk + +## stap "0" +@e2e +Scenario: Ik wil een huwelijk plannen proces beginnen +Gegeven dat ik op de "utrecht huwelijksplanner" pagina ben + En ik zie de heading "Regel je huwelijk of geregistreerd partnerschap" + #En ik ben op stap "0" + En ik kan een "Start" button zien +Wanneer ik op de "Start" button klik +Dan word ik naar de "trouw opties" pagina gestuurd + En ik ben op stap 1 + #add quotation marks around the "1" + +## stap "1" +Scenario: Ik wil een huwelijk als trouw optie kiezen +Gegeven ik ben op de "/trouw-opties" pagina + En ik zie de heading "Trouwen of geregistreerd partnerschap" + En ik ben op stap "1" + En ik kan een "Trouwen plannen" button zien +Wanneer ik op de "Trouwen plannen" button klik +Dan word ik naar de "trouw opties huwelijk" pagina gestuurd + En ik ben op stap "2" + +## stap "2" +Scenario: Ik wil zien op welk datum ik kan trouwen door op de kalendericoon te klikken +Gegeven ik ben op de "trouw opties huwelijk" pagina + En ik zie de heading "Wanneer en Hoe" + En ik ben op stap "2" + En er is een "Trouwdatum" datum prikker op de pagina +Wanneer ik op de kalender icon klik +Dan kan ik de beschikbare trouwdatums zien + +Scenario: Ik wil zien op welk datum ik kan trouwen door een datum in te vullen +Gegeven ik ben op de "trouw opties huwelijk" pagina + En ik zie de heading "Wanneer en Hoe" + En ik ben op stap "2" + En er is een "Trouwdatum" datum prikker op de pagina +Wanneer ik het "Trouwdatum" datum prikker gefocust heb +Dan kan ik een datum handmatig invullen in de "Trouwdatum" datum prikker + En ik kan de beschikbare tijdsloten voor de ingevulde datum zien + +Scenario: Ik kan mijn gekozen trouwdatum niet selecteren +Gegeven ik ben op de "trouw opties huwelijk" pagina + En ik zie de heading "Wanneer en Hoe" + En ik ben op stap "2" + En er is een "Trouwdatum" datum prikker op de pagina + En ik wil binnen de komende twee weken trouwen + En ik de kalender icon heb geklik + En ik kan de beschikbare trouwdatums zien +Wanneer ik probeer een niet beschikbare dag te selecteren +Dan zie ik dat ik dat dag niet selecteren kan + +Scenario: Ik kan tijdsloten voor mijn gekozen trouwdatum niet selecteren +Gegeven ik ben op de "trouw opties huwelijk" pagina + En ik zie de heading "Wanneer en Hoe" + En ik ben op stap "2" + En er is een "Trouwdatum" datum prikker op de pagina + En ik wil binnen de komende twee weken trouwen + En ik heb de datum prikker geopend +Wanneer ik probeer een niet beschikbare dag in te vullen +Dan zie ik dat er geen tijdsloten checkbox opties op de pagina verschijnen + +Scenario: Ik wil een trouwdatum selecteren +Gegeven ik ben op de "trouw opties huwelijk" pagina + En ik zie de heading "Wanneer en Hoe" + En ik ben op stap "2" + En er is een "Trouwdatum" datum prikker op de pagina + En er zijn beschikbare data voor trouwen +Wanneer ik een beschikbare dag selecteer +Dan wordt de datum op de datum prikker gezet + +Scenario: Ik wil een tijdslot selecteren +Gegeven ik ben op de "trouw opties huwelijk" pagina + En ik zie de heading "Wanneer en Hoe" + En ik ben op stap "2" + En er is een "Trouwdatum" datum prikker op de pagina + En ik heb een beschikbare dag geselecteerd + En ik zie tijdslot checkbox opties voor trouwen op de geselecteerde dag +Wanneer ik op de gewenste tijdslot checkbox klik +Dan de tijdslot checkbox wordt geselecteerd + +Scenario: Ik wil mijn gewenste tijd en datum bevestigen +Gegeven ik ben op de "trouw opties huwelijk" pagina + En ik zie de heading "Wanneer en Hoe" + En ik ben op stap "2" + En er is een "Trouwdatum" datum prikker op de pagina + En ik heb een beschikbare dag geselecteerd + En ik heb een beschikbare tijdslot geselecteerd + En ik kan een "Ja, dit wil ik!" button zien +Wanneer ik op de "Ja, dit wil ik!" button klik +Dan word ik naar de "voorgenomen huwelijk" pagina gestuurd + En ik ben op stap "3" + +Scenario: Ik wil in over een jaar trouwen +Gegeven ik ben op de "trouw opties huwelijk" pagina + En ik zie de heading "Wanneer en Hoe" + En ik ben op stap "2" + En er is een "Trouwdatum" datum prikker op de pagina + En ik kan de beschikbare trouwdatums zien +Wanneer ik probeer een datum over een jaar te selecteren +Dan kan ik geen datum selecteren + En ik krijg een melding om een datum tussen een jaar te selecteren + +## stap "3" +Scenario: Ik wil naar de DigID login pagina +Gegeven ik ben op de Voorgenomen Huwelijk pagina #Eenvoudig trouwen stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik zie een Inloggen met DigID button +Wanneer ik op de button klik +Dan ik word naar de DigID login pagina doorgestuurd +# stap " " 3 + +Scenario: Ik wil Partner 1 met DigID inloggen +Gegeven ik ben op de DigID Login pagina +# Inloggen bij DigID stap " " 3 + En Partner 1 heeft een DigID + En ik zie de DigID Inloggen interface + En ik zie de DigID inloggen opties buttons +# <---Meer info TBD +Wanneer ik klik op een van de inloggen opties +Dan Partner 1 word ingelogd met DigID + En ik word naar de Persoonsgegevens voor Partner 1 pagina gestuurd + +Scenario: Ik wil de DigID inloggen annuleren +Gegeven ik ben op de DigID login pagina +# Inloggen bij DigID stap " " 3 + En ik zie de DigID Inloggen interface + En ik zie een Annuleren button +Wanneer ik klik op de Annuleren button +Dan ik word teruggestuurd naar de Voorgenomen Huwelijk pagina + +Scenario: Ik wil een DigID hebben +Gegeven ik ben op de DigID Login pagina +# Inloggen bij DigID stap " " 3 + En ik heb geen DigID + En ik zie de Nog geen DigID? Vraag uw DigiD aan link op de pagina +Wanneer ik klik op de link +Dan ik word naar een pagina waarin ik een DigID kan krijgen gestuurd + +Scenario: Ik wil de basisgegevens van Partner 1 bevestigen +Gegeven ik ben op de Persoonsgegevens voor Partner 1 pagina +# stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En De persoonsgegevens van Partner 1 zijn juist + En De adresgegevens van Partner 1 zijn juist + +Scenario: De basis gegevens van Partner 1 kloppen niet +Gegeven ik ben op de Persoonsgegevens voor Partner 1 pagina +# Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En De basisgegevens van Partner 1 zijn niet juist + En ik zie een Neem contact op met de gemeente link +Wanneer ik op de Neem contact op met de gemeente link klik +Dan ik word naar de Persoonsgegevens opvragen of aanpassen (BRP) pagina gestuurd + +Scenario: Ik wil het telefoonnummer van Partner 1 invullen +Gegeven ik ben op de Persoonsgegevens voor Partner 1 pagina +# Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik zie een input field voor het telefoonnummer van Partner 1 +Wanneer ik in de input field het telefoonnummer van Partner 1 invul +Dan Het ingevulde nummer wordt gecontroleerd voor geldigheid + +Scenario: Ik wil het telefoonnummer van Partner 1 bewerken +Gegeven ik ben op de Persoonsgegevens voor Partner 1 pagina +# Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik zie een input field voor het telefoonnummer van Partner 1 + En ik heb al een nummer in de input field ingevuld +Wanneer ik in de input field klik +Dan Kan ik het ingevulde nummer bewerken + En Het ingevulde nummer wordt gecontroleerd voor geldigheid + +Scenario: Ik wil de e-mail van Partner 1 invullen +Gegeven ik ben op de Persoonsgegevens pagina +# Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik zie een input field voor de e-mail van Partner 1 +Wanneer ik in de input field de e-mail van Partner 1 invul +Dan Het ingevulde e-mail wordt gecontroleerd voor geldigheid + +Scenario: Ik wil de e-mail van Partner 1 bewerken +Gegeven ik ben op de Persoonsgegevens pagina +# Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik zie een input field voor de e-mail van Partner 1 + En ik heb al een e-mail in de input field ingevuld +Wanneer ik in de input field klik +Dan Kan ik het ingevulde e-mail bewerken + En Het ingevulde e-mail wordt gecontroleerd voor geldigheid + +Scenario: Ik Partner 1 wil verklaren dat ik niet getrouwd ben +Gegeven ik ben op de Persoonsgegevens pagina +# Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik zie een checkbox voor de alleenstaand verklaring van Partner 1 +Wanneer ik op de checkbox klik +Dan Het checkbox wordt ingevuld + +Scenario: Ik Partner 1 wil mijn alleenstaand verklaring terugnemen +Gegeven ik ben op de Persoonsgegevens pagina +# Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik zie een gecheckte checkbox voor de alleenstaand verklaring van Partner 1 +Wanneer ik op de checkbox klik +Dan Het checkbox wordt leeg + +Scenario: Ik Partner 1 wil verklaren dat ik niet binnen mijn familie ga trouwen +Gegeven ik ben op de Persoonsgegevens pagina +# Melding Voorgenomen Huwelijk stap " " 3 + En ik zie een checkbox voor de niet familie trouwen verklaring voor Partner 1 +Wanneer ik op de checkbox klik +Dan Het checkbox wordt ingevuld + +Scenario: Ik Partner 1 wil mijn verklaring dat ik niet binnen mijn familie ga trouwen terugnemen +Gegeven ik ben op de Persoonsgegevens pagina +# Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik zie een gecheckte checkbox voor de niet familie trouwen verklaring van Partner 1 +Wanneer ik op de checkbox klik +Dan Het checkbox wordt leeg + +Scenario: Ik Partner 1 wil iemand in mijn familie trouwen +Gegeven ik ben op de Persoonsgegevens pagina +# Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik zie een checkbox voor de niet familie trouwen verklaring van Partner 1 + En ik zie een Meer Informatie sectie met contactmogelijkheden links +Wanneer ik op de Bel 14 030 link klik +Dan ik neem contact met de gemeente zodat ik Partner 1 een familieleden kan trouwen + +Scenario: Ik Partner 1 wil iemand in mijn familie trouwen +Gegeven ik ben op de Persoonsgegevens pagina +# Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik zie een checkbox voor de niet familie trouwen verklaring van Partner 1 + En ik zie een Meer Informatie sectie met contactmogelijkheden links +Wanneer ik op de Chat met ons link klik +Dan ik neem contact met de gemeente zodat ik Partner 1 een familieleden kan trouwen + +Scenario: Ik Partner 1 wil al de gegevens in het formulier bevestigen +Gegeven ik ben op de Persoonsgegevens pagina +# Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik zie een checkbox voor de gegevensbevestiging van Partner 1 + En Al de ingevulde gegevens in het formulier kloppen +Wanneer ik op de gegevensbevestiging checkbox klik +Dan Het checkbox wordt ingevuld + +Scenario: Ik Partner 1 wil mijn bevestiging dat al de gegevens in het formulier kloppen terugnemen +Gegeven ik ben op de Persoonsgegevens pagina +# Melding Voorgenomen Huwelijk stap " " 3 + En ik zie een ingevulde checkbox voor de gegevensbevestiging van Partner 1 +Wanneer ik op de checkbox klik +Dan De checkbox wordt leeg + +Scenario: Ik Partner 1 wil mijn contactgegevens opslaan +Gegeven ik ben op de Persoonsgegevens pagina +# Melding Voorgenomen Huwelijk stap " " 3 + #En ik heb al mijn contactgegevens ingevuld + En ik heb al de verklaring checkboxes ingevuld + En ik heb de gegevensbevestiging checkbox ingevuld + En ik zie een Contactgegevens opslaan button +Wanneer ik op de Contactgegevens opslaan button klik +Dan ik word naar de Voorgenomen Huwelijk Partner pagina gestuurd + +Scenario: Ik Partner 1 wil mijn contactgegevens opslaan +Gegeven ik ben op de Persoonsgegevens pagina +# Melding Voorgenomen Huwelijk stap " " 3 + #En ik heb al mijn contactgegevens ingevuld + En ik zie de verklaring en bevestiging checkboxes op de pagina + En ik heb nog niet de alleenstaandenverklaring checkbox ingevuld + En ik zie een Contactgegevens opslaan button +Wanneer ik op de Contactgegevens opslaan button klik +Dan ik krijg een Please tick this box if you want to proceed popup +# Wat is de naam van dit in het Nederlands? + +Scenario: Ik Partner 1 wil mijn contactgegevens opslaan +Gegeven ik ben op de Persoonsgegevens pagina +# Melding Voorgenomen Huwelijk stap " " 3 + #En ik heb al mijn contactgegevens ingevuld + En ik zie de verklaring en bevestiging checkboxes op de pagina + En ik heb nog niet de alleenstaandenverklaring checkbox ingevuld + En ik zie een Contactgegevens opslaan button + En ik heb de Contactgegevens opslaan button geklik + En ik heb een Please tick this box if you want to proceed popup gekregen +Wanneer ik op de alleenstaandenverklaring checkbox klik +Dan De alleenstaand verklaring checkbox wordt ingevuld +# Wat is de naam van dit in het Nederlands? + + +Scenario: Ik Partner 1 wil mijn contactgegevens opslaan +Gegeven ik ben op de Persoonsgegevens pagina +# Melding Voorgenomen Huwelijk stap " " 3 + #En ik heb al mijn contactgegevens ingevuld + En ik zie de verklaring en bevestiging checkboxes op de pagina + En ik heb nog niet de verklaring dat ik niet binnen mijn familie ga trouwen checkbox ingevuld + En ik zie een Contactgegevens opslaan button +Wanneer ik op de Contactgegevens opslaan button klik +Dan ik krijg een Please tick this box if you want to proceed popup +# Wat is de naam van dit in het Nederlands? + +Scenario: Ik Partner 1 wil mijn contactgegevens opslaan +Gegeven ik ben op de Persoonsgegevens pagina +# Melding Voorgenomen Huwelijk stap " " 3 + #En ik heb al mijn contactgegevens ingevuld + En ik zie de verklaring en bevestiging checkboxes op de pagina + En ik heb nog niet de verklaring dat ik niet binnen mijn familie ga trouwen checkbox ingevuld + En ik zie een Contactgegevens opslaan button + En ik heb de Contactgegevens opslaan button geklik + En ik heb een Please tick this box if you want to proceed popup gekregen +Wanneer ik op de verklaring dat ik niet binnen mijn familie ga trouwen verklaring checkbox klik +Dan De verklaring dat ik niet binnen mijn familie ga trouwen checkbox wordt ingevuld +# Wat is de naam van dit in het Nederlands? + +Scenario: Ik Partner 1 wil mijn contactgegevens opslaan +Gegeven ik ben op de Persoonsgegevens pagina +# Melding Voorgenomen Huwelijk stap " " 3 + #En ik heb al mijn contactgegevens ingevuld + En ik zie de verklaring en bevestiging checkboxes op de pagina + En ik heb nog niet de bevestiging dat al de gegevens in het formulier kloppen checkbox ingevuld + En ik zie een Contactgegevens opslaan button +Wanneer ik op de Contactgegevens opslaan button klik +Dan ik krijg een Please tick this box if you want to proceed popup +# Wat is de naam van dit in het Nederlands? + +Scenario: Ik Partner 1 wil mijn contactgegevens opslaan +Gegeven ik ben op de Persoonsgegevens pagina +# Melding Voorgenomen Huwelijk stap " " 3 + # En ik heb al mijn contactgegevens ingevuld + En ik zie de verklaring en bevestiging checkboxes op de pagina + En ik heb nog niet de bevestiging dat al de gegevens in het formulier kloppen checkbox ingevuld + En ik zie een Contactgegevens opslaan button + En ik heb de Contactgegevens opslaan button geklik + En ik heb een Please tick this box if you want to proceed popup gekregen +Wanneer ik op de bevestiging dat al de gegevens in het formulier kloppen checkbox klik +Dan De bevestiging dat al de gegevens in het formulier kloppen checkbox wordt ingevuld +# Wat is de naam van dit in het Nederlands? + +Scenario: Ik wil Partner 2 voor het huwelijk melden +Gegeven ik ben op de Persoonsgegevens pagina +# Melding Voorgenomen Huwelijk stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik zie een Partner inloggen met DigID button +Wanneer ik op de Partner inloggen met DigID button klik +Dan ik word naar de DigID login pagina doorgestuurd +# stap " " 3 +#-----!!! +Scenario: Ik wil Partner 2 met DigID inloggen +Gegeven ik ben op de DigID login pagina +# Inloggen bij DigID stap " " 3 +Wanneer ik login met een DigID + En Het is een ander login als dat van partner 1 +Dan Mijn partner wordt ingelogd met DigID +#-----!!! +Scenario: Ik wil Partner 1 met DigID inloggen +Gegeven ik ben op de DigID Login pagina +# Inloggen bij DigID stap " " 3 + En Partner 1 heeft een DigID + En ik zie de DigID Inloggen interface + En ik zie de DigID inloggen opties buttons +# <---Meer info TBD +Wanneer ik klik op een van de inloggen opties +Dan Partner 1 word ingelogd met DigID + En ik word naar de Persoonsgegevens voor Partner 1 pagina gestuurd + +Scenario: Ik wil mijn partner voor het huwelijk melden!!! +Gegeven ik ben op de Persoonsgegevens pagina +# Eenvoudig trouwen stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik zie een mail een uitnodiging aan je partner link +Wanneer ik op de link klik +Dan ik word naar de Partner Uitnodigen pagina doorgestuurd + +# stap " " 3 + +Scenario: Ik wil mijn partners gegevens invullen voor een DigID login uitnodiging +Gegeven ik ben op de Partner Uitnodigen pagina +# Eenvoudig trouwen stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik zie een name input field + En ik zie een e-mail input field + En ik zie een Verstuur uitnodiging button +Wanneer ik de input fields invul +Dan Word de ingevulde informatie laten zien op de input fields +# stap " " 3 + +Scenario: Ik wil mijn partner een uitnodiging voor een DigID login sturen +Gegeven ik ben op de Partner Uitnodigen pagina +# Eenvoudig trouwen stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik heb de partner gegevens input fields ingevuld +Wanneer ik op de Verstuur uitnodiging button klik +Dan Word een uitnodiging voor en DigID login e-mail naar mijn partner gestuurd + En ik word naar de Partner Success pagina gestuurd +# stap " " 3 + +Scenario: Ik wil mijn e-mail bekijken +Gegeven ik ben op de Partner Success pagina +# Eenvoudig trouwen stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik zie een tekst waarin staat we wachten voor de login van partner 2 + En ik zie een button Bekijk e-mail voor aanvrager +Wanneer ik op de button klik +Dan ik word naar de Aanvrager e-mail pagina gestuurd +# stap " " 3 + +Scenario: Ik wil met het huwelijk saanvraag doorgaan +Gegeven ik ben op de Aanvrager e-mail pagina +# Eenvoudig trouwen stap " " 3 + En ik zie de correcte naam van partner 1 + En ik zie een button Doorgaan huwelijksaanvraag +Wanneer ik op de button klik +Dan ik word naar de Getuigen pagina gestuurd +# stap " " 3 + +Scenario: Ik wil de e-mail van mijn partner bekijken +Gegeven ik ben op de Partner Success pagina +# Eenvoudig trouwen stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik zie een tekst waarin staat we wachten voor de login van partner 2 + En ik zie een button Bekijk e-mail voor partner +Wanneer ik op de button klik +Dan ik word naar de Invitation Email Partner pagina gestuurd +# stap " " 3 + +Scenario: Partner 2 met DigID inloggen +Gegeven ik ben op de Invitation Email Partner pagina +# Eenvoudig trouwen stap " " 3 + En ik zie de correcte naam van partner 2 + En ik zie een button Inloggen met DigID +Wanneer ik op de button klik +Dan ik word naar de DigID login pagina doorgestuurd +# stap " " 3 + +Scenario: Ik wil een DigID inloggen uitnodiging per e-mail naar partner 2 stuuren +Gegeven ik ben op de Persoonsgegevens pagina voor Partner 2 +# Eenvoudig trouwen stap " " 3 + En ik zie een name input field + En ik zie een e-mail input field +Wanneer ik de gegevens van partner 2 invul +Dan Het getypte e-mail wordt gecontroleerd voor geldigheid +# stap " " 3 + En ik krijg een bevestiging dat de e-mail is verzonden + +!!!!! +Scenario: Ik, Partner 2, wil mijn basisgegevens bevestigen*** +Gegeven ik ben op de Persoonsgegevens pagina voor Partner 2 +# Eenvoudig trouwen stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En Mijn persoonsgegevens zijn juist + En Mijn adresgegevens zijn juist + +Scenario: Ik, Partner 2, wil mijn gegevens bevestigen +Gegeven ik ben op de Persoonsgegevens pagina voor Partner 2 +# Eenvoudig trouwen stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En Mijn gegevens zijn niet juist +Wanneer ik op Neem contact op met de gemeente klik +Dan ik word naar een pagina waarin ik mijn gegevens kan laten bekend zijn gestuurd + +Scenario: Ik, Partner 2, wil mijn telefoonnummer invullen +Gegeven ik ben op de Persoonsgegevens pagina voor Partner 2 +# Eenvoudig trouwen stap " " 3 + En ik zie een input field voor mijn telefoonnummer +Wanneer ik in een input field mijn telefoonnummer invul +Dan Het getypte nummer wordt gecontroleerd voor geldigheid + +Scenario: Ik, Partner 2, wil mijn e-mail invullen +Gegeven ik ben op de Persoonsgegevens pagina voor Partner 2 +# Eenvoudig trouwen stap " " 3 + En ik zie een input field voor mijn e-mail +Wanneer ik in een input field mijn e-mail invul +Dan De getypte e-mail wordt gecontroleerd voor geldigheid + +Scenario: Ik, Partner 2, wil verklaren dat ik niet getrouwd ben +Gegeven ik ben op de Persoonsgegevens pagina voor Partner 2 +# Eenvoudig trouwen stap " " 3 + En ik zie een checkbox voor de alleenstaEn verklaring +Wanneer ik op de checkbox tikt +Dan Het checkbox wordt ingevuld + +Scenario: Ik, Partner 2, wil verklaren dat ik niet binnen mijn familie ga trouwen +Gegeven ik ben op de Persoonsgegevens pagina voor Partner 2 +# Eenvoudig trouwen stap " " 3 + En ik zie een checkbox voor de niet familie trouwen verklaring +Wanneer ik op de checkbox tikt +Dan Het checkbox wordt ingevuld + +Scenario: Ik, Partner 2, wil iemand in mijn familie trouwen +Gegeven ik ben op de Persoonsgegevens pagina voor Partner 2 +#Eenvoudig trouwen stap " " 3 + En ik zie een checkbox voor de niet familie trouwen verklaring + En ik zie een Meer Informatie sectie met contactmogelijkheden links +Wanneer ik op een van de contactmogelijkehen links klik +Dan ik neem contact met de gemeente om mijn familieleden te kunnen trouwen + +Scenario: Ik, Partner 2, wil al de gegevens in het formulier bevestigen +Gegeven ik ben op de Persoonsgegevens pagina voor Partner 2 +# Eenvoudig trouwen stap " " 3 + En Al de ingevulde gegevens in het formulier kloppen +Wanneer ik op de gegevensbevestiging checkbox tikt +Dan Het checkbox wordt ingevuld + +Scenario: Ik, Partner 2, wil mijn contactgegevens opslaan +Gegeven ik ben op de Persoonsgegevens pagina voor Partner 2 +# Eenvoudig trouwen stap " " 3 + En ik heb al mijn contactgegevens ingevuld + En ik heb al de verklering checkboxes getikt +Wanneer ik op de Contactgegevens opslaan button klik +Dan ik word naar een pagina waarin ik kan bevestigen de gegevens van Partner 2 zijn gekoppeld met die van Partner 1 gestuurd + +Scenario: Gekoppeling van gegevens bevestigen +Gegeven ik ben op de Persoonsgegevens Succes pagina voor Partner 2 +# Eenvoudig trouwen stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik zie de kosten voor het huwelijk + En ik zie een tekst waar het staat de gegevens van de twee partners aijn gekoppeld + + +Scenario: Ik, wil getuigen uitnodigen +Gegeven ik ben op de Persoonsgegevens Succes pagina voor Partner 2 +# Eenvoudig trouwen stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik zie de kosten voor het huwelijk + En ik zie een tekst waar het staat de gegevens van de twee partners aijn gekoppeld +Wanneer ik op de Nodig getuigen uit button klik +Dan ik word naar de Getuigen pagina gestuurd +# stap " " 3 + +Scenario: Getuigen gegevens invullen +Gegeven ik ben op de Getuigen pagina +# Eenvoudig trouwen stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik zie de kosten voor het huwelijk + En ik zie tussen 2 en 4 input field sets voor de namen en e-mails van de getuigen +Wanneer ik in een input field klik +Dan Kan ik de input fields met de gegevens van de getuigen invullen +# stap " " 3 + +Scenario: Getuigens e-mail controleren +Gegeven ik ben op de Getuigen pagina +# Eenvoudig trouwen stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik zie de kosten voor het huwelijk + En ik zie tussen 2 en 4 input field sets voor de namen en e-mails van de getuigen +Wanneer ik in een input field klik +Dan Kan ik de gegevens van de getuigen invullen +# stap " " 3 + En De getypte e-mail wordt gecontroleerd voor geldigheid + +Scenario: Verzenden van getuigen uitnodigingen +Gegeven ik ben op de Getuigen pagina +# Eenvoudig trouwen stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik zie de kosten voor het huwelijk + En ik heb tenminste 1 paar van input fields ingevuld + En De ingevulde e-mail is geldig +Wanneer ik op de Verstuur uitnodiging button klik +Dan ik word naar de Getuigen Succes pagina gestuurd +# stap " " 3 + +Scenario: Ik wil de gemeente laten mijn huwelijks verzoek checken +Gegeven ik ben op de Getuigen Succes pagina +# Eenvoudig trouwen stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik zie de kosten voor het huwelijk +Wanneer ik op de Laat de gemeente checken en ga betalen button klik +Dan ik word naar de Voorgenomen Huwelijk Checken pagina gestuurd +# stap " " 3 +#Hoelang moet man wachten? Ga ik direct naar de volgende pagina zoals bij de draft website? Wat gebeurt als er iets mis is (e-mail, phonecall, anders)? +#-----!!! +Scenario: Ik wil voor mij huwelijk betalen +Gegeven ik ben op de Voorgenomen Huwelijk Checken pagina +# Eenvoudig trouwen stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik zie de kosten voor het huwelijk +Wanneer ik op de Ga betalen button klik +Dan ik word naar de Voorgenomen Huwelijk Betalen pagina gestuurd +# stap " " 3 + +Scenario: Ik wil met iDEAL voor mij huwelijk betalen +Gegeven ik ben op de Voorgenomen Huwelijk Betalen pagina +# Eenvoudig trouwen stap " " 3 + En ik zie Gemeente Utrecht als de correcte begunstigde + En ik zie de kosten voor het huwelijk +Wanneer ik op de icoon van mijn bank X klik +Dan ik word naar de X bank betaling pagina gestuurd +# stap " " 3 + +Scenario: Ik wil mijn betaling with bank X voltooien +Gegeven ik ben op de Betalen Succes pagina +# Eenvoudig trouwen stap " " 3 + En X + En X +Wanneer X +Dan ik word naar de X bank betaling pagina gestuurd +# stap " " 3 + +Scenario: Ik wil mijn huwelijk betaling ontvangen bevestigen +Gegeven ik ben op de Betalen Succes pagina +# Eenvoudig trouwen stap " " 5 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik zie de kosten voor het huwelijk + En ik zie als tekst GELUKT Betaling ontvangen + +Scenario: Ik wil informatie over het Stadskantoor Utrecht locatie +Gegeven ik ben op de Betalen Succes pagina +# Eenvoudig trouwen stap " " 5 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik zie de kosten voor het huwelijk + En ik zie als tekst GELUKT Betaling ontvangen +Wanneer ik op de link Stadskantoor Utrecht link klik +Dan ik word naar de Contact Stadskantoor pagina gestuurd +# stap " " 5 + +Scenario: Ik wil het huwelijk annuleren +Gegeven ik ben op de Betalen Succes pagina +# Eenvoudig trouwen stap " " 5 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik zie de kosten voor het huwelijk + En ik zie als tekst GELUKT Betaling ontvangen +Wanneer ik op de Annuleer huwelijk link klik +Dan ik word naar de Huwelijksplanner Cancel pagina gestuurd +# stap " " 5 + +Scenario: Ik wil het huwelijk sreservering annuleren +Gegeven ik ben op de Huwelijksplanner Cancel pagina +# Eenvoudig trouwen stap " " 5 +Wanneer ik op de Annuleer reservering button klik +Dan ik word naar de "Annuleer reservering bevestiging" pagina gestuurd +# stap " " 5 + +Scenario: Ik wil het huwelijk sreservering annuleren +Gegeven ik ben op de Huwelijksplanner Cancel pagina +# Eenvoudig trouwen stap " " 5 +Wanneer ik op de Nee, ik wil terug naar het overzicht button klik +Dan ik word naar de Betalen Succes pagina gestuurd +# stap " " 5 + +Scenario: Ik wil de gegevens van Partner 1 aanpassen +Gegeven ik ben op de Betalen Succes pagina +# Eenvoudig trouwen stap " " 5 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik zie de kosten voor het huwelijk + En ik zie als tekst GELUKT Betaling ontvangen +Wanneer ik op een van de Aanpassen links van de contactgegevens van Partner 1 klik +Dan ik word naar de Persoonsgegevens voor Partner 1 pagina gestuurd +# stap " " 3 + +Scenario: Ik wil terug gaan naar de Melding Voorgenomen Huwelijk pagina gaan +Gegeven ik ben op de Persoonsgegevens voor Partner 1 pagina +# Eenvoudig trouwen stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik heb voor het huwelijk al betaald + En ik zie een link Ga terug naar de Melding Voorgenomen Huwelijk pagina +Wanneer ik op de Ga terug naar de Melding Voorgenomen Huwelijk pagina klik +Dan ik word naar de Betalen Succes pagina gestuurd +# stap " " 5 + +Scenario: Ik wil de gegevens van Partner 2 aanpassen +Gegeven ik ben op de Betalen Succes pagina +# Eenvoudig trouwen stap " " 5 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik zie de kosten voor het huwelijk + En ik zie als tekst GELUKT Betaling ontvangen +Wanneer ik op een van de Aanpassen links van de contactgegevens van Partner 2 klik +Dan ik word naar de Persoonsgegevens voor Partner 2 pagina gestuurd +# stap " " 3 + +Scenario: Ik wil terug gaan naar de Melding Voorgenomen Huwelijk pagina gaan +Gegeven ik ben op de Persoonsgegevens voor Partner 2 pagina +# Eenvoudig trouwen stap " " 3 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik heb voor het huwelijk al betaald + En ik zie een link Ga terug naar de Melding Voorgenomen Huwelijk pagina +Wanneer ik op de Ga terug naar de Melding Voorgenomen Huwelijk pagina klik +Dan ik word naar de Betalen Succes pagina gestuurd +# stap " " 5 + +Scenario: Ik wil de gegevens van getuige 1 aanpassen +Gegeven ik ben op de Betalen Succes pagina +# Eenvoudig trouwen stap " " 5 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik zie de kosten voor het huwelijk + En ik zie als tekst GELUKT Betaling ontvangen +Wanneer ik op een van de Aanpassen links van de contactgegevens van Getuigen 1 klik +Dan ik word naar de Getuigen pagina gestuurd +# stap " " 3 + En De gegevens van getuige 1 verwezen door de geklikte link krijgen focus + +Scenario: Ik wil de gegevens van getuige 2 aanpassen +Gegeven ik ben op de Betalen Succes pagina +# Eenvoudig trouwen stap " " 5 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik zie de kosten voor het huwelijk + En ik zie als tekst GELUKT Betaling ontvangen +Wanneer ik op een van de Aanpassen links van de contactgegevens van Getuigen 1 klik +Dan ik word naar de Getuigen pagina gestuurd +# stap " " 3 + En De gegevens van getuige 2 verwezen door de geklikte link krijgen focus + +Scenario: Ik wil de gegevens van getuige 3 aanpassen +Gegeven ik ben op de Betalen Succes pagina +# Eenvoudig trouwen stap " " 5 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik zie de kosten voor het huwelijk + En ik zie als tekst GELUKT Betaling ontvangen + En Er zijn contactgegevens voorhanden voor Getuige 3 +Wanneer ik op een van de Aanpassen links van de contactgegevens van Getuigen 1 klik +Dan ik word naar de Getuigen pagina gestuurd +# stap " " 3 + En De gegevens van getuige 3 verwezen door de geklikte link krijgen focus + +Scenario: Ik wil de gegevens van getuige 4 aanpassen +Gegeven ik ben op de Betalen Succes pagina +# Eenvoudig trouwen stap " " 5 + En ik zie de correcte vroeger geselecteerde tijd en datum combinatie + En ik zie de kosten voor het huwelijk + En ik zie als tekst GELUKT Betaling ontvangen + En Er zijn contactgegevens voorhanden voor Getuige 4 +Wanneer ik op een van de Aanpassen links van de contactgegevens van Getuigen 1 klik +Dan ik word naar de Getuigen pagina gestuurd +# stap " " 3 + En De gegevens van getuige 3 verwezen door de geklikte link krijgen focus \ No newline at end of file diff --git a/features/weird.feature b/features/weird.feature new file mode 100644 index 00000000..92c40eda --- /dev/null +++ b/features/weird.feature @@ -0,0 +1,25 @@ +# Huwelijk datumgrens 2 weken VS Getuigenuitnodigingen datumgrens 4 weken +# -Wat als 5 weken geleden ik heb mijn huwelijkdatum en ook mijn getuigen geregistreerd +# Dan 2 weken voor de huwelijk wil ik mijn huwelijkdatum laten veranderen. ik ben nog binnen de +# datumgrens voor de huwelijk, maar niet voor de Getuigenuitnodigingen, maar ze waren al geregistreerd +# Mag het dan? + +Scenario: Huwelijksdatum wijziging na de datumgrens voor Getuigen +Gegeven dat ik mijn huwelijksreservering heb "geannuleert/" #Annuleer huwelijksreservering Step 5 + En Ik ga terug naar de de Trouw Opties Huwelijk pagina #Wanneer en Hoe Step 2 + En Ik wil binnen de komende twee weken trouwen + En Ik selecteer een geldig trouwdatum en tijdslot + En Ik had twee of meer weken geleden de getuigen al uitgenodigd + En Ik Partner 1 ben al met DigID ingelogd + En Partner 2 is al met DigID ingelogd + En Ik zie een Ja, dit wil ik! button +Wanneer Ik op de button klik +Dan Word ik naar de Voorgenomen Huwelijk pagina gestuurd #Step 3 <--Ik moet alle stappen weer doorlopen +of +Dan Word ik naar de Voorgenomen Huwelijk Getuigen Succes pagina gestuurd #Step 5 <--Je gaat gelijk naar het overzicht + + + +# Huwelijk tussen de 2-3 weken +# Krijg ik een melding dat ik over de datumgrens van de getuigensuitnodigingen ben? +NEEDS CLEANING! \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 55e77c25..032a287f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,12 +28,14 @@ "react-dom": "18.2.0" }, "devDependencies": { + "@badeball/cypress-cucumber-preprocessor": "15.1.4", + "@bahmutov/cypress-esbuild-preprocessor": "2.2.0", "@conductionnl/agenda-service": "github:Huwelijksplanner/AgendaService", "@conductionnl/klanten-api": "github:CommonGateway/KlantenAPI", "@conductionnl/overige-objecten-service": "github:Huwelijksplanner/OverigeObjecten", "@conductionnl/trouw-service": "github:Huwelijksplanner/TrouwService", "@nl-design-system-unstable/amsterdam-design-tokens": "1.0.0-alpha.64", - "@playwright/test": "1.31.0", + "@testing-library/cypress": "9.0.0", "@testing-library/jest-dom": "5.16.5", "@testing-library/react": "13.4.0", "@testing-library/user-event": "14.4.3", @@ -42,6 +44,7 @@ "@types/react": "18.0.28", "@typescript-eslint/eslint-plugin": "5.53.0", "@typescript-eslint/parser": "5.53.0", + "cypress": "12.7.0", "eslint": "8.34.0", "eslint-config-next": "12.3.4", "eslint-config-prettier": "8.6.0", @@ -752,12 +755,199 @@ "node": ">=6.9.0" } }, + "node_modules/@badeball/cypress-configuration": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@badeball/cypress-configuration/-/cypress-configuration-4.2.0.tgz", + "integrity": "sha512-8Dc6diBW8zUycpCFbr7vqQ8ioNZMvpHV79KGdHVpwpRtkFX6enwG82CKU9DeWys6Ou5dFpXw6NYNYNb46y7UYA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.18.8", + "debug": "^4.3.2", + "esbuild": "^0.14.23", + "glob": "^7.1.6", + "minimatch": "^3.0.4", + "node-hook": "^1.0.0" + } + }, + "node_modules/@badeball/cypress-configuration/node_modules/@esbuild/linux-loong64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", + "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@badeball/cypress-configuration/node_modules/esbuild": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", + "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/linux-loong64": "0.14.54", + "esbuild-android-64": "0.14.54", + "esbuild-android-arm64": "0.14.54", + "esbuild-darwin-64": "0.14.54", + "esbuild-darwin-arm64": "0.14.54", + "esbuild-freebsd-64": "0.14.54", + "esbuild-freebsd-arm64": "0.14.54", + "esbuild-linux-32": "0.14.54", + "esbuild-linux-64": "0.14.54", + "esbuild-linux-arm": "0.14.54", + "esbuild-linux-arm64": "0.14.54", + "esbuild-linux-mips64le": "0.14.54", + "esbuild-linux-ppc64le": "0.14.54", + "esbuild-linux-riscv64": "0.14.54", + "esbuild-linux-s390x": "0.14.54", + "esbuild-netbsd-64": "0.14.54", + "esbuild-openbsd-64": "0.14.54", + "esbuild-sunos-64": "0.14.54", + "esbuild-windows-32": "0.14.54", + "esbuild-windows-64": "0.14.54", + "esbuild-windows-arm64": "0.14.54" + } + }, + "node_modules/@badeball/cypress-cucumber-preprocessor": { + "version": "15.1.4", + "resolved": "https://registry.npmjs.org/@badeball/cypress-cucumber-preprocessor/-/cypress-cucumber-preprocessor-15.1.4.tgz", + "integrity": "sha512-CVagR47O7ZNOGVZJzBz6IJ5cVqj7zEUQEoI6br/gSdfZ8YVBbf8Eqx1pEZCWiDnzc7w20qj+IzM7Z8ExxYN4fQ==", + "dev": true, + "dependencies": { + "@badeball/cypress-configuration": "^4.0.0", + "@cucumber/cucumber-expressions": "^16.0.0", + "@cucumber/gherkin": "^24.0.0", + "@cucumber/html-formatter": "^19.2.0", + "@cucumber/message-streams": "^4.0.1", + "@cucumber/messages": "^19.1.2", + "@cucumber/tag-expressions": "^4.1.0", + "base64-js": "^1.5.1", + "chalk": "^4.1.2", + "cli-table": "^0.3.11", + "common-ancestor-path": "^1.0.1", + "cosmiconfig": "^7.0.1", + "debug": "^4.2.0", + "error-stack-parser": "^2.0.7", + "esbuild": "^0.17.8", + "glob": "^7.2.0", + "is-path-inside": "^3.0.3", + "module-alias": "^2.2.2", + "node-hook": "^1.0.0", + "resolve-pkg": "^2.0.0", + "source-map": "^0.7.4", + "uuid": "^8.3.2" + }, + "bin": { + "cypress-cucumber-diagnostics": "lib/diagnostics/index.js" + }, + "engines": { + "node": ">=14.14.0" + }, + "peerDependencies": { + "@cypress/browserify-preprocessor": "^3.0.1", + "cypress": "^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0" + }, + "peerDependenciesMeta": { + "@cypress/browserify-preprocessor": { + "optional": true + } + } + }, + "node_modules/@badeball/cypress-cucumber-preprocessor/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@badeball/cypress-cucumber-preprocessor/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@badeball/cypress-cucumber-preprocessor/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@badeball/cypress-cucumber-preprocessor/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@bahmutov/cypress-esbuild-preprocessor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@bahmutov/cypress-esbuild-preprocessor/-/cypress-esbuild-preprocessor-2.2.0.tgz", + "integrity": "sha512-pTvxRi6+OFsXy6uCn/HlO5zi0fUZWbiCtTiLTDf/+kgEfZ/Y8WIxZ2pjuir9MEM8prQenBw60TLcM0wcazh7+Q==", + "dev": true, + "dependencies": { + "debug": "4.3.4" + }, + "peerDependencies": { + "esbuild": ">=0.17.0" + } + }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "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, + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/@conductionnl/agenda-service": { "version": "1.0.0", "resolved": "git+ssh://git@github.com/Huwelijksplanner/AgendaService.git#deacac54371371f2c85e35139f7062bbeaf98d74", @@ -795,6 +985,496 @@ "postcss-selector-parser": "^6.0.10" } }, + "node_modules/@cucumber/cucumber-expressions": { + "version": "16.1.2", + "resolved": "https://registry.npmjs.org/@cucumber/cucumber-expressions/-/cucumber-expressions-16.1.2.tgz", + "integrity": "sha512-CfHEbxJ5FqBwF6mJyLLz4B353gyHkoi6cCL4J0lfDZ+GorpcWw4n2OUAdxJmP7ZlREANWoTFlp4FhmkLKrCfUA==", + "dev": true, + "dependencies": { + "regexp-match-indices": "1.0.2" + } + }, + "node_modules/@cucumber/gherkin": { + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-24.1.0.tgz", + "integrity": "sha512-B48XrUod4y3SoXe6mv12q7U1zThUNSK3yHSm/hBJCJZ6RJUJhFk3FVMN/83qOEbsYZe6iG9v+4L1Myf8/q8C6g==", + "dev": true, + "dependencies": { + "@cucumber/messages": "^19.1.4" + } + }, + "node_modules/@cucumber/html-formatter": { + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/@cucumber/html-formatter/-/html-formatter-19.2.0.tgz", + "integrity": "sha512-qGms4588jmVF/G3fTbgZvxn6OQw9GaTFV007nZZ9/10M9DfrgRqjFjVxVI9TPV63xOLPicEVoqsKZtcECbdMSA==", + "dev": true, + "peerDependencies": { + "@cucumber/messages": ">=18" + } + }, + "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, + "peerDependencies": { + "@cucumber/messages": ">=17.1.1" + } + }, + "node_modules/@cucumber/messages": { + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-19.1.4.tgz", + "integrity": "sha512-Pksl0pnDz2l1+L5Ug85NlG6LWrrklN9qkMxN5Mv+1XZ3T6u580dnE6mVaxjJRdcOq4tR17Pc0RqIDZMyVY1FlA==", + "dev": true, + "dependencies": { + "@types/uuid": "8.3.4", + "class-transformer": "0.5.1", + "reflect-metadata": "0.1.13", + "uuid": "9.0.0" + } + }, + "node_modules/@cucumber/messages/node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@cucumber/tag-expressions": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@cucumber/tag-expressions/-/tag-expressions-4.1.0.tgz", + "integrity": "sha512-chTnjxV3vryL75N90wJIMdMafXmZoO2JgNJLYpsfcALL2/IQrRiny3vM9DgD5RDCSt1LNloMtb7rGey9YWxCsA==", + "dev": true + }, + "node_modules/@cypress/request": { + "version": "2.88.11", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.11.tgz", + "integrity": "sha512-M83/wfQ1EkspjkE2lNWNV5ui2Cv7UCv1swW1DqljahbzLVWltcsexQh8jYtuS/vzFXP+HySntGM83ZXA9fn17w==", + "dev": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "http-signature": "~1.3.6", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "performance-now": "^2.1.0", + "qs": "~6.10.3", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@cypress/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/@cypress/request/node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "dev": true, + "dependencies": { + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + } + }, + "node_modules/@cypress/xvfb/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.10.tgz", + "integrity": "sha512-7YEBfZ5lSem9Tqpsz+tjbdsEshlO9j/REJrfv4DXgKTt1+/MHqGwbtlyxQuaSlMeUZLxUKBaX8wdzlTfHkmnLw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.10.tgz", + "integrity": "sha512-ht1P9CmvrPF5yKDtyC+z43RczVs4rrHpRqrmIuoSvSdn44Fs1n6DGlpZKdK6rM83pFLbVaSUwle8IN+TPmkv7g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.10.tgz", + "integrity": "sha512-CYzrm+hTiY5QICji64aJ/xKdN70IK8XZ6iiyq0tZkd3tfnwwSWTYH1t3m6zyaaBxkuj40kxgMyj1km/NqdjQZA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.10.tgz", + "integrity": "sha512-3HaGIowI+nMZlopqyW6+jxYr01KvNaLB5znXfbyyjuo4lE0VZfvFGcguIJapQeQMS4cX/NEispwOekJt3gr5Dg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.10.tgz", + "integrity": "sha512-J4MJzGchuCRG5n+B4EHpAMoJmBeAE1L3wGYDIN5oWNqX0tEr7VKOzw0ymSwpoeSpdCa030lagGUfnfhS7OvzrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.10.tgz", + "integrity": "sha512-ZkX40Z7qCbugeK4U5/gbzna/UQkM9d9LNV+Fro8r7HA7sRof5Rwxc46SsqeMvB5ZaR0b1/ITQ/8Y1NmV2F0fXQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.10.tgz", + "integrity": "sha512-0m0YX1IWSLG9hWh7tZa3kdAugFbZFFx9XrvfpaCMMvrswSTvUZypp0NFKriUurHpBA3xsHVE9Qb/0u2Bbi/otg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.10.tgz", + "integrity": "sha512-whRdrrl0X+9D6o5f0sTZtDM9s86Xt4wk1bf7ltx6iQqrIIOH+sre1yjpcCdrVXntQPCNw/G+XqsD4HuxeS+2QA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.10.tgz", + "integrity": "sha512-g1EZJR1/c+MmCgVwpdZdKi4QAJ8DCLP5uTgLWSAVd9wlqk9GMscaNMEViG3aE1wS+cNMzXXgdWiW/VX4J+5nTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.10.tgz", + "integrity": "sha512-1vKYCjfv/bEwxngHERp7huYfJ4jJzldfxyfaF7hc3216xiDA62xbXJfRlradiMhGZbdNLj2WA1YwYFzs9IWNPw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.10.tgz", + "integrity": "sha512-mvwAr75q3Fgc/qz3K6sya3gBmJIYZCgcJ0s7XshpoqIAIBszzfXsqhpRrRdVFAyV1G9VUjj7VopL2HnAS8aHFA==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.10.tgz", + "integrity": "sha512-XilKPgM2u1zR1YuvCsFQWl9Fc35BqSqktooumOY2zj7CSn5czJn279j9TE1JEqSqz88izJo7yE4x3LSf7oxHzg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.10.tgz", + "integrity": "sha512-kM4Rmh9l670SwjlGkIe7pYWezk8uxKHX4Lnn5jBZYBNlWpKMBCVfpAgAJqp5doLobhzF3l64VZVrmGeZ8+uKmQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.10.tgz", + "integrity": "sha512-r1m9ZMNJBtOvYYGQVXKy+WvWd0BPvSxMsVq8Hp4GzdMBQvfZRvRr5TtX/1RdN6Va8JMVQGpxqde3O+e8+khNJQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.10.tgz", + "integrity": "sha512-LsY7QvOLPw9WRJ+fU5pNB3qrSfA00u32ND5JVDrn/xG5hIQo3kvTxSlWFRP0NJ0+n6HmhPGG0Q4jtQsb6PFoyg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.10.tgz", + "integrity": "sha512-zJUfJLebCYzBdIz/Z9vqwFjIA7iSlLCFvVi7glMgnu2MK7XYigwsonXshy9wP9S7szF+nmwrelNaP3WGanstEg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.10.tgz", + "integrity": "sha512-lOMkailn4Ok9Vbp/q7uJfgicpDTbZFlXlnKT2DqC8uBijmm5oGtXAJy2ZZVo5hX7IOVXikV9LpCMj2U8cTguWA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.10.tgz", + "integrity": "sha512-/VE0Kx6y7eekqZ+ZLU4AjMlB80ov9tEz4H067Y0STwnGOYL8CsNg4J+cCmBznk1tMpxMoUOf0AbWlb1d2Pkbig==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.10.tgz", + "integrity": "sha512-ERNO0838OUm8HfUjjsEs71cLjLMu/xt6bhOlxcJ0/1MG3hNqCmbWaS+w/8nFLa0DDjbwZQuGKVtCUJliLmbVgg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.10.tgz", + "integrity": "sha512-fXv+L+Bw2AeK+XJHwDAQ9m3NRlNemG6Z6ijLwJAAVdu4cyoFbBWbEtyZzDeL+rpG2lWI51cXeMt70HA8g2MqIg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.10.tgz", + "integrity": "sha512-3s+HADrOdCdGOi5lnh5DMQEzgbsFsd4w57L/eLKKjMnN0CN4AIEP0DCP3F3N14xnxh3ruNc32A0Na9zYe1Z/AQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.10.tgz", + "integrity": "sha512-oP+zFUjYNaMNmjTwlFtWep85hvwUu19cZklB3QsBOcZSs6y7hmH4LNCJ7075bsqzYaNvZFXJlAVaQ2ApITDXtw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@eslint/eslintrc": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", @@ -2508,25 +3188,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@playwright/test": { - "version": "1.31.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.31.0.tgz", - "integrity": "sha512-Ys5s/06Dg9g3zAIdCIb/UOBYim3U7Zjb3DvC6XBtnRmnglH5O47iwYzmtxXu9fhSyzI2Jn28apkXIOD81GgCdw==", - "dev": true, - "dependencies": { - "@types/node": "*", - "playwright-core": "1.31.0" - }, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=14" - }, - "optionalDependencies": { - "fsevents": "2.3.2" - } - }, "node_modules/@pnpm/network.ca-file": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.1.tgz", @@ -2634,6 +3295,23 @@ "node": ">=14.16" } }, + "node_modules/@testing-library/cypress": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@testing-library/cypress/-/cypress-9.0.0.tgz", + "integrity": "sha512-c1XiCGeHGGTWn0LAU12sFUfoX3qfId5gcSE2yHode+vsyHDWraxDPALjVnHd4/Fa3j4KBcc5k++Ccy6A9qnkMA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.14.6", + "@testing-library/dom": "^8.1.0" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "cypress": "^12.0.0" + } + }, "node_modules/@testing-library/dom": { "version": "8.17.1", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.17.1.tgz", @@ -3005,6 +3683,18 @@ "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", "dev": true }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", + "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", + "dev": true + }, + "node_modules/@types/sizzle": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", + "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", + "dev": true + }, "node_modules/@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", @@ -3026,6 +3716,12 @@ "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", "dev": true }, + "node_modules/@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", + "dev": true + }, "node_modules/@types/yargs": { "version": "17.0.11", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.11.tgz", @@ -3041,6 +3737,16 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, + "node_modules/@types/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.53.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.53.0.tgz", @@ -3404,6 +4110,15 @@ "string-width": "^4.1.0" } }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -3474,6 +4189,26 @@ "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "dev": true }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/are-we-there-yet": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", @@ -3588,6 +4323,24 @@ "node": ">=0.10.0" } }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, "node_modules/ast-types-flow": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", @@ -3603,12 +4356,27 @@ "node": ">=8" } }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", @@ -3621,6 +4389,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", + "dev": true + }, "node_modules/axe-core": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.3.tgz", @@ -3753,6 +4536,15 @@ } ] }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -3773,6 +4565,18 @@ "readable-stream": "^3.4.0" } }, + "node_modules/blob-util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", + "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", + "dev": true + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, "node_modules/boxen": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", @@ -3958,6 +4762,15 @@ "ieee754": "^1.1.13" } }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -4088,6 +4901,15 @@ "node": ">=8" } }, + "node_modules/cachedir": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", + "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -4157,6 +4979,12 @@ } ] }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -4182,6 +5010,15 @@ "node": ">=10" } }, + "node_modules/check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -4242,6 +5079,12 @@ "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", "dev": true }, + "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 + }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -4263,6 +5106,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cli-table": { "version": "0.3.11", "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.11.tgz", @@ -4275,6 +5130,51 @@ "node": ">= 0.2.0" } }, + "node_modules/cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -4407,6 +5307,12 @@ "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", "dev": true }, + "node_modules/colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, "node_modules/colors": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", @@ -4437,6 +5343,21 @@ "node": "^12.20.0 || >=14" } }, + "node_modules/common-ancestor-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", + "dev": true + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/compress-brotli": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz", @@ -4530,6 +5451,12 @@ "url": "https://opencollective.com/core-js" } }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, "node_modules/cosmiconfig": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz", @@ -4642,12 +5569,182 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" }, + "node_modules/cypress": { + "version": "12.7.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-12.7.0.tgz", + "integrity": "sha512-7rq+nmhzz0u6yabCFyPtADU2OOrYt6pvUau9qV7xyifJ/hnsaw/vkr0tnLlcuuQKUAOC1v1M1e4Z0zG7S0IAvA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@cypress/request": "^2.88.10", + "@cypress/xvfb": "^1.2.4", + "@types/node": "^14.14.31", + "@types/sinonjs__fake-timers": "8.1.1", + "@types/sizzle": "^2.3.2", + "arch": "^2.2.0", + "blob-util": "^2.0.2", + "bluebird": "^3.7.2", + "buffer": "^5.6.0", + "cachedir": "^2.3.0", + "chalk": "^4.1.0", + "check-more-types": "^2.24.0", + "cli-cursor": "^3.1.0", + "cli-table3": "~0.6.1", + "commander": "^5.1.0", + "common-tags": "^1.8.0", + "dayjs": "^1.10.4", + "debug": "^4.3.4", + "enquirer": "^2.3.6", + "eventemitter2": "6.4.7", + "execa": "4.1.0", + "executable": "^4.1.1", + "extract-zip": "2.0.1", + "figures": "^3.2.0", + "fs-extra": "^9.1.0", + "getos": "^3.2.1", + "is-ci": "^3.0.0", + "is-installed-globally": "~0.4.0", + "lazy-ass": "^1.6.0", + "listr2": "^3.8.3", + "lodash": "^4.17.21", + "log-symbols": "^4.0.0", + "minimist": "^1.2.6", + "ospath": "^1.2.2", + "pretty-bytes": "^5.6.0", + "proxy-from-env": "1.0.0", + "request-progress": "^3.0.0", + "semver": "^7.3.2", + "supports-color": "^8.1.1", + "tmp": "~0.2.1", + "untildify": "^4.0.0", + "yauzl": "^2.10.0" + }, + "bin": { + "cypress": "bin/cypress" + }, + "engines": { + "node": "^14.0.0 || ^16.0.0 || >=18.0.0" + } + }, + "node_modules/cypress/node_modules/@types/node": { + "version": "14.18.36", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.36.tgz", + "integrity": "sha512-FXKWbsJ6a1hIrRxv+FoukuHnGTgEzKYGi7kilfMae96AL9UNkPFNWJEEYWzdRI9ooIkbr4AKldyuSTLql06vLQ==", + "dev": true + }, + "node_modules/cypress/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/cypress/node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/cypress/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cypress/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cypress/node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/cypress/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/cypress/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", "dev": true }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/data-urls": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", @@ -4674,6 +5771,12 @@ "url": "https://opencollective.com/date-fns" } }, + "node_modules/dayjs": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", + "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==", + "dev": true + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -4912,6 +6015,16 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, "node_modules/electron-to-chromium": { "version": "1.4.305", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.305.tgz", @@ -4967,6 +6080,18 @@ "node": ">=10.13.0" } }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/entities": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", @@ -5003,6 +6128,15 @@ "is-arrayish": "^0.2.1" } }, + "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, + "dependencies": { + "stackframe": "^1.3.4" + } + }, "node_modules/es-abstract": { "version": "1.21.1", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", @@ -5090,6 +6224,363 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/esbuild": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.10.tgz", + "integrity": "sha512-n7V3v29IuZy5qgxx25TKJrEm0FHghAlS6QweUcyIgh/U0zYmQcvogWROitrTyZId1mHSkuhhuyEXtI9OXioq7A==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.10", + "@esbuild/android-arm64": "0.17.10", + "@esbuild/android-x64": "0.17.10", + "@esbuild/darwin-arm64": "0.17.10", + "@esbuild/darwin-x64": "0.17.10", + "@esbuild/freebsd-arm64": "0.17.10", + "@esbuild/freebsd-x64": "0.17.10", + "@esbuild/linux-arm": "0.17.10", + "@esbuild/linux-arm64": "0.17.10", + "@esbuild/linux-ia32": "0.17.10", + "@esbuild/linux-loong64": "0.17.10", + "@esbuild/linux-mips64el": "0.17.10", + "@esbuild/linux-ppc64": "0.17.10", + "@esbuild/linux-riscv64": "0.17.10", + "@esbuild/linux-s390x": "0.17.10", + "@esbuild/linux-x64": "0.17.10", + "@esbuild/netbsd-x64": "0.17.10", + "@esbuild/openbsd-x64": "0.17.10", + "@esbuild/sunos-x64": "0.17.10", + "@esbuild/win32-arm64": "0.17.10", + "@esbuild/win32-ia32": "0.17.10", + "@esbuild/win32-x64": "0.17.10" + } + }, + "node_modules/esbuild-android-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz", + "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz", + "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz", + "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz", + "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz", + "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz", + "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz", + "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz", + "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz", + "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz", + "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz", + "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz", + "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz", + "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz", + "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz", + "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz", + "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", + "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz", + "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", + "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", + "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -5742,6 +7233,12 @@ "node": ">=0.10.0" } }, + "node_modules/eventemitter2": { + "version": "6.4.7", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", + "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", + "dev": true + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -5761,8 +7258,29 @@ "engines": { "node": ">=10" }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "dependencies": { + "pify": "^2.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/executable/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/exit": { @@ -5799,6 +7317,56 @@ "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -5878,6 +7446,39 @@ "bser": "2.1.1" } }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "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, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/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, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -5946,6 +7547,15 @@ "is-callable": "^1.1.3" } }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -6172,6 +7782,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/getos": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", + "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", + "dev": true, + "dependencies": { + "async": "^3.2.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, "node_modules/github-from-package": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", @@ -6585,6 +8213,20 @@ "node": ">= 6" } }, + "node_modules/http-signature": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", + "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.14.1" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/http2-wrapper": { "version": "2.1.11", "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.1.11.tgz", @@ -7269,6 +8911,12 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", @@ -9373,6 +11021,12 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, "node_modules/jsdom": { "version": "20.0.3", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", @@ -9457,6 +11111,12 @@ "jju": "^1.1.0" } }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, "node_modules/json-schema-ref-parser": { "version": "9.0.9", "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", @@ -9482,6 +11142,12 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -9536,6 +11202,21 @@ "node >= 0.2.0" ] }, + "node_modules/jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, "node_modules/jsx-ast-utils": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", @@ -9613,6 +11294,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", + "dev": true, + "engines": { + "node": "> 0.8" + } + }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -9641,6 +11331,50 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, + "node_modules/listr2": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", + "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", + "dev": true, + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.1", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -9724,6 +11458,12 @@ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true + }, "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", @@ -9746,6 +11486,38 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -10377,6 +12149,12 @@ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", "dev": true }, + "node_modules/module-alias": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.2.tgz", + "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q==", + "dev": true + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -10571,6 +12349,12 @@ "node": "^12.13 || ^14.13 || >=16" } }, + "node_modules/node-hook": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-hook/-/node-hook-1.0.0.tgz", + "integrity": "sha512-tBTIHwkzXvbesP0fY495VsqSWCOS5Ttt5+mAmeqUC1yglCiSYarNewfi2Q+HOL+M6pZYYqwGU6jIi5+gIHQbpg==", + "dev": true + }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -11357,6 +13141,12 @@ "node": ">= 0.8.0" } }, + "node_modules/ospath": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", + "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", + "dev": true + }, "node_modules/p-cancelable": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", @@ -11566,6 +13356,18 @@ "node": ">=8" } }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -11677,18 +13479,6 @@ "node": ">=8" } }, - "node_modules/playwright-core": { - "version": "1.31.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.31.0.tgz", - "integrity": "sha512-/KquBjS5DcASCh8cGeNVHuC0kyb7c9plKTwaKxgOGtxT7+DZO2fjmFvPDBSXslEIK5CeOO/2kk5rOCktFXKEdA==", - "dev": true, - "bin": { - "playwright": "cli.js" - }, - "engines": { - "node": ">=14" - } - }, "node_modules/plur": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", @@ -11824,6 +13614,18 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pretty-format": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", @@ -11945,6 +13747,12 @@ "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", "dev": true }, + "node_modules/proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", + "dev": true + }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -11985,6 +13793,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/qs": { + "version": "6.10.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz", + "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", @@ -12439,11 +14262,35 @@ "node": ">=8" } }, + "node_modules/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true + }, "node_modules/regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, + "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, + "dependencies": { + "regexp-tree": "^0.1.11" + } + }, + "node_modules/regexp-tree": { + "version": "0.1.24", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz", + "integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==", + "dev": true, + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, "node_modules/regexp.prototype.flags": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", @@ -12509,6 +14356,15 @@ "node": ">=8" } }, + "node_modules/request-progress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", + "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", + "dev": true, + "dependencies": { + "throttleit": "^1.0.0" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -12568,7 +14424,37 @@ "node": ">=8" } }, - "node_modules/resolve-cwd/node_modules/resolve-from": { + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg/-/resolve-pkg-2.0.0.tgz", + "integrity": "sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-pkg/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", @@ -12577,15 +14463,6 @@ "node": ">=8" } }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/resolve.exports": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.0.tgz", @@ -12616,6 +14493,19 @@ "node": ">=8" } }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", @@ -12635,6 +14525,12 @@ "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -12673,6 +14569,15 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rxjs": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", + "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -13126,6 +15031,31 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, + "node_modules/sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ssri": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.1.tgz", @@ -13159,6 +15089,12 @@ "node": ">=8" } }, + "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 + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -13736,6 +15672,30 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -13950,6 +15910,12 @@ "node": "*" } }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -14203,6 +16169,15 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", @@ -14251,6 +16226,20 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, "node_modules/void-elements": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", @@ -14694,6 +16683,16 @@ "node": ">=12" } }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -15219,12 +17218,151 @@ "to-fast-properties": "^2.0.0" } }, + "@badeball/cypress-configuration": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@badeball/cypress-configuration/-/cypress-configuration-4.2.0.tgz", + "integrity": "sha512-8Dc6diBW8zUycpCFbr7vqQ8ioNZMvpHV79KGdHVpwpRtkFX6enwG82CKU9DeWys6Ou5dFpXw6NYNYNb46y7UYA==", + "dev": true, + "requires": { + "@babel/parser": "^7.18.8", + "debug": "^4.3.2", + "esbuild": "^0.14.23", + "glob": "^7.1.6", + "minimatch": "^3.0.4", + "node-hook": "^1.0.0" + }, + "dependencies": { + "@esbuild/linux-loong64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", + "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", + "dev": true, + "optional": true + }, + "esbuild": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", + "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", + "dev": true, + "requires": { + "@esbuild/linux-loong64": "0.14.54", + "esbuild-android-64": "0.14.54", + "esbuild-android-arm64": "0.14.54", + "esbuild-darwin-64": "0.14.54", + "esbuild-darwin-arm64": "0.14.54", + "esbuild-freebsd-64": "0.14.54", + "esbuild-freebsd-arm64": "0.14.54", + "esbuild-linux-32": "0.14.54", + "esbuild-linux-64": "0.14.54", + "esbuild-linux-arm": "0.14.54", + "esbuild-linux-arm64": "0.14.54", + "esbuild-linux-mips64le": "0.14.54", + "esbuild-linux-ppc64le": "0.14.54", + "esbuild-linux-riscv64": "0.14.54", + "esbuild-linux-s390x": "0.14.54", + "esbuild-netbsd-64": "0.14.54", + "esbuild-openbsd-64": "0.14.54", + "esbuild-sunos-64": "0.14.54", + "esbuild-windows-32": "0.14.54", + "esbuild-windows-64": "0.14.54", + "esbuild-windows-arm64": "0.14.54" + } + } + } + }, + "@badeball/cypress-cucumber-preprocessor": { + "version": "15.1.4", + "resolved": "https://registry.npmjs.org/@badeball/cypress-cucumber-preprocessor/-/cypress-cucumber-preprocessor-15.1.4.tgz", + "integrity": "sha512-CVagR47O7ZNOGVZJzBz6IJ5cVqj7zEUQEoI6br/gSdfZ8YVBbf8Eqx1pEZCWiDnzc7w20qj+IzM7Z8ExxYN4fQ==", + "dev": true, + "requires": { + "@badeball/cypress-configuration": "^4.0.0", + "@cucumber/cucumber-expressions": "^16.0.0", + "@cucumber/gherkin": "^24.0.0", + "@cucumber/html-formatter": "^19.2.0", + "@cucumber/message-streams": "^4.0.1", + "@cucumber/messages": "^19.1.2", + "@cucumber/tag-expressions": "^4.1.0", + "base64-js": "^1.5.1", + "chalk": "^4.1.2", + "cli-table": "^0.3.11", + "common-ancestor-path": "^1.0.1", + "cosmiconfig": "^7.0.1", + "debug": "^4.2.0", + "error-stack-parser": "^2.0.7", + "esbuild": "^0.17.8", + "glob": "^7.2.0", + "is-path-inside": "^3.0.3", + "module-alias": "^2.2.2", + "node-hook": "^1.0.0", + "resolve-pkg": "^2.0.0", + "source-map": "^0.7.4", + "uuid": "^8.3.2" + }, + "dependencies": { + "cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + } + } + }, + "@bahmutov/cypress-esbuild-preprocessor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@bahmutov/cypress-esbuild-preprocessor/-/cypress-esbuild-preprocessor-2.2.0.tgz", + "integrity": "sha512-pTvxRi6+OFsXy6uCn/HlO5zi0fUZWbiCtTiLTDf/+kgEfZ/Y8WIxZ2pjuir9MEM8prQenBw60TLcM0wcazh7+Q==", + "dev": true, + "requires": { + "debug": "4.3.4" + } + }, "@bcoe/v8-coverage": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "@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, + "optional": true + }, "@conductionnl/agenda-service": { "version": "git+ssh://git@github.com/Huwelijksplanner/AgendaService.git#deacac54371371f2c85e35139f7062bbeaf98d74", "dev": true, @@ -15245,12 +17383,294 @@ "dev": true, "from": "@conductionnl/trouw-service@github:Huwelijksplanner/TrouwService" }, - "@csstools/selector-specificity": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz", - "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==", + "@csstools/selector-specificity": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz", + "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==", + "dev": true, + "requires": {} + }, + "@cucumber/cucumber-expressions": { + "version": "16.1.2", + "resolved": "https://registry.npmjs.org/@cucumber/cucumber-expressions/-/cucumber-expressions-16.1.2.tgz", + "integrity": "sha512-CfHEbxJ5FqBwF6mJyLLz4B353gyHkoi6cCL4J0lfDZ+GorpcWw4n2OUAdxJmP7ZlREANWoTFlp4FhmkLKrCfUA==", + "dev": true, + "requires": { + "regexp-match-indices": "1.0.2" + } + }, + "@cucumber/gherkin": { + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-24.1.0.tgz", + "integrity": "sha512-B48XrUod4y3SoXe6mv12q7U1zThUNSK3yHSm/hBJCJZ6RJUJhFk3FVMN/83qOEbsYZe6iG9v+4L1Myf8/q8C6g==", + "dev": true, + "requires": { + "@cucumber/messages": "^19.1.4" + } + }, + "@cucumber/html-formatter": { + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/@cucumber/html-formatter/-/html-formatter-19.2.0.tgz", + "integrity": "sha512-qGms4588jmVF/G3fTbgZvxn6OQw9GaTFV007nZZ9/10M9DfrgRqjFjVxVI9TPV63xOLPicEVoqsKZtcECbdMSA==", + "dev": true, + "requires": {} + }, + "@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, + "requires": {} + }, + "@cucumber/messages": { + "version": "19.1.4", + "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-19.1.4.tgz", + "integrity": "sha512-Pksl0pnDz2l1+L5Ug85NlG6LWrrklN9qkMxN5Mv+1XZ3T6u580dnE6mVaxjJRdcOq4tR17Pc0RqIDZMyVY1FlA==", + "dev": true, + "requires": { + "@types/uuid": "8.3.4", + "class-transformer": "0.5.1", + "reflect-metadata": "0.1.13", + "uuid": "9.0.0" + }, + "dependencies": { + "uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "dev": true + } + } + }, + "@cucumber/tag-expressions": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@cucumber/tag-expressions/-/tag-expressions-4.1.0.tgz", + "integrity": "sha512-chTnjxV3vryL75N90wJIMdMafXmZoO2JgNJLYpsfcALL2/IQrRiny3vM9DgD5RDCSt1LNloMtb7rGey9YWxCsA==", + "dev": true + }, + "@cypress/request": { + "version": "2.88.11", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.11.tgz", + "integrity": "sha512-M83/wfQ1EkspjkE2lNWNV5ui2Cv7UCv1swW1DqljahbzLVWltcsexQh8jYtuS/vzFXP+HySntGM83ZXA9fn17w==", + "dev": true, + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "http-signature": "~1.3.6", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "performance-now": "^2.1.0", + "qs": "~6.10.3", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^8.3.2" + }, + "dependencies": { + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + } + } + }, + "@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@esbuild/android-arm": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.10.tgz", + "integrity": "sha512-7YEBfZ5lSem9Tqpsz+tjbdsEshlO9j/REJrfv4DXgKTt1+/MHqGwbtlyxQuaSlMeUZLxUKBaX8wdzlTfHkmnLw==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.10.tgz", + "integrity": "sha512-ht1P9CmvrPF5yKDtyC+z43RczVs4rrHpRqrmIuoSvSdn44Fs1n6DGlpZKdK6rM83pFLbVaSUwle8IN+TPmkv7g==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.10.tgz", + "integrity": "sha512-CYzrm+hTiY5QICji64aJ/xKdN70IK8XZ6iiyq0tZkd3tfnwwSWTYH1t3m6zyaaBxkuj40kxgMyj1km/NqdjQZA==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.10.tgz", + "integrity": "sha512-3HaGIowI+nMZlopqyW6+jxYr01KvNaLB5znXfbyyjuo4lE0VZfvFGcguIJapQeQMS4cX/NEispwOekJt3gr5Dg==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.10.tgz", + "integrity": "sha512-J4MJzGchuCRG5n+B4EHpAMoJmBeAE1L3wGYDIN5oWNqX0tEr7VKOzw0ymSwpoeSpdCa030lagGUfnfhS7OvzrQ==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.10.tgz", + "integrity": "sha512-ZkX40Z7qCbugeK4U5/gbzna/UQkM9d9LNV+Fro8r7HA7sRof5Rwxc46SsqeMvB5ZaR0b1/ITQ/8Y1NmV2F0fXQ==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.10.tgz", + "integrity": "sha512-0m0YX1IWSLG9hWh7tZa3kdAugFbZFFx9XrvfpaCMMvrswSTvUZypp0NFKriUurHpBA3xsHVE9Qb/0u2Bbi/otg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.10.tgz", + "integrity": "sha512-whRdrrl0X+9D6o5f0sTZtDM9s86Xt4wk1bf7ltx6iQqrIIOH+sre1yjpcCdrVXntQPCNw/G+XqsD4HuxeS+2QA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.10.tgz", + "integrity": "sha512-g1EZJR1/c+MmCgVwpdZdKi4QAJ8DCLP5uTgLWSAVd9wlqk9GMscaNMEViG3aE1wS+cNMzXXgdWiW/VX4J+5nTA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.10.tgz", + "integrity": "sha512-1vKYCjfv/bEwxngHERp7huYfJ4jJzldfxyfaF7hc3216xiDA62xbXJfRlradiMhGZbdNLj2WA1YwYFzs9IWNPw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.10.tgz", + "integrity": "sha512-mvwAr75q3Fgc/qz3K6sya3gBmJIYZCgcJ0s7XshpoqIAIBszzfXsqhpRrRdVFAyV1G9VUjj7VopL2HnAS8aHFA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.10.tgz", + "integrity": "sha512-XilKPgM2u1zR1YuvCsFQWl9Fc35BqSqktooumOY2zj7CSn5czJn279j9TE1JEqSqz88izJo7yE4x3LSf7oxHzg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.10.tgz", + "integrity": "sha512-kM4Rmh9l670SwjlGkIe7pYWezk8uxKHX4Lnn5jBZYBNlWpKMBCVfpAgAJqp5doLobhzF3l64VZVrmGeZ8+uKmQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.10.tgz", + "integrity": "sha512-r1m9ZMNJBtOvYYGQVXKy+WvWd0BPvSxMsVq8Hp4GzdMBQvfZRvRr5TtX/1RdN6Va8JMVQGpxqde3O+e8+khNJQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.10.tgz", + "integrity": "sha512-LsY7QvOLPw9WRJ+fU5pNB3qrSfA00u32ND5JVDrn/xG5hIQo3kvTxSlWFRP0NJ0+n6HmhPGG0Q4jtQsb6PFoyg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.10.tgz", + "integrity": "sha512-zJUfJLebCYzBdIz/Z9vqwFjIA7iSlLCFvVi7glMgnu2MK7XYigwsonXshy9wP9S7szF+nmwrelNaP3WGanstEg==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.10.tgz", + "integrity": "sha512-lOMkailn4Ok9Vbp/q7uJfgicpDTbZFlXlnKT2DqC8uBijmm5oGtXAJy2ZZVo5hX7IOVXikV9LpCMj2U8cTguWA==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.10.tgz", + "integrity": "sha512-/VE0Kx6y7eekqZ+ZLU4AjMlB80ov9tEz4H067Y0STwnGOYL8CsNg4J+cCmBznk1tMpxMoUOf0AbWlb1d2Pkbig==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.10.tgz", + "integrity": "sha512-ERNO0838OUm8HfUjjsEs71cLjLMu/xt6bhOlxcJ0/1MG3hNqCmbWaS+w/8nFLa0DDjbwZQuGKVtCUJliLmbVgg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.10.tgz", + "integrity": "sha512-fXv+L+Bw2AeK+XJHwDAQ9m3NRlNemG6Z6ijLwJAAVdu4cyoFbBWbEtyZzDeL+rpG2lWI51cXeMt70HA8g2MqIg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.10.tgz", + "integrity": "sha512-3s+HADrOdCdGOi5lnh5DMQEzgbsFsd4w57L/eLKKjMnN0CN4AIEP0DCP3F3N14xnxh3ruNc32A0Na9zYe1Z/AQ==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.10.tgz", + "integrity": "sha512-oP+zFUjYNaMNmjTwlFtWep85hvwUu19cZklB3QsBOcZSs6y7hmH4LNCJ7075bsqzYaNvZFXJlAVaQ2ApITDXtw==", "dev": true, - "requires": {} + "optional": true }, "@eslint/eslintrc": { "version": "1.4.1", @@ -16547,17 +18967,6 @@ } } }, - "@playwright/test": { - "version": "1.31.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.31.0.tgz", - "integrity": "sha512-Ys5s/06Dg9g3zAIdCIb/UOBYim3U7Zjb3DvC6XBtnRmnglH5O47iwYzmtxXu9fhSyzI2Jn28apkXIOD81GgCdw==", - "dev": true, - "requires": { - "@types/node": "*", - "fsevents": "2.3.2", - "playwright-core": "1.31.0" - } - }, "@pnpm/network.ca-file": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.1.tgz", @@ -16641,6 +19050,16 @@ "defer-to-connect": "^2.0.1" } }, + "@testing-library/cypress": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@testing-library/cypress/-/cypress-9.0.0.tgz", + "integrity": "sha512-c1XiCGeHGGTWn0LAU12sFUfoX3qfId5gcSE2yHode+vsyHDWraxDPALjVnHd4/Fa3j4KBcc5k++Ccy6A9qnkMA==", + "dev": true, + "requires": { + "@babel/runtime": "^7.14.6", + "@testing-library/dom": "^8.1.0" + } + }, "@testing-library/dom": { "version": "8.17.1", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.17.1.tgz", @@ -16980,6 +19399,18 @@ "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", "dev": true }, + "@types/sinonjs__fake-timers": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", + "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", + "dev": true + }, + "@types/sizzle": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", + "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", + "dev": true + }, "@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", @@ -17001,6 +19432,12 @@ "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", "dev": true }, + "@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", + "dev": true + }, "@types/yargs": { "version": "17.0.11", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.11.tgz", @@ -17016,6 +19453,16 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, + "@types/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } + }, "@typescript-eslint/eslint-plugin": { "version": "5.53.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.53.0.tgz", @@ -17256,6 +19703,12 @@ "string-width": "^4.1.0" } }, + "ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true + }, "ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -17304,6 +19757,12 @@ "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "dev": true }, + "arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true + }, "are-we-there-yet": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", @@ -17388,6 +19847,21 @@ "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true }, + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true + }, "ast-types-flow": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", @@ -17400,18 +19874,42 @@ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true + }, "available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "dev": true }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true + }, + "aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", + "dev": true + }, "axe-core": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.3.tgz", @@ -17506,6 +20004,15 @@ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -17523,6 +20030,18 @@ "readable-stream": "^3.4.0" } }, + "blob-util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", + "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", + "dev": true + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, "boxen": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", @@ -17635,6 +20154,12 @@ "ieee754": "^1.1.13" } }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true + }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -17742,6 +20267,12 @@ } } }, + "cachedir": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", + "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", + "dev": true + }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -17786,6 +20317,12 @@ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001451.tgz", "integrity": "sha512-XY7UbUpGRatZzoRft//5xOa69/1iGJRBlrieH6QYrkKLIFn3m7OVEJ81dSrKoy2BnKsdbX5cLrOispZNYo9v2w==" }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -17802,6 +20339,12 @@ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true }, + "check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", + "dev": true + }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -17847,6 +20390,12 @@ "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", "dev": true }, + "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 + }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -17859,6 +20408,15 @@ "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", "dev": true }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, "cli-table": { "version": "0.3.11", "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.11.tgz", @@ -17868,6 +20426,39 @@ "colors": "1.0.3" } }, + "cli-table3": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz", + "integrity": "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==", + "dev": true, + "requires": { + "@colors/colors": "1.5.0", + "string-width": "^4.2.0" + } + }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "dependencies": { + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + } + } + }, "cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -17973,6 +20564,12 @@ "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", "dev": true }, + "colorette": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "dev": true + }, "colors": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", @@ -17994,6 +20591,18 @@ "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", "dev": true }, + "common-ancestor-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", + "dev": true + }, + "common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true + }, "compress-brotli": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/compress-brotli/-/compress-brotli-1.3.8.tgz", @@ -18070,6 +20679,12 @@ "integrity": "sha512-r1nJk41QLLPyozHUUPmILCEMtMw24NG4oWK6RbsDdjzQgg9ZvrUsPBj1MnG0wXXp1DCDU6j+wUvEmBSrtRbLXg==", "dev": true }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, "cosmiconfig": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz", @@ -18156,12 +20771,144 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" }, + "cypress": { + "version": "12.7.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-12.7.0.tgz", + "integrity": "sha512-7rq+nmhzz0u6yabCFyPtADU2OOrYt6pvUau9qV7xyifJ/hnsaw/vkr0tnLlcuuQKUAOC1v1M1e4Z0zG7S0IAvA==", + "dev": true, + "requires": { + "@cypress/request": "^2.88.10", + "@cypress/xvfb": "^1.2.4", + "@types/node": "^14.14.31", + "@types/sinonjs__fake-timers": "8.1.1", + "@types/sizzle": "^2.3.2", + "arch": "^2.2.0", + "blob-util": "^2.0.2", + "bluebird": "^3.7.2", + "buffer": "^5.6.0", + "cachedir": "^2.3.0", + "chalk": "^4.1.0", + "check-more-types": "^2.24.0", + "cli-cursor": "^3.1.0", + "cli-table3": "~0.6.1", + "commander": "^5.1.0", + "common-tags": "^1.8.0", + "dayjs": "^1.10.4", + "debug": "^4.3.4", + "enquirer": "^2.3.6", + "eventemitter2": "6.4.7", + "execa": "4.1.0", + "executable": "^4.1.1", + "extract-zip": "2.0.1", + "figures": "^3.2.0", + "fs-extra": "^9.1.0", + "getos": "^3.2.1", + "is-ci": "^3.0.0", + "is-installed-globally": "~0.4.0", + "lazy-ass": "^1.6.0", + "listr2": "^3.8.3", + "lodash": "^4.17.21", + "log-symbols": "^4.0.0", + "minimist": "^1.2.6", + "ospath": "^1.2.2", + "pretty-bytes": "^5.6.0", + "proxy-from-env": "1.0.0", + "request-progress": "^3.0.0", + "semver": "^7.3.2", + "supports-color": "^8.1.1", + "tmp": "~0.2.1", + "untildify": "^4.0.0", + "yauzl": "^2.10.0" + }, + "dependencies": { + "@types/node": { + "version": "14.18.36", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.36.tgz", + "integrity": "sha512-FXKWbsJ6a1hIrRxv+FoukuHnGTgEzKYGi7kilfMae96AL9UNkPFNWJEEYWzdRI9ooIkbr4AKldyuSTLql06vLQ==", + "dev": true + }, + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + } + } + }, "damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", "dev": true }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, "data-urls": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", @@ -18178,6 +20925,12 @@ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==" }, + "dayjs": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", + "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==", + "dev": true + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -18350,6 +21103,16 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, "electron-to-chromium": { "version": "1.4.305", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.305.tgz", @@ -18396,6 +21159,15 @@ "tapable": "^2.2.0" } }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, "entities": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", @@ -18423,6 +21195,15 @@ "is-arrayish": "^0.2.1" } }, + "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, + "requires": { + "stackframe": "^1.3.4" + } + }, "es-abstract": { "version": "1.21.1", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", @@ -18464,36 +21245,206 @@ "which-typed-array": "^1.1.9" } }, - "es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + } + }, + "es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "esbuild": { + "version": "0.17.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.10.tgz", + "integrity": "sha512-n7V3v29IuZy5qgxx25TKJrEm0FHghAlS6QweUcyIgh/U0zYmQcvogWROitrTyZId1mHSkuhhuyEXtI9OXioq7A==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.17.10", + "@esbuild/android-arm64": "0.17.10", + "@esbuild/android-x64": "0.17.10", + "@esbuild/darwin-arm64": "0.17.10", + "@esbuild/darwin-x64": "0.17.10", + "@esbuild/freebsd-arm64": "0.17.10", + "@esbuild/freebsd-x64": "0.17.10", + "@esbuild/linux-arm": "0.17.10", + "@esbuild/linux-arm64": "0.17.10", + "@esbuild/linux-ia32": "0.17.10", + "@esbuild/linux-loong64": "0.17.10", + "@esbuild/linux-mips64el": "0.17.10", + "@esbuild/linux-ppc64": "0.17.10", + "@esbuild/linux-riscv64": "0.17.10", + "@esbuild/linux-s390x": "0.17.10", + "@esbuild/linux-x64": "0.17.10", + "@esbuild/netbsd-x64": "0.17.10", + "@esbuild/openbsd-x64": "0.17.10", + "@esbuild/sunos-x64": "0.17.10", + "@esbuild/win32-arm64": "0.17.10", + "@esbuild/win32-ia32": "0.17.10", + "@esbuild/win32-x64": "0.17.10" + } + }, + "esbuild-android-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz", + "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==", + "dev": true, + "optional": true + }, + "esbuild-android-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz", + "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==", + "dev": true, + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz", + "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==", + "dev": true, + "optional": true + }, + "esbuild-darwin-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz", + "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz", + "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz", + "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==", + "dev": true, + "optional": true + }, + "esbuild-linux-32": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz", + "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==", + "dev": true, + "optional": true + }, + "esbuild-linux-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz", + "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz", + "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz", + "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==", + "dev": true, + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz", + "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==", + "dev": true, + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz", + "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-riscv64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz", + "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==", + "dev": true, + "optional": true + }, + "esbuild-linux-s390x": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz", + "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==", + "dev": true, + "optional": true + }, + "esbuild-netbsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz", + "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==", + "dev": true, + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz", + "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==", + "dev": true, + "optional": true + }, + "esbuild-sunos-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", + "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==", "dev": true, - "requires": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - } + "optional": true }, - "es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "esbuild-windows-32": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz", + "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==", "dev": true, - "requires": { - "has": "^1.0.3" - } + "optional": true }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "esbuild-windows-64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", + "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.14.54", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", + "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==", + "dev": true, + "optional": true }, "escalade": { "version": "3.1.1", @@ -18973,6 +21924,12 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, + "eventemitter2": { + "version": "6.4.7", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", + "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", + "dev": true + }, "execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -18990,6 +21947,23 @@ "strip-final-newline": "^2.0.0" } }, + "executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "requires": { + "pify": "^2.2.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + } + } + }, "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -19015,6 +21989,41 @@ "jest-util": "^28.1.3" } }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "requires": { + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -19087,6 +22096,32 @@ "bser": "2.1.1" } }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + }, + "dependencies": { + "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 + } + } + }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -19140,6 +22175,12 @@ "is-callable": "^1.1.3" } }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true + }, "form-data": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -19301,6 +22342,24 @@ "get-intrinsic": "^1.1.1" } }, + "getos": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", + "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", + "dev": true, + "requires": { + "async": "^3.2.0" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, "github-from-package": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", @@ -19602,6 +22661,17 @@ "debug": "4" } }, + "http-signature": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", + "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.14.1" + } + }, "http2-wrapper": { "version": "2.1.11", "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.1.11.tgz", @@ -20070,6 +23140,12 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, "istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", @@ -21753,6 +24829,12 @@ "argparse": "^2.0.1" } }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, "jsdom": { "version": "20.0.3", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", @@ -21820,6 +24902,12 @@ "jju": "^1.1.0" } }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, "json-schema-ref-parser": { "version": "9.0.9", "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", @@ -21841,6 +24929,12 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, "json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -21883,6 +24977,18 @@ "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "dev": true }, + "jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, "jsx-ast-utils": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", @@ -21945,6 +25051,12 @@ "package-json": "^8.1.0" } }, + "lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", + "dev": true + }, "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -21967,6 +25079,35 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, + "listr2": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", + "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", + "dev": true, + "requires": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.1", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, "load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -22037,6 +25178,12 @@ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true + }, "lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", @@ -22053,6 +25200,31 @@ "is-unicode-supported": "^0.1.0" } }, + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -22541,6 +25713,12 @@ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", "dev": true }, + "module-alias": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.2.tgz", + "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q==", + "dev": true + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -22670,6 +25848,12 @@ "which": "^2.0.2" } }, + "node-hook": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-hook/-/node-hook-1.0.0.tgz", + "integrity": "sha512-tBTIHwkzXvbesP0fY495VsqSWCOS5Ttt5+mAmeqUC1yglCiSYarNewfi2Q+HOL+M6pZYYqwGU6jIi5+gIHQbpg==", + "dev": true + }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -23263,6 +26447,12 @@ "word-wrap": "^1.2.3" } }, + "ospath": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", + "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", + "dev": true + }, "p-cancelable": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", @@ -23406,6 +26596,18 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -23483,12 +26685,6 @@ } } }, - "playwright-core": { - "version": "1.31.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.31.0.tgz", - "integrity": "sha512-/KquBjS5DcASCh8cGeNVHuC0kyb7c9plKTwaKxgOGtxT7+DZO2fjmFvPDBSXslEIK5CeOO/2kk5rOCktFXKEdA==", - "dev": true - }, "plur": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", @@ -23575,6 +26771,12 @@ "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", "dev": true }, + "pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true + }, "pretty-format": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", @@ -23673,6 +26875,12 @@ "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", "dev": true }, + "proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", + "dev": true + }, "psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -23704,6 +26912,15 @@ "escape-goat": "^4.0.0" } }, + "qs": { + "version": "6.10.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.4.tgz", + "integrity": "sha512-OQiU+C+Ds5qiH91qh/mg0w+8nwQuLjM4F4M/PbmhDOoYehPh+Fb0bDjtR1sOvy7YKxvj28Y/M0PhP5uVX0kB+g==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, "querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", @@ -24051,11 +27268,32 @@ "strip-indent": "^3.0.0" } }, + "reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true + }, "regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" }, + "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, + "requires": { + "regexp-tree": "^0.1.11" + } + }, + "regexp-tree": { + "version": "0.1.24", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz", + "integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==", + "dev": true + }, "regexp.prototype.flags": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", @@ -24097,6 +27335,15 @@ "integrity": "sha512-C9hAO4eoEsX+OXA4rla66pXZQ+TLQ8T9dttgQj18yuKlPMTVkIkdYXvlMC55IuUsIkV6DpmQYi10JKFLaU+l7w==", "dev": true }, + "request-progress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", + "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", + "dev": true, + "requires": { + "throttleit": "^1.0.0" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -24155,6 +27402,23 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, + "resolve-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg/-/resolve-pkg-2.0.0.tgz", + "integrity": "sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, "resolve.exports": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.0.tgz", @@ -24178,6 +27442,16 @@ } } }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, "retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", @@ -24190,6 +27464,12 @@ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -24208,6 +27488,15 @@ "queue-microtask": "^1.2.2" } }, + "rxjs": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", + "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -24553,6 +27842,23 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, + "sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, "ssri": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.1.tgz", @@ -24579,6 +27885,12 @@ } } }, + "stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", + "dev": true + }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -25010,6 +28322,27 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, "tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -25183,6 +28516,12 @@ "safe-buffer": "^5.0.1" } }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -25359,6 +28698,12 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + }, "v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", @@ -25403,6 +28748,17 @@ "builtins": "^5.0.0" } }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, "void-elements": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", @@ -25721,6 +29077,16 @@ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 2758554b..5ee3cef1 100644 --- a/package.json +++ b/package.json @@ -41,8 +41,10 @@ "lint:ts": "tsc --noEmit --project tsconfig.json", "prettier": "prettier --write .", "test": "NODE_OPTIONS=--experimental-vm-modules jest --verbose src/", - "test:e2e": "playwright test", - "e2e-report": "playwright show-report", + "test:e2e": "cypress run --env tags=@e2e", + "cypress": "cypress open --env tags=@e2e", + "test:wip": "cypress run --env tags=@wip", + "cypress:wip": "cypress open --env tags=@wip", "update-patch": "npm-check-updates --configFileName .ncurc.patch.js --deep --dep dev,prod --target patch --upgrade && npm install", "update-minor": "npm-check-updates --configFileName .ncurc.minor.js --deep --dep dev,prod --target minor --upgrade && npm install", "update-major": "npm-check-updates --configFileName .ncurc.major.js --deep --dep dev,prod --target latest --upgrade && npm install", @@ -68,12 +70,14 @@ "react-dom": "18.2.0" }, "devDependencies": { + "@badeball/cypress-cucumber-preprocessor": "15.1.4", + "@bahmutov/cypress-esbuild-preprocessor": "2.2.0", "@conductionnl/agenda-service": "github:Huwelijksplanner/AgendaService", "@conductionnl/klanten-api": "github:CommonGateway/KlantenAPI", "@conductionnl/overige-objecten-service": "github:Huwelijksplanner/OverigeObjecten", "@conductionnl/trouw-service": "github:Huwelijksplanner/TrouwService", "@nl-design-system-unstable/amsterdam-design-tokens": "1.0.0-alpha.64", - "@playwright/test": "1.31.0", + "@testing-library/cypress": "9.0.0", "@testing-library/jest-dom": "5.16.5", "@testing-library/react": "13.4.0", "@testing-library/user-event": "14.4.3", @@ -82,6 +86,7 @@ "@types/react": "18.0.28", "@typescript-eslint/eslint-plugin": "5.53.0", "@typescript-eslint/parser": "5.53.0", + "cypress": "12.7.0", "eslint": "8.34.0", "eslint-config-next": "12.3.4", "eslint-config-prettier": "8.6.0", diff --git a/src/openapi/index.ts b/src/openapi/index.ts index 0643b77a..8be74d7f 100644 --- a/src/openapi/index.ts +++ b/src/openapi/index.ts @@ -1,2 +1,2 @@ -// export * from './mock-api'; -export * from './test-env'; +export * from './mock-api'; +//export * from './test-env'; diff --git a/test/PRACTICE.spec.ts b/test/PRACTICE.spec.ts new file mode 100644 index 00000000..c2225e09 --- /dev/null +++ b/test/PRACTICE.spec.ts @@ -0,0 +1,111 @@ +import { expect, test } from '@playwright/test'; + +/* +test('Scenario: ...', async ({ page }) => { + // Gegeven: ... + await page.goto('http://localhost:3000/'); + + // Wanneer ... + await page.getByRole('link', { name: 'Start' }).click(); + + // Dan ... + await expect(page).toHaveURL(/.*\/trouw-opties/); + + // En ... +}); +*/ + +// Functionaliteit: Overzicht van huwelijksmogelijkheden +// Scenario: Ik wil een huwelijk of geregistreerd partnerschap plannen +// Gegeven dat ik ben op de "utrecht huwelijksplanner" pagina +// En ik zie de heading "Regel je huwelijk of geregistreerd partnerschap" +// En ik kan een "Start" button zien +// Wanneer ik op de "Start" button klik +// Dan word ik naar de "trouw opties" pagina gestuurd +// En ik ben op step "1" + +//Step 0 +test('Scenario: Ik wil een huwelijk plannen proces beginnen', async ({ page }) => { + // Gegeven dat ik ben op de "utrecht huwelijksplanner" pagina + await page.goto('http://localhost:3000/'); + await expect(page).toHaveTitle(/Regel je huwelijk/); //Regel je huwelijk of geregistreerd partnerschap - Gemeente + + // En ik zie de heading "Regel je huwelijk of geregistreerd partnerschap" + const heading = await page + .getByRole('heading', { + name: 'Regel je huwelijk of geregistreerd partnerschap', + exact: true, + }) + .innerText(); + + expect(heading).toBeDefined(); //this is the test + expect(heading).toBe('Regel je huwelijk of geregistreerd partnerschap'); + // console.log(heading); + + // En ik kan een "Start" button zien + // En "Start" button gedraagt zich als een link + const startButton = await page.getByRole('link', { name: /Start/i }); + expect(startButton).toBeDefined(); //this is the test + + // Wanneer ik op de "Start" button klik + await startButton.click(); + + // Dan word ik naar de "trouw opties" pagina gestuurd + await expect(page).toHaveURL(/.*\/trouw-opties/); + + // En ik ben op step "1" + const step1 = await page.getByRole('paragraph', { name: /Stap 1 van [0-9]/i }); + expect(step1).toBeDefined(); +}); + +// Scenario: Ik wil een huwelijk als trouw optie kiezen +// Gegeven dat ik ben op de "trouw opties" pagina +// En ik zie de heading "Trouwen of geregistreerd partnerschap" +// En ik ben op step "1" +// En ik kan een "Trouwen plannen" button zien +// Wanneer ik op de "Trouwen plannen" button klik +// Dan word ik naar de "trouw opties huwelijk" pagina gestuurd +// En ik ben op step "2" +//Step 1 +test('Scenario: Ik wil een huwelijk als trouw optie kiezen', async ({ page }) => { + // Gegeven dat ik ben op de "trouw opties" pagina + await page.goto('http://localhost:3000/trouw-opties'); + await expect(page).toHaveTitle(/Stap 1: Trouwen of geregistreerd partnerschap - Gemeente Utrecht/); //It could also just be "Step 1" + + // En ik zie de heading "Regel je huwelijk of geregistreerd partnerschap" + const heading = await page + .getByRole('heading', { + name: 'Trouwen of geregistreerd partnerschap', + exact: true, + }) + .innerText(); + + expect(heading).toBeDefined(); //this is the test + expect(heading).toBe('Trouwen of geregistreerd partnerschap'); + + const stepnumber = await page + // .getByRole('paragraph', { + // name: 'Trouwen of geregistreerd partnerschap', + // exact: true, + // }) + .getByText(/Stap [0-9] van [0-9]/i) + .innerText(); + + expect(stepnumber).toBeDefined(); //this is the test + expect(stepnumber).toContain('Stap 1'); //we could have also used getByRole in here + + // En ik kan een "Trouwen plannen" button zien + // En "Start" button gedraagt zich als een link + const trouwenPlannen = await page.getByRole('button', { name: /Trouwen plannen/i }); + expect(trouwenPlannen).toBeDefined(); //this is the test + + // Wanneer ik op de "Start" button klik + await trouwenPlannen.click(); + + // Dan word ik naar de "trouw opties" pagina gestuurd + await expect(page).toHaveURL(/.*\/trouw-opties\/huwelijk/); + + // En ik ben op step "1" + const step2 = await page.getByRole('paragraph', { name: /Stap 2 van [0-9]/i }); + expect(step2).toBeDefined(); //we could have used getbytext as well +}); diff --git a/test/example.spec.ts b/test/example.spec.ts index 98ae8b90..56e47068 100644 --- a/test/example.spec.ts +++ b/test/example.spec.ts @@ -1,18 +1,18 @@ -import { expect, test } from '@playwright/test'; +// import { expect, test } from '@playwright/test'; -test('has title', async ({ page }) => { - await page.goto('http://localhost:3000/'); +// test('has title', async ({ page }) => { +// await page.goto('http://localhost:3000/'); - // Expect a title "to contain" a substring. - await expect(page).toHaveTitle(/Regel je huwelijk/); -}); +// // Expect a title "to contain" a substring. +// await expect(page).toHaveTitle(/Regel je huwelijk/); +// }); -test('get started link', async ({ page }) => { - await page.goto('http://localhost:3000/'); +// test('get started link', async ({ page }) => { +// await page.goto('http://localhost:3000/'); - // Click the get started link. - await page.getByRole('link', { name: 'Start' }).click(); +// // Click the get started link. +// await page.getByRole('link', { name: 'Start' }).click(); - // Expects the URL to contain intro. - await expect(page).toHaveURL(/.*\/trouw-opties/); -}); +// // Expects the URL to contain intro. +// await expect(page).toHaveURL(/.*\/trouw-opties/); +// }); diff --git a/test/landing-pagina.spec.ts b/test/landing-pagina.spec.ts new file mode 100644 index 00000000..b1590987 --- /dev/null +++ b/test/landing-pagina.spec.ts @@ -0,0 +1,57 @@ +import { expect, test } from '@playwright/test'; + +/* +test('Scenario: ...', async ({ page }) => { + // Gegeven: ... + await page.goto('http://localhost:3000/'); + + // Wanneer ... + await page.getByRole('link', { name: 'Start' }).click(); + + // Dan ... + await expect(page).toHaveURL(/.*\/trouw-opties/); + + // En ... +}); +*/ + +// Functionaliteit: Overzicht van huwelijksmogelijkheden +// Scenario: Ik wil een huwelijk of geregistreerd partnerschap plannen +// Gegeven dat ik ben op de "utrecht huwelijksplanner" pagina +// En ik zie de heading "Regel je huwelijk of geregistreerd partnerschap" +// En ik kan een "Start" button zien +// Wanneer ik op de "Start" button klik +// Dan word ik naar de "trouw opties" pagina gestuurd +// En ik ben op step "1" + +test('Scenario: Ik wil een huwelijk of geregistreerd partnerschap plannen', async ({ page }) => { + // Gegeven dat ik ben op de "utrecht huwelijksplanner" pagina + await page.goto('http://localhost:3000/'); + + // En ik zie de heading "Regel je huwelijk of geregistreerd partnerschap" + const heading = await page + .getByRole('heading', { + name: 'Regel je huwelijk of geregistreerd partnerschap', + exact: true, + }) + .innerText(); + + expect(heading).toBeDefined(); //this is the test + expect(heading).toBe('Regel je huwelijk of geregistreerd partnerschap'); + // console.log(heading); + + // En ik kan een "Start" button zien + // En "Start" button gedraagt zich als een link + const startButton = await page.getByRole('link', { name: /Start/i }); + expect(startButton).toBeDefined(); //this is the test + + // Wanneer ik op de "Start" button klik + await startButton.click(); + + // Dan word ik naar de "trouw opties" pagina gestuurd + await expect(page).toHaveURL(/.*\/trouw-opties/); + + // En ik ben op step "1" + const step1 = await page.getByRole('paragraph', { name: /Stap 1 van [0-9]/i }); + expect(step1).toBeDefined(); +}); diff --git a/tests-examples/demo-todo-app.spec.ts b/tests-examples/demo-todo-app.spec.ts new file mode 100644 index 00000000..2fd6016f --- /dev/null +++ b/tests-examples/demo-todo-app.spec.ts @@ -0,0 +1,437 @@ +import { test, expect, type Page } from '@playwright/test'; + +test.beforeEach(async ({ page }) => { + await page.goto('https://demo.playwright.dev/todomvc'); +}); + +const TODO_ITEMS = [ + 'buy some cheese', + 'feed the cat', + 'book a doctors appointment' +]; + +test.describe('New Todo', () => { + test('should allow me to add todo items', async ({ page }) => { + // create a new todo locator + const newTodo = page.getByPlaceholder('What needs to be done?'); + + // Create 1st todo. + await newTodo.fill(TODO_ITEMS[0]); + await newTodo.press('Enter'); + + // Make sure the list only has one todo item. + await expect(page.getByTestId('todo-title')).toHaveText([ + TODO_ITEMS[0] + ]); + + // Create 2nd todo. + await newTodo.fill(TODO_ITEMS[1]); + await newTodo.press('Enter'); + + // Make sure the list now has two todo items. + await expect(page.getByTestId('todo-title')).toHaveText([ + TODO_ITEMS[0], + TODO_ITEMS[1] + ]); + + await checkNumberOfTodosInLocalStorage(page, 2); + }); + + test('should clear text input field when an item is added', async ({ page }) => { + // create a new todo locator + const newTodo = page.getByPlaceholder('What needs to be done?'); + + // Create one todo item. + await newTodo.fill(TODO_ITEMS[0]); + await newTodo.press('Enter'); + + // Check that input is empty. + await expect(newTodo).toBeEmpty(); + await checkNumberOfTodosInLocalStorage(page, 1); + }); + + test('should append new items to the bottom of the list', async ({ page }) => { + // Create 3 items. + await createDefaultTodos(page); + + // create a todo count locator + const todoCount = page.getByTestId('todo-count') + + // Check test using different methods. + await expect(page.getByText('3 items left')).toBeVisible(); + await expect(todoCount).toHaveText('3 items left'); + await expect(todoCount).toContainText('3'); + await expect(todoCount).toHaveText(/3/); + + // Check all items in one call. + await expect(page.getByTestId('todo-title')).toHaveText(TODO_ITEMS); + await checkNumberOfTodosInLocalStorage(page, 3); + }); +}); + +test.describe('Mark all as completed', () => { + test.beforeEach(async ({ page }) => { + await createDefaultTodos(page); + await checkNumberOfTodosInLocalStorage(page, 3); + }); + + test.afterEach(async ({ page }) => { + await checkNumberOfTodosInLocalStorage(page, 3); + }); + + test('should allow me to mark all items as completed', async ({ page }) => { + // Complete all todos. + await page.getByLabel('Mark all as complete').check(); + + // Ensure all todos have 'completed' class. + await expect(page.getByTestId('todo-item')).toHaveClass(['completed', 'completed', 'completed']); + await checkNumberOfCompletedTodosInLocalStorage(page, 3); + }); + + test('should allow me to clear the complete state of all items', async ({ page }) => { + const toggleAll = page.getByLabel('Mark all as complete'); + // Check and then immediately uncheck. + await toggleAll.check(); + await toggleAll.uncheck(); + + // Should be no completed classes. + await expect(page.getByTestId('todo-item')).toHaveClass(['', '', '']); + }); + + test('complete all checkbox should update state when items are completed / cleared', async ({ page }) => { + const toggleAll = page.getByLabel('Mark all as complete'); + await toggleAll.check(); + await expect(toggleAll).toBeChecked(); + await checkNumberOfCompletedTodosInLocalStorage(page, 3); + + // Uncheck first todo. + const firstTodo = page.getByTestId('todo-item').nth(0); + await firstTodo.getByRole('checkbox').uncheck(); + + // Reuse toggleAll locator and make sure its not checked. + await expect(toggleAll).not.toBeChecked(); + + await firstTodo.getByRole('checkbox').check(); + await checkNumberOfCompletedTodosInLocalStorage(page, 3); + + // Assert the toggle all is checked again. + await expect(toggleAll).toBeChecked(); + }); +}); + +test.describe('Item', () => { + + test('should allow me to mark items as complete', async ({ page }) => { + // create a new todo locator + const newTodo = page.getByPlaceholder('What needs to be done?'); + + // Create two items. + for (const item of TODO_ITEMS.slice(0, 2)) { + await newTodo.fill(item); + await newTodo.press('Enter'); + } + + // Check first item. + const firstTodo = page.getByTestId('todo-item').nth(0); + await firstTodo.getByRole('checkbox').check(); + await expect(firstTodo).toHaveClass('completed'); + + // Check second item. + const secondTodo = page.getByTestId('todo-item').nth(1); + await expect(secondTodo).not.toHaveClass('completed'); + await secondTodo.getByRole('checkbox').check(); + + // Assert completed class. + await expect(firstTodo).toHaveClass('completed'); + await expect(secondTodo).toHaveClass('completed'); + }); + + test('should allow me to un-mark items as complete', async ({ page }) => { + // create a new todo locator + const newTodo = page.getByPlaceholder('What needs to be done?'); + + // Create two items. + for (const item of TODO_ITEMS.slice(0, 2)) { + await newTodo.fill(item); + await newTodo.press('Enter'); + } + + const firstTodo = page.getByTestId('todo-item').nth(0); + const secondTodo = page.getByTestId('todo-item').nth(1); + const firstTodoCheckbox = firstTodo.getByRole('checkbox'); + + await firstTodoCheckbox.check(); + await expect(firstTodo).toHaveClass('completed'); + await expect(secondTodo).not.toHaveClass('completed'); + await checkNumberOfCompletedTodosInLocalStorage(page, 1); + + await firstTodoCheckbox.uncheck(); + await expect(firstTodo).not.toHaveClass('completed'); + await expect(secondTodo).not.toHaveClass('completed'); + await checkNumberOfCompletedTodosInLocalStorage(page, 0); + }); + + test('should allow me to edit an item', async ({ page }) => { + await createDefaultTodos(page); + + const todoItems = page.getByTestId('todo-item'); + const secondTodo = todoItems.nth(1); + await secondTodo.dblclick(); + await expect(secondTodo.getByRole('textbox', { name: 'Edit' })).toHaveValue(TODO_ITEMS[1]); + await secondTodo.getByRole('textbox', { name: 'Edit' }).fill('buy some sausages'); + await secondTodo.getByRole('textbox', { name: 'Edit' }).press('Enter'); + + // Explicitly assert the new text value. + await expect(todoItems).toHaveText([ + TODO_ITEMS[0], + 'buy some sausages', + TODO_ITEMS[2] + ]); + await checkTodosInLocalStorage(page, 'buy some sausages'); + }); +}); + +test.describe('Editing', () => { + test.beforeEach(async ({ page }) => { + await createDefaultTodos(page); + await checkNumberOfTodosInLocalStorage(page, 3); + }); + + test('should hide other controls when editing', async ({ page }) => { + const todoItem = page.getByTestId('todo-item').nth(1); + await todoItem.dblclick(); + await expect(todoItem.getByRole('checkbox')).not.toBeVisible(); + await expect(todoItem.locator('label', { + hasText: TODO_ITEMS[1], + })).not.toBeVisible(); + await checkNumberOfTodosInLocalStorage(page, 3); + }); + + test('should save edits on blur', async ({ page }) => { + const todoItems = page.getByTestId('todo-item'); + await todoItems.nth(1).dblclick(); + await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).fill('buy some sausages'); + await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).dispatchEvent('blur'); + + await expect(todoItems).toHaveText([ + TODO_ITEMS[0], + 'buy some sausages', + TODO_ITEMS[2], + ]); + await checkTodosInLocalStorage(page, 'buy some sausages'); + }); + + test('should trim entered text', async ({ page }) => { + const todoItems = page.getByTestId('todo-item'); + await todoItems.nth(1).dblclick(); + await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).fill(' buy some sausages '); + await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).press('Enter'); + + await expect(todoItems).toHaveText([ + TODO_ITEMS[0], + 'buy some sausages', + TODO_ITEMS[2], + ]); + await checkTodosInLocalStorage(page, 'buy some sausages'); + }); + + test('should remove the item if an empty text string was entered', async ({ page }) => { + const todoItems = page.getByTestId('todo-item'); + await todoItems.nth(1).dblclick(); + await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).fill(''); + await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).press('Enter'); + + await expect(todoItems).toHaveText([ + TODO_ITEMS[0], + TODO_ITEMS[2], + ]); + }); + + test('should cancel edits on escape', async ({ page }) => { + const todoItems = page.getByTestId('todo-item'); + await todoItems.nth(1).dblclick(); + await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).fill('buy some sausages'); + await todoItems.nth(1).getByRole('textbox', { name: 'Edit' }).press('Escape'); + await expect(todoItems).toHaveText(TODO_ITEMS); + }); +}); + +test.describe('Counter', () => { + test('should display the current number of todo items', async ({ page }) => { + // create a new todo locator + const newTodo = page.getByPlaceholder('What needs to be done?'); + + // create a todo count locator + const todoCount = page.getByTestId('todo-count') + + await newTodo.fill(TODO_ITEMS[0]); + await newTodo.press('Enter'); + + await expect(todoCount).toContainText('1'); + + await newTodo.fill(TODO_ITEMS[1]); + await newTodo.press('Enter'); + await expect(todoCount).toContainText('2'); + + await checkNumberOfTodosInLocalStorage(page, 2); + }); +}); + +test.describe('Clear completed button', () => { + test.beforeEach(async ({ page }) => { + await createDefaultTodos(page); + }); + + test('should display the correct text', async ({ page }) => { + await page.locator('.todo-list li .toggle').first().check(); + await expect(page.getByRole('button', { name: 'Clear completed' })).toBeVisible(); + }); + + test('should remove completed items when clicked', async ({ page }) => { + const todoItems = page.getByTestId('todo-item'); + await todoItems.nth(1).getByRole('checkbox').check(); + await page.getByRole('button', { name: 'Clear completed' }).click(); + await expect(todoItems).toHaveCount(2); + await expect(todoItems).toHaveText([TODO_ITEMS[0], TODO_ITEMS[2]]); + }); + + test('should be hidden when there are no items that are completed', async ({ page }) => { + await page.locator('.todo-list li .toggle').first().check(); + await page.getByRole('button', { name: 'Clear completed' }).click(); + await expect(page.getByRole('button', { name: 'Clear completed' })).toBeHidden(); + }); +}); + +test.describe('Persistence', () => { + test('should persist its data', async ({ page }) => { + // create a new todo locator + const newTodo = page.getByPlaceholder('What needs to be done?'); + + for (const item of TODO_ITEMS.slice(0, 2)) { + await newTodo.fill(item); + await newTodo.press('Enter'); + } + + const todoItems = page.getByTestId('todo-item'); + const firstTodoCheck = todoItems.nth(0).getByRole('checkbox'); + await firstTodoCheck.check(); + await expect(todoItems).toHaveText([TODO_ITEMS[0], TODO_ITEMS[1]]); + await expect(firstTodoCheck).toBeChecked(); + await expect(todoItems).toHaveClass(['completed', '']); + + // Ensure there is 1 completed item. + await checkNumberOfCompletedTodosInLocalStorage(page, 1); + + // Now reload. + await page.reload(); + await expect(todoItems).toHaveText([TODO_ITEMS[0], TODO_ITEMS[1]]); + await expect(firstTodoCheck).toBeChecked(); + await expect(todoItems).toHaveClass(['completed', '']); + }); +}); + +test.describe('Routing', () => { + test.beforeEach(async ({ page }) => { + await createDefaultTodos(page); + // make sure the app had a chance to save updated todos in storage + // before navigating to a new view, otherwise the items can get lost :( + // in some frameworks like Durandal + await checkTodosInLocalStorage(page, TODO_ITEMS[0]); + }); + + test('should allow me to display active items', async ({ page }) => { + const todoItem = page.getByTestId('todo-item'); + await page.getByTestId('todo-item').nth(1).getByRole('checkbox').check(); + + await checkNumberOfCompletedTodosInLocalStorage(page, 1); + await page.getByRole('link', { name: 'Active' }).click(); + await expect(todoItem).toHaveCount(2); + await expect(todoItem).toHaveText([TODO_ITEMS[0], TODO_ITEMS[2]]); + }); + + test('should respect the back button', async ({ page }) => { + const todoItem = page.getByTestId('todo-item'); + await page.getByTestId('todo-item').nth(1).getByRole('checkbox').check(); + + await checkNumberOfCompletedTodosInLocalStorage(page, 1); + + await test.step('Showing all items', async () => { + await page.getByRole('link', { name: 'All' }).click(); + await expect(todoItem).toHaveCount(3); + }); + + await test.step('Showing active items', async () => { + await page.getByRole('link', { name: 'Active' }).click(); + }); + + await test.step('Showing completed items', async () => { + await page.getByRole('link', { name: 'Completed' }).click(); + }); + + await expect(todoItem).toHaveCount(1); + await page.goBack(); + await expect(todoItem).toHaveCount(2); + await page.goBack(); + await expect(todoItem).toHaveCount(3); + }); + + test('should allow me to display completed items', async ({ page }) => { + await page.getByTestId('todo-item').nth(1).getByRole('checkbox').check(); + await checkNumberOfCompletedTodosInLocalStorage(page, 1); + await page.getByRole('link', { name: 'Completed' }).click(); + await expect(page.getByTestId('todo-item')).toHaveCount(1); + }); + + test('should allow me to display all items', async ({ page }) => { + await page.getByTestId('todo-item').nth(1).getByRole('checkbox').check(); + await checkNumberOfCompletedTodosInLocalStorage(page, 1); + await page.getByRole('link', { name: 'Active' }).click(); + await page.getByRole('link', { name: 'Completed' }).click(); + await page.getByRole('link', { name: 'All' }).click(); + await expect(page.getByTestId('todo-item')).toHaveCount(3); + }); + + test('should highlight the currently applied filter', async ({ page }) => { + await expect(page.getByRole('link', { name: 'All' })).toHaveClass('selected'); + + //create locators for active and completed links + const activeLink = page.getByRole('link', { name: 'Active' }); + const completedLink = page.getByRole('link', { name: 'Completed' }); + await activeLink.click(); + + // Page change - active items. + await expect(activeLink).toHaveClass('selected'); + await completedLink.click(); + + // Page change - completed items. + await expect(completedLink).toHaveClass('selected'); + }); +}); + +async function createDefaultTodos(page: Page) { + // create a new todo locator + const newTodo = page.getByPlaceholder('What needs to be done?'); + + for (const item of TODO_ITEMS) { + await newTodo.fill(item); + await newTodo.press('Enter'); + } +} + +async function checkNumberOfTodosInLocalStorage(page: Page, expected: number) { + return await page.waitForFunction(e => { + return JSON.parse(localStorage['react-todos']).length === e; + }, expected); +} + +async function checkNumberOfCompletedTodosInLocalStorage(page: Page, expected: number) { + return await page.waitForFunction(e => { + return JSON.parse(localStorage['react-todos']).filter((todo: any) => todo.completed).length === e; + }, expected); +} + +async function checkTodosInLocalStorage(page: Page, title: string) { + return await page.waitForFunction(t => { + return JSON.parse(localStorage['react-todos']).map((todo: any) => todo.title).includes(t); + }, title); +} diff --git a/tests/example.spec.ts b/tests/example.spec.ts new file mode 100644 index 00000000..c511525c --- /dev/null +++ b/tests/example.spec.ts @@ -0,0 +1,18 @@ +import { test, expect } from '@playwright/test'; + +test('has title', async ({ page }) => { + await page.goto('https://playwright.dev/'); + + // Expect a title "to contain" a substring. + await expect(page).toHaveTitle(/Playwright/); +}); + +test('get started link', async ({ page }) => { + await page.goto('https://playwright.dev/'); + + // Click the get started link. + await page.getByRole('link', { name: 'Get started' }).click(); + + // Expects the URL to contain intro. + await expect(page).toHaveURL(/.*intro/); +}); diff --git a/tsconfig.json b/tsconfig.json index 78960705..2ad58af3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -13,7 +13,8 @@ "resolveJsonModule": true, "isolatedModules": true, "jsx": "preserve", - "incremental": true + "incremental": true, + "types": ["cypress", "@testing-library/cypress"] }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], "exclude": ["node_modules"]