From a091cffea893213b8d761d70bbfad708ad5a4e37 Mon Sep 17 00:00:00 2001 From: Christopher Sunkel Date: Mon, 19 Feb 2024 15:50:35 +0000 Subject: [PATCH] Reactify OMIS quote page (#6515) * Add remarkGfm markdown plugin * Create component to render OMIS terms and conditions * Reactify OMIS quote page * Add tests * Remove legacy code * Fixup! use STATUS constant --- package-lock.json | 4789 ++++++++++++++++- package.json | 1 + src/apps/omis/__test__/middleware.test.js | 130 - src/apps/omis/apps/create/steps.js | 36 - src/apps/omis/apps/edit/steps.js | 59 - src/apps/omis/apps/list/orders.js | 16 - src/apps/omis/apps/list/router.js | 5 - .../apps/view/__test__/controllers.test.js | 39 - .../apps/view/__test__/middleware.test.js | 1056 ---- src/apps/omis/apps/view/controllers.js | 12 - src/apps/omis/apps/view/middleware.js | 225 - src/apps/omis/apps/view/router.js | 21 - src/apps/omis/apps/view/views/quote.njk | 121 - src/apps/omis/locales/en/default.json | 146 - src/apps/omis/middleware.js | 34 +- src/apps/omis/models.js | 25 - src/apps/omis/router.js | 5 +- src/apps/routers.js | 1 + src/client/actions.js | 2 + .../modules/Omis/OMISTermsAndConditions.jsx | 664 +++ src/client/modules/Omis/OrderQuote.jsx | 310 ++ src/client/modules/Omis/reducer.js | 13 + src/client/modules/Omis/state.js | 6 + src/client/modules/Omis/tasks.js | 11 + src/client/reducers.js | 4 + src/client/routes.js | 6 + src/client/tasks.js | 9 + src/config/nunjucks/filters.js | 5 - src/lib/urls.js | 9 + src/middleware/api-proxy.js | 3 + src/templates/_layouts/template.njk | 2 +- src/templates/_macros/common.njk | 4 - .../_macros/common/__test__/from-now.test.js | 44 - .../common/__test__/hidden-content.test.js | 56 - src/templates/_macros/common/from-now.njk | 14 - .../_macros/common/hidden-content.njk | 35 - src/templates/_macros/entity/entity.njk | 2 - src/templates/_macros/entity/meta-item.njk | 4 - .../cypress/specs/Omis/RenderQuote.cy.jsx | 49 + test/functional/cypress/fixtures/index.js | 4 + .../cypress/specs/omis/quote-spec.js | 240 + .../fixtures/v3/omis/quote-cancelled.json | 27 + .../fixtures/v3/omis/quote-not-accepted.json | 17 + .../fixtures/v3/omis/quote-preview.json | 12 + test/sandbox/fixtures/v3/omis/quote.json | 11 +- test/sandbox/routes/v3/omis/omis.js | 23 +- test/sandbox/server.js | 6 + test/unit/data/contacts/contacts.json | 108 - 48 files changed, 6018 insertions(+), 2403 deletions(-) delete mode 100644 src/apps/omis/apps/create/steps.js delete mode 100644 src/apps/omis/apps/edit/steps.js delete mode 100644 src/apps/omis/apps/list/orders.js delete mode 100644 src/apps/omis/apps/view/__test__/controllers.test.js delete mode 100644 src/apps/omis/apps/view/__test__/middleware.test.js delete mode 100644 src/apps/omis/apps/view/controllers.js delete mode 100644 src/apps/omis/apps/view/middleware.js delete mode 100644 src/apps/omis/apps/view/views/quote.njk delete mode 100644 src/apps/omis/locales/en/default.json create mode 100644 src/client/modules/Omis/OMISTermsAndConditions.jsx create mode 100644 src/client/modules/Omis/OrderQuote.jsx create mode 100644 src/client/modules/Omis/reducer.js delete mode 100644 src/templates/_macros/common/__test__/from-now.test.js delete mode 100644 src/templates/_macros/common/__test__/hidden-content.test.js delete mode 100644 src/templates/_macros/common/from-now.njk delete mode 100644 src/templates/_macros/common/hidden-content.njk create mode 100644 test/component/cypress/specs/Omis/RenderQuote.cy.jsx create mode 100644 test/functional/cypress/specs/omis/quote-spec.js create mode 100644 test/sandbox/fixtures/v3/omis/quote-cancelled.json create mode 100644 test/sandbox/fixtures/v3/omis/quote-not-accepted.json create mode 100644 test/sandbox/fixtures/v3/omis/quote-preview.json delete mode 100644 test/unit/data/contacts/contacts.json diff --git a/package-lock.json b/package-lock.json index cea6c43e2ce..759a9f44863 100644 --- a/package-lock.json +++ b/package-lock.json @@ -80,6 +80,7 @@ "redis": "4.6.13", "redux": "^4.2.1", "redux-saga": "^1.3.0", + "remark-gfm": "^4.0.0", "request-promise": "^4.2.6", "resolve-url-loader": "^5.0.0", "sass": "^1.70.0", @@ -10979,6 +10980,15 @@ "node": ">=4" } }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chai": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", @@ -13175,6 +13185,18 @@ "detect-port": "bin/detect-port.js" } }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/dezalgo": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", @@ -20896,6 +20918,15 @@ "node": ">=0.10.0" } }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -21289,6 +21320,15 @@ "markdown-it": "bin/markdown-it.mjs" } }, + "node_modules/markdown-table": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", + "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/markdown-to-jsx": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.4.1.tgz", @@ -21377,6 +21417,70 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", + "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-from-markdown": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", @@ -21400,231 +21504,515 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-to-hast": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", - "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", + "node_modules/mdast-util-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", + "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", "dependencies": { - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-definitions": "^5.0.0", - "micromark-util-sanitize-uri": "^1.1.0", - "trim-lines": "^3.0.0", - "unist-util-generated": "^2.0.0", - "unist-util-position": "^4.0.0", - "unist-util-visit": "^4.0.0" + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-to-hast/node_modules/mdast-util-definitions": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", - "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz", + "integrity": "sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==", "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", - "unist-util-visit": "^4.0.0" + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-to-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", - "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "node_modules/mdast-util-gfm-autolink-literal/node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", "dependencies": { - "@types/mdast": "^3.0.0" + "@types/unist": "*" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", + "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + "node_modules/mdast-util-gfm-footnote/node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dependencies": { + "@types/unist": "*" + } }, - "node_modules/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==" + "node_modules/mdast-util-gfm-footnote/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" }, - "node_modules/measured-core": { - "version": "1.51.1", - "resolved": "https://registry.npmjs.org/measured-core/-/measured-core-1.51.1.tgz", - "integrity": "sha512-DZQP9SEwdqqYRvT2slMK81D/7xwdxXosZZBtLVfPSo6y5P672FBTbzHVdN4IQyUkUpcVOR9pIvtUy5Ryl7NKyg==", + "node_modules/mdast-util-gfm-footnote/node_modules/mdast-util-from-markdown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", + "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", "dependencies": { - "binary-search": "^1.3.3", - "optional-js": "^2.0.0" + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" }, - "engines": { - "node": ">= 5.12" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/measured-reporting": { - "version": "1.51.1", - "resolved": "https://registry.npmjs.org/measured-reporting/-/measured-reporting-1.51.1.tgz", - "integrity": "sha512-JCt+2u6XT1I5lG3SuYqywE0e62DJuAzBcfMzWGUhIYtPQV2Vm4HiYt/durqmzsAbZV181CEs+o/jMKWJKkYIWw==", + "node_modules/mdast-util-gfm-footnote/node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", "dependencies": { - "console-log-level": "^1.4.1", - "mapcap": "^1.0.0", - "measured-core": "^1.51.1", - "optional-js": "^2.0.0" + "@types/mdast": "^4.0.0" }, - "engines": { - "node": ">= 5.12" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" + "node_modules/mdast-util-gfm-footnote/node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-core-commonmark": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", + "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/memfs": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", - "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", - "dev": true, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "fs-monkey": "^1.0.4" - }, - "engines": { - "node": ">= 4.0.0" + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/memoizerific": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz", - "integrity": "sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==", - "dev": true, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "map-or-similar": "^1.5.0" + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==", - "dev": true, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/memory-fs/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } }, - "node_modules/memory-fs/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/memory-fs/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "safe-buffer": "~5.1.0" + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "dev": true, - "engines": { - "node": ">= 0.10.0" + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/meow": { - "version": "10.1.5", - "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", - "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], "dependencies": { - "@types/minimist": "^1.2.2", - "camelcase-keys": "^7.0.0", - "decamelize": "^5.0.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.2", - "read-pkg-up": "^8.0.0", - "redent": "^4.0.0", - "trim-newlines": "^4.0.2", - "type-fest": "^1.2.2", - "yargs-parser": "^20.2.9" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, - "node_modules/meow/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } }, - "node_modules/merge-stream": { + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-encode": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" } }, - "node_modules/micromark": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", - "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", "funding": [ { "type": "GitHub Sponsors", @@ -21636,29 +22024,2681 @@ } ], "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "micromark-core-commonmark": "^1.0.1", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, - "node_modules/micromark-core-commonmark": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", - "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-subtokenize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", + "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-footnote/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-footnote/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/mdast-util-from-markdown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", + "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-core-commonmark": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", + "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-subtokenize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", + "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-strikethrough/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/mdast-util-gfm-table/node_modules/mdast-util-from-markdown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", + "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-core-commonmark": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", + "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-subtokenize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", + "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-table/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-table/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/mdast-util-from-markdown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", + "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-core-commonmark": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", + "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-subtokenize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", + "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm-task-list-item/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm/node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/mdast-util-gfm/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/mdast-util-gfm/node_modules/mdast-util-from-markdown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", + "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm/node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-core-commonmark": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", + "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-subtokenize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", + "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-gfm/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing/node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/mdast-util-phrasing/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/mdast-util-phrasing/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-12.3.0.tgz", + "integrity": "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==", + "dependencies": { + "@types/hast": "^2.0.0", + "@types/mdast": "^3.0.0", + "mdast-util-definitions": "^5.0.0", + "micromark-util-sanitize-uri": "^1.1.0", + "trim-lines": "^3.0.0", + "unist-util-generated": "^2.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast/node_modules/mdast-util-definitions": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-5.1.2.tgz", + "integrity": "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "unist-util-visit": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", + "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/mdast-util-to-markdown/node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-to-markdown/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/mdast-util-to-markdown/node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz", + "integrity": "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==", + "dependencies": { + "@types/mdast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==" + }, + "node_modules/measured-core": { + "version": "1.51.1", + "resolved": "https://registry.npmjs.org/measured-core/-/measured-core-1.51.1.tgz", + "integrity": "sha512-DZQP9SEwdqqYRvT2slMK81D/7xwdxXosZZBtLVfPSo6y5P672FBTbzHVdN4IQyUkUpcVOR9pIvtUy5Ryl7NKyg==", + "dependencies": { + "binary-search": "^1.3.3", + "optional-js": "^2.0.0" + }, + "engines": { + "node": ">= 5.12" + } + }, + "node_modules/measured-reporting": { + "version": "1.51.1", + "resolved": "https://registry.npmjs.org/measured-reporting/-/measured-reporting-1.51.1.tgz", + "integrity": "sha512-JCt+2u6XT1I5lG3SuYqywE0e62DJuAzBcfMzWGUhIYtPQV2Vm4HiYt/durqmzsAbZV181CEs+o/jMKWJKkYIWw==", + "dependencies": { + "console-log-level": "^1.4.1", + "mapcap": "^1.0.0", + "measured-core": "^1.51.1", + "optional-js": "^2.0.0" + }, + "engines": { + "node": ">= 5.12" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dev": true, + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/memoizerific": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/memoizerific/-/memoizerific-1.11.3.tgz", + "integrity": "sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==", + "dev": true, + "dependencies": { + "map-or-similar": "^1.5.0" + } + }, + "node_modules/memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==", + "dev": true, + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/memory-fs/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/memory-fs/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/memory-fs/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/meow": { + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", + "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", + "dependencies": { + "@types/minimist": "^1.2.2", + "camelcase-keys": "^7.0.0", + "decamelize": "^5.0.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.2", + "read-pkg-up": "^8.0.0", + "redent": "^4.0.0", + "trim-newlines": "^4.0.2", + "type-fest": "^1.2.2", + "yargs-parser": "^20.2.9" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", + "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "micromark-core-commonmark": "^1.0.1", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-decode-numeric-character-reference": "^1.0.0", + "micromark-util-encode": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", + "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-factory-destination": "^1.0.0", + "micromark-factory-label": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-factory-title": "^1.0.0", + "micromark-factory-whitespace": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-html-tag-name": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-subtokenize": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.1", + "uvu": "^0.5.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.0.0.tgz", + "integrity": "sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.0.0.tgz", + "integrity": "sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-core-commonmark": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", + "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", "funding": [ { "type": "GitHub Sponsors", @@ -21671,23 +24711,703 @@ ], "dependencies": { "decode-named-character-reference": "^1.0.0", - "micromark-factory-destination": "^1.0.0", - "micromark-factory-label": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-factory-title": "^1.0.0", - "micromark-factory-whitespace": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-html-tag-name": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-subtokenize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", + "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.0.0.tgz", + "integrity": "sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.0.1.tgz", + "integrity": "sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm/node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm/node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, + "node_modules/micromark-extension-gfm/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/micromark-extension-gfm/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, "node_modules/micromark-factory-destination": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", @@ -26827,6 +30547,575 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-gfm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", + "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm/node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/remark-gfm/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/remark-gfm/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/remark-gfm/node_modules/mdast-util-from-markdown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", + "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm/node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm/node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/remark-gfm/node_modules/micromark-core-commonmark": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", + "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/remark-gfm/node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/remark-gfm/node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/remark-gfm/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/remark-gfm/node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/remark-gfm/node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/remark-gfm/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/remark-gfm/node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/remark-gfm/node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/remark-gfm/node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/remark-gfm/node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/remark-gfm/node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/remark-gfm/node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/remark-gfm/node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/remark-gfm/node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/remark-gfm/node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/remark-gfm/node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/remark-gfm/node_modules/micromark-util-subtokenize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", + "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/remark-gfm/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/remark-gfm/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/remark-gfm/node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm/node_modules/unified": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", + "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm/node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-parse": { "version": "10.0.2", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-10.0.2.tgz", @@ -26920,6 +31209,101 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify/node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/remark-stringify/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + }, + "node_modules/remark-stringify/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/remark-stringify/node_modules/unified": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", + "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify/node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/renderkid": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", @@ -32285,6 +36669,15 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } } } diff --git a/package.json b/package.json index 12ccb292903..d23bb19c16c 100644 --- a/package.json +++ b/package.json @@ -141,6 +141,7 @@ "redis": "4.6.13", "redux": "^4.2.1", "redux-saga": "^1.3.0", + "remark-gfm": "^4.0.0", "request-promise": "^4.2.6", "resolve-url-loader": "^5.0.0", "sass": "^1.70.0", diff --git a/src/apps/omis/__test__/middleware.test.js b/src/apps/omis/__test__/middleware.test.js index 414066c27e6..0f9d4d20648 100644 --- a/src/apps/omis/__test__/middleware.test.js +++ b/src/apps/omis/__test__/middleware.test.js @@ -1,7 +1,5 @@ const proxyquire = require('proxyquire') -const buildMiddlewareParameters = require('../../../../test/unit/helpers/middleware-parameters-builder') -const companyData = require('../../../../test/unit/data/company.json') const orderData = require('../../../../test/unit/data/omis/simple-order.json') describe('OMIS middleware', () => { @@ -42,86 +40,6 @@ describe('OMIS middleware', () => { }) }) - describe('setCompany()', () => { - beforeEach(() => { - this.companyId = 'c-1234567890' - }) - - context('when get company resolves', () => { - beforeEach(() => { - this.getDitCompanyStub.resolves(companyData) - }) - - it('should call getDitCompany() with correct arguments', async () => { - await this.middleware.setCompany( - this.reqMock, - this.resMock, - this.nextSpy, - this.companyId - ) - - expect(this.getDitCompanyStub).to.have.been.calledWith( - this.reqMock, - this.companyId - ) - }) - - it('should set a company property on locals', async () => { - await this.middleware.setCompany( - this.reqMock, - this.resMock, - this.nextSpy, - this.companyId - ) - - expect(this.resMock.locals).to.have.property('company') - expect(this.resMock.locals.company).to.deep.equal(companyData) - }) - - it('should call next with no errors', async () => { - await this.middleware.setCompany( - this.reqMock, - this.resMock, - this.nextSpy, - this.companyId - ) - - expect(this.nextSpy).to.have.been.calledWith() - }) - }) - - context('when a company rejects', () => { - beforeEach(() => { - this.error = { - statusCode: 404, - } - this.getDitCompanyStub.rejects(this.error) - }) - - it('should call next with an error', async () => { - await this.middleware.setCompany( - this.reqMock, - this.resMock, - this.nextSpy, - this.companyId - ) - - expect(this.nextSpy).to.have.been.calledWith(this.error) - }) - - it('should not set a company property on locals', async () => { - await this.middleware.setCompany( - this.reqMock, - this.resMock, - this.nextSpy, - this.companyId - ) - - expect(this.resMock.locals).to.not.have.property('company') - }) - }) - }) - describe('setOrder()', () => { beforeEach(() => { this.orderId = 'o-1234567890' @@ -332,52 +250,4 @@ describe('OMIS middleware', () => { }) }) }) - - describe('setOrderBreadcrumb()', () => { - beforeEach(() => { - this.resMock.locals.order = { - id: '123456789', - reference: '12345/AS', - } - }) - - it('should call setHomeBreadcrumb with order reference', () => { - this.middleware.setOrderBreadcrumb({}, this.resMock, this.nextSpy) - - expect(this.setHomeBreadcrumbStub).to.have.been.calledOnce - expect(this.setHomeBreadcrumbStub).to.have.been.calledWith('12345/AS') - - expect(this.setHomeBreadcrumbReturnSpy).to.have.been.calledOnce - expect(this.setHomeBreadcrumbReturnSpy).to.have.been.calledWith( - {}, - this.resMock, - this.nextSpy - ) - }) - }) - - describe('translate()', () => { - beforeEach(() => { - this.middlewareParameters = buildMiddlewareParameters({}) - - this.middleware.translate( - this.middlewareParameters.reqMock, - this.middlewareParameters.resMock, - this.middlewareParameters.nextSpy - ) - }) - - it('should set the translate function', () => { - const actual = this.middlewareParameters.resMock.locals.translate( - 'fields.contact.label' - ) - expect(actual).to.equal('Contact responsible for the order') - }) - - it('should call next()', () => { - expect( - this.middlewareParameters.nextSpy - ).to.have.been.calledOnceWithExactly() - }) - }) }) diff --git a/src/apps/omis/apps/create/steps.js b/src/apps/omis/apps/create/steps.js deleted file mode 100644 index 2dcffcfc47d..00000000000 --- a/src/apps/omis/apps/create/steps.js +++ /dev/null @@ -1,36 +0,0 @@ -module.exports = { - '/': { - entryPoint: true, - resetJourney: true, - skip: true, - next: 'company', - }, - '/company': { - heading: 'Choose the company', - backLink: null, - editable: true, - next: 'contact', - fields: ['company'], - }, - '/contact': { - heading: 'Choose the contact at the company', - editable: true, - next: 'market', - fields: ['contact'], - }, - '/market': { - heading: 'Choose the country (market) of interest', - editable: true, - next: 'sector', - }, - '/sector': { - heading: 'Choose the sector', - editable: true, - next: 'confirm', - fields: ['use_sector_from_company', 'sector'], - }, - '/confirm': { - heading: 'Check order details', - backLink: null, - }, -} diff --git a/src/apps/omis/apps/edit/steps.js b/src/apps/omis/apps/edit/steps.js deleted file mode 100644 index 75d2193d543..00000000000 --- a/src/apps/omis/apps/edit/steps.js +++ /dev/null @@ -1,59 +0,0 @@ -const { cloneDeep, mapValues, merge, omit } = require('lodash') - -const createJourney = require('../create/steps') - -const createSteps = mapValues(cloneDeep(createJourney), (step) => { - return omit(step, ['next', 'backLink']) -}) - -const steps = merge({}, createSteps, { - '/assignee-time': { - heading: 'Edit estimated hours of work', - fields: ['assignee_time'], - }, - '/quote-details': { - heading: 'Edit quote information', - fields: ['description', 'delivery_date'], - }, - '/internal-details': { - heading: 'Edit internal information', - fields: [ - 'service_types', - 'sector', - 'further_info', - 'existing_agents', - 'contacts_not_to_approach', - ], - }, - '/invoice-details': { - heading: 'Edit invoice details', - fields: ['vat_status', 'vat_number', 'vat_verified', 'po_number'], - }, - '/billing-address': { - heading: 'Edit billing address', - fields: [ - 'billing_address_1', - 'billing_address_2', - 'billing_address_town', - 'billing_address_county', - 'billing_address_postcode', - 'billing_address_country', - ], - }, - '/vat-status': { - heading: 'Confirm VAT status', - fields: ['vat_status', 'vat_number', 'vat_verified'], - }, - '/payment-reconciliation': { - heading: 'Reconcile a payment', - fields: ['amount', 'received_on'], - }, -}) - -// Market cannot be edited after creation -delete steps['/market'] - -// Sector can be edited as part of a different section at this stage -delete steps['/sector'] - -module.exports = steps diff --git a/src/apps/omis/apps/list/orders.js b/src/apps/omis/apps/list/orders.js deleted file mode 100644 index 96af2290241..00000000000 --- a/src/apps/omis/apps/list/orders.js +++ /dev/null @@ -1,16 +0,0 @@ -const renderOrdersView = async (req, res, next) => { - try { - const props = { - title: 'Orders', - heading: 'Orders', - } - - return res.render('omis/apps/view/views/orders', { props }) - } catch (error) { - next(error) - } -} - -module.exports = { - renderOrdersView, -} diff --git a/src/apps/omis/apps/list/router.js b/src/apps/omis/apps/list/router.js index 26257a1b9f8..c4e422f1722 100644 --- a/src/apps/omis/apps/list/router.js +++ b/src/apps/omis/apps/list/router.js @@ -1,6 +1,5 @@ const router = require('express').Router() -const urls = require('../../../../lib/urls') const { QUERY_FIELDS } = require('../../constants') const { @@ -9,10 +8,6 @@ const { const { getRequestBody } = require('../../../../middleware/collection') -const { renderOrdersView } = require('./orders') - -router.get(urls.omis.index(), renderOrdersView) - router.get('/export', getRequestBody(QUERY_FIELDS), exportCollection('order')) module.exports = router diff --git a/src/apps/omis/apps/view/__test__/controllers.test.js b/src/apps/omis/apps/view/__test__/controllers.test.js deleted file mode 100644 index ea566371118..00000000000 --- a/src/apps/omis/apps/view/__test__/controllers.test.js +++ /dev/null @@ -1,39 +0,0 @@ -const proxyquire = require('proxyquire') - -const transformerStub = (item) => { - return item -} - -describe('OMIS View controllers', () => { - beforeEach(() => { - this.transformSubscriberToViewStub = sinon.stub().returns(transformerStub) - - this.controllers = proxyquire('../controllers', { - '../../transformers': { - transformSubscriberToView: this.transformSubscriberToViewStub, - }, - }) - }) - - describe('renderQuote()', () => { - beforeEach(() => { - this.breadcrumbSpy = sinon.stub().returnsThis() - this.renderSpy = sinon.spy() - - this.resMock = { - breadcrumb: this.breadcrumbSpy, - render: this.renderSpy, - } - - this.controllers.renderQuote({}, this.resMock) - }) - - it('should set a breadcrumb option', () => { - expect(this.breadcrumbSpy).to.have.been.called - }) - - it('should render a template', () => { - expect(this.renderSpy).to.have.been.called - }) - }) -}) diff --git a/src/apps/omis/apps/view/__test__/middleware.test.js b/src/apps/omis/apps/view/__test__/middleware.test.js deleted file mode 100644 index bf9a67e827b..00000000000 --- a/src/apps/omis/apps/view/__test__/middleware.test.js +++ /dev/null @@ -1,1056 +0,0 @@ -const proxyquire = require('proxyquire') - -const contactMock = - require('../../../../../../test/unit/data/contacts/contacts.json')[0] - -describe('OMIS View middleware', () => { - beforeEach(() => { - this.setCompanySpy = sinon.spy() - this.loggerErrorSpy = sinon.spy() - this.getContactStub = sinon.stub() - this.previewQuoteStub = sinon.stub() - this.getQuoteStub = sinon.stub() - this.createQuoteStub = sinon.stub() - this.cancelQuoteStub = sinon.stub() - this.flashSpy = sinon.spy() - this.nextSpy = sinon.spy() - - this.resMock = { - locals: { - order: { - id: '123456789', - }, - }, - } - this.reqMock = { - session: { - token: '12345', - }, - flash: this.flashSpy, - } - - this.middleware = proxyquire('../middleware', { - '../../middleware': { - setCompany: this.setCompanySpy, - }, - '../../../../config/logger': { - error: this.loggerErrorSpy, - }, - '../../../contacts/repos': { - getContact: this.getContactStub, - }, - '../../models': { - Order: { - previewQuote: this.previewQuoteStub, - getQuote: this.getQuoteStub, - createQuote: this.createQuoteStub, - cancelQuote: this.cancelQuoteStub, - }, - }, - '../edit/steps': { - '/one': { - heading: 'Step one', - fields: ['service_types'], - }, - '/two': { - heading: 'Step two', - fields: ['foo', 'bar'], - }, - '/three': { - heading: 'Step three', - fields: ['description'], - }, - '/four': { - heading: 'Step four', - fields: ['description'], - }, - '/vat-status': { - heading: 'VAT status step', - fields: ['description'], - }, - '@noCallThru': true, - }, - }) - }) - - describe('setCompany()', () => { - context('when no order exists', () => { - beforeEach(() => { - this.middleware.setCompany({}, this.resMock, this.nextSpy) - }) - - it('should not call company middleware', () => { - expect(this.setCompanySpy).not.to.have.been.called - }) - - it('should call next', () => { - expect(this.nextSpy).to.have.been.called - }) - }) - - context('when an order exists', () => { - beforeEach(() => { - this.resMock.locals.order.company = { - id: 'company-id', - } - this.middleware.setCompany({}, this.resMock, this.nextSpy) - }) - - it('should call company middleware with correct arguments', () => { - expect(this.setCompanySpy).to.have.been.calledOnce - expect(this.setCompanySpy).to.have.been.calledWith( - {}, - this.resMock, - this.nextSpy, - 'company-id' - ) - }) - - it('should not call next itself', () => { - expect(this.nextSpy).not.to.have.been.called - }) - }) - }) - - describe('setContact()', () => { - context('when no contact ID exists', () => { - beforeEach(async () => { - await this.middleware.setContact( - this.reqMock, - this.resMock, - this.nextSpy - ) - }) - - it('should not make an API request', () => { - expect(this.getContactStub).not.to.have.called - }) - - it('should call next', () => { - expect(this.nextSpy).to.have.been.calledWith() - }) - }) - - context('when API call resolves', () => { - beforeEach(async () => { - this.resMock.locals.order.contact = { - id: 'contact-id', - } - this.getContactStub.resolves(contactMock) - - await this.middleware.setContact( - this.reqMock, - this.resMock, - this.nextSpy - ) - }) - - it('should call getContact with correct arguments', () => { - expect(this.getContactStub).to.have.been.calledOnce - expect(this.getContactStub).to.have.been.calledWith( - this.reqMock, - 'contact-id' - ) - }) - - it('should set contact property on locals', () => { - expect(this.resMock.locals.order).to.have.property('contact') - }) - - it('should set correct contact object', () => { - expect(this.resMock.locals.order.contact).to.deep.equal(contactMock) - }) - - it('should call next', () => { - expect(this.nextSpy).to.have.been.calledWith() - }) - }) - - context('when call generates an error', () => { - beforeEach(async () => { - this.resMock.locals.order.contact = { - id: 'contact-id', - } - this.error = { - statusCode: 500, - } - this.getContactStub.rejects(this.error) - - await this.middleware.setContact( - this.reqMock, - this.resMock, - this.nextSpy - ) - }) - - it('should call next with error', () => { - expect(this.nextSpy).to.have.been.calledWith(this.error) - }) - }) - }) - - describe('setQuoteSummary()', () => { - context('when order is awaiting quote acceptance', () => { - beforeEach(() => { - this.resMock.locals.order.status = 'quote_awaiting_acceptance' - }) - - context('when quote resolves', () => { - beforeEach(() => { - const mockDate = new Date('2017-08-01') - this.clock = sinon.useFakeTimers(mockDate.getTime()) - }) - - afterEach(() => { - this.clock.restore() - }) - - context('when quote has not expired', () => { - beforeEach(async () => { - this.getQuoteStub.resolves({ - id: '12345', - content: 'Quote content', - expires_on: '2017-08-02', - }) - - await this.middleware.setQuoteSummary( - this.reqMock, - this.resMock, - this.nextSpy - ) - }) - - it('should make quote request', () => { - expect(this.getQuoteStub).to.have.been.calledWith( - this.reqMock, - this.resMock.locals.order.id - ) - }) - - it('should set response as quote property on locals', () => { - expect(this.resMock.locals).to.have.property('quote') - expect(this.resMock.locals.quote).to.deep.equal({ - id: '12345', - expired: false, - expires_on: new Date('2017-08-02T23:59:59'), - content: 'Quote content', - }) - }) - - it('should call next', () => { - expect(this.nextSpy).to.have.been.calledWith() - }) - }) - - context('when quote has expired', () => { - beforeEach(async () => { - this.getQuoteStub.resolves({ - id: '12345', - expires_on: '2017-07-10', - }) - - await this.middleware.setQuoteSummary( - this.reqMock, - this.resMock, - this.nextSpy - ) - }) - - it('should set expired property to true', async () => { - expect(this.resMock.locals).to.have.property('quote') - expect(this.resMock.locals.quote).to.deep.equal({ - id: '12345', - expired: true, - expires_on: new Date('2017-07-10T23:59:59'), - }) - }) - }) - }) - - context('when quote rejects', () => { - beforeEach(async () => { - this.error = { - statusCode: 409, - } - this.getQuoteStub.rejects(this.error) - - await this.middleware.setQuoteSummary( - this.reqMock, - this.resMock, - this.nextSpy - ) - }) - - it('should make quote request', () => { - expect(this.getQuoteStub).to.have.been.calledWith( - this.reqMock, - this.resMock.locals.order.id - ) - }) - - it('should log error', () => { - expect(this.loggerErrorSpy).to.have.been.calledOnce - expect(this.loggerErrorSpy).to.have.been.calledWith(this.error) - }) - - it('should call next', () => { - expect(this.nextSpy).to.have.been.calledWith() - }) - }) - }) - - context('when order is not awaiting quote acceptance', () => { - beforeEach(async () => { - this.resMock.locals.order.status = 'draft' - - await this.middleware.setQuoteSummary( - this.reqMock, - this.resMock, - this.nextSpy - ) - }) - - it('should not make quote request', () => { - expect(this.getQuoteStub).not.to.have.been.called - }) - - it('should call next', () => { - expect(this.nextSpy).to.have.been.calledWith() - }) - }) - }) - - describe('setQuotePreview()', () => { - context('when an order is in draft', () => { - beforeEach(() => { - this.resMock.locals.order.status = 'draft' - }) - - context('when quote preview resolves', () => { - beforeEach(async () => { - this.previewQuoteStub.resolves({ - id: '12345', - content: 'Quote content', - expires_on: '2017-07-10', - }) - - await this.middleware.setQuotePreview( - this.reqMock, - this.resMock, - this.nextSpy - ) - }) - - it('should set response as quote property on locals', () => { - expect(this.resMock.locals).to.have.property('quote') - expect(this.resMock.locals.quote).to.deep.equal({ - id: '12345', - content: 'Quote content', - expires_on: new Date('2017-07-10T23:59:59'), - }) - }) - - it('should call next', () => { - expect(this.nextSpy).to.have.been.calledWith() - }) - }) - - context('when quote preview generates an unexpected error', () => { - beforeEach(async () => { - this.error = { - statusCode: 500, - } - this.previewQuoteStub.rejects(this.error) - - await this.middleware.setQuotePreview( - this.reqMock, - this.resMock, - this.nextSpy - ) - }) - - it('should log error', () => { - expect(this.loggerErrorSpy).to.have.been.calledOnce - expect(this.loggerErrorSpy).to.have.been.calledWith(this.error) - }) - - it('should call next', () => { - expect(this.nextSpy).to.have.been.calledWith() - }) - }) - - context( - 'when quote preview cannot be generated because of errors', - () => { - beforeEach(() => { - const error = { - statusCode: 400, - error: { - service_types: ['Required'], - description: ['Required'], - }, - } - this.previewQuoteStub.rejects(error) - }) - - it('should include incomplete fields object', async () => { - await this.middleware.setQuotePreview( - this.reqMock, - this.resMock, - this.nextSpy - ) - - expect(this.resMock.locals).to.have.property('incompleteFields') - }) - - it('should contain the correct error step', async () => { - await this.middleware.setQuotePreview( - this.reqMock, - this.resMock, - this.nextSpy - ) - - expect(this.resMock.locals.incompleteFields).to.have.ordered.keys([ - '/one', - '/three', - '/four', - ]) - }) - - it('should not contain the vat status step', async () => { - await this.middleware.setQuotePreview( - this.reqMock, - this.resMock, - this.nextSpy - ) - - expect(this.resMock.locals.incompleteFields).not.to.have.property( - '/vat-status' - ) - }) - - it('should contain correct object structure', async () => { - await this.middleware.setQuotePreview( - this.reqMock, - this.resMock, - this.nextSpy - ) - - expect(this.resMock.locals.incompleteFields).to.deep.equal({ - '/one': { - heading: 'Step one', - errors: ['service_types'], - }, - '/three': { - heading: 'Step three', - errors: ['description'], - }, - '/four': { - heading: 'Step four', - errors: ['description'], - }, - }) - }) - - it('should set a missingLeadAssignee property', async () => { - await this.middleware.setQuotePreview( - this.reqMock, - this.resMock, - this.nextSpy - ) - - expect(this.resMock.locals).to.have.property('missingLeadAssignee') - }) - - it('should set a missingLeadAssignee to false', async () => { - await this.middleware.setQuotePreview( - this.reqMock, - this.resMock, - this.nextSpy - ) - - expect(this.resMock.locals.missingLeadAssignee).to.equal(false) - }) - - it('should return next without error', async () => { - await this.middleware.setQuotePreview( - this.reqMock, - this.resMock, - this.nextSpy - ) - - expect(this.nextSpy).to.have.been.calledWith() - }) - } - ) - - context('when quote preview errors contains assignee_lead error', () => { - beforeEach(() => { - const error = { - statusCode: 400, - error: { - assignee_lead: ['Required'], - }, - } - this.previewQuoteStub.rejects(error) - }) - - it('should set a missingLeadAssignee property', async () => { - await this.middleware.setQuotePreview( - this.reqMock, - this.resMock, - this.nextSpy - ) - - expect(this.resMock.locals).to.have.property('missingLeadAssignee') - }) - - it('should set a missingLeadAssignee to true', async () => { - await this.middleware.setQuotePreview( - this.reqMock, - this.resMock, - this.nextSpy - ) - - expect(this.resMock.locals.missingLeadAssignee).to.equal(true) - }) - - it('should return next without error', async () => { - await this.middleware.setQuotePreview( - this.reqMock, - this.resMock, - this.nextSpy - ) - - expect(this.nextSpy).to.have.been.calledWith() - }) - }) - }) - - context('when an order is in draft', () => { - beforeEach(async () => { - this.resMock.locals.order.status = 'quote_accepted' - await this.middleware.setQuotePreview( - this.reqMock, - this.resMock, - this.nextSpy - ) - }) - - it('should not make quote preview request', () => { - expect(this.previewQuoteStub).not.to.have.been.called - }) - - it('should call next', () => { - expect(this.nextSpy).to.have.been.calledWith() - }) - }) - }) - - describe('setQuote()', () => { - context('when quote already exists on locals', () => { - beforeEach(async () => { - this.resMock.locals.quote = { - id: '12345', - content: 'Quote content', - } - await this.middleware.setQuote(this.reqMock, this.resMock, this.nextSpy) - }) - - it('should not make call to get quote', () => { - expect(this.getQuoteStub).not.to.have.been.called - }) - - it('should not change quote property on locals', () => { - expect(this.resMock.locals.quote).to.deep.equal({ - id: '12345', - content: 'Quote content', - }) - }) - - it('should call next with no error', () => { - expect(this.nextSpy).to.have.been.calledWith() - }) - }) - - context('when quote does not exist on locals', () => { - context('when quote resolves', () => { - beforeEach(async () => { - const mockDate = new Date('2017-08-01') - - this.clock = sinon.useFakeTimers(mockDate.getTime()) - this.getQuoteStub.resolves({ - id: '12345', - content: 'Quote content', - expires_on: '2017-08-10', - }) - - await this.middleware.setQuote( - this.reqMock, - this.resMock, - this.nextSpy - ) - }) - - afterEach(() => { - this.clock.restore() - }) - - it('should set response as quote property on locals', () => { - expect(this.resMock.locals).to.have.property('quote') - expect(this.resMock.locals.quote).to.deep.equal({ - id: '12345', - expired: false, - expires_on: new Date('2017-08-10T23:59:59'), - content: 'Quote content', - }) - }) - - it('should call next', () => { - expect(this.nextSpy).to.have.been.calledWith() - }) - }) - - context('when quote generates a 404', () => { - beforeEach(async () => { - this.error = { - statusCode: 404, - } - this.getQuoteStub.rejects(this.error) - - await this.middleware.setQuote( - this.reqMock, - this.resMock, - this.nextSpy - ) - }) - - it('should not log error', () => { - expect(this.loggerErrorSpy).not.to.have.been.called - }) - - it('should call next', () => { - expect(this.nextSpy).to.have.been.calledWith() - }) - }) - - context('when quote generates an unexpected error', () => { - beforeEach(async () => { - this.error = { - statusCode: 500, - } - this.getQuoteStub.rejects(this.error) - - await this.middleware.setQuote( - this.reqMock, - this.resMock, - this.nextSpy - ) - }) - - it('should log error', () => { - expect(this.loggerErrorSpy).to.have.been.calledOnce - expect(this.loggerErrorSpy).to.have.been.calledWith(this.error) - }) - - it('should call next', () => { - expect(this.nextSpy).to.have.been.calledWith() - }) - }) - }) - }) - - describe('generateQuote()', () => { - context('when Order.createQuote resolves', () => { - beforeEach(() => { - this.createQuoteStub.resolves({ - created_on: '2017-08-31T15:10:41.119609', - created_by: { - name: 'Rebecca Bah', - id: '3cfad090-8f7e-4a8b-beb0-14c909d6f052', - }, - }) - }) - - it('should redirect back to order page', (done) => { - const resMock = Object.assign({}, this.resMock, { - redirect: (path) => { - try { - expect(this.nextSpy).not.to.have.been.called - expect(this.flashSpy).to.have.been.calledOnce - expect(path).to.equal('/omis/123456789') - done() - } catch (error) { - done(error) - } - }, - }) - - this.middleware.generateQuote(this.reqMock, resMock, this.nextSpy) - }) - }) - - context('when Order.createQuote returns a 400', () => { - beforeEach(() => { - const error = { - statusCode: 400, - } - this.createQuoteStub.rejects(error) - }) - - it('should set flash and redirect', (done) => { - const resMock = Object.assign({}, this.resMock, { - redirect: (path) => { - try { - expect(this.nextSpy).not.to.have.been.called - expect(this.flashSpy).to.have.been.calledOnce - expect(path).to.equal('/omis/123456789') - done() - } catch (error) { - done(error) - } - }, - }) - - this.middleware.generateQuote(this.reqMock, resMock, this.nextSpy) - }) - }) - - context('when Order.createQuote returns a 409', () => { - beforeEach(() => { - const error = { - statusCode: 409, - } - this.createQuoteStub.rejects(error) - }) - - it('should set flash and redirect', (done) => { - const resMock = Object.assign({}, this.resMock, { - redirect: (path) => { - try { - expect(this.nextSpy).not.to.have.been.called - expect(this.flashSpy).to.have.been.calledOnce - expect(path).to.equal('/omis/123456789') - done() - } catch (error) { - done(error) - } - }, - }) - - this.middleware.generateQuote(this.reqMock, resMock, this.nextSpy) - }) - }) - - context('when Order.createQuote returns any other error', () => { - beforeEach(() => { - this.error = new Error('Server error') - this.error.statusCode = 500 - - this.createQuoteStub.rejects(this.error) - }) - - it('should set an empty quote object on locals object', (done) => { - const nextSpy = (error) => { - try { - expect(error).to.deep.equal(this.error) - done() - } catch (error) { - done(error) - } - } - - this.middleware.generateQuote(this.reqMock, this.resMock, nextSpy) - }) - }) - }) - - describe('cancelQuote()', () => { - context('when Order.cancelQuote resolves', () => { - beforeEach(() => { - this.cancelQuoteStub.resolves({ - created_on: '2017-08-31T15:10:41.119609', - created_by: { - name: 'Rebecca Bah', - id: '3cfad090-8f7e-4a8b-beb0-14c909d6f052', - }, - cancelled_on: '2017-09-02T15:10:41.119609', - cancelled_by: { - name: 'Rebecca Bah', - id: '3cfad090-8f7e-4a8b-beb0-14c909d6f052', - }, - }) - }) - - it('should redirect back to order page', (done) => { - const resMock = Object.assign({}, this.resMock, { - redirect: (path) => { - try { - expect(this.nextSpy).not.to.have.been.called - expect(this.flashSpy).to.have.been.calledOnce - expect(path).to.equal('/omis/123456789') - done() - } catch (error) { - done(error) - } - }, - }) - - this.middleware.cancelQuote(this.reqMock, resMock, this.nextSpy) - }) - }) - - context('when Order.cancelQuote returns a 404', () => { - beforeEach(() => { - const error = { - statusCode: 404, - } - this.cancelQuoteStub.rejects(error) - }) - - it('should set flash and redirect', (done) => { - const resMock = Object.assign({}, this.resMock, { - redirect: (path) => { - try { - expect(this.nextSpy).not.to.have.been.called - expect(this.flashSpy).to.have.been.calledOnce - expect(path).to.equal('/omis/123456789/quote') - done() - } catch (error) { - done(error) - } - }, - }) - - this.middleware.cancelQuote(this.reqMock, resMock, this.nextSpy) - }) - }) - - context('when Order.cancelQuote returns a 409', () => { - beforeEach(() => { - const error = { - statusCode: 409, - } - this.cancelQuoteStub.rejects(error) - }) - - it('should set flash and redirect', (done) => { - const resMock = Object.assign({}, this.resMock, { - redirect: (path) => { - try { - expect(this.nextSpy).not.to.have.been.called - expect(this.flashSpy).to.have.been.calledOnce - expect(path).to.equal('/omis/123456789/quote') - done() - } catch (error) { - done(error) - } - }, - }) - - this.middleware.cancelQuote(this.reqMock, resMock, this.nextSpy) - }) - }) - - context('when Order.cancelQuote returns any other error', () => { - beforeEach(() => { - this.error = new Error('Server error') - this.error.statusCode = 500 - - this.cancelQuoteStub.rejects(this.error) - }) - - it('should set an empty quote object on locals object', (done) => { - const nextSpy = (error) => { - try { - expect(error).to.deep.equal(this.error) - done() - } catch (error) { - done(error) - } - } - - this.middleware.cancelQuote(this.reqMock, this.resMock, nextSpy) - }) - }) - }) - - describe('setQuoteForm()', () => { - beforeEach(() => { - this.resMock.locals.quote = {} - }) - - context('when quote does not exist', () => { - it('should set default quoteForm object', (done) => { - const nextSpy = () => { - try { - expect(this.resMock.locals).to.have.property('quoteForm') - - expect(this.resMock.locals.quoteForm).to.have.property('buttonText') - expect(this.resMock.locals.quoteForm).to.have.property('returnText') - expect(this.resMock.locals.quoteForm).to.have.property('returnLink') - - done() - } catch (error) { - done(error) - } - } - - this.middleware.setQuoteForm({}, this.resMock, nextSpy) - }) - }) - - context('when quote preview errors exist', () => { - beforeEach(() => { - this.resMock.locals.incompleteFields = ['service_types'] - }) - - it('should hide the primary form action', (done) => { - const nextSpy = () => { - try { - expect(this.resMock.locals).to.have.property('quoteForm') - - expect(this.resMock.locals.quoteForm).to.have.property('buttonText') - expect(this.resMock.locals.quoteForm).to.have.property('returnText') - expect(this.resMock.locals.quoteForm).to.have.property('returnLink') - expect(this.resMock.locals.quoteForm).to.have.property( - 'hidePrimaryFormAction', - true - ) - - done() - } catch (error) { - done(error) - } - } - - this.middleware.setQuoteForm({}, this.resMock, nextSpy) - }) - }) - - context('when quote exists', () => { - beforeEach(() => { - this.resMock.locals.quote.created_on = '2017-08-01' - this.resMock.locals.quote.expires_on = '2017-09-01' - }) - - it('should set change quoteForm object', (done) => { - const nextSpy = () => { - try { - expect(this.resMock.locals.quoteForm).to.have.property( - 'action', - '/omis/123456789/quote/cancel' - ) - expect(this.resMock.locals.quoteForm).to.have.property( - 'buttonText', - 'Withdraw quote' - ) - expect(this.resMock.locals.quoteForm).to.have.property( - 'buttonModifiers', - 'govuk-button--warning' - ) - - done() - } catch (error) { - done(error) - } - } - - this.middleware.setQuoteForm({}, this.resMock, nextSpy) - }) - - context('when quote has not expired', () => { - beforeEach(() => { - const mockDate = new Date('2017-08-01') - - this.clock = sinon.useFakeTimers(mockDate.getTime()) - this.resMock.locals.quote.expires_on = '2017-08-10' - }) - - afterEach(() => { - this.clock.restore() - }) - - context('when quote has not been accpeted or cancelled', () => { - it('should allow destructive cancel', (done) => { - const nextSpy = () => { - try { - expect(this.resMock.locals.quoteForm).to.have.property( - 'action', - '/omis/123456789/quote/cancel' - ) - expect(this.resMock.locals.quoteForm).to.have.property( - 'buttonText', - 'Withdraw quote' - ) - expect(this.resMock.locals.quoteForm).to.have.property( - 'buttonModifiers', - 'govuk-button--warning' - ) - - done() - } catch (error) { - done(error) - } - } - - this.middleware.setQuoteForm({}, this.resMock, nextSpy) - }) - }) - - context('when quote has been accepted', () => { - it('should disable form actions', (done) => { - const nextSpy = () => { - try { - expect(this.resMock.locals.quoteForm).to.have.property( - 'hidePrimaryFormAction', - true - ) - - done() - } catch (error) { - done(error) - } - } - - this.resMock.locals.quote.accepted_on = '2017-08-02' - - this.middleware.setQuoteForm({}, this.resMock, nextSpy) - }) - }) - - context('when quote has been cancelled', () => { - it('should contain default form actions', (done) => { - const nextSpy = () => { - try { - expect(this.resMock.locals.quoteForm).to.have.property( - 'buttonText', - 'Send quote to client' - ) - expect(this.resMock.locals.quoteForm).to.have.property( - 'returnText', - 'Return to order' - ) - expect(this.resMock.locals.quoteForm).to.have.property( - 'returnLink', - '/omis/123456789' - ) - expect(this.resMock.locals.quoteForm).to.not.have.property( - 'hidePrimaryFormAction' - ) - - done() - } catch (error) { - done(error) - } - } - - this.resMock.locals.quote.cancelled_on = '2017-08-02' - - this.middleware.setQuoteForm({}, this.resMock, nextSpy) - }) - }) - }) - }) - }) -}) diff --git a/src/apps/omis/apps/view/controllers.js b/src/apps/omis/apps/view/controllers.js deleted file mode 100644 index 2454fa0e71b..00000000000 --- a/src/apps/omis/apps/view/controllers.js +++ /dev/null @@ -1,12 +0,0 @@ -const { get } = require('lodash') - -function renderQuote(req, res) { - const orderStatus = get(res.locals, 'order.status') - const heading = `Quote${orderStatus === 'draft' ? ' preview' : ''}` - - res.breadcrumb(heading).render('omis/apps/view/views/quote') -} - -module.exports = { - renderQuote, -} diff --git a/src/apps/omis/apps/view/middleware.js b/src/apps/omis/apps/view/middleware.js deleted file mode 100644 index 92452131256..00000000000 --- a/src/apps/omis/apps/view/middleware.js +++ /dev/null @@ -1,225 +0,0 @@ -const { assign, get, filter, mapValues, pickBy } = require('lodash') - -const logger = require('../../../../config/logger') -const { Order } = require('../../models') -const { setCompany: setCompanyMW } = require('../../middleware') -const { getContact } = require('../../../contacts/repos') -const editSteps = require('../edit/steps') - -function setCompany(req, res, next) { - const orderId = get(res.locals, 'order.company.id') - - if (!orderId) { - return next() - } - - setCompanyMW(req, res, next, orderId) -} - -async function setContact(req, res, next) { - const contactId = get(res.locals, 'order.contact.id') - - if (!contactId) { - return next() - } - - try { - res.locals.order.contact = await getContact( - req, - contactId, - res.locals.features - ) - next() - } catch (error) { - next(error) - } -} - -async function setQuoteSummary(req, res, next) { - const orderId = get(res.locals, 'order.id') - const orderStatus = get(res.locals, 'order.status') - - if (orderStatus === 'quote_awaiting_acceptance') { - try { - const quote = await Order.getQuote(req, orderId) - quote.expires_on = new Date(quote.expires_on + 'T23:59:59') - - res.locals.quote = assign({}, quote, { - expired: quote.expires_on < new Date(), - }) - } catch (error) { - logger.error(error) - } - } - - next() -} - -async function setQuotePreview(req, res, next) { - if (!get(res.locals, 'order')) { - return next() - } - - const { id, status } = res.locals.order - - if (status !== 'draft') { - return next() - } - - try { - const quote = await Order.previewQuote(req, id) - quote.expires_on = new Date(quote.expires_on + 'T23:59:59') - - res.locals.quote = quote - } catch (error) { - if (error.statusCode !== 400) { - logger.error(error) - return next() - } - - const quoteErrors = mapValues(editSteps, (step) => { - if (!step.fields) { - return false - } - - const stepErrors = filter(step.fields, (field) => { - return error.error.hasOwnProperty(field) - }) - - if (!stepErrors.length) { - return false - } - - return { - heading: step.heading, - errors: stepErrors, - } - }) - - delete quoteErrors['/vat-status'] - - res.locals.missingLeadAssignee = error.error.hasOwnProperty('assignee_lead') - res.locals.incompleteFields = pickBy(quoteErrors) - } - - next() -} - -async function setQuote(req, res, next) { - if (res.locals.quote) { - return next() - } - - try { - const quote = await Order.getQuote(req, res.locals.order.id) - quote.expires_on = new Date(quote.expires_on + 'T23:59:59') - - res.locals.quote = assign({}, quote, { - expired: quote.expires_on < new Date(), - }) - } catch (error) { - if (error.statusCode !== 404) { - logger.error(error) - } - } - - next() -} - -async function generateQuote(req, res, next) { - const orderId = get(res.locals, 'order.id') - const clientEmail = get(res.locals, 'order.contact.email') || 'client' - - try { - await Order.createQuote(req, orderId) - - req.flash('success', `Quote sent ${clientEmail}`) - res.redirect(`/omis/${orderId}`) - } catch (error) { - const errorCode = error.statusCode - - if (errorCode === 400) { - req.flash( - 'error', - 'Quote could not be sent to client. Some fields were missing.' - ) - return res.redirect(`/omis/${orderId}`) - } - - if (errorCode === 409) { - req.flash( - 'error', - 'Quote could not be sent to client. A valid quote already exists.' - ) - return res.redirect(`/omis/${orderId}`) - } - - next(error) - } -} - -async function cancelQuote(req, res, next) { - const orderId = get(res.locals, 'order.id') - - try { - await Order.cancelQuote(req, orderId) - - req.flash('success', 'Quote successfully cancelled.') - res.redirect(`/omis/${orderId}`) - } catch (error) { - if (error.statusCode === 404) { - req.flash('error', 'The quote does not exist so could not be cancelled.') - return res.redirect(`/omis/${orderId}/quote`) - } - - if (error.statusCode === 409) { - req.flash( - 'error', - 'Quote could not be cancelled. It has already been accepted.' - ) - return res.redirect(`/omis/${orderId}/quote`) - } - - next(error) - } -} - -function setQuoteForm(req, res, next) { - const quote = res.locals.quote - const orderId = get(res.locals, 'order.id') - const orderStatus = get(res.locals, 'order.status') - const form = { - buttonText: `Send quote to client`, - returnText: 'Return to order', - returnLink: `/omis/${orderId}`, - } - - if (res.locals.incompleteFields || ['cancelled'].includes(orderStatus)) { - form.hidePrimaryFormAction = true - } - - if (get(quote, 'created_on') && !get(quote, 'cancelled_on')) { - form.action = `/omis/${orderId}/quote/cancel` - form.buttonText = 'Withdraw quote' - form.buttonModifiers = 'govuk-button--warning' - res.locals.destructive = true - - if (quote.accepted_on) { - form.hidePrimaryFormAction = true - } - } - - res.locals.quoteForm = form - next() -} - -module.exports = { - setCompany, - setContact, - setQuoteSummary, - setQuotePreview, - setQuote, - generateQuote, - cancelQuote, - setQuoteForm, -} diff --git a/src/apps/omis/apps/view/router.js b/src/apps/omis/apps/view/router.js index ff23bca688d..42a49638e80 100644 --- a/src/apps/omis/apps/view/router.js +++ b/src/apps/omis/apps/view/router.js @@ -1,32 +1,11 @@ const router = require('express').Router() const { setLocalNav, redirectToFirstNavItem } = require('../../../middleware') -const { setOrderBreadcrumb } = require('../../middleware') -const { renderQuote } = require('./controllers') -const { - setCompany, - setContact, - setQuoteSummary, - setQuotePreview, - setQuote, - setQuoteForm, - generateQuote, - cancelQuote, -} = require('./middleware') const LOCAL_NAV = [{ path: 'work-order', label: 'Work order' }] router.use(setLocalNav(LOCAL_NAV)) -router.use(setCompany) -router.use(setOrderBreadcrumb) -router.use(setQuoteSummary) router.get('/', redirectToFirstNavItem) -router - .route('/quote') - .get(setContact, setQuotePreview, setQuote, setQuoteForm, renderQuote) - .post(setContact, generateQuote) - -router.post('/quote/cancel', cancelQuote) module.exports = router diff --git a/src/apps/omis/apps/view/views/quote.njk b/src/apps/omis/apps/view/views/quote.njk deleted file mode 100644 index cd0acf8e499..00000000000 --- a/src/apps/omis/apps/view/views/quote.njk +++ /dev/null @@ -1,121 +0,0 @@ -{% extends '_layouts/template.njk' %} - -{% from "_macros/dev.njk" import Example %} - -{% block body_main_content %} - {% if incompleteFields %} - {% call Message({ - type: 'error', - element: 'div' - }) %} -

To preview a quote you must complete the following:

- - - {% endcall %} - {% else %} - - {% if quote %} - {% set expiryLabel %} - {% if order.status === 'quote_awaiting_acceptance' %} - Expire{{ 'd' if quote.expired else 's' }} on - {% else %} - Will expire on - {% endif %} - {% endset %} - - {% set expiryValue %} - {{ FromNow({ datetime: order.quote.expires_on }) }} - {% endset %} - - {% if order.status in ['draft', 'quote_awaiting_acceptance'] %} - {{ MetaList({ - items: [ - { label: expiryLabel, value: expiryValue } - ], - itemModifier: 'stacked' - }) }} - {% endif %} - - {{ MetaList({ - items: [ - { label: 'Sent on', value: quote.created_on, type: 'datetime' }, - { label: 'Sent by', value: quote.created_by if quote.created_on } - ], - itemModifier: 'stacked' - }) }} - - {{ MetaList({ - items: [ - { label: 'Cancelled on', value: quote.cancelled_on, type: 'datetime' }, - { label: 'Cancelled by', value: quote.cancelled_by }, - { label: 'Accepted on', value: quote.accepted_on, type: 'datetime' }, - { label: 'Accepted by', value: quote.accepted_by } - ], - itemModifier: 'stacked' - }) }} - - {% if quote.content %} - {% call Example(tabTitle = '') %} -
-{# Ugly indentation is so that markdown spacing is handled correctly #} -{% markdown %}{{ quote.content | safe }}{% endmarkdown %} - - {% call HiddenContent({ summary: 'View full terms and conditions' }) %} -{# Ugly indentation is so that markdown spacing is handled correctly #} -{% markdown %}{{ quote.terms_and_conditions | safe }}{% endmarkdown %} - {% endcall %} -
- {% endcall %} - {% endif %} - - {% if order.status in ['quote_awaiting_acceptance'] and destructive %} - {% call Message({ - type: 'error', - element: 'div' - }) %} -

The client will no longer be able to accept the quote once it has been withdrawn.

-

They will be notified by email.

- {% endcall %} - {% endif %} - - {% endif %} - - {% if order.status === 'draft' and quote %} - {{ Message({ - type: 'info', - text: 'Quotes should be reviewed by a manager before being sent.' - }) }} - - {% if order.contact.email %} - {% call Message({ type: 'muted', element: 'div' }) %} - - An email with a link to this quote will be sent to: - - - {{ order.contact.email }} - - {% endcall %} - {% endif %} - {% endif %} - - {% endif %} - - {{ Form(quoteForm) }} -{% endblock %} diff --git a/src/apps/omis/locales/en/default.json b/src/apps/omis/locales/en/default.json deleted file mode 100644 index bca94b86c12..00000000000 --- a/src/apps/omis/locales/en/default.json +++ /dev/null @@ -1,146 +0,0 @@ -{ - "fields": { - "company": { - "label": "Company that will pay for the order" - }, - "contact": { - "label": "Contact responsible for the order" - }, - "primary_market": { - "label": "Country where the service is required" - }, - "subscribers": { - "legend": "Advisers", - "hint": "People who need to be kept informed about this order, for example, international trade advisers or language advisors.", - "addButtonText": "Add another adviser", - "label": "Adviser" - }, - "service_types": { - "label": "Service types the order covers" - }, - "description": { - "label": "Description of the work or activity" - }, - "use_sector_from_company": { - "label": "Do you want to use the company’s primary sector (shown above) for this order?" - }, - "sector": { - "label": "Sector" - }, - "delivery_date": { - "label": "Delivery date of work", - "hint": "For example 28/10/2018 or 28 October 2018" - }, - "contacts_not_to_approach": { - "label": "Specific people or organisations the company does not want DBT to talk to" - }, - "existing_agents": { - "label": "Contacts the company already has in the market", - "hint": "For example partners, suppliers or distributors" - }, - "further_info": { - "label": "Internal notes and useful information", - "hint": "For example specific client requirements, market and distribution strategies or key deadlines" - }, - "assignees": { - "legend": "Advisers", - "hint": "For example post advisers or other in-country staff", - "addButtonText": "Add another adviser", - "label": "Adviser" - }, - "assignee_time": { - "label": "Estimated hours" - }, - "assignee_actual_time": { - "label": "Actual hours worked" - }, - "vat_status": { - "label": "VAT category", - "hint": "Choose a VAT category based on the billing address country", - "options": { - "uk": "Inside UK", - "eu": "Inside EU", - "outside_eu": "Outside EU" - } - }, - "vat_number": { - "label": "VAT number" - }, - "vat_verified": { - "label": "Has a valid VAT number been supplied?", - "options": { - "unverified": "Not verified", - "valid": "Valid", - "invalid": "Invalid" - } - }, - "po_number": { - "label": "Purchase Order (PO) number" - }, - "billing_address_1": { - "label": "Business and street" - }, - "billing_address_2": { - "label": "Business and street continued" - }, - "billing_address_town": { - "label": "Town or city" - }, - "billing_address_county": { - "label": "County" - }, - "billing_address_postcode": { - "label": "Postcode" - }, - "billing_address_country": { - "label": "Country" - }, - "amount": { - "label": "Amount received", - "hint": "The amount in GBP" - }, - "received_on": { - "label": "Payment received date", - "hint": "For example 28/10/2017" - }, - "cancellation_reason": { - "label": "Reason for cancelling" - }, - "verify_work_sent": { - "label": "Work has been sent to the contact" - } - }, - "errors": { - "quote": { - "service_types": "Choose at least one service type the order covers", - "description": "Add a description of the work or activity", - "delivery_date": "Set a delivery date of at least 21 days from now", - "assignees": "Add at least one adviser in the market", - "assignee_time": "Allocate hours to at least one adviser in the market", - "assignee_lead": "Set a lead adviser", - "vat_status": "Choose a VAT category", - "vat_number": "Enter the EU company’s VAT number", - "vat_verified": "Verify the EU company’s VAT number" - } - }, - "validation": { - "required": "cannot be blank", - "numeric": "can only contain numbers", - "date": "must be a valid date", - "after": "must be in the future", - "before": "must be in the past", - "greaterthanamount": "must be equal to or larger than the invoice amount", - "default": "is required", - "verify_work_sent": { - "required": "must be verified" - } - }, - "status": { - "draft": "Draft", - "quote_awaiting_acceptance": "Quote awaiting acceptance", - "quote_accepted": "Quote accepted", - "paid": "Payment received", - "complete": "Completed", - "cancelled": "Cancelled" - } -} diff --git a/src/apps/omis/middleware.js b/src/apps/omis/middleware.js index 0135d2b58c1..3ebd0097638 100644 --- a/src/apps/omis/middleware.js +++ b/src/apps/omis/middleware.js @@ -1,18 +1,6 @@ -const { assign, get, set } = require('lodash') +const { assign } = require('lodash') -const { getDitCompany } = require('../companies/repos') -const { setHomeBreadcrumb } = require('../middleware') const { Order } = require('./models') -const labels = require('./locales/en/default') - -async function setCompany(req, res, next, companyId) { - try { - res.locals.company = await getDitCompany(req, companyId) - next() - } catch (error) { - next(error) - } -} async function setOrder(req, res, next, orderId) { try { @@ -43,26 +31,6 @@ async function setOrder(req, res, next, orderId) { } } -function setOrderBreadcrumb(req, res, next) { - const reference = get(res.locals, 'order.reference') - - return setHomeBreadcrumb(reference)(req, res, next) -} - -/* -In order to remove the i18n-future dependency this -function has been introduced to replace code which was -calling the translation library. Translations are not -required at this stage. -*/ -function translate(req, res, next) { - set(res.locals, 'translate', (key) => get(labels, key)) - next() -} - module.exports = { - setCompany, setOrder, - setOrderBreadcrumb, - translate, } diff --git a/src/apps/omis/models.js b/src/apps/omis/models.js index 1f3552b691f..eea57188fe0 100644 --- a/src/apps/omis/models.js +++ b/src/apps/omis/models.js @@ -5,31 +5,6 @@ const Order = { getById(req, id) { return authorisedRequest(req, `${config.apiRoot}/v3/omis/order/${id}`) }, - - previewQuote(req, id) { - return authorisedRequest(req, { - url: `${config.apiRoot}/v3/omis/order/${id}/quote/preview`, - method: 'POST', - }) - }, - - getQuote(req, id) { - return authorisedRequest(req, `${config.apiRoot}/v3/omis/order/${id}/quote`) - }, - - createQuote(req, id) { - return authorisedRequest(req, { - url: `${config.apiRoot}/v3/omis/order/${id}/quote`, - method: 'POST', - }) - }, - - cancelQuote(req, id) { - return authorisedRequest(req, { - url: `${config.apiRoot}/v3/omis/order/${id}/quote/cancel`, - method: 'POST', - }) - }, } module.exports = { diff --git a/src/apps/omis/router.js b/src/apps/omis/router.js index f18bc497f52..03b1a261bde 100644 --- a/src/apps/omis/router.js +++ b/src/apps/omis/router.js @@ -7,14 +7,12 @@ const { removeBreadcrumb, handleRoutePermissions, } = require('../middleware') -const { setOrder, translate } = require('./middleware') +const { setOrder } = require('./middleware') const viewApp = require('./apps/view') const listApp = require('./apps/list') const reconciliationApp = require('./apps/reconciliation') -router.use(translate) - router.use(handleRoutePermissions(APP_PERMISSIONS)) router.param('orderId', setOrder) @@ -26,5 +24,4 @@ router.use( reconciliationApp.router ) router.use(viewApp.mountpath, viewApp.router) - module.exports = router diff --git a/src/apps/routers.js b/src/apps/routers.js index 260dce172bc..bdbd846daaa 100644 --- a/src/apps/routers.js +++ b/src/apps/routers.js @@ -125,6 +125,7 @@ const reactRoutes = [ '/companies/:companyId/exports', '/companies/:companyId/exports/history', '/companies/:companyId/exports/history/:countryId', + '/omis/:orderId/quote', ] reactRoutes.forEach((path) => { diff --git a/src/client/actions.js b/src/client/actions.js index 296d7d7fd58..31ea9a1ed4e 100644 --- a/src/client/actions.js +++ b/src/client/actions.js @@ -328,3 +328,5 @@ export const PROPOSITION_COMPLETE = 'PROPOSITION_COMPLETE' export const COMPANIES__GLOBAL_ULTIMATE_LOADED = 'COMPANIES__GLOBAL_ULTIMATE_LOADED' + +export const ORDERS__QUOTE_PREVIEW_LOADED = 'ORDERS__QUOTE_PREVIEW_LOADED' diff --git a/src/client/modules/Omis/OMISTermsAndConditions.jsx b/src/client/modules/Omis/OMISTermsAndConditions.jsx new file mode 100644 index 00000000000..a7f1c236a6d --- /dev/null +++ b/src/client/modules/Omis/OMISTermsAndConditions.jsx @@ -0,0 +1,664 @@ +import React from 'react' +import styled from 'styled-components' +import { Link, ListItem, OrderedList } from 'govuk-react' + +import { NewWindowLink, SummaryTable } from '../../components' +import urls from '../../../lib/urls' + +const StyledListItem = styled(ListItem)` + margin-top: 16px; +` + +const HAS_MEANING_GIVEN_IN_QUOTE = 'has the meaning given to it in the Quote' + +const OMISTermsAndConditions = () => ( + <> + ANNEX 1 +
+
+ + TERMS & CONDITIONS FOR DELIVERY OF DEPARTMENT FOR BUSINESS AND TRADE + OVERSEAS MARKET INTRODUCTION SERVICE + +
+
+ + + 1. INTERPRETATION + + + + 1.1. In this Contract the following terms shall have the meaning given + to them below: + + + + + + + + + + + + + + + + +

+ means the website based on the{' '} + + omis.trade.gov.uk + {' '} + domain, to which you were directed by an email from DBT, and on + which the Quote was first presented to you +

+
+
+
+
+ + 2. THE CONTRACT + + + + 2.1. The Quote, together with these Terms and Conditions, contains our + offer to provide the Services. The offer contained in the Quote and + the Terms and Conditions shall be deemed to be accepted by you on your + acceptance of the Quote and a Contract formed. + + + 2.2 This Contract is between yourselves and the Secretary of State for + DBT. In these Terms and Conditions the expressions 'we', 'us' and + 'our' refer to the Secretary of State for DBT and those acting on his + behalf. The expressions 'you' and 'your' refer to you, the Customer. + + + 2.3. Where appropriate we may choose to provide the Services through a + team based in the commercial sections of a British Embassy, Consulate + or High Commission or the auspices of Scottish Development + International, the Welsh Government or Invest Northern Ireland. + + + 2.4. We will indicate who will be primarily responsible for delivering + the Services in the DBT Contact section of the Quote, but we reserve + the right to change the DBT Contact and/or any other member of DBT + personnel involved in the provision of the services at any time. + + + 2.5. References to "Clauses" are, unless otherwise provided, + references to the clauses of these Terms and Conditions. + + + 2.6. For the avoidance of doubt any reference to "in writing" in this + Contract shall include email. + + + + 3. SERVICES + + + + 3.1. We will provide you with the Services using reasonable care and + skill. + + + 3.2. We will deliver the Services to you on or before the Delivery + Date. If it becomes necessary to change the Delivery Date we will + notify you in writing and a new date will be agreed between the + Parties. + + + 3.3. Unless otherwise agreed in writing, we will not supply the + Services until we have received payment of the Charges in full. You + agree that we may extend the Delivery Dates to reflect any delay in + our receiving payment from you. + + + 3.4. Any amendments to the Services or Charges must be agreed by the + Parties in writing. + + + + 4. CHARGES + + + + 4.1. You agree to pay the Charges to us for the provision of the + Services. + + + 4.2. The Charges are exclusive of value added tax which will be + payable by you at the prevailing rate, where applicable. + + + 4.3. You agree to pay the Charges in full on or before the Payment + Date or such other date as has been agreed by the Parties in writing. + + + 4.4. Payment of the Charges will be made by one of the following + methods: + + + + Credit or Debit Card + + + 4.4.1. You can make payment online by following the relevant link on + the Website. + + + Bank Transfer + + + 4.4.2. Payment by bank transfer must be made in sterling for the + full amount stated on the invoice to DBT's bank account at National + Westminster Bank - Account Name: DBT OMIS Service Account Number: + 10014187 Sort Code: 60-70-80. SWIFT Address: NWBKGB2L and IBAN: + GB57NWBK60708010014187. + + + 4.4.3. You agree to pay any bank charges incurred with this + transaction. You must quote the invoice number shown on the relevant + invoice when arranging the payment and must send a copy of the + payment remittance advice which must show the payment reference to + your DBT Contact. + + + 4.5. A VAT invoice will be available on the Website after your + payment has been received (and cleared if necessary). The VAT + receipt can be printed from the relevant page. + + + + + 5. NON-PAYMENT + + + + 5.1. If we have not received full payment of the Charges by the + Payment Date (or such other date as has been agreed in writing), we + will begin action to recover the non-payment from you. We may, at our + absolute discretion, withdraw your access to all DBT services (not + limited to OMIS) until payment is received in full, including any + interest to which DBT is entitled in respect of late payments under + Clause 5.2. + + + 5.2. If you fail to pay any undisputed Charges properly invoiced we + will have the right to charge interest on the overdue amount at the + applicable rate under the Late Payment of Commercial Debts (Interest) + Act 1998, accruing on a daily basis from the due date up to the date + of actual payment, whether before or after judgment. + + + + 6. CORRESPONDENCE + + + + 6.1. Your Quote has a unique reference number which should always be + quoted in correspondence. + + + 6.2. We will address all correspondence and any notices issued under + this Contract to the Customer Contact and you should address the same + to the DBT Contact. + + + 6.3. You will inform us immediately of any changes to the Customer + Contact and we will inform you of any changes to the DBT Contact. + + + + 7. YOUR RIGHT TO CANCEL + + + + 7.1. You may cancel the Services without incurring any liability by + notifying us in writing at any time before you accept the Quote. + Written notice of cancellation should be sent to the DBT Contact. + + + + 8. CROWN COPYRIGHT + + + + 8.1. Any material that we produce for you in the course of delivering + the Services will be Crown Copyright. + + + 8.2. Under the terms of the open government licence (and subject to + Clause 8.4 below) you may use and reuse the Crown copyright material + free of charge and in any format or medium. Excluded from this + permission are the HM Government, Department for Business and Trade, + DBT and "exporting is GREAT", names, logos and "get-up" (including our + coat of arms) and all images and case studies that appear on the + Website or any other DBT website. This means you must not reproduce + them without our prior written approval. + + + 8.3. If you have a question about the use of our intellectual property + and Crown copyright, email the DBT brand team at{' '} + + brand@trade.gsi.gov.uk + + , with your contact details detailing how and why you wish to use the + name or logo(s). + + + 8.4. If you do re-use any Crown Copyright material you must + acknowledge the source with the following attribution: + + + 8.4.1. "This information is provided by the Department for + Business and Trade and used as permitted by the Open Government + Licence v3.0" + + + + + 8.5. For more information, please follow{' '} + + this link + + . + + + 8.6. Enquiries about use and re-use of Crown copyright material should + be sent to{' '} + + psi@nationalarchives.gsi.gov.uk + + . + + + 8.7. The ability for you to reproduce Crown copyright material in + accordance with the instructions in this Clause does not extend to any + material provided that is the copyright of a third party. + Authorisation to reproduce such material has to be obtained by you + from the copyright holder concerned. + + + + 9. PRIVACY AND DATA PROTECTION POLICY + + + + 9.1. By accepting these Terms and Conditions you agree that we may + collect your personal data in accordance with{' '} + + our privacy and cookies policy + + . + + + 9.2. We will not share your information with any other organisations + for marketing, market research or commercial purposes. + + + 9.3. We may pass on your personal information to third parties, + including other government departments, where we have a legal + obligation to do so. + + + 9.4. We will process any personal data you provide to us in accordance + with the Data Protection Act 1998 and will also comply with the + Privacy and Electronic Communications (EC Directive) Regulations 2003 + ("Data Protection Legislation"). Under Data Protection Legislation, we + have a legal duty to protect any information we collect from you. We + use leading technologies and encryption software to safeguard your + data, and keep strict security standards to prevent any authorised + access to or disclosure of it. + + + + 10. CONFIDENTIALITY + + + + 10.1. Material provided by you to DBT or to its representatives and + designated in writing by you as confidential will be used solely for + the purpose for which it is provided and subject to Clause 10.2 shall + not be disclosed to any person without your prior written consent. + + + 10.2. Notwithstanding Clause 10.1, we may disclose your confidential + information: + + + 10.2.1. where disclosure is required by applicable law (including + the Freedom of Information Act 2000) or by a court of competent + jurisdiction; + + + 10.2.2. on a confidential basis to our employees, agents, + consultants, contractors and professional advisors to the extent + necessary to perform our obligations under this Contract; + + + 10.2.3. on a confidential basis to the Scottish Development + International, the Welsh Assembly, Invest Northern Ireland or any + central government body; or + + + 10.2.4. to the extent that DBT (acting reasonably) deems + disclosure necessary or appropriate in the course of carrying out + its public functions. + + + + + + 11. FREEDOM OF INFORMATION + + + + 11.1. You accept that any information held by us is subject to the + provisions of the Freedom of Information Act 2000 and the + Environmental Information Regulations 2004 which may require the + release of such information by us. The release of information will be + at our discretion and we may not always be able to consult with you + before releasing information. + + + + 12. VIRUS PROTECTION + + + + 12.1. We will make every effort to check and test the material we make + available for you to access or download whilst we are providing you + with the Services. You acknowledge and agree that you will run an + appropriate anti-virus programme on all materials downloaded from the + internet, including from the Website. We cannot accept responsibility + for any loss, disruption or damage to your data or your computer + system which may occur as a result of using material derived from the + Website or sent to you by us electronically. + + + + 13. COMPLAINTS AND REFUNDS + + + + 13.1. If you wish to lodge a complaint or believe that a refund of any + Charges is due you must contact the DBT Contact in the first instance + and they will consider the request. + + + 13.2. Refunds will be considered by DBT when you have paid for + Services in advance of delivery and the Services are not subsequently + delivered by us. Refunds are made at the discretion of DBT. + + + 13.3. A request for a refund must be submitted within three months of + the delivery of the relevant part of the Services and in any event + within three months of the delivery of all the Services set out in the + Quote or otherwise agreed between the Parties in writing. + + + 13.4. If after discussing your case with your DBT Contract you are + still dissatisfied with the service received, you can use our online + feedback form on the DBT page at{' '} + + gov.uk + + . + + + 13.5. Payment of refunds of Charges paid by credit or debit card will + be made direct to your card. All non-card payments of Charges will be + refunded by BACS and we will contact you to obtain the information we + will need to effect the necessary transfer. + + + + 14. TERM AND TERMINATION + + + + 14.1. The Contract will start on the date you accept the Quote and + expire on the later of the date when: + + + 14.1.1. all Services have been delivered; and + + 14.1.2. all Charges paid in full. + + + + 14.2. Either Party may terminate the Contract by giving the other + Party 14 days' written notice. + + + 14.3. You will remain liable to pay all Charges due up to and + including the date of termination. + + + 14.4. Each Party shall be liable for its own costs arising on + termination. + + + + 15. DISCLAIMER + + + + 15.1. Nothing in this Clause 15 shall limit or exclude our liability + for death or personal injury caused by our negligence, or the + negligence of our employees or agents. + + + 15.2. We will make every effort to ensure that information provided by + us in the course of delivering the Services is accurate but we accept + no liability for any loss or damage caused to any person as a result + of any errors, omissions or misleading statements in such information. + + + 15.3. In the course of providing the Services DBT may offer to + introduce you to third parties. DBT does not guarantee the + participation of any third party in such introduction process. You + acknowledge that the actions of any third party introduced to you in + connection with these services are outside of DBT's control and that + DBT does not accept any liability for the actions or omissions of that + third party. + + + 15.4. If you are interested in developing a relationship with any + third party referred to in material provided by us you should + undertake your own due diligence in respect of such third party and + should not consider a reference in our material to be an endorsement + by DBT of that third party or any goods or services provided by it. + + + 15.5. You acknowledge and agree that we accept no liability for + commercial arrangements entered into in connection with use of the + Services, and we assume no responsibility for the success or failure + of any such arrangements. + + + 15.6. The identification by DBT of an export opportunity in any + information provided to you does not indicate that such export + opportunity is in compliance with export control legislation and it + remains your responsibility to ensure that you comply with such export + control legislation including the obtaining of relevant licences. + + + 15.7. We shall not have any responsibility to any third party to whom + materials produced by us are disclosed. You agree to inform any + recipient of the materials that should they choose to rely on any + aspects of our work they will do so at their own risk and have no + recourse to DBT. + + + 15.8. We shall have no liability to you in the event that we are + prevented from providing the Services to you by your act, omission or + failure. + + + 15.9. In no event shall we have any liability to you for: + + + 15.9.1. loss of profits, sales, business or revenue; + + 15.9.2. business interruption; + + 15.9.3. loss of anticipated savings; + + + 15.9.4. loss of business opportunity, goodwill or reputation; or + + + 15.9.5. any indirect or consequential loss or damage. + + + + + + 16. LIMIT OF LIABILITY + + + + 16.1. Subject to Clause 15.1 the liability of each of the Parties + under the Contract is capped at the value of the Charges. + + + + 17. AMENDMENTS TO THE TERMS AND CONDITIONS + + + + 17.1. We reserve the right to amend the Terms and Conditions from time + to time at our discretion. + + + 17.2. Where the Terms and Conditions are amended we will notify you by + email that an updated version of the Terms and Conditions is available + and provide you with a link to a website where you can view the + revised Terms and Conditions. + + + 17.3. Unless you terminate the Contract under Clause 14 within 14 days + of our email notification you will be deemed to have accepted the + amended Terms and Conditions. + + + + 18. ENTIRE AGREEMENT + + + + 18.1. The Contract contains the whole agreement between the Parties + and supersedes and replaces any prior written or oral agreements, + representations or understandings between them. The Parties confirm + that they have not entered into the Contract on the basis of any + representation that is not expressly incorporated into the Contract. + Nothing in this clause shall exclude liability for fraud or fraudulent + misrepresentation. + + + + 19. FORCE MAJEURE + + + + 19.1. In this Clause a "Force Majeure Event" means an event beyond our + reasonable control including but not limited to strikes, lock-outs or + other industrial disputes (whether involving our workforce or any + other party), failure of a utility service or transport network, act + of God, war, riot, civil commotion, malicious damage, compliance with + any law or governmental order, rule, regulation or direction, + accident, breakdown of plant or machinery, fire, flood, storm or + default of our suppliers or subcontractors. + + + 19.2. We shall not be liable to you as a result of any delay or + failure to perform the Services as a result of a Force Majeure Event. + + + 19.3. If the Force Majeure Event prevents us from providing the + Services for more than four weeks, either Party may terminate the + Contract by written notice to the other Party. If notice of + termination for a Force Majeure Event occurs we will refund any + Charges paid by you in advance for any part of the Services that we + have been unable to deliver as at the date notice of termination is + given. + + + + 20. AGENCY + + + + 20.1. The Agreement shall not constitute or imply any partnership, + joint venture, agency, fiduciary relationship or other relationship + between the Parties other than the contractual relationship expressly + provided for in the Contract. + + + + 21. GOVERNING LAW AND JURISDICTION + + + + 21.1. The Contract and any dispute or claim arising out of or in + connection with it or its subject matter or formation (including + non-contractual disputes or claims), shall be governed by, and + construed in accordance with, English law, and the parties irrevocably + submit to the exclusive jurisdiction of the courts of England and + Wales. + + +
+ +) + +export default OMISTermsAndConditions diff --git a/src/client/modules/Omis/OrderQuote.jsx b/src/client/modules/Omis/OrderQuote.jsx new file mode 100644 index 00000000000..04f030ef448 --- /dev/null +++ b/src/client/modules/Omis/OrderQuote.jsx @@ -0,0 +1,310 @@ +import React from 'react' +import styled from 'styled-components' +import { useParams } from 'react-router-dom' +import { connect } from 'react-redux' +import Markdown from 'react-markdown' +import remarkGfm from 'remark-gfm' +import { Details, H1, InsetText, Link, WarningText } from 'govuk-react' +import { FONT_SIZE, SPACING } from '@govuk-react/constants' + +import { DefaultLayout, Form } from '../../components' +import { + ContactResource, + OrderQuoteResource, + OrderResource, +} from '../../components/Resource' +import Task from '../../components/Task' +import { + PREVIEW_QUOTE_ID, + TASK_CANCEL_QUOTE, + TASK_CREATE_QUOTE, + TASK_PREVIEW_QUOTE, + quoteState2props, +} from './state' +import { ORDERS__QUOTE_PREVIEW_LOADED } from '../../actions' +import OMISTermsAndConditions from './OMISTermsAndConditions' +import urls from '../../../lib/urls' +import { DARK_GREY, RED_2 } from '../../utils/colours' +import { + formatMediumDate, + formatMediumDateTime, + isDateInFuture, +} from '../../utils/date' +import { STATUS } from './constants' + +const StyledInsetText = styled(InsetText)` + margin-bottom: -${SPACING.SCALE_2}; +` + +const StyledContactEmail = styled('p')` + font-size: ${FONT_SIZE.SIZE_24}; + margin-bottom: -${SPACING.SCALE_1}; +` + +const StyledHeading = styled('p')` + color: ${DARK_GREY}; + margin-top: -${SPACING.SCALE_1}; +` + +const StyledP = styled('p')` + margin-top: -${SPACING.SCALE_2}; +` + +const StyledWarningText = styled(WarningText)` + margin-bottom: ${SPACING.SCALE_4}; +` + +const SetHeading = ({ id }) => ( + + {(order) => (order.status === STATUS.DRAFT ? 'Quote preview' : 'Quote')} + +) + +const OrderReference = ({ id }) => ( + + {(order) => order.reference} + +) + +const ContactEmail = ({ id }) => ( + + {(contact) => contact.email} + +) + +const getQuoteDate = (quote) => { + if (quote) { + const splitQuote = quote.split('\n') + return splitQuote.splice(0, 1) + } +} + +const pruneQuote = (quote) => { + if (quote) { + const lines = quote.split('\n') + lines.splice(0, 4) + return lines.join('\n') + } + return null +} + +export const RenderQuote = ({ quote, reference }) => ( + <> +

{getQuoteDate(quote)}

+

+ Quote for the Provision of an Overseas Market Introduction Service + ("OMIS"): {reference} (the Quote) +

+

+ {pruneQuote(quote)} +

+
+ +
+ +) + +const setExpiryLabel = (quote) => + isDateInFuture(quote.expiresOn) ? 'Expires on' : 'Expired on' + +const SentOn = ({ quote }) => ( + <> + Sent on + + {formatMediumDateTime(quote.createdOn)} + + Sent by + {quote.createdBy.name} + +) + +const AcceptedOn = ({ quote }) => ( + <> + Accepted on + + {formatMediumDateTime(quote.acceptedOn)} + + Accepted by + {quote.acceptedBy.name} + +) + +const ReturnToOrder = ({ orderId }) => ( + <> + + Return to order + +
+
+ +) + +const OrderQuote = ({ quotePreview }) => { + const { orderId } = useParams() + return ( + } + pageTitle={ +

+ + {' - '} + + {' - Orders (OMIS)'} +

+ } + breadcrumbs={[ + { + link: urls.dashboard.index(), + text: 'Home', + }, + { + link: urls.omis.index(), + text: 'Orders (OMIS)', + }, + { + link: urls.omis.order(orderId), + text: , + }, + { text: }, + ]} + > + + {(order) => ( + <> + {order.status === STATUS.DRAFT && ( + + {() => ( +
({ + id: orderId, + })} + redirectTo={() => urls.omis.workOrder(orderId)} + cancelRedirectTo={() => urls.omis.workOrder(orderId)} + submitButtonLabel="Send quote to client" + cancelButtonLabel="Return to order" + flashMessage={() => 'Quote sent to client'} + > + {quotePreview && ( + <> + + Will expire on + +

+ {formatMediumDate(quotePreview?.expires_on)} +

+ + + Quotes should be reviewed by a manager before being + sent. + + + An email with a link to this quote will be sent to: +
+ + {order.contactEmail ? ( + order.contactEmail + ) : ( + + )} + +
+
+ + )} + + )} +
+ )} + {order.status === STATUS.QUOTE_AWAITING_ACCEPTANCE && ( + + {(quote) => ( +
({ + id: orderId, + })} + redirectTo={() => urls.omis.workOrder(orderId)} + cancelRedirectTo={() => urls.omis.workOrder(orderId)} + submitButtonLabel="Withdraw quote" + submitButtonColour={RED_2} + cancelButtonLabel="Return to order" + flashMessage={() => 'Quote withdrawn'} + > + + {setExpiryLabel(quote)} + + + {formatMediumDate(quote.expiresOn)} + + + + + + The client will no longer be able to accept the quote once + it has been withdrawn. +
+ They will be notified by email. +
+ + )} +
+ )} + {order.status != STATUS.DRAFT && + order.status != STATUS.QUOTE_AWAITING_ACCEPTANCE && ( + + {(quote) => ( + <> + + + {order.status === STATUS.CANCELLED && ( + <> + + Cancelled on + + + {formatMediumDateTime(quote.cancelledOn)} + + + Cancelled by + + + {quote.cancelledBy.name} + + + )} + + + + )} + + )} + + )} +
+
+ ) +} + +export default connect(quoteState2props)(OrderQuote) diff --git a/src/client/modules/Omis/reducer.js b/src/client/modules/Omis/reducer.js new file mode 100644 index 00000000000..4e9b4899aa0 --- /dev/null +++ b/src/client/modules/Omis/reducer.js @@ -0,0 +1,13 @@ +import { ORDERS__QUOTE_PREVIEW_LOADED } from '../../actions' + +export default (state = {}, { type, result }) => { + switch (type) { + case ORDERS__QUOTE_PREVIEW_LOADED: + return { + ...state, + quotePreview: result, + } + default: + return state + } +} diff --git a/src/client/modules/Omis/state.js b/src/client/modules/Omis/state.js index 30e2fd0c712..0091229866d 100644 --- a/src/client/modules/Omis/state.js +++ b/src/client/modules/Omis/state.js @@ -13,10 +13,16 @@ export const TASK_EDIT_ORDER_CONTACT = 'TASK_EDIT_ORDER_CONTACT' export const TASK_SAVE_ORDER_ASSIGNEES = 'TASK_SAVE_ORDER_ASSIGNEES' export const TASK_SAVE_ORDER_SUBSCRIBERS = 'TASK_SAVE_ORDER_SUBSCRIBERS' export const TASK_SET_LEAD_ADVISER = 'TASK_SET_LEAD_ADVISER' +export const TASK_PREVIEW_QUOTE = 'TASK_PREVIEW_QUOTE' +export const TASK_CREATE_QUOTE = 'TASK_CREATE_QUOTE' +export const TASK_CANCEL_QUOTE = 'TASK_CANCEL_QUOTE' export const EDIT_CONTACT_ID = 'editOmisContactId' export const SET_LEAD_ADVISER_ID = 'setLeadAdviserId' +export const PREVIEW_QUOTE_ID = 'previewQuote' export const state2props = (state) => ({ csrfToken: state.csrfToken, }) + +export const quoteState2props = (state) => state[PREVIEW_QUOTE_ID] diff --git a/src/client/modules/Omis/tasks.js b/src/client/modules/Omis/tasks.js index 9a4ca40a3dd..25f4f1d6b6a 100644 --- a/src/client/modules/Omis/tasks.js +++ b/src/client/modules/Omis/tasks.js @@ -44,3 +44,14 @@ export const setLeadAdviser = (values) => `v3/omis/order/${values.orderId}/assignee`, transformLeadAdviserForApi(values) ) + +export const previewQuote = (id) => + apiProxyAxios + .post(`v3/omis/order/${id}/quote/preview`) + .then(({ data }) => data) + +export const createQuote = ({ id }) => + apiProxyAxios.post(`v3/omis/order/${id}/quote`) + +export const cancelQuote = ({ id }) => + apiProxyAxios.post(`v3/omis/order/${id}/quote/cancel`) diff --git a/src/client/reducers.js b/src/client/reducers.js index 67881741e4e..afa086026b6 100644 --- a/src/client/reducers.js +++ b/src/client/reducers.js @@ -181,6 +181,9 @@ import getMyTasksReducer from './components/Dashboard/my-tasks/reducer' import { ID as INTERACTION_ID } from './modules/Interactions/InteractionDetails/state' import getInteractionReducer from './modules/Interactions/InteractionDetails/reducer' +import { PREVIEW_QUOTE_ID } from './modules/Omis/state' +import orderQuoteReducer from './modules/Omis/reducer' + const parseProps = (domNode) => { if (!domNode) { return { @@ -287,4 +290,5 @@ export const reducers = { [GET_MY_TASKS_ID]: getMyTasksReducer, [INTERACTION_ID]: getInteractionReducer, [PROPOSITION_COMPLETE_ID]: investmentProjectsReducer, + [PREVIEW_QUOTE_ID]: orderQuoteReducer, } diff --git a/src/client/routes.js b/src/client/routes.js index c6ac8bc7846..ef605812de7 100644 --- a/src/client/routes.js +++ b/src/client/routes.js @@ -95,6 +95,7 @@ import LargeCapitalProfile from './modules/Companies/CompanyInvestments/LargeCap import ExportsIndex from './modules/Companies/CompanyExports/ExportsIndex' import ExportsHistory from './modules/Companies/CompanyExports/ExportHistory' import InvestmentProjectAdmin from './modules/Investments/Projects/InvestmentProjectAdmin' +import OrderQuote from './modules/Omis/OrderQuote' const routes = { companies: [ @@ -408,6 +409,11 @@ const routes = { module: 'datahub:orders', component: PaymentReceipt, }, + { + path: '/omis/:orderId/quote', + module: 'datahub:orders', + component: OrderQuote, + }, ], reminders: [ { diff --git a/src/client/tasks.js b/src/client/tasks.js index 39c163d63be..b0fa0fae350 100644 --- a/src/client/tasks.js +++ b/src/client/tasks.js @@ -395,6 +395,9 @@ import { TASK_SAVE_ORDER_ASSIGNEES, TASK_SAVE_ORDER_SUBSCRIBERS, TASK_SET_LEAD_ADVISER, + TASK_PREVIEW_QUOTE, + TASK_CREATE_QUOTE, + TASK_CANCEL_QUOTE, } from './modules/Omis/state' import { cancelOrder, @@ -405,6 +408,9 @@ import { saveOrderAssignees, saveOrderSubscribers, setLeadAdviser, + previewQuote, + createQuote, + cancelQuote, } from './modules/Omis/tasks' import { TASK_GET_COMPANIES } from './modules/Omis/CreateOrder/CompanySelect/state' @@ -688,4 +694,7 @@ export const tasks = { [TASK_GET_GLOBAL_ULTIMATE]: businessDetails.getGlobalUltimate, [TASK_SET_GLOBAL_HQ]: setGlobalHq, [TASK_REMOVE_GLOBAL_HQ]: removeGlobalHq, + [TASK_PREVIEW_QUOTE]: previewQuote, + [TASK_CREATE_QUOTE]: createQuote, + [TASK_CANCEL_QUOTE]: cancelQuote, } diff --git a/src/config/nunjucks/filters.js b/src/config/nunjucks/filters.js index 87e29d2309a..421ea0e6f18 100644 --- a/src/config/nunjucks/filters.js +++ b/src/config/nunjucks/filters.js @@ -38,7 +38,6 @@ const { isUnparsedDateValid, isDateValid, format, - getDifferenceInWords, } = require('../../client/utils/date') require('numeral/locales/en-gb') const { @@ -199,10 +198,6 @@ const filters = { ]).join(join) }, - fromNow: (value) => { - return getDifferenceInWords(value) - }, - applyClassModifiers(className, modifier) { if (!isString(className) || !(isString(modifier) || isArray(modifier))) { return className diff --git a/src/lib/urls.js b/src/lib/urls.js index 19628426a60..a8b361483c7 100644 --- a/src/lib/urls.js +++ b/src/lib/urls.js @@ -87,6 +87,15 @@ module.exports = { exportWins: () => 'https://www.exportwins.service.trade.gov.uk/', dataWorkspace: (id) => `https://data.trade.gov.uk/visualisations/link/e69bbfde-0e68-49d3-ad81-ddffbad6bac6#p.CompanyID=${id}`, + omis: 'https://omis.trade.gov.uk/', + nationalArchives: { + openGovLicence: + 'http://www.nationalarchives.gov.uk/doc/open-government-licence', + }, + great: { + privacyPolicy: 'https://www.great.gov.uk/uk/privacy-policy/', + }, + govUkHomepage: 'https://www.gov.uk/', digitalWorkspace: { teams: 'https://people.trade.gov.uk/teams/department-for-international-trade', diff --git a/src/middleware/api-proxy.js b/src/middleware/api-proxy.js index 9fc30d13dad..0c2ac3d694e 100644 --- a/src/middleware/api-proxy.js +++ b/src/middleware/api-proxy.js @@ -80,6 +80,9 @@ const ALLOWLIST = [ '/v3/omis/order', '/v4/search/task', '/v4/task/companies-and-projects', + '/v3/omis/order/:id/quote', + '/v3/omis/order/:id/quote/preview', + '/v3/omis/order/:id/quote/cancel', ] module.exports = (app) => { diff --git a/src/templates/_layouts/template.njk b/src/templates/_layouts/template.njk index 603a313fe47..720acc766c2 100644 --- a/src/templates/_layouts/template.njk +++ b/src/templates/_layouts/template.njk @@ -4,7 +4,7 @@ {% from "_macros/form.njk" import FormGroup, Fieldset, TextField, AddAnother, Link, FormSubHeading, MultipleChoiceField, PreviouslySelected, HiddenField, DateFieldset, DateField, UneditableField %} {% from "_macros/form.njk" import EntitySearchForm, Form, MultiStepForm with context %} {% from "_macros/common.njk" import LocalHeader with context %} -{% from "_macros/common.njk" import Message, MessageList, Pagination, LocalNav, FromNow, HiddenContent, TabbedLocalNav %} +{% from "_macros/common.njk" import Message, MessageList, Pagination, LocalNav, TabbedLocalNav %} {% from "_macros/collection.njk" import CollectionContent, CollectionFilters %} {% from "_macros/entity.njk" import MetaList %} diff --git a/src/templates/_macros/common.njk b/src/templates/_macros/common.njk index 7ac2d6a78ab..26efa6e49d8 100644 --- a/src/templates/_macros/common.njk +++ b/src/templates/_macros/common.njk @@ -1,17 +1,13 @@ -{% from "./common/from-now.njk" import FromNow %} {% from "./common/local-header.njk" import LocalHeader with context %} {% from "./common/local-nav.njk" import LocalNav %} {% from "./common/pagination.njk" import Pagination %} {% from "./common/messages.njk" import Message, MessageList %} -{% from "./common/hidden-content.njk" import HiddenContent %} {% from "./common/tabbed-local-nav.njk" import TabbedLocalNav %} -{% set FromNow = FromNow %} {% set LocalHeader = LocalHeader %} {% set LocalNav = LocalNav %} {% set Pagination = Pagination %} {% set Message = Message %} {% set MessageList = MessageList %} -{% set HiddenContent = HiddenContent %} {% set TabbedLocalNav = TabbedLocalNav %} diff --git a/src/templates/_macros/common/__test__/from-now.test.js b/src/templates/_macros/common/__test__/from-now.test.js deleted file mode 100644 index 5fe8d15d054..00000000000 --- a/src/templates/_macros/common/__test__/from-now.test.js +++ /dev/null @@ -1,44 +0,0 @@ -const { getMacros } = require('../../../../../test/unit/macro-helper') - -const commonMacros = getMacros('common') - -describe('FromNow macro', () => { - describe('invalid props', () => { - it('should not render if props is not given', () => { - const component = commonMacros.renderToDom('FromNow') - expect(component).to.be.null - }) - }) - - describe('valid props', () => { - beforeEach(() => { - this.component = commonMacros.renderToDom('FromNow', { - datetime: '2010-08-01', - }) - }) - - it('should render time element', () => { - expect(this.component.tagName.toLowerCase()).to.equal('time') - }) - - it('should contain datetime attribute', () => { - expect(this.component.hasAttribute('datetime')).to.equal(true) - }) - - it('should format datetime attribute to local datetime', () => { - expect(this.component.getAttribute('datetime')).to.equal( - '2010-08-01 00:00:00+01:00' - ) - }) - - it('should contain title attribute', () => { - expect(this.component.hasAttribute('title')).to.equal(true) - }) - - it('should format title attribute to default datetime format', () => { - expect(this.component.getAttribute('title')).to.equal( - '1 Aug 2010, 12:00am' - ) - }) - }) -}) diff --git a/src/templates/_macros/common/__test__/hidden-content.test.js b/src/templates/_macros/common/__test__/hidden-content.test.js deleted file mode 100644 index c7935ecf695..00000000000 --- a/src/templates/_macros/common/__test__/hidden-content.test.js +++ /dev/null @@ -1,56 +0,0 @@ -const { getMacros } = require('../../../../../test/unit/macro-helper') - -const commonMacros = getMacros('common') - -const summaryMock = 'Do you want to see more text?' -const textMock = 'Extra text to reveal' -const propsMock = { - summary: summaryMock, - text: textMock, -} - -describe('HiddenContent macro', () => { - describe('invalid props', () => { - it('should not render if props is not given', () => { - const component = commonMacros.renderToDom('HiddenContent') - expect(component).to.be.null - }) - }) - - describe('valid props', () => { - context('items prop', () => { - beforeEach(() => { - this.component = commonMacros.renderToDom('HiddenContent', propsMock) - }) - - it('should render a details element', () => { - expect(this.component.tagName.toLowerCase()).to.equal('details') - }) - - it('should render a correct summary', () => { - const summary = this.component.querySelector('.details__summary') - expect(summary.textContent).to.equal(summaryMock) - }) - - it('should render correct contents', () => { - const content = this.component.querySelector('.details__content') - expect(content.textContent).to.equal(textMock) - }) - }) - - context('caller', () => { - beforeEach(() => { - this.customHTML = 'Custom html' - this.component = commonMacros.renderWithCallerToDom( - 'HiddenContent', - propsMock - )(this.customHTML) - }) - - it('should render custom body', () => { - const content = this.component.querySelector('.details__content') - expect(content.innerHTML.trim()).to.equal(this.customHTML) - }) - }) - }) -}) diff --git a/src/templates/_macros/common/from-now.njk b/src/templates/_macros/common/from-now.njk deleted file mode 100644 index 840709cfa54..00000000000 --- a/src/templates/_macros/common/from-now.njk +++ /dev/null @@ -1,14 +0,0 @@ -{## - # Render time element using from now wording - # @param {object} props - # @param {array} props.datetime - datetime used to generate the time from now - # - #} -{% macro FromNow(props) %} - {%- if props.datetime -%} - - {%- endif -%} -{% endmacro %} diff --git a/src/templates/_macros/common/hidden-content.njk b/src/templates/_macros/common/hidden-content.njk deleted file mode 100644 index 1a73ecb78ec..00000000000 --- a/src/templates/_macros/common/hidden-content.njk +++ /dev/null @@ -1,35 +0,0 @@ -{## - # Render a details element with summary and progressively revealed content - # - # @param {object} props - # @param {string} props.summary - Summary text to always be visible - # @param {string} [props.text] - A string to render as the contents - # @param {function} [props.caller] - Optional inner contents - # @param {string} props.dataTest - Optional text for data-test attribute - # - #} -{% macro HiddenContent(props) %} - {%- if props.summary -%} -
- - {{ props.summary }} - - -
- {% if caller %} - {{ caller() }} - {% else %} - {{ props.text }} - {% endif %} -
-
- {%- endif -%} -{% endmacro %} diff --git a/src/templates/_macros/entity/entity.njk b/src/templates/_macros/entity/entity.njk index bb1400e657a..569c18d97c7 100644 --- a/src/templates/_macros/entity/entity.njk +++ b/src/templates/_macros/entity/entity.njk @@ -104,8 +104,6 @@ {% set value = props.value | formatDate('MMMM yyyy') %} {% elif props.type === 'datetime' %} {% set value = props.value | formatDateTime %} - {% elif props.type === 'fromNow' %} - {% set value = FromNow({ datetime: props.value }) %} {% else %} {% set value = props.value %} {% endif %} diff --git a/src/templates/_macros/entity/meta-item.njk b/src/templates/_macros/entity/meta-item.njk index 65952c5c2d4..2608e5a3849 100644 --- a/src/templates/_macros/entity/meta-item.njk +++ b/src/templates/_macros/entity/meta-item.njk @@ -1,5 +1,3 @@ -{% from '../common.njk' import FromNow %} - {## # Render meta data item # @param {object} props @@ -29,8 +27,6 @@ {% set metaItemValue = props.value | formatDate('MMMM yyyy') %} {% elif props.type === 'datetime' %} {% set metaItemValue = props.value | formatDateTime %} - {% elif props.type === 'fromNow' %} - {% set metaItemValue = FromNow({ datetime: props.value }) %} {% elif props.type === 'address' %} {% set metaItemValue = props.value | formatAddress %} {% else %} diff --git a/test/component/cypress/specs/Omis/RenderQuote.cy.jsx b/test/component/cypress/specs/Omis/RenderQuote.cy.jsx new file mode 100644 index 00000000000..3bf0cc795b3 --- /dev/null +++ b/test/component/cypress/specs/Omis/RenderQuote.cy.jsx @@ -0,0 +1,49 @@ +import React from 'react' + +import { RenderQuote } from '../../../../../src/client/modules/Omis/OrderQuote' +import quote from '../../../../sandbox/fixtures/v3/omis/quote.json' +import { assertDetails } from '../../../../functional/cypress/support/assertions' + +const prunedQuote = + 'We, the Department for Business and Trade (DBT) agree to provide you {{company_name}} of {{company_address}} with the Services on the terms set out in this Quote.\nThe Services are those described below:\n{{order_description}}\nDBT will deliver the Services on or before the Delivery Date which shall be 17 December 2022.\nIn exchange for these Services you agree to pay the Charges which shall be £12 (excluding VAT) on or before the Payment Date which shall be the earliest of: the date 30 days from the date of the relevant invoice; or the date 10 days before the Delivery Date. The Payment Date will be specified on your invoice.\nAll correspondence will be between our representatives set out below:\nThe DBT Contact shall be lead_assignee_name. If you do not have contact details for the DBT Contact, please contact generic_contact_email.\nThe Customer Contact shall be contact_name of company_name, company_address and contact_email.' +const reference = 'RVK689/22' + +describe('RenderQuote', () => { + context('When viewing a company with a non-registered address', () => { + beforeEach(() => { + cy.mount() + }) + + it('should render the date', () => { + cy.get('[data-test="quote-date"]') + .should('exist') + .should('have.text', 'Date: 2 Feb 2021') + }) + + it('should render the heading', () => { + cy.get('[data-test="quote-heading"]') + .should('exist') + .should( + 'have.text', + `Quote for the Provision of an Overseas Market Introduction Service ("OMIS"): ${reference} (the Quote)` + ) + }) + + it('should render the quote', () => { + cy.get('[data-test="quote"]') + .should('exist') + .should('have.text', prunedQuote) + }) + + it('should render the T&C component', () => { + cy.get('[data-test="quote-terms"]').then((element) => { + assertDetails({ + element, + summary: 'View full terms and conditions', + content: + 'ANNEX 1TERMS & CONDITIONS FOR DELIVERY OF DEPARTMENT FOR BUSINESS AND TRADE OVERSEAS MARKET INTRODUCTION SERVICE1. INTERPRETATION1.1. In this Contract the following terms shall have the meaning given to them below:"Contract"means the Quote and these Terms and Conditions"Charges"has the meaning given to it in the Quote"Customer"the company or other legal entity to whom the Quote is addressed"Customer Contact"has the meaning given to it in the Quote"Delivery Date"has the meaning given to it in the Quote"DBT"the Department for Business and Trade ("DBT"), of Old Admiralty Building, Admiralty Place, London, SW1A 2DY"DBT Contact"has the meaning given to it in the Quote"Force Majeure Event"has the meaning given to it in Clause 19"Parties"the parties to this Contract being the Secretary of State for DBT and the Customer"OMIS"the overseas market introduction services provided by DBT"Quote"the terms of DBT\'s proposal set out in the document to which these Terms and Conditions are annexed"Payment Date"has the meaning given to it in the Quote"Services"has the meaning given to it in the Quote"Terms and Conditions"means these terms and conditions as amended from time to time"Website"means the website based on the omis.trade.gov.uk (opens in new tab) domain, to which you were directed by an email from DBT, and on which the Quote was first presented to you2. THE CONTRACT2.1. The Quote, together with these Terms and Conditions, contains our offer to provide the Services. The offer contained in the Quote and the Terms and Conditions shall be deemed to be accepted by you on your acceptance of the Quote and a Contract formed.2.2 This Contract is between yourselves and the Secretary of State for DBT. In these Terms and Conditions the expressions \'we\', \'us\' and \'our\' refer to the Secretary of State for DBT and those acting on his behalf. The expressions \'you\' and \'your\' refer to you, the Customer.2.3. Where appropriate we may choose to provide the Services through a team based in the commercial sections of a British Embassy, Consulate or High Commission or the auspices of Scottish Development International, the Welsh Government or Invest Northern Ireland.2.4. We will indicate who will be primarily responsible for delivering the Services in the DBT Contact section of the Quote, but we reserve the right to change the DBT Contact and/or any other member of DBT personnel involved in the provision of the services at any time.2.5. References to "Clauses" are, unless otherwise provided, references to the clauses of these Terms and Conditions.2.6. For the avoidance of doubt any reference to "in writing" in this Contract shall include email.3. SERVICES3.1. We will provide you with the Services using reasonable care and skill.3.2. We will deliver the Services to you on or before the Delivery Date. If it becomes necessary to change the Delivery Date we will notify you in writing and a new date will be agreed between the Parties.3.3. Unless otherwise agreed in writing, we will not supply the Services until we have received payment of the Charges in full. You agree that we may extend the Delivery Dates to reflect any delay in our receiving payment from you.3.4. Any amendments to the Services or Charges must be agreed by the Parties in writing.4. CHARGES4.1. You agree to pay the Charges to us for the provision of the Services.4.2. The Charges are exclusive of value added tax which will be payable by you at the prevailing rate, where applicable.4.3. You agree to pay the Charges in full on or before the Payment Date or such other date as has been agreed by the Parties in writing.4.4. Payment of the Charges will be made by one of the following methods:Credit or Debit Card4.4.1. You can make payment online by following the relevant link on the Website.Bank Transfer4.4.2. Payment by bank transfer must be made in sterling for the full amount stated on the invoice to DBT\'s bank account at National Westminster Bank - Account Name: DBT OMIS Service Account Number: 10014187 Sort Code: 60-70-80. SWIFT Address: NWBKGB2L and IBAN: GB57NWBK60708010014187.4.4.3. You agree to pay any bank charges incurred with this transaction. You must quote the invoice number shown on the relevant invoice when arranging the payment and must send a copy of the payment remittance advice which must show the payment reference to your DBT Contact.4.5. A VAT invoice will be available on the Website after your payment has been received (and cleared if necessary). The VAT receipt can be printed from the relevant page.5. NON-PAYMENT5.1. If we have not received full payment of the Charges by the Payment Date (or such other date as has been agreed in writing), we will begin action to recover the non-payment from you. We may, at our absolute discretion, withdraw your access to all DBT services (not limited to OMIS) until payment is received in full, including any interest to which DBT is entitled in respect of late payments under Clause 5.2.5.2. If you fail to pay any undisputed Charges properly invoiced we will have the right to charge interest on the overdue amount at the applicable rate under the Late Payment of Commercial Debts (Interest) Act 1998, accruing on a daily basis from the due date up to the date of actual payment, whether before or after judgment.6. CORRESPONDENCE6.1. Your Quote has a unique reference number which should always be quoted in correspondence.6.2. We will address all correspondence and any notices issued under this Contract to the Customer Contact and you should address the same to the DBT Contact.6.3. You will inform us immediately of any changes to the Customer Contact and we will inform you of any changes to the DBT Contact.7. YOUR RIGHT TO CANCEL7.1. You may cancel the Services without incurring any liability by notifying us in writing at any time before you accept the Quote. Written notice of cancellation should be sent to the DBT Contact.8. CROWN COPYRIGHT8.1. Any material that we produce for you in the course of delivering the Services will be Crown Copyright.8.2. Under the terms of the open government licence (and subject to Clause 8.4 below) you may use and reuse the Crown copyright material free of charge and in any format or medium. Excluded from this permission are the HM Government, Department for Business and Trade, DBT and "exporting is GREAT", names, logos and "get-up" (including our coat of arms) and all images and case studies that appear on the Website or any other DBT website. This means you must not reproduce them without our prior written approval.8.3. If you have a question about the use of our intellectual property and Crown copyright, email the DBT brand team at brand@trade.gsi.gov.uk, with your contact details detailing how and why you wish to use the name or logo(s).8.4. If you do re-use any Crown Copyright material you must acknowledge the source with the following attribution:8.4.1. "This information is provided by the Department for Business and Trade and used as permitted by the Open Government Licence v3.0"8.5. For more information, please follow this link (opens in new tab).8.6. Enquiries about use and re-use of Crown copyright material should be sent to psi@nationalarchives.gsi.gov.uk.8.7. The ability for you to reproduce Crown copyright material in accordance with the instructions in this Clause does not extend to any material provided that is the copyright of a third party. Authorisation to reproduce such material has to be obtained by you from the copyright holder concerned.9. PRIVACY AND DATA PROTECTION POLICY9.1. By accepting these Terms and Conditions you agree that we may collect your personal data in accordance with our privacy and cookies policy (opens in new tab).9.2. We will not share your information with any other organisations for marketing, market research or commercial purposes.9.3. We may pass on your personal information to third parties, including other government departments, where we have a legal obligation to do so.9.4. We will process any personal data you provide to us in accordance with the Data Protection Act 1998 and will also comply with the Privacy and Electronic Communications (EC Directive) Regulations 2003 ("Data Protection Legislation"). Under Data Protection Legislation, we have a legal duty to protect any information we collect from you. We use leading technologies and encryption software to safeguard your data, and keep strict security standards to prevent any authorised access to or disclosure of it.10. CONFIDENTIALITY10.1. Material provided by you to DBT or to its representatives and designated in writing by you as confidential will be used solely for the purpose for which it is provided and subject to Clause 10.2 shall not be disclosed to any person without your prior written consent.10.2. Notwithstanding Clause 10.1, we may disclose your confidential information:10.2.1. where disclosure is required by applicable law (including the Freedom of Information Act 2000) or by a court of competent jurisdiction;10.2.2. on a confidential basis to our employees, agents, consultants, contractors and professional advisors to the extent necessary to perform our obligations under this Contract;10.2.3. on a confidential basis to the Scottish Development International, the Welsh Assembly, Invest Northern Ireland or any central government body; or10.2.4. to the extent that DBT (acting reasonably) deems disclosure necessary or appropriate in the course of carrying out its public functions.11. FREEDOM OF INFORMATION11.1. You accept that any information held by us is subject to the provisions of the Freedom of Information Act 2000 and the Environmental Information Regulations 2004 which may require the release of such information by us. The release of information will be at our discretion and we may not always be able to consult with you before releasing information.12. VIRUS PROTECTION12.1. We will make every effort to check and test the material we make available for you to access or download whilst we are providing you with the Services. You acknowledge and agree that you will run an appropriate anti-virus programme on all materials downloaded from the internet, including from the Website. We cannot accept responsibility for any loss, disruption or damage to your data or your computer system which may occur as a result of using material derived from the Website or sent to you by us electronically.13. COMPLAINTS AND REFUNDS13.1. If you wish to lodge a complaint or believe that a refund of any Charges is due you must contact the DBT Contact in the first instance and they will consider the request.13.2. Refunds will be considered by DBT when you have paid for Services in advance of delivery and the Services are not subsequently delivered by us. Refunds are made at the discretion of DBT.13.3. A request for a refund must be submitted within three months of the delivery of the relevant part of the Services and in any event within three months of the delivery of all the Services set out in the Quote or otherwise agreed between the Parties in writing.13.4. If after discussing your case with your DBT Contract you are still dissatisfied with the service received, you can use our online feedback form on the DBT page at gov.uk (opens in new tab).13.5. Payment of refunds of Charges paid by credit or debit card will be made direct to your card. All non-card payments of Charges will be refunded by BACS and we will contact you to obtain the information we will need to effect the necessary transfer.14. TERM AND TERMINATION14.1. The Contract will start on the date you accept the Quote and expire on the later of the date when:14.1.1. all Services have been delivered; and14.1.2. all Charges paid in full.14.2. Either Party may terminate the Contract by giving the other Party 14 days\' written notice.14.3. You will remain liable to pay all Charges due up to and including the date of termination.14.4. Each Party shall be liable for its own costs arising on termination.15. DISCLAIMER15.1. Nothing in this Clause 15 shall limit or exclude our liability for death or personal injury caused by our negligence, or the negligence of our employees or agents.15.2. We will make every effort to ensure that information provided by us in the course of delivering the Services is accurate but we accept no liability for any loss or damage caused to any person as a result of any errors, omissions or misleading statements in such information.15.3. In the course of providing the Services DBT may offer to introduce you to third parties. DBT does not guarantee the participation of any third party in such introduction process. You acknowledge that the actions of any third party introduced to you in connection with these services are outside of DBT\'s control and that DBT does not accept any liability for the actions or omissions of that third party.15.4. If you are interested in developing a relationship with any third party referred to in material provided by us you should undertake your own due diligence in respect of such third party and should not consider a reference in our material to be an endorsement by DBT of that third party or any goods or services provided by it.15.5. You acknowledge and agree that we accept no liability for commercial arrangements entered into in connection with use of the Services, and we assume no responsibility for the success or failure of any such arrangements.15.6. The identification by DBT of an export opportunity in any information provided to you does not indicate that such export opportunity is in compliance with export control legislation and it remains your responsibility to ensure that you comply with such export control legislation including the obtaining of relevant licences.15.7. We shall not have any responsibility to any third party to whom materials produced by us are disclosed. You agree to inform any recipient of the materials that should they choose to rely on any aspects of our work they will do so at their own risk and have no recourse to DBT.15.8. We shall have no liability to you in the event that we are prevented from providing the Services to you by your act, omission or failure.15.9. In no event shall we have any liability to you for:15.9.1. loss of profits, sales, business or revenue;15.9.2. business interruption;15.9.3. loss of anticipated savings;15.9.4. loss of business opportunity, goodwill or reputation; or15.9.5. any indirect or consequential loss or damage.16. LIMIT OF LIABILITY16.1. Subject to Clause 15.1 the liability of each of the Parties under the Contract is capped at the value of the Charges.17. AMENDMENTS TO THE TERMS AND CONDITIONS17.1. We reserve the right to amend the Terms and Conditions from time to time at our discretion.17.2. Where the Terms and Conditions are amended we will notify you by email that an updated version of the Terms and Conditions is available and provide you with a link to a website where you can view the revised Terms and Conditions.17.3. Unless you terminate the Contract under Clause 14 within 14 days of our email notification you will be deemed to have accepted the amended Terms and Conditions.18. ENTIRE AGREEMENT18.1. The Contract contains the whole agreement between the Parties and supersedes and replaces any prior written or oral agreements, representations or understandings between them. The Parties confirm that they have not entered into the Contract on the basis of any representation that is not expressly incorporated into the Contract. Nothing in this clause shall exclude liability for fraud or fraudulent misrepresentation.19. FORCE MAJEURE19.1. In this Clause a "Force Majeure Event" means an event beyond our reasonable control including but not limited to strikes, lock-outs or other industrial disputes (whether involving our workforce or any other party), failure of a utility service or transport network, act of God, war, riot, civil commotion, malicious damage, compliance with any law or governmental order, rule, regulation or direction, accident, breakdown of plant or machinery, fire, flood, storm or default of our suppliers or subcontractors.19.2. We shall not be liable to you as a result of any delay or failure to perform the Services as a result of a Force Majeure Event.19.3. If the Force Majeure Event prevents us from providing the Services for more than four weeks, either Party may terminate the Contract by written notice to the other Party. If notice of termination for a Force Majeure Event occurs we will refund any Charges paid by you in advance for any part of the Services that we have been unable to deliver as at the date notice of termination is given.20. AGENCY20.1. The Agreement shall not constitute or imply any partnership, joint venture, agency, fiduciary relationship or other relationship between the Parties other than the contractual relationship expressly provided for in the Contract.21. GOVERNING LAW AND JURISDICTION21.1. The Contract and any dispute or claim arising out of or in connection with it or its subject matter or formation (including non-contractual disputes or claims), shall be governed by, and construed in accordance with, English law, and the parties irrevocably submit to the exclusive jurisdiction of the courts of England and Wales.', + }) + }) + }) + }) +}) diff --git a/test/functional/cypress/fixtures/index.js b/test/functional/cypress/fixtures/index.js index 76aa5c6da6c..5d7ef6f4def 100644 --- a/test/functional/cypress/fixtures/index.js +++ b/test/functional/cypress/fixtures/index.js @@ -83,6 +83,10 @@ module.exports = { assignees: require('../../../sandbox/fixtures/v3/omis/assignees.json'), subscribers: require('../../../sandbox/fixtures/v3/omis/subscribers.json'), emptyOrder: require('../../../sandbox/fixtures/v3/omis/empty-order.json'), + quoteNotAccepted: require('../../../sandbox/fixtures/v3/omis/quote-not-accepted.json'), + quotePreview: require('../../../sandbox/fixtures/v3/omis/quote-preview.json'), + quoteCancelled: require('../../../sandbox/fixtures/v3/omis/quote-cancelled.json'), + quote: require('../../../sandbox/fixtures/v3/omis/quote.json'), }, referrals: { referalDetails: require('../../../sandbox/fixtures/v4/referrals/referral-details.json'), diff --git a/test/functional/cypress/specs/omis/quote-spec.js b/test/functional/cypress/specs/omis/quote-spec.js new file mode 100644 index 00000000000..fc30cd5abea --- /dev/null +++ b/test/functional/cypress/specs/omis/quote-spec.js @@ -0,0 +1,240 @@ +import fixtures from '../../fixtures/index' +import urls from '../../../../../src/lib/urls' +import { + assertBreadcrumbs, + assertFlashMessage, + assertLocalHeader, +} from '../../support/assertions' +import { + formatMediumDate, + formatMediumDateTime, +} from '../../../../../src/client/utils/date' + +const { + cancelledOrder, + draftOrder, + quote, + quoteAccepted, + quoteAwaitOrder, + quoteCancelled, + quoteNotAccepted, + quotePreview, +} = fixtures.omis + +const assertSenderDetails = (quote) => + it('should display the sender information', () => { + cy.get('[data-test="sent-on-heading"]') + .should('exist') + .should('have.text', 'Sent on') + cy.get('[data-test="sent-on-date"]') + .should('exist') + .should('have.text', formatMediumDateTime(quote.created_on)) + cy.get('[data-test="sent-by-heading"]') + .should('exist') + .should('have.text', 'Sent by') + cy.get('[data-test="sent-by-name"]') + .should('exist') + .should('have.text', quote.created_by.name) + }) + +const assertAcceptanceDetails = (quote) => + it('should display the acceptance information', () => { + cy.get('[data-test="accepted-on-heading"]') + .should('exist') + .should('have.text', 'Accepted on') + cy.get('[data-test="accepted-on-date"]') + .should('exist') + .should('have.text', formatMediumDateTime(quote.accepted_on)) + cy.get('[data-test="accepted-by-heading"]') + .should('exist') + .should('have.text', 'Accepted by') + cy.get('[data-test="accepted-by-name"]') + .should('exist') + .should('have.text', quote.accepted_by.name) + }) + +const assertReturnLink = (orderId) => + it('should render the return link', () => { + cy.get('[data-test="return-link"]') + .should('exist') + .should('have.text', 'Return to order') + .should('have.attr', 'href', urls.omis.workOrder(orderId)) + }) + +describe('Order quote', () => { + context('When viewing the quote preview for a draft order', () => { + beforeEach(() => { + cy.visit(urls.omis.quote(draftOrder.id)) + }) + + it('should render the local header', () => { + assertLocalHeader('Quote preview') + }) + + it('should render breadcrumbs', () => { + assertBreadcrumbs({ + Home: urls.dashboard.index(), + 'Orders (OMIS)': urls.omis.index(), + [draftOrder.reference]: urls.omis.order(draftOrder.id), + 'Quote preview': '', + }) + }) + + it('should render the expiry date', () => { + cy.get('[data-test="expiry-heading"]') + .should('exist') + .should('have.text', 'Will expire on') + cy.get('[data-test="expiry-date"]') + .should('exist') + .should('have.text', formatMediumDate(quotePreview.expires_on)) + }) + + it('should display the warning message', () => { + cy.get('[data-test="preview-warning"]') + .should('exist') + .should( + 'contain', + 'Quotes should be reviewed by a manager before being sent.' + ) + }) + + it('should display the contact email', () => { + cy.get('[data-test="contact-email"]') + .should('exist') + .should( + 'have.text', + 'An email with a link to this quote will be sent to:contact@bob.com' + ) + }) + + it('should create the quote successfully', () => { + cy.get('[data-test=submit-button]').click() + assertFlashMessage('Quote sent to client') + cy.location('pathname').should('eq', urls.omis.workOrder(draftOrder.id)) + }) + }) + + context( + 'When viewing an order where the quote is awaiting acceptance', + () => { + beforeEach(() => { + cy.visit(urls.omis.quote(quoteAwaitOrder.id)) + }) + + it('should render the local header', () => { + assertLocalHeader('Quote') + }) + + it('should render breadcrumbs', () => { + assertBreadcrumbs({ + Home: urls.dashboard.index(), + 'Orders (OMIS)': urls.omis.index(), + [quoteAwaitOrder.reference]: urls.omis.order(quoteAwaitOrder.id), + Quote: '', + }) + }) + + it('should render the expiry date', () => { + cy.get('[data-test="expires-on-heading"]') + .should('exist') + .should('have.text', 'Expired on') + cy.get('[data-test="expires-on-date"]') + .should('exist') + .should('have.text', formatMediumDate(quoteNotAccepted.expires_on)) + }) + + assertSenderDetails(quoteNotAccepted) + + it('should display the warning message', () => { + cy.get('[data-test="awaiting-acceptance-warning"]') + .should('exist') + .should( + 'contain', + 'The client will no longer be able to accept the quote once it has been withdrawn.' + ) + .should('contain', 'They will be notified by email.') + }) + + it('should withdraw the quote successfully', () => { + cy.get('[data-test=submit-button]').click() + assertFlashMessage('Quote withdrawn') + cy.location('pathname').should( + 'eq', + urls.omis.workOrder(quoteAwaitOrder.id) + ) + }) + } + ) + + context('When the quote has been accepted', () => { + beforeEach(() => { + cy.visit(urls.omis.quote(quoteAccepted.id)) + }) + + it('should render the local header', () => { + assertLocalHeader('Quote') + }) + + it('should render breadcrumbs', () => { + assertBreadcrumbs({ + Home: urls.dashboard.index(), + 'Orders (OMIS)': urls.omis.index(), + [quoteAccepted.reference]: urls.omis.order(quoteAccepted.id), + Quote: '', + }) + }) + + assertSenderDetails(quote) + assertAcceptanceDetails(quote) + assertReturnLink(quoteAccepted.id) + + it('should not render any form actions', () => { + cy.get('[data-test="submit-button"]').should('not.exist') + cy.get('[data-test="cancel-button"]').should('not.exist') + }) + }) + + context('When the order has been cancelled', () => { + beforeEach(() => { + cy.visit(urls.omis.quote(cancelledOrder.id)) + }) + + it('should render the local header', () => { + assertLocalHeader('Quote') + }) + + it('should render breadcrumbs', () => { + assertBreadcrumbs({ + Home: urls.dashboard.index(), + 'Orders (OMIS)': urls.omis.index(), + [cancelledOrder.reference]: urls.omis.order(cancelledOrder.id), + Quote: '', + }) + }) + + assertSenderDetails(quoteCancelled) + assertAcceptanceDetails(quoteCancelled) + + it('should display the cancellation information', () => { + cy.get('[data-test="cancelled-on-heading"]') + .should('exist') + .should('have.text', 'Cancelled on') + cy.get('[data-test="cancelled-on-date"]') + .should('exist') + .should('have.text', formatMediumDateTime(quoteCancelled.cancelled_on)) + cy.get('[data-test="cancelled-by-heading"]') + .should('exist') + .should('have.text', 'Cancelled by') + cy.get('[data-test="cancelled-by-name"]') + .should('exist') + .should('have.text', quoteCancelled.cancelled_by.name) + }) + + assertReturnLink(cancelledOrder.id) + + it('should not render any form actions', () => { + cy.get('[data-test="submit-button"]').should('not.exist') + cy.get('[data-test="cancel-button"]').should('not.exist') + }) + }) +}) diff --git a/test/sandbox/fixtures/v3/omis/quote-cancelled.json b/test/sandbox/fixtures/v3/omis/quote-cancelled.json new file mode 100644 index 00000000000..55097229894 --- /dev/null +++ b/test/sandbox/fixtures/v3/omis/quote-cancelled.json @@ -0,0 +1,27 @@ +{ + "created_on": "2021-02-02T14:13:10.030533Z", + "created_by": { + "name": "Miranda Pottinger", + "first_name": "Miranda", + "last_name": "Pottinger", + "id": "d5b8be3f-d9da-411e-8acf-f85986e3b4dd" + }, + "cancelled_on": "2021-02-02T14:13:10.030533Z", + "cancelled_by": { + "name": "Miranda Pottinger", + "first_name": "Miranda", + "last_name": "Pottinger", + "id": "d5b8be3f-d9da-411e-8acf-f85986e3b4dd" + }, + "accepted_on": "2022-02-02T14:13:10.030533Z", + "accepted_by": { + "name": "Miranda Pottinger", + "first_name": "Miranda", + "last_name": "Pottinger", + "id": "d5b8be3f-d9da-411e-8acf-f85986e3b4dd" + }, + "expires_on": "2021-03-04", + "content": "Date: 2 Feb 2021\n\n# Quote for the Provision of an Overseas Market Introduction Service (“OMIS”): {{order_reference}} (the **Quote**)\n\nWe, the Department for Business and Trade (**DBT**) agree to provide you {{company_name}} of {{company_address}} with the Services on the terms set out in this Quote.\n\nThe **Services** are those described below:\n\n{{order_description}}\n\nDBT will deliver the Services on or before the **Delivery Date** which shall be 17 December 2022.\n\nIn exchange for these Services you agree to pay the **Charges** which shall be £12 (excluding VAT) on or before the **Payment Date** which shall be the earliest of: the date 30 days from the date of the relevant invoice; or the date 10 days before the Delivery Date. The Payment Date will be specified on your invoice.\n\nAll correspondence will be between our representatives set out below:\n\nThe **DBT Contact** shall be lead_assignee_name. If you do not have contact details for the DBT Contact, please contact generic_contact_email.\n\nThe **Customer Contact** shall be contact_name of company_name, company_address and contact_email.", + "terms_and_conditions": "**ANNEX 1**\n\n**TERMS & CONDITIONS FOR DELIVERY OF DEPARTMENT FOR INTERNATIONAL TRADE OVERSEAS MARKET INTRODUCTION SERVICE**\n\n1. **INTERPRETATION**" + } + \ No newline at end of file diff --git a/test/sandbox/fixtures/v3/omis/quote-not-accepted.json b/test/sandbox/fixtures/v3/omis/quote-not-accepted.json new file mode 100644 index 00000000000..536331f3f9b --- /dev/null +++ b/test/sandbox/fixtures/v3/omis/quote-not-accepted.json @@ -0,0 +1,17 @@ +{ + "created_on": "2021-02-02T14:13:10.030533Z", + "created_by": { + "name": "Miranda Pottinger", + "first_name": "Miranda", + "last_name": "Pottinger", + "id": "d5b8be3f-d9da-411e-8acf-f85986e3b4dd" + }, + "cancelled_on": null, + "cancelled_by": null, + "accepted_on": null, + "accepted_by": null, + "expires_on": "2021-03-04", + "content": "Date: 2 Feb 2021\n\n# Quote for the Provision of an Overseas Market Introduction Service (“OMIS”): {{order_reference}} (the **Quote**)\n\nWe, the Department for Business and Trade (**DBT**) agree to provide you {{company_name}} of {{company_address}} with the Services on the terms set out in this Quote.\n\nThe **Services** are those described below:\n\n{{order_description}}\n\nDBT will deliver the Services on or before the **Delivery Date** which shall be 17 December 2022.\n\nIn exchange for these Services you agree to pay the **Charges** which shall be £12 (excluding VAT) on or before the **Payment Date** which shall be the earliest of: the date 30 days from the date of the relevant invoice; or the date 10 days before the Delivery Date. The Payment Date will be specified on your invoice.\n\nAll correspondence will be between our representatives set out below:\n\nThe **DBT Contact** shall be lead_assignee_name. If you do not have contact details for the DBT Contact, please contact generic_contact_email.\n\nThe **Customer Contact** shall be contact_name of company_name, company_address and contact_email.", + "terms_and_conditions": "**ANNEX 1**\n\n**TERMS & CONDITIONS FOR DELIVERY OF DEPARTMENT FOR INTERNATIONAL TRADE OVERSEAS MARKET INTRODUCTION SERVICE**\n\n1. **INTERPRETATION**" + } + \ No newline at end of file diff --git a/test/sandbox/fixtures/v3/omis/quote-preview.json b/test/sandbox/fixtures/v3/omis/quote-preview.json new file mode 100644 index 00000000000..7e41caa036c --- /dev/null +++ b/test/sandbox/fixtures/v3/omis/quote-preview.json @@ -0,0 +1,12 @@ +{ + "created_on": null, + "created_by": null, + "cancelled_on": null, + "cancelled_by": null, + "accepted_on": null, + "accepted_by": null, + "expires_on": "2021-03-04", + "content": "Date: 2 Feb 2021\n\n# Quote for the Provision of an Overseas Market Introduction Service (“OMIS”): {{order_reference}} (the **Quote**)\n\nWe, the Department for Business and Trade (**DBT**) agree to provide you {{company_name}} of {{company_address}} with the Services on the terms set out in this Quote.\n\nThe **Services** are those described below:\n\n{{order_description}}\n\nDBT will deliver the Services on or before the **Delivery Date** which shall be 17 December 2022.\n\nIn exchange for these Services you agree to pay the **Charges** which shall be £12 (excluding VAT) on or before the **Payment Date** which shall be the earliest of: the date 30 days from the date of the relevant invoice; or the date 10 days before the Delivery Date. The Payment Date will be specified on your invoice.\n\nAll correspondence will be between our representatives set out below:\n\nThe **DBT Contact** shall be lead_assignee_name. If you do not have contact details for the DBT Contact, please contact generic_contact_email.\n\nThe **Customer Contact** shall be contact_name of company_name, company_address and contact_email.", + "terms_and_conditions": "**ANNEX 1**\n\n**TERMS & CONDITIONS FOR DELIVERY OF DEPARTMENT FOR INTERNATIONAL TRADE OVERSEAS MARKET INTRODUCTION SERVICE**\n\n1. **INTERPRETATION**" + } + \ No newline at end of file diff --git a/test/sandbox/fixtures/v3/omis/quote.json b/test/sandbox/fixtures/v3/omis/quote.json index b376895f53e..8806cbbbd57 100644 --- a/test/sandbox/fixtures/v3/omis/quote.json +++ b/test/sandbox/fixtures/v3/omis/quote.json @@ -8,9 +8,14 @@ }, "cancelled_on": null, "cancelled_by": null, - "accepted_on": null, - "accepted_by": null, + "accepted_on": "2022-02-02T14:13:10.030533Z", + "accepted_by": { + "name": "Miranda Pottinger", + "first_name": "Miranda", + "last_name": "Pottinger", + "id": "d5b8be3f-d9da-411e-8acf-f85986e3b4dd" + }, "expires_on": "2021-03-04", - "content": "some dummy content", + "content": "Date: 2 Feb 2021\n\n# Quote for the Provision of an Overseas Market Introduction Service (“OMIS”): {{order_reference}} (the **Quote**)\n\nWe, the Department for Business and Trade (**DBT**) agree to provide you {{company_name}} of {{company_address}} with the Services on the terms set out in this Quote.\n\nThe **Services** are those described below:\n\n{{order_description}}\n\nDBT will deliver the Services on or before the **Delivery Date** which shall be 17 December 2022.\n\nIn exchange for these Services you agree to pay the **Charges** which shall be £12 (excluding VAT) on or before the **Payment Date** which shall be the earliest of: the date 30 days from the date of the relevant invoice; or the date 10 days before the Delivery Date. The Payment Date will be specified on your invoice.\n\nAll correspondence will be between our representatives set out below:\n\nThe **DBT Contact** shall be lead_assignee_name. If you do not have contact details for the DBT Contact, please contact generic_contact_email.\n\nThe **Customer Contact** shall be contact_name of company_name, company_address and contact_email.", "terms_and_conditions": "**ANNEX 1**\n\n**TERMS & CONDITIONS FOR DELIVERY OF DEPARTMENT FOR INTERNATIONAL TRADE OVERSEAS MARKET INTRODUCTION SERVICE**\n\n1. **INTERPRETATION**" } diff --git a/test/sandbox/routes/v3/omis/omis.js b/test/sandbox/routes/v3/omis/omis.js index de7ddd53239..638e402e21d 100644 --- a/test/sandbox/routes/v3/omis/omis.js +++ b/test/sandbox/routes/v3/omis/omis.js @@ -5,10 +5,13 @@ import assignees from '../../../fixtures/v3/omis/assignees.json' assert { type: import invoice from '../../../fixtures/v3/omis/invoice.json' assert { type: 'json' } import payments from '../../../fixtures/v3/omis/payments.json' assert { type: 'json' } import quote from '../../../fixtures/v3/omis/quote.json' assert { type: 'json' } +import quotePreview from '../../../fixtures/v3/omis/quote-preview.json' assert { type: 'json' } import quoteAccepted from '../../../fixtures/v3/omis/quote-accepted.json' assert { type: 'json' } import subscribers from '../../../fixtures/v3/omis/subscribers.json' assert { type: 'json' } import quoteAwaitOrder from '../../../fixtures/v3/omis/quote-awaiting-order.json' assert { type: 'json' } import emptyOrder from '../../../fixtures/v3/omis/empty-order.json' assert { type: 'json' } +import quoteNotAccepted from '../../../fixtures/v3/omis/quote-not-accepted.json' assert { type: 'json' } +import quoteCancelled from '../../../fixtures/v3/omis/quote-cancelled.json' assert { type: 'json' } export const getAssignees = function (req, res) { res.json(assignees) @@ -40,7 +43,25 @@ export const createPayments = function (req, res) { } export const getQuote = function (req, res) { - res.json(quote) + if (req.params.id === quoteAwaitOrder.id) { + return res.json(quoteNotAccepted) + } + if (req.params.id === cancelledOrder.id) { + return res.json(quoteCancelled) + } + return res.json(quote) +} + +export const createQuote = function (req, res) { + res.sendStatus(200) +} + +export const cancelQuote = function (req, res) { + res.sendStatus(200) +} + +export const getQuotePreview = function (req, res) { + res.json(quotePreview) } export const subscriberList = function (req, res) { diff --git a/test/sandbox/server.js b/test/sandbox/server.js index 4a75de1f87e..bcddf56dc2c 100644 --- a/test/sandbox/server.js +++ b/test/sandbox/server.js @@ -92,6 +92,9 @@ import { getPayments, createPayments, getQuote, + getQuotePreview, + createQuote, + cancelQuote, } from './routes/v3/omis/omis.js' import { featureFlag, @@ -564,6 +567,9 @@ app.put('/v3/omis/order/:id/subscriber-list', subscriberList) app.get('/v3/omis/order/:id/payment', getPayments) app.post('/v3/omis/order/:id/payment', createPayments) app.get('/v3/omis/order/:id/quote', getQuote) +app.post('/v3/omis/order/:id/quote', createQuote) +app.post('/v3/omis/order/:id/quote/preview', getQuotePreview) +app.post('/v3/omis/order/:id/quote/cancel', cancelQuote) app.patch('/v3/omis/order/:id/assignee', getAssignees) app.post('/v3/omis/order/:id/cancel', getOrderById) app.post('/v3/omis/order/:id/complete', getOrderById) diff --git a/test/unit/data/contacts/contacts.json b/test/unit/data/contacts/contacts.json deleted file mode 100644 index bde9b9e8db6..00000000000 --- a/test/unit/data/contacts/contacts.json +++ /dev/null @@ -1,108 +0,0 @@ -[{ - "id": "12651151-2149-465e-871b-ac45bc568a62", - "created_on": "2017-02-14T14:49:17", - "modified_on": "2017-02-14T14:49:17", - "archived": false, - "archived_on": null, - "archived_reason": "", - "first_name": "Fred", - "last_name": "Smith", - "job_title": "Director", - "primary": true, - "telephone_countrycode": "+44", - "telephone_number": "07814 333 777", - "email": "fred@test.com", - "address_same_as_company": false, - "address_1": "", - "address_2": "", - "address_town": "", - "address_county": "", - "address_postcode": "", - "telephone_alternative": null, - "email_alternative": null, - "notes": null, - "archived_by": null, - "title": { - "id": "a26cb21e-6095-e211-a939-e4115bead28a", - "name": "Mr" - }, - "adviser": null, - "address_country": null -}, -{ - "id": "12651151-2149-465e-871b-ac45bc568a63", - "created_on": "2017-02-14T14:49:17", - "modified_on": "2017-02-14T14:49:17", - "archived": false, - "archived_on": null, - "archived_reason": "", - "first_name": "John", - "last_name": "Smith", - "job_title": "Director", - "primary": true, - "telephone_countrycode": "+44", - "telephone_number": "07814 333 777", - "email": "john@test.com", - "address_same_as_company": false, - "address_1": "", - "address_2": "", - "address_town": "", - "address_county": "", - "address_postcode": "", - "telephone_alternative": null, - "email_alternative": null, - "notes": null, - "archived_by": null, - "title": { - "id": "a26cb21e-6095-e211-a939-e4115bead28a", - "name": "Mr" - }, - "adviser": null, - "address_country": null -}, -{ - "id": "12651151-2149-465e-871b-ac45bc568a64", - "created_on": "2017-02-14T14:49:17", - "modified_on": "2017-02-14T14:49:17", - "archived": true, - "archived_on": "2017-02-14T14:49:17", - "archived_reason": "Contact has left the company", - "first_name": "Jane", - "last_name": "Smith", - "job_title": "Director", - "primary": true, - "telephone_countrycode": "+44", - "telephone_number": "07814 333 777", - "email": "jane@test.com", - "address_same_as_company": false, - "address_1": "", - "address_2": "", - "address_town": "", - "address_county": "", - "address_postcode": "", - "telephone_alternative": null, - "email_alternative": null, - "notes": null, - "archived_by": { - "id": "5707c18a-454a-4bd2-b14b-218761a684bc", - "password": "pbkdf2_sha256$30000$CcwYNPOk7Q0S$Isy9CB/NLd9eKXJfVtR7mgi1Shj4OiavmgqhZ/vCnMs=", - "last_login": "2017-02-27T15:51:27.258250", - "is_superuser": true, - "first_name": "Zac", - "last_name": "Tolley", - "email": "zac.tolley@digital.trade.gov.uk", - "is_staff": true, - "is_active": true, - "date_joined": "2017-02-20T10:33:14", - "enabled": false, - "dit_team": "0167b456-0ddd-49bd-8184-e3227a0b6396", - "groups": [], - "user_permissions": [] - }, - "title": { - "id": "a26cb21e-6095-e211-a939-e4115bead28a", - "name": "Mr" - }, - "adviser": null, - "address_country": null -}]