From e02efa9d3771f2913004d6cf6fc79a9820f8c974 Mon Sep 17 00:00:00 2001 From: eyelidlessness Date: Sat, 18 Feb 2023 09:35:01 -0800 Subject: [PATCH 01/24] Convert `transform` to async/await Includes tests around API stability, as these expectations were all broken in a previous naive attempt at the same change --- src/transformer.ts | 123 +++++++++++++++++---------------------- test/transformer.spec.ts | 56 +++++++++++++++++- 2 files changed, 107 insertions(+), 72 deletions(-) diff --git a/src/transformer.ts b/src/transformer.ts index 8150ab3..d874c0e 100644 --- a/src/transformer.ts +++ b/src/transformer.ts @@ -45,70 +45,59 @@ export interface TransformedSurvey { /** * Performs XSLT transformation on XForm and process the result. */ -export const transform = (survey: Survey): Promise => { - let xformDoc: XMLJSDocument; +export const transform = async ( + survey: T +): Promise> => { + const { xform, markdown, media, openclinica, preprocess, theme } = survey; - const xsltParams = survey.openclinica + const xsltParams = openclinica ? { openclinica: 1, } : {}; const mediaMap = Object.fromEntries( - Object.entries(survey.media || {}).map((entry) => - entry.map(escapeURLPath) - ) + Object.entries(media || {}).map((entry) => entry.map(escapeURLPath)) ); - return parseXML(survey.xform) - .then((doc) => { - if (typeof survey.preprocess === 'function') { - doc = survey.preprocess.call(libxmljs, doc); - } + const doc = await parseXML(xform); + const xformDoc = + typeof preprocess === 'function' ? preprocess.call(libxmljs, doc) : doc; - return doc; - }) - .then((doc) => processBinaryDefaults(doc, mediaMap)) - .then((doc) => { - xformDoc = doc; - - return xslTransform(xslForm, xformDoc, xsltParams); - }) - .then((htmlDoc) => { - htmlDoc = correctAction(htmlDoc, 'setgeopoint'); - htmlDoc = correctAction(htmlDoc, 'setvalue'); - htmlDoc = replaceTheme(htmlDoc, survey.theme); - htmlDoc = replaceMediaSources(htmlDoc, mediaMap); - - const languageMap = replaceLanguageTags(htmlDoc); - const form = - survey.markdown !== false - ? renderMarkdown(htmlDoc, mediaMap) - : docToString(htmlDoc); - const xmlDoc = xslTransform(xslModel, xformDoc); - - return Promise.all([form, languageMap, xmlDoc]); - }) - .then(([form, languageMap, xmlDoc]) => { - xmlDoc = replaceMediaSources(xmlDoc, mediaMap); - xmlDoc = addInstanceIdNodeIfMissing(xmlDoc); - - const model = docToString(xmlDoc); - - // @ts-expect-error - This fails because `xform` is not optional, but this is API-consistent behavior. - delete survey.xform; - delete survey.media; - delete survey.preprocess; - delete survey.markdown; - delete survey.openclinica; - - return Object.assign(survey, { - form, - model, - languageMap, - transformerVersion: PACKAGE_VERSION, - }); - }); + processBinaryDefaults(xformDoc, mediaMap); + + const htmlDoc = await xslTransform(xslForm, xformDoc, xsltParams); + + correctAction(htmlDoc, 'setgeopoint'); + correctAction(htmlDoc, 'setvalue'); + replaceTheme(htmlDoc, theme); + replaceMediaSources(htmlDoc, mediaMap); + + const languageMap = replaceLanguageTags(htmlDoc); + const form = + markdown !== false + ? renderMarkdown(htmlDoc, mediaMap) + : docToString(htmlDoc); + const xmlDoc = await xslTransform(xslModel, xformDoc); + + replaceMediaSources(xmlDoc, mediaMap); + addInstanceIdNodeIfMissing(xmlDoc); + + const model = docToString(xmlDoc); + + // @ts-expect-error - This fails because `xform` is not optional, but this is API-consistent behavior. + delete survey.xform; + delete survey.media; + delete survey.preprocess; + delete survey.markdown; + delete survey.openclinica; + + return Object.assign(survey, { + form, + model, + languageMap, + transformerVersion: PACKAGE_VERSION, + }); }; interface XSLTParams { @@ -166,8 +155,6 @@ const processBinaryDefaults = ( } } }); - - return doc; }; /** @@ -216,8 +203,6 @@ const correctAction = ( setValueEl.parent()?.remove(); } }); - - return doc; }; const parseXML = (xmlStr: string) => @@ -235,13 +220,13 @@ const replaceTheme = (doc: XMLJSDocument, theme?: string) => { const HAS_THEME = /(theme-)[^"'\s]+/; if (!theme) { - return doc; + return; } const formClassAttr = doc.root().get('/root/form')?.attr('class'); if (formClassAttr == null) { - return doc; + return; } const formClassValue = formClassAttr.value(); @@ -255,8 +240,6 @@ const replaceTheme = (doc: XMLJSDocument, theme?: string) => { } else { formClassAttr.value(`${formClassValue} theme-${theme}`); } - - return doc; }; const replaceMediaSources = ( @@ -264,7 +247,7 @@ const replaceMediaSources = ( mediaMap?: Record ) => { if (!mediaMap) { - return root; + return; } // iterate through each element with a src attribute @@ -289,8 +272,6 @@ const replaceMediaSources = ( if (formLogo && formLogoEl) { formLogoEl.node('img').attr('src', formLogo).attr('alt', 'form logo'); } - - return root; }; /** @@ -300,7 +281,7 @@ const replaceMediaSources = ( * @see http://www.w3.org/International/questions/qa-choosing-language-tags */ const replaceLanguageTags = (doc: XMLJSDocument) => { - const map: Record = {}; + const languageMap: Record = {}; const languageElements = doc.find( '/root/form/select[@id="form-languages"]/option' @@ -322,7 +303,7 @@ const replaceLanguageTags = (doc: XMLJSDocument) => { languageElements.forEach((el, index) => { const val = el.attr('value')?.value(); if (val && val !== languages[index].tag) { - map[val] = languages[index].tag; + languageMap[val] = languages[index].tag; } el.attr({ 'data-dir': languages[index].directionality, @@ -361,7 +342,7 @@ const replaceLanguageTags = (doc: XMLJSDocument) => { }); } - return map; + return languageMap; }; /** @@ -408,8 +389,6 @@ const addInstanceIdNodeIfMissing = (doc: XMLJSDocument) => { rootEl.node('meta').node('instanceID'); } } - - return doc; }; /** @@ -458,7 +437,9 @@ const renderMarkdown = ( `
${rendered}
` ); - rendered = replaceMediaSources(fragment, mediaMap) + replaceMediaSources(fragment, mediaMap); + + rendered = fragment .root() .childNodes() .map((node) => node.toString(false)) diff --git a/test/transformer.spec.ts b/test/transformer.spec.ts index d31d6a8..9506b0f 100644 --- a/test/transformer.spec.ts +++ b/test/transformer.spec.ts @@ -1,4 +1,4 @@ -import { transform } from '../src/transformer'; +import { Survey, transform } from '../src/transformer'; import { getTransformedForm, getTransformedFormDocument, @@ -66,6 +66,60 @@ describe('transformer', () => { widgets = await getTransformedForm('widgets.xml'); }); + // These tests ensure the API of `transform` remains consistent, out of an + // abundance of caution after breaking compatibility in previous attempts to + // refactor it. + describe('API stability', () => { + interface ExtraneousProperty { + extraneous: 'property'; + } + + let survey: ExtraneousProperty & Survey; + let transformed: ExtraneousProperty & TransformedSurvey; + + beforeAll(async () => { + survey = { + xform: widgetsXForm, + media: { 'form_logo.png': 'http://example.com/form_logo.png' }, + preprocess(doc) { + return doc; + }, + markdown: true, + openclinica: 1, + extraneous: 'property', + }; + transformed = await transform(survey); + }); + + it('does not return properties of the explicit `Survey` type', () => { + const keys = [ + 'xform', + 'media', + 'preprocess', + 'markdown', + 'openclinica', + ]; + + expect(keys.every((key) => !(key in transformed))).to.be.true; + + keys.forEach((key) => { + expect(key in transformed).to.be.false; + + // @ts-expect-error - This checks that the return type matches the runtime value + expect(transformed[key]).to.be.undefined; + }); + }); + + it('preserves properties not explicitly on the `Survey` type', () => { + expect(transformed.extraneous).to.equal('property'); + }); + + it('returns a reference to the `survey` input object', () => { + // @ts-expect-error - TypeScript rightly does not agree that these types are assignable + expect(transformed === survey).to.be.true; + }); + }); + describe('transforms valid XForms', () => { it('without an error', () => { expect(widgets).to.be.an('object'); From 6242fbeb17de112b4fe7eb47e05d3fe98c264293 Mon Sep 17 00:00:00 2001 From: eyelidlessness Date: Sun, 19 Feb 2023 13:13:32 -0800 Subject: [PATCH 02/24] Initial Node/DOM compatibility 1. Introduces an abstract subset of DOM APIs corresponding to previous usage of semantically equivalent `libxmljs` APIs. It would have been nicer to import these types and export the subset we care about, but this is inconsistent with how TypeScript `lib` works (it always augments the global scope). 2. Provides a Node implementation of those DOM APIs by extending `libxmljs` prototypes. This kind of extension isn't ideal, but it's the most reasonable way to achieve such a compatibility layer without sacrificing performance. An ealirer alternative approach used `WeakMap`s to cross reference the DOM/`libxmljs` interfaces, but this had a significant impact on perf. This implementation is type checked by default. 3. Provides a web implementation by... just exporting the relevant globals. This implementation is type checked by `tsc` using the `tsconfig.web.json` project file. This ensures that the abstract DOM interfaces are actully consistent with the built in DOM `lib` types. 4. Refactors transformer.ts to use the abstract DOM APIs. This uses the Node DOM compatibility implementation by default, and the native web DOM implementation when the environment variable `ENV` is set to "web". 5. Also when `ENV` is web, tests and benchmarks call `transform` in the specified `BROWSER` environment variable (defaulting to "fiefox") via a simple `playwright` bridge. In CI, all tests and benchmarks are run in: Node 14, Node 16, Firefox, Chromium, Webkit. 6. Build is updated to produce both Node and web targets. The build config itself is fairly complex, but it's been consolidated in `vite.config.ts`. This also includes a corresponding change to build `app.ts` rather than the previous, much more complex `app.js` using a Vite dev server (and roughly restores its implementation to what it had been prior to the initial TypeScript migration). 7. There are several known issues at the point of this commit. These either correspond to XSLT extensions not supported by browser targets, or to differences in behavior between DOM/`libxmljs`, all of which will be addressed in separate commits discussing each in greater detail. --- .eslintrc.json | 14 +- .github/workflows/npmjs.yml | 23 +- .vscode/settings.json | 4 +- app.js | 64 +--- config/build.shared.d.ts | 7 - config/build.shared.js | 42 --- index.html | 18 ++ package-lock.json | 95 +++--- package.json | 34 ++- src/api.ts | 38 ++- app.ts => src/app.ts | 10 +- src/dom/abstract/Attr.d.ts | 6 + src/dom/abstract/DOMParser.d.ts | 9 + src/dom/abstract/Document.d.ts | 34 +++ src/dom/abstract/Element.d.ts | 28 ++ src/dom/abstract/Node.d.ts | 12 + src/dom/abstract/XSLTProcessor.d.ts | 10 + src/dom/abstract/index.d.ts | 23 ++ src/dom/index.ts | 10 + src/dom/node/DOMParser.ts | 16 + src/dom/node/Document.ts | 93 ++++++ src/dom/node/Element.ts | 106 +++++++ src/dom/node/Node.ts | 91 ++++++ src/dom/node/XSLTProcessor.ts | 37 +++ src/dom/node/extensions.d.ts | 25 ++ src/dom/node/index.ts | 6 + src/dom/shared.ts | 15 + src/dom/web/DOMParser.ts | 7 + src/dom/web/XSLTProcessor.ts | 8 + src/dom/web/index.ts | 2 + src/dom/web/libxslt.ts | 9 + src/shared.ts | 6 + src/transformer.ts | 459 +++++++++++++++------------- test/bad-external.spec.ts | 363 +++++++++++----------- test/benchmarks.ts | 50 ++- test/shared.ts | 121 +++++++- test/snapshot.spec.ts | 89 +++--- test/transformer.spec.ts | 19 +- test/tsconfig.json | 9 +- tsconfig.json | 9 +- tsconfig.typedefs.json | 7 +- tsconfig.web.json | 11 + typings/env.d.ts | 4 + typings/libxmljs.d.ts | 59 ++-- typings/libxslt.d.ts | 12 +- typings/test.d.ts | 2 + vite.config.ts | 244 +++++++++++---- 47 files changed, 1646 insertions(+), 714 deletions(-) delete mode 100644 config/build.shared.d.ts delete mode 100644 config/build.shared.js create mode 100644 index.html rename app.ts => src/app.ts (59%) create mode 100644 src/dom/abstract/Attr.d.ts create mode 100644 src/dom/abstract/DOMParser.d.ts create mode 100644 src/dom/abstract/Document.d.ts create mode 100644 src/dom/abstract/Element.d.ts create mode 100644 src/dom/abstract/Node.d.ts create mode 100644 src/dom/abstract/XSLTProcessor.d.ts create mode 100644 src/dom/abstract/index.d.ts create mode 100644 src/dom/index.ts create mode 100644 src/dom/node/DOMParser.ts create mode 100644 src/dom/node/Document.ts create mode 100644 src/dom/node/Element.ts create mode 100644 src/dom/node/Node.ts create mode 100644 src/dom/node/XSLTProcessor.ts create mode 100644 src/dom/node/extensions.d.ts create mode 100644 src/dom/node/index.ts create mode 100644 src/dom/shared.ts create mode 100644 src/dom/web/DOMParser.ts create mode 100644 src/dom/web/XSLTProcessor.ts create mode 100644 src/dom/web/index.ts create mode 100644 src/dom/web/libxslt.ts create mode 100644 src/shared.ts create mode 100644 tsconfig.web.json diff --git a/.eslintrc.json b/.eslintrc.json index 524c3bf..fa2e9e1 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -48,9 +48,9 @@ { "devDependencies": [ "app.js", - "app.ts", "vite.config.ts", "src/api.ts", + "src/app.ts", "test/**/*.ts" ], "optionalDependencies": false, @@ -95,10 +95,19 @@ { "files": ["./**/*.ts"], "rules": { + "consistent-return": "off", "no-useless-constructor": "off", "@typescript-eslint/no-useless-constructor": "error", "no-unused-vars": "off", - "@typescript-eslint/no-unused-vars": "error", + "@typescript-eslint/no-unused-vars": [ + "error", + { + "argsIgnorePattern": "^_", + "varsIgnorePattern": "^_" + } + ], + "no-dupe-class-members": "off", + "@typescript-eslint/no-dupe-class-members": "error", "no-empty-function": "off", "@typescript-eslint/no-empty-function": "error", "no-undef": "off", @@ -129,6 +138,7 @@ { "files": ["./**/*.d.ts"], "rules": { + "lines-between-class-members": "off", "no-unused-vars": "off" } }, diff --git a/.github/workflows/npmjs.yml b/.github/workflows/npmjs.yml index 907824b..2387fd9 100644 --- a/.github/workflows/npmjs.yml +++ b/.github/workflows/npmjs.yml @@ -12,13 +12,26 @@ jobs: runs-on: ubuntu-latest strategy: matrix: + target: ['node'] node: ['14', '16'] + include: + - target: web + node: 16 + browser: firefox + - target: web + node: 16 + browser: chromium + - target: web + node: 16 + browser: webkit steps: - uses: actions/checkout@v2 - uses: actions/cache@v2 id: cache with: - path: node_modules + path: | + node_modules + ~/.cache/ms-playwright key: ${{ matrix.node }}-${{ hashFiles('**/package-lock.json') }} - uses: actions/setup-node@v2 with: @@ -27,9 +40,11 @@ jobs: - run: npm install -g npm@^6 - if: steps.cache.outputs.cache-hit != 'true' run: npm ci - - run: npm test - - run: npm run benchmarks - - if: github.event_name == 'release' && github.event.action == 'published' && matrix.node == '16' + - if: matrix.node == '16' && matrix.browser == 'webkit' + run: sudo npx playwright install-deps + - run: ENV=${{ matrix.target }} BROWSER=${{ matrix.browser }} npm test + - run: ENV=${{ matrix.target }} BROWSER=${{ matrix.browser }} npm run benchmarks + - if: github.event_name == 'release' && github.event.action == 'published' && matrix.node == '16' && matrix.target == 'node' run: npm publish env: NODE_AUTH_TOKEN: ${{secrets.npm_token}} diff --git a/.vscode/settings.json b/.vscode/settings.json index d469ee3..88f7aeb 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -22,7 +22,6 @@ "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true }, - // Note: it would be nice to reverse this! But it's currently preventing a *ton* of whitespace diff noise "[xml]": { "editor.formatOnSave": false @@ -32,5 +31,6 @@ }, // Code navigation - "javascript.referencesCodeLens.enabled": true + "javascript.referencesCodeLens.enabled": true, + "typescript.tsdk": "node_modules/typescript/lib" } diff --git a/app.js b/app.js index 385f0b3..83f7638 100644 --- a/app.js +++ b/app.js @@ -1,63 +1 @@ -// @ts-check - -import { createServer } from 'vite'; -import { VitePluginNode } from 'vite-plugin-node'; -import { - config, - external, - resolvePath, - rootDir, -} from './config/build.shared.js'; - -const appPath = resolvePath('./app.ts'); - -const init = async () => { - /** @type {import('vite').UserConfig} */ - const baseOptions = { - mode: 'development', - build: { - rollupOptions: { - external, - }, - }, - optimizeDeps: { - disabled: true, - }, - root: rootDir, - ssr: { - target: 'node', - }, - }; - - const servers = await Promise.all([ - createServer({ - ...baseOptions, - configFile: false, - plugins: VitePluginNode({ - adapter: 'express', - appPath, - exportName: 'app', - tsCompiler: 'esbuild', - }), - server: { - port: config.port, - }, - }), - createServer({ - ...baseOptions, - configFile: false, - publicDir: resolvePath('./test/forms'), - server: { - port: 8081, - }, - }), - ]); - - await Promise.all(servers.map((server) => server.listen())); - - servers.forEach((server) => { - server.printUrls(); - }); -}; - -init(); +import './dist/enketo-transformer/app.cjs'; diff --git a/config/build.shared.d.ts b/config/build.shared.d.ts deleted file mode 100644 index 6adedf8..0000000 --- a/config/build.shared.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -export { - config, - external, - resolvePath, - readFile, - rootDir, -} from './build.shared'; diff --git a/config/build.shared.js b/config/build.shared.js deleted file mode 100644 index d9aeb62..0000000 --- a/config/build.shared.js +++ /dev/null @@ -1,42 +0,0 @@ -// @ts-check - -import fs from 'fs'; -import { createRequire } from 'module'; -import { dirname, resolve } from 'path'; -import { fileURLToPath } from 'url'; - -const require = createRequire(import.meta.url); - -export const config = require('./config.json'); - -export const external = [ - 'body-parser', - 'crypto', - 'css.escape', - 'express', - 'fs', - 'language-tags', - 'libxslt', - 'node1-libxmljsmt-myh', - 'path', - 'string-direction', - 'undici', - 'url', - 'vite-node', - 'vite', -]; - -export const rootDir = dirname(fileURLToPath(import.meta.url)).replace( - /(\/enketo-transformer)(\/.*$)/, - '$1' -); - -/** - * @param {string} path - */ -export const resolvePath = (path) => resolve(rootDir, path); - -/** - * @param {string} path - */ -export const readFile = (path) => fs.readFileSync(resolvePath(path), 'utf-8'); diff --git a/index.html b/index.html new file mode 100644 index 0000000..20465c3 --- /dev/null +++ b/index.html @@ -0,0 +1,18 @@ + + + + + + + Enketo Transformer (web) + + + + + diff --git a/package-lock.json b/package-lock.json index 44aacdb..753cba2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1391,7 +1391,7 @@ "array-each": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", "dev": true }, "array-flatten": { @@ -2399,7 +2399,7 @@ "colors": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w==", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", "dev": true }, "comment-parser": { @@ -2411,7 +2411,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "confusing-browser-globals": { "version": "1.0.11", @@ -2422,7 +2422,7 @@ "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" }, "content-disposition": { "version": "0.5.4", @@ -2657,7 +2657,7 @@ "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" }, "depd": { "version": "2.0.0", @@ -2672,7 +2672,7 @@ "detect-file": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", "dev": true }, "detect-libc": { @@ -3974,7 +3974,7 @@ "eventemitter2": { "version": "0.4.14", "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", - "integrity": "sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==", + "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", "dev": true }, "eventemitter3": { @@ -3986,13 +3986,13 @@ "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", "dev": true }, "expand-tilde": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", "dev": true, "requires": { "homedir-polyfill": "^1.0.1" @@ -4220,13 +4220,13 @@ "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, "for-own": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", "dev": true, "requires": { "for-in": "^1.0.1" @@ -4253,7 +4253,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "fsevents": { "version": "2.3.2", @@ -4413,7 +4413,7 @@ "global-prefix": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", "dev": true, "requires": { "expand-tilde": "^2.0.2", @@ -4743,7 +4743,7 @@ "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" }, "he": { "version": "1.2.0", @@ -4763,7 +4763,7 @@ "hooker": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", - "integrity": "sha512-t+UerCsQviSymAInD01Pw+Dn/usmz1sRO+3Zk1+lx8eg+WKpD2ulcwWqHHL0+aseRBr+3+vIhiG1K1JTwaIcTA==", + "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", "dev": true }, "hosted-git-info": { @@ -4916,7 +4916,7 @@ "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "requires": { "once": "^1.3.0", "wrappy": "1" @@ -5003,7 +5003,7 @@ "interpret": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha512-CLM8SNMDu7C5psFCn6Wg/tgpj/bKAg7hc2gWqcuR9OD5Ft9PhBpIu8PLicPeis+xDd6YX2ncI8MCA64I9tftIA==", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", "dev": true }, "ipaddr.js": { @@ -5291,7 +5291,7 @@ "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, "istanbul": { @@ -5557,7 +5557,7 @@ "language-tags": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=", + "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", "requires": { "language-subtag-registry": "~0.3.2" } @@ -5732,7 +5732,7 @@ "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", "dev": true }, "markdown-eslint-parser": { @@ -6132,7 +6132,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "multimap": { "version": "1.1.0", @@ -6359,7 +6359,7 @@ "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" }, "object-inspect": { "version": "1.12.0", @@ -6397,7 +6397,7 @@ "object.defaults": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", "dev": true, "requires": { "array-each": "^1.0.1", @@ -6749,7 +6749,7 @@ "object.map": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", "dev": true, "requires": { "for-own": "^1.0.0", @@ -6759,7 +6759,7 @@ "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { "isobject": "^3.0.1" @@ -6941,7 +6941,7 @@ "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "requires": { "wrappy": "1" } @@ -6978,12 +6978,12 @@ "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==" }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" }, "osenv": { "version": "0.1.5", @@ -7021,7 +7021,7 @@ "parse-filepath": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", "dev": true, "requires": { "is-absolute": "^1.0.0", @@ -7044,7 +7044,7 @@ "parse-passwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", "dev": true }, "parseurl": { @@ -7061,7 +7061,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" }, "path-key": { "version": "3.1.1", @@ -7078,7 +7078,7 @@ "path-root": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", "dev": true, "requires": { "path-root-regex": "^0.1.0" @@ -7087,7 +7087,7 @@ "path-root-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", "dev": true }, "path-to-regexp": { @@ -7142,6 +7142,23 @@ "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", "dev": true }, + "playwright": { + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.25.0.tgz", + "integrity": "sha512-Z+pQNWI17Qx/tHhnmgMmPsptsisXpKgAnUvYv98kctlHUJaqMt2400P8kTw9vEPoC0xdxqu0JhxO7pDTmaaIKw==", + "dev": true, + "requires": { + "playwright-core": "1.25.0" + }, + "dependencies": { + "playwright-core": { + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.25.0.tgz", + "integrity": "sha512-kZ3Jwaf3wlu0GgU0nB8UMQ+mXFTqBIFz9h1svTlNduNKjnbPXFxw7mJanLVjqxHJRn62uBfmgBj93YHidk2N5Q==", + "dev": true + } + } + }, "pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", @@ -7494,7 +7511,7 @@ "resolve-dir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", "dev": true, "requires": { "expand-tilde": "^2.0.0", @@ -7672,7 +7689,7 @@ "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, "setprototypeof": { "version": "1.2.0", @@ -7878,7 +7895,7 @@ "string-direction": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/string-direction/-/string-direction-0.1.2.tgz", - "integrity": "sha1-PYRT5ydKLkShQrPchEnftk2a3jo=" + "integrity": "sha512-NJHQRg6GlOEMLA6jEAlSy21KaXvJDNoAid/v6fBAJbqdvOEIiPpCrIPTHnl4636wUF/IGyktX5A9eddmETb1Cw==" }, "string-width": { "version": "4.2.3", @@ -8420,7 +8437,7 @@ "unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", "dev": true }, "underscore.string": { @@ -8473,7 +8490,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "utils-merge": { "version": "1.0.1", @@ -8780,7 +8797,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "write": { "version": "1.0.3", diff --git a/package.json b/package.json index 227e017..2d40721 100644 --- a/package.json +++ b/package.json @@ -4,18 +4,26 @@ "description": "Library/app that transforms ODK-compliant XForms into a format that Enketo can consume", "license": "Apache-2.0", "type": "module", - "main": "./dist/enketo-transformer.umd.cjs", - "module": "./dist/enketo-transformer.js", - "types": "./dist/src/transformer.d.ts", + "main": "./dist/enketo-transformer/transformer.cjs", + "module": "./dist/enketo-transformer/enketo-transformer.js", + "browser": "./dist/@enketo/transformer-web/transformer.js", + "types": "./dist/types/transformer.d.ts", "files": [ "app.js", "dist/**/*" ], "exports": { ".": { - "import": "./dist/enketo-transformer.js", - "require": "./dist/enketo-transformer.umd.cjs", - "types": "./dist/src/transformer.d.ts" + "import": "./dist/enketo-transformer/enketo-transformer.js", + "require": "./dist/enketo-transformer/transformer.cjs", + "browser": "./dist/@enketo/transformer-web/transformer.js", + "types": "./dist/types/transformer.d.ts" + }, + "./dom": { + "import": "./dist/enketo-transformer/dom/node/index.js", + "require": "./dist/enketo-transformer/dom/node/index.cjs", + "browser": "./dist/@enketo/transformer-web/dom/web/index.js", + "types": "./dist/types/dom/node/index.d.ts" } }, "bugs": { @@ -34,16 +42,17 @@ "contributors": [], "scripts": { "benchmarks": "vite-node ./test/benchmarks.ts", - "build": "vite build && npm run tsc", + "build": "EMPTY_OUT_DIR=true vite build && ENV=web vite build && npm run tsc", "prepare": "npm run build", - "start": "vite", - "eslint-check": "eslint app.ts src/**/*.ts vite.config.ts test/**/*.ts", - "eslint-fix": "eslint app.ts src/**/*.ts vite.config.ts test/**/*.ts --fix", + "start": "vite-node ./src/app.ts", + "eslint-check": "eslint src/**/*.ts vite.config.ts test/**/*.ts", + "eslint-fix": "eslint src/**/*.ts vite.config.ts test/**/*.ts --fix", "prettier-fix": "prettier --write .", "test": "vitest run --coverage && npm run prettier-fix && npm run eslint-fix && npm run tsc && node update-readme-with-shield-badge.cjs", "test:watch": "vitest", - "develop": "DEBUG=api,transformer,markdown,language node ./app.js", - "tsc": "tsc --project ./tsconfig.json && tsc --project ./tsconfig.typedefs.json && tsc --project ./test/tsconfig.json" + "test:watch:web": "ENV=web vitest", + "develop": "DEBUG=api,transformer,markdown,language vite-node ./src/app.ts & http-server test/forms -p 8081", + "tsc": "tsc --project ./tsconfig.json && tsc --project ./tsconfig.web.json && tsc --project ./tsconfig.typedefs.json && tsc --project ./test/tsconfig.json" }, "repository": { "type": "git", @@ -100,6 +109,7 @@ "istanbul-reporter-shield-badge": "^1.2.1", "markdown-eslint-parser": "^1.2.1", "microtime": "^3.1.1", + "playwright": "1.25.0", "pretty-format": "^29.4.2", "rimraf": "^3.0.2", "typescript": "^4.9.5", diff --git a/src/api.ts b/src/api.ts index 2c144da..a565177 100644 --- a/src/api.ts +++ b/src/api.ts @@ -10,7 +10,10 @@ */ import express from 'express'; +import { readFileSync } from 'fs'; +import { dirname, resolve } from 'path'; import { request } from 'undici'; +import { fileURLToPath } from 'url'; import { transform } from './transformer'; const router = express.Router(); @@ -25,17 +28,42 @@ class FetchError extends Error { } const getXForm = async (req: express.Request) => { - const url = req.query.xform; + const { xform } = req.query; try { - if (typeof url !== 'string') { + if (typeof xform !== 'string') { throw new FetchError( 400, 'An `xform` query parameter is required.' ); } - const response = await request(url, { + if (!xform.includes('/')) { + const basePath = resolve( + dirname(fileURLToPath(import.meta.url)), + '../' + ); + const paths = [ + resolve(basePath, './test/forms', xform), + resolve( + basePath, + './test/external-fixtures/enketo-core', + xform + ), + ]; + + for (const path of paths) { + try { + return readFileSync(path, 'utf-8'); + } catch { + // Try next path... + } + } + + throw new FetchError(400, `Could not find XForm: ${xform}`); + } + + const response = await request(xform, { headers: { 'X-OpenRosa-Version': '1.0', }, @@ -50,12 +78,12 @@ const getXForm = async (req: express.Request) => { } if (statusCode < 200 || statusCode >= 300) { - throw new FetchError(statusCode, `Request to ${url} failed.`); + throw new FetchError(statusCode, `Request to ${xform} failed.`); } return response.body.text(); } catch (error) { - console.error(`Error occurred when requesting ${url}`, error); + console.error(`Error occurred when requesting ${xform}`, error); if (error instanceof Error && !(error instanceof FetchError)) { throw new FetchError(500, error.message ?? 'Unknown error.'); diff --git a/app.ts b/src/app.ts similarity index 59% rename from app.ts rename to src/app.ts index daf06b3..190887c 100644 --- a/app.ts +++ b/src/app.ts @@ -1,7 +1,7 @@ import bodyParser from 'body-parser'; import express from 'express'; -import { config } from './config/build.shared'; -import { api } from './src/api'; +import config from '../config/config.json'; +import { api } from './api'; const app = express(); @@ -18,4 +18,8 @@ app.use( api(app); -export { app }; +const { port } = config; + +app.listen(port, () => { + console.warn(`enketo-transformer running on port ${port}!`); +}); diff --git a/src/dom/abstract/Attr.d.ts b/src/dom/abstract/Attr.d.ts new file mode 100644 index 0000000..c82867a --- /dev/null +++ b/src/dom/abstract/Attr.d.ts @@ -0,0 +1,6 @@ +/** @package */ +export interface Attr { + readonly name: string; + readonly namespaceURI: string | null; + readonly value: string; +} diff --git a/src/dom/abstract/DOMParser.d.ts b/src/dom/abstract/DOMParser.d.ts new file mode 100644 index 0000000..0c9fd34 --- /dev/null +++ b/src/dom/abstract/DOMParser.d.ts @@ -0,0 +1,9 @@ +import type { Document } from './Document'; + +/** @package */ +export type DOMMimeType = 'text/html' | 'text/xml'; + +/** @package */ +export interface DOMParser { + parseFromString(docStr: string, mimeType: DOMMimeType): Document; +} diff --git a/src/dom/abstract/Document.d.ts b/src/dom/abstract/Document.d.ts new file mode 100644 index 0000000..6550c2d --- /dev/null +++ b/src/dom/abstract/Document.d.ts @@ -0,0 +1,34 @@ +import type { Element } from './Element'; +import type { Node } from './Node'; + +/** @package */ +export interface NamespaceResolver { + lookupNamespaceURI(prefix: string): string | null; +} + +/** @package */ +export interface XPathResult { + ORDERED_NODE_SNAPSHOT_TYPE?: number; + snapshotItem?(index: number): Node | null; + snapshotLength?: number; +} + +/** @package */ +export interface Document { + readonly documentElement: Element; + readonly nodeName: string; + readonly nodeType: number; + readonly ownerDocument: Document | null; + readonly parentElement: Element | null; + readonly textContent: string | null; + + cloneNode(deep?: boolean): Node; + createElement(name: string): Element; + createElementNS(namespaceURI: string | null, name: string): Element; + evaluate( + xpathExpression: string, + contextNode: Node | Document, + namespaceResolver: NamespaceResolver | null, + resultType: number + ): XPathResult; +} diff --git a/src/dom/abstract/Element.d.ts b/src/dom/abstract/Element.d.ts new file mode 100644 index 0000000..9bc029e --- /dev/null +++ b/src/dom/abstract/Element.d.ts @@ -0,0 +1,28 @@ +import type { Attr } from './Attr'; +import type { Node } from './Node'; + +interface NamedNodeMap { + [Symbol.iterator](): IterableIterator; +} + +/** @package */ +export interface Element extends Node { + readonly attributes: NamedNodeMap; + readonly firstChild: Node | null; + readonly firstElementChild: Element | null; + readonly nodeName: string; + readonly outerHTML: string; + append(...nodes: Array): void; + getAttribute(name: string): string | null; + hasAttribute(name: string): boolean; + insertAdjacentHTML(position: 'afterend', html: string): void; + remove(): void; + removeAttribute(name: string): void; + replaceWith(...nodes: Array): void; + setAttribute(name: string, value: string): void; + setAttributeNS( + namespaceURI: string | null, + name: string, + value: string + ): void; +} diff --git a/src/dom/abstract/Node.d.ts b/src/dom/abstract/Node.d.ts new file mode 100644 index 0000000..74c04c0 --- /dev/null +++ b/src/dom/abstract/Node.d.ts @@ -0,0 +1,12 @@ +import type { Document } from './Document'; +import type { Element } from './Element'; + +/** @package */ +export interface Node { + readonly nodeType: number; + readonly ownerDocument: Document | null; + readonly parentElement: Element | null; + textContent: string | null; + + cloneNode(deep?: boolean): Node; +} diff --git a/src/dom/abstract/XSLTProcessor.d.ts b/src/dom/abstract/XSLTProcessor.d.ts new file mode 100644 index 0000000..c2cb386 --- /dev/null +++ b/src/dom/abstract/XSLTProcessor.d.ts @@ -0,0 +1,10 @@ +import type { Document } from './Document'; +import type { Node } from './Node'; + +/** @package */ +export interface XSLTProcessor { + importStylesheet(style: Node): void; + reset(): void; + setParameter(namespaceURI: string | null, name: string, value: any): void; + transformToDocument(source: Node): Document; +} diff --git a/src/dom/abstract/index.d.ts b/src/dom/abstract/index.d.ts new file mode 100644 index 0000000..8ee8007 --- /dev/null +++ b/src/dom/abstract/index.d.ts @@ -0,0 +1,23 @@ +import type { Attr as AbstractAttr } from './Attr'; +import type { + Document as AbstractDocument, + NamespaceResolver as AbstractNamespaceResolver, + XPathResult as AbstractXPathResult, +} from './Document'; +import type { DOMParser as AbstractDOMParser } from './DOMParser'; +import type { Element as AbstractElement } from './Element'; +import type { Node as AbstractNode } from './Node'; +import type { XSLTProcessor as AbstractXSLTProcessor } from './XSLTProcessor'; + +/** @package */ +// eslint-disable-next-line @typescript-eslint/no-namespace +export namespace DOM { + export type Attr = AbstractAttr; + export type Document = AbstractDocument; + export type DOMParser = AbstractDOMParser; + export type NamespaceResolver = AbstractNamespaceResolver; + export type Node = AbstractNode; + export type Element = AbstractElement; + export type XPathResult = AbstractXPathResult; + export type XSLTProcessor = AbstractXSLTProcessor; +} diff --git a/src/dom/index.ts b/src/dom/index.ts new file mode 100644 index 0000000..0667b18 --- /dev/null +++ b/src/dom/index.ts @@ -0,0 +1,10 @@ +/** + * Note: we **intentionally** neither import nor export anything from + * `/src/dom/web/*`. This is because merely referencing them will cause the + * entire project to incorrectly have global `dom` and `dom.iterble` lib types. + * Instead, we have a separate TypeScript config which aliases the web types to + * ensure they're compatible. + */ + +export type { DOM } from './abstract'; +export * from './node'; diff --git a/src/dom/node/DOMParser.ts b/src/dom/node/DOMParser.ts new file mode 100644 index 0000000..b650c16 --- /dev/null +++ b/src/dom/node/DOMParser.ts @@ -0,0 +1,16 @@ +import { libxmljs } from 'libxslt'; +import type { DOM } from '../abstract'; +import type { DOMMimeType } from '../abstract/DOMParser'; + +const { parseHtmlFragment, parseXml } = libxmljs; + +/** @package */ +export class DOMParser implements DOM.DOMParser { + parseFromString = (docStr: string, mimeType: DOMMimeType): DOM.Document => { + if (mimeType === 'text/html') { + return parseHtmlFragment(docStr); + } + + return parseXml(docStr); + }; +} diff --git a/src/dom/node/Document.ts b/src/dom/node/Document.ts new file mode 100644 index 0000000..2188fda --- /dev/null +++ b/src/dom/node/Document.ts @@ -0,0 +1,93 @@ +import type { ParentNode } from 'libxmljs'; +import { libxmljs } from 'libxslt'; +import { NAMESPACES } from '../../shared'; +import type { DOM } from '../abstract'; +import { NodeTypes } from '../shared'; + +const { Document, Element } = libxmljs; + +/** @package */ +export const XPathResult = { + ORDERED_NODE_SNAPSHOT_TYPE: 6 as const, + snapshotItem: () => null, + snapshotLength: 0, +} satisfies DOM.XPathResult; + +/** @package */ +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface DOMExtendedDocument extends DOM.Node {} + +export class DOMExtendedDocument implements DOM.Document { + get documentElement() { + return (this as any as DOMExtendedDocument & Document).root(); + } + + readonly nodeName = '#document'; + + readonly nodeType = NodeTypes.DOCUMENT_NODE; + + createElement(this: DOMExtendedDocument & Document, name: string): Element { + return new Element(this, name); + } + + createElementNS( + this: DOMExtendedDocument & Document, + namespaceURI: string | null, + name: string + ): Element { + const [prefix, suffix] = name.split(':'); + + const element = new Element(this, suffix ?? name); + + if (suffix == null || namespaceURI == null) { + return element; + } + + const namespace = element.defineNamespace(prefix, namespaceURI); + + element.namespace(namespace); + + return element; + } + + evaluate( + this: Document & DOMExtendedDocument, + xpathExpression: string, + contextNode: ParentNode, + namespaceResolver: DOM.NamespaceResolver | null, + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore - this is part of the interface! + // eslint-disable-next-line @typescript-eslint/no-unused-vars + resultType: XPathResult['ORDERED_NODE_SNAPSHOT_TYPE'] + ) { + const namespaces = + namespaceResolver == null + ? undefined + : Object.fromEntries( + Object.entries(NAMESPACES).filter( + ([prefix, value]) => + namespaceResolver.lookupNamespaceURI(prefix) === + value + ) + ); + + const results = (contextNode ?? this).find(xpathExpression, namespaces); + + return { + snapshotItem: (index: number) => results[index], + snapshotLength: results.length, + }; + } +} + +/* eslint-disable @typescript-eslint/no-redeclare */ +type Document = InstanceType; +type Element = InstanceType; +export type XPathResult = typeof XPathResult; +/* eslint-enable @typescript-eslint/no-redeclare */ + +const { constructor: _, ...descriptors } = Object.getOwnPropertyDescriptors( + DOMExtendedDocument.prototype +); + +Object.defineProperties(Document.prototype, descriptors); diff --git a/src/dom/node/Element.ts b/src/dom/node/Element.ts new file mode 100644 index 0000000..f6ae6b0 --- /dev/null +++ b/src/dom/node/Element.ts @@ -0,0 +1,106 @@ +import type { Node } from 'libxmljs'; +import { libxmljs } from 'libxslt'; +import type { DOM } from '../abstract'; +import { NodeTypes } from '../shared'; + +const { Element, parseXml } = libxmljs; + +/** @package */ +export interface DOMExtendedElement extends DOM.Node { + remove(): void; +} + +export class DOMExtendedElement implements DOM.Element { + readonly nodeType = NodeTypes.DOCUMENT_NODE; + + get attributes() { + return (this as any as DOMExtendedElement & Element) + .attrs() + .map((attr) => ({ + name: attr.name(), + namespaceURI: null, + value: attr.value() ?? '', + })); + } + + get firstChild() { + return (this as any as DOMExtendedElement & Element).child(0) ?? null; + } + + get firstElementChild(): Element | null { + return (this as any as DOMExtendedElement & Element).get('*') ?? null; + } + + get nodeName() { + return (this as any as Element).name(); + } + + get outerHTML() { + return (this as any as Element).toString(false); + } + + append(this: DOMExtendedElement & Element, ...nodes: Node[]) { + nodes.forEach((node) => { + this.addChild(node); + }); + } + + getAttribute(this: DOMExtendedElement & Element, name: string) { + return this.attr(name)?.value() ?? null; + } + + hasAttribute(this: Element & DOMExtendedElement, name: string) { + return this.attr(name) != null; + } + + insertAdjacentHTML( + this: Element & DOMExtendedElement, + _position: 'afterend', + html: string + ) { + const childNodes = parseXml(`${html}`).find('/root/*'); + + childNodes.forEach((node) => { + this.addNextSibling(node); + }); + } + + replaceWith(this: Element & DOMExtendedElement, ...nodes: Node[]) { + nodes.forEach((node) => { + this.addPrevSibling(node); + }); + + this.remove(); + } + + removeAttribute(this: DOMExtendedElement & Element, name: string): void { + this.attr(name)?.remove(); + } + + setAttribute( + this: DOMExtendedElement & Element, + name: string, + value: string + ) { + this.attr(name, value); + } + + setAttributeNS( + this: DOMExtendedElement & Element, + _namespaceURI: string | null, + name: string, + value: string + ) { + this.attr(name, value); + } +} + +/* eslint-disable @typescript-eslint/no-redeclare */ +type Element = InstanceType; +/* eslint-enable @typescript-eslint/no-redeclare */ + +const { constructor: _, ...descriptors } = Object.getOwnPropertyDescriptors( + DOMExtendedElement.prototype +); + +Object.defineProperties(Element.prototype, descriptors); diff --git a/src/dom/node/Node.ts b/src/dom/node/Node.ts new file mode 100644 index 0000000..0519e1f --- /dev/null +++ b/src/dom/node/Node.ts @@ -0,0 +1,91 @@ +import type { Node } from 'libxmljs'; +import { libxmljs } from 'libxslt'; +import type { DOM } from '../abstract'; +import { NodeTypes } from '../shared'; + +const { Element, Document } = libxmljs; + +Object.assign(libxmljs, { + Node: NodeTypes, +}); + +/** @package */ +export class DOMExtendedNode implements DOM.Node { + get nodeName() { + return (this as any as Node & DOMExtendedNode).name(); + } + + get nodeType() { + const type = (this as any as Node & DOMExtendedNode).type(); + + switch (type) { + case 'attribute': { + return NodeTypes.ATTRIBUTE_NODE; + } + + case 'comment': { + return NodeTypes.COMMENT_NODE; + } + + case 'document': { + return NodeTypes.DOCUMENT_NODE; + } + + case 'element': { + return NodeTypes.ELEMENT_NODE; + } + + case 'text': { + return NodeTypes.TEXT_NODE; + } + + default: { + throw new Error(`Unknown node type: `); + } + } + } + + get ownerDocument() { + if (this.nodeType === NodeTypes.DOCUMENT_NODE) { + return this as any as Document; + } + + return (this as any as DOMExtendedNode & Node).doc(); + } + + get parentElement() { + return ( + this as any as DOMExtendedNode & Node + ).parent() as Element | null; + } + + // @ts-expect-error - TypeScript correctly objects to this type, which is also unfortunately accurate! + get textContent(): string | null { + return (this as any as DOMExtendedNode & Node).text(); + } + + set textContent(value: string) { + (this as any as DOMExtendedNode & Node).text(value); + } + + cloneNode( + this: DOMExtendedNode & T, + deep = false + ): DOMExtendedNode & T { + return this.clone(deep); + } +} + +/* eslint-disable @typescript-eslint/no-redeclare */ +type Document = InstanceType; +type Element = InstanceType; +/* eslint-enable @typescript-eslint/no-redeclare */ + +const { constructor: _, ...descriptors } = Object.getOwnPropertyDescriptors( + DOMExtendedNode.prototype +); + +[Element, Document].forEach((Constructor) => { + Object.assign(Constructor, NodeTypes); + Object.defineProperties(Constructor.prototype, descriptors); +}); diff --git a/src/dom/node/XSLTProcessor.ts b/src/dom/node/XSLTProcessor.ts new file mode 100644 index 0000000..7edc5c3 --- /dev/null +++ b/src/dom/node/XSLTProcessor.ts @@ -0,0 +1,37 @@ +import type { Document } from 'libxmljs'; +import { parse } from 'libxslt'; +import type { XSLTStylesheet } from 'libxslt'; +import type { DOM } from '../abstract'; + +/** @package */ +export class XSLTProcessor { + private parameters: Record = {}; + + private stylesheet: XSLTStylesheet | null = null; + + importStylesheet(xsltDoc: DOM.Document) { + try { + this.stylesheet = parse(xsltDoc as Document); + } catch (error) { + console.error(error, 'xsl', xsltDoc.toString()); + throw error; + } + } + + reset() { + this.parameters = {}; + this.stylesheet = null; + } + + setParameter(_namespaceURI: string | null, name: string, value: any) { + this.parameters[name] = value; + } + + transformToDocument(xmlDoc: DOM.Document) { + if (this.stylesheet == null) { + throw new Error('`importStylesheet` must be called.'); + } + + return this.stylesheet.apply(xmlDoc as Document, this.parameters); + } +} diff --git a/src/dom/node/extensions.d.ts b/src/dom/node/extensions.d.ts new file mode 100644 index 0000000..9afb5fd --- /dev/null +++ b/src/dom/node/extensions.d.ts @@ -0,0 +1,25 @@ +import { DOMExtendedDocument } from './Document'; +import { DOMExtendedElement } from './Element'; +import { DOMExtendedNode } from './Node'; +import { NodeTypes } from '../shared'; + +declare module 'libxmljs' { + /* eslint-disable @typescript-eslint/no-empty-interface */ + export interface Document extends DOMExtendedDocument {} + export interface Element extends DOMExtendedElement {} + export interface Node extends DOMExtendedNode {} + namespace Node { + export const { + ELEMENT_NODE, + ATTRIBUTE_NODE, + TEXT_NODE, + CDATA_SECTION_NODE, + PROCESSING_INSTRUCTION_NODE, + COMMENT_NODE, + DOCUMENT_NODE, + DOCUMENT_TYPE_NODE, + DOCUMENT_FRAGMENT_NODE, + } = NodeTypes; + } + /* eslint-enable @typescript-eslint/no-empty-interface */ +} diff --git a/src/dom/node/index.ts b/src/dom/node/index.ts new file mode 100644 index 0000000..89f3736 --- /dev/null +++ b/src/dom/node/index.ts @@ -0,0 +1,6 @@ +import './Document'; +import './Node'; +import './Element'; + +export * from './DOMParser'; +export * from './XSLTProcessor'; diff --git a/src/dom/shared.ts b/src/dom/shared.ts new file mode 100644 index 0000000..e2fc51f --- /dev/null +++ b/src/dom/shared.ts @@ -0,0 +1,15 @@ +/** @package */ +export const NodeTypes = { + ELEMENT_NODE: 1, + ATTRIBUTE_NODE: 2, + TEXT_NODE: 3, + CDATA_SECTION_NODE: 4, + PROCESSING_INSTRUCTION_NODE: 7, + COMMENT_NODE: 8, + DOCUMENT_NODE: 9, + DOCUMENT_TYPE_NODE: 10, + DOCUMENT_FRAGMENT_NODE: 11, +}; + +/** @package */ +export type NodeType = (typeof NodeTypes)[keyof typeof NodeTypes]; diff --git a/src/dom/web/DOMParser.ts b/src/dom/web/DOMParser.ts new file mode 100644 index 0000000..2a3a508 --- /dev/null +++ b/src/dom/web/DOMParser.ts @@ -0,0 +1,7 @@ +/// +/// + +import type { DOM } from '../abstract'; + +/** @package */ +export const DOMParser = globalThis.DOMParser satisfies new () => DOM.DOMParser; diff --git a/src/dom/web/XSLTProcessor.ts b/src/dom/web/XSLTProcessor.ts new file mode 100644 index 0000000..6df5354 --- /dev/null +++ b/src/dom/web/XSLTProcessor.ts @@ -0,0 +1,8 @@ +/// +/// + +import type { DOM } from '../abstract'; + +/** @package */ +export const XSLTProcessor = + globalThis.XSLTProcessor as new () => DOM.XSLTProcessor; diff --git a/src/dom/web/index.ts b/src/dom/web/index.ts new file mode 100644 index 0000000..9eaa1b4 --- /dev/null +++ b/src/dom/web/index.ts @@ -0,0 +1,2 @@ +export * from './DOMParser'; +export * from './XSLTProcessor'; diff --git a/src/dom/web/libxslt.ts b/src/dom/web/libxslt.ts new file mode 100644 index 0000000..5fc3ba9 --- /dev/null +++ b/src/dom/web/libxslt.ts @@ -0,0 +1,9 @@ +/** @package */ +export const libxmljs = new Proxy( + {}, + { + get() { + throw new Error('Not supported'); + }, + } +); diff --git a/src/shared.ts b/src/shared.ts new file mode 100644 index 0000000..e086aa5 --- /dev/null +++ b/src/shared.ts @@ -0,0 +1,6 @@ +export const NAMESPACES = { + xmlns: 'http://www.w3.org/2002/xforms', + orx: 'http://openrosa.org/xforms', + h: 'http://www.w3.org/1999/xhtml', + xsl: 'http://www.w3.org/1999/XSL/Transform', +} as const; diff --git a/src/transformer.ts b/src/transformer.ts index d874c0e..60edf2e 100644 --- a/src/transformer.ts +++ b/src/transformer.ts @@ -1,53 +1,51 @@ -import crypto from 'crypto'; -import libxslt from 'libxslt'; -import type { - Document as XMLJSDocument, - DocumentFragment as XMLJSDocumentFragment, -} from 'libxmljs'; -import pkg from '../package.json'; +import { DOMParser, XSLTProcessor } from 'enketo-transformer/dom'; +import type LibXMLJS from 'libxmljs'; +import { libxmljs } from 'libxslt'; +import type { DOM } from './dom/abstract'; +import { NodeTypes } from './dom/shared'; import xslForm from './xsl/openrosa2html5form.xsl?raw'; import xslModel from './xsl/openrosa2xmlmodel.xsl?raw'; import { parseLanguage } from './language'; import { markdownToHTML } from './markdown'; +import { NAMESPACES } from './shared'; import { escapeURLPath, getMediaPath } from './url'; -const { libxmljs } = libxslt; - -export const NAMESPACES = { - xmlns: 'http://www.w3.org/2002/xforms', - orx: 'http://openrosa.org/xforms', - h: 'http://www.w3.org/1999/xhtml', -} as const; - -type LibXMLJS = typeof libxmljs; - export type TransformPreprocess = ( - this: LibXMLJS, - doc: XMLJSDocument -) => XMLJSDocument; + this: typeof LibXMLJS, + doc: LibXMLJS.Document +) => LibXMLJS.Document; export interface Survey { xform: string; markdown?: boolean; media?: Record; openclinica?: boolean | number; + + /** + * @deprecated + * + * Only supported in Node environments. + */ preprocess?: TransformPreprocess; + theme?: string; } -export interface TransformedSurvey { +export type TransformedSurvey = Omit & { form: string; languageMap: Record; model: string; transformerVersion: string; -} +}; + +export type Transform = ( + survey: T +) => Promise>; /** * Performs XSLT transformation on XForm and process the result. */ -export const transform = async ( - survey: T -): Promise> => { +export const transform: Transform = async (survey) => { const { xform, markdown, media, openclinica, preprocess, theme } = survey; const xsltParams = openclinica @@ -59,14 +57,18 @@ export const transform = async ( const mediaMap = Object.fromEntries( Object.entries(media || {}).map((entry) => entry.map(escapeURLPath)) ); + const domParser = new DOMParser(); + const xslFormDoc = domParser.parseFromString(xslForm, 'text/xml'); + + let xformDoc: DOM.Document = domParser.parseFromString(xform, 'text/xml'); - const doc = await parseXML(xform); - const xformDoc = - typeof preprocess === 'function' ? preprocess.call(libxmljs, doc) : doc; + if (typeof preprocess === 'function' && ENV === 'node') { + xformDoc = preprocess.call(libxmljs, xformDoc as any); + } processBinaryDefaults(xformDoc, mediaMap); - const htmlDoc = await xslTransform(xslForm, xformDoc, xsltParams); + const htmlDoc = xslTransform(xslFormDoc, xformDoc, xsltParams); correctAction(htmlDoc, 'setgeopoint'); correctAction(htmlDoc, 'setvalue'); @@ -78,7 +80,8 @@ export const transform = async ( markdown !== false ? renderMarkdown(htmlDoc, mediaMap) : docToString(htmlDoc); - const xmlDoc = await xslTransform(xslModel, xformDoc); + const xslModelDoc = domParser.parseFromString(xslModel, 'text/xml'); + const xmlDoc = xslTransform(xslModelDoc, xformDoc); replaceMediaSources(xmlDoc, mediaMap); addInstanceIdNodeIfMissing(xmlDoc); @@ -105,44 +108,73 @@ interface XSLTParams { } const xslTransform = ( - xslStr: string, - xmlDoc: XMLJSDocument, + xslDoc: DOM.Document, + xmlDoc: DOM.Document, xsltParams: XSLTParams = {} as XSLTParams -) => - new Promise((resolve, reject) => { - libxslt.parse(xslStr, (error, stylesheet) => { - if (stylesheet == null) { - reject(error); - } else { - stylesheet.apply(xmlDoc, xsltParams, (error, result) => { - if (result == null) { - reject(error); - } else { - resolve(result); - } - }); - } - }); +) => { + const xsltProcessor = new XSLTProcessor(); + + xsltProcessor.importStylesheet(xslDoc); + + Object.entries(xsltParams).forEach(([key, value]) => { + xsltProcessor.setParameter(null, key, value); }); + return xsltProcessor.transformToDocument(xmlDoc); +}; + +const getNamespaceResolver = (namespaces: Record) => ({ + lookupNamespaceURI: (prefix: string) => namespaces[prefix] ?? null, +}); + +const isDocument = (node: DOM.Node | DOM.Document): node is DOM.Document => + node.nodeType === NodeTypes.DOCUMENT_NODE; + +const getNodesByXPathExpression = < + T extends DOM.Element | DOM.Attr = DOM.Element +>( + context: DOM.Document | DOM.Element, + expression: string, + namespaces?: Record +) => { + const results: T[] = []; + const namespaceResolver = + namespaces == null ? null : getNamespaceResolver(namespaces); + const doc = isDocument(context) ? context : context.ownerDocument; + + if (doc == null) { + throw new Error('Could not find owner document'); + } + + const result = doc.evaluate(expression, context, namespaceResolver, 6); + + for (let i = 0; i < (result.snapshotLength ?? 0); i += 1) { + results.push(result.snapshotItem?.(i) as T); + } + + return results; +}; + const processBinaryDefaults = ( - doc: XMLJSDocument, + doc: DOM.Document, mediaMap: Record ) => { - doc.find( + getNodesByXPathExpression( + doc, '/h:html/h:head/xmlns:model/xmlns:bind[@type="binary"]', NAMESPACES ).forEach((bind) => { - const nodeset = bind.attr('nodeset'); + const nodeset = bind.getAttribute('nodeset'); - if (nodeset && nodeset.value()) { - const path = `/h:html/h:head/xmlns:model/xmlns:instance${nodeset - .value() - ?.replace(/\//g, '/xmlns:')}`; - const dataNode = doc.get(path, NAMESPACES); + if (nodeset) { + const path = `/h:html/h:head/xmlns:model/xmlns:instance${nodeset.replace( + /\//g, + '/xmlns:' + )}`; + const [dataNode] = getNodesByXPathExpression(doc, path, NAMESPACES); if (dataNode) { - const text = dataNode.text(); + const text = dataNode.textContent ?? ''; // Very crude URL checker which is fine for now, // because at this point we don't expect anything other than jr:// @@ -150,7 +182,8 @@ const processBinaryDefaults = ( const value = getMediaPath(mediaMap, text); const escapedText = escapeURLPath(text); - dataNode.attr({ src: value }).text(escapedText); + dataNode.setAttribute('src', value); + dataNode.textContent = escapedText; } } } @@ -162,19 +195,24 @@ const processBinaryDefaults = ( * This is much easier to correct in javascript than in XSLT */ const correctAction = ( - doc: XMLJSDocument, + doc: DOM.Document, localName: 'setvalue' | 'setgeopoint' = 'setvalue' ) => { /* * See setvalue.xml (/data/person/age_changed). A inside a form control results * in one label.question with a nested label.setvalue which is weird syntax (and possibly invalid HTML). */ - doc.find( + getNodesByXPathExpression( + doc, `//*[contains(@class, "question")]//label/input[@data-${localName}]` ).forEach((setValueEl) => { - const clone = setValueEl.clone(); - setValueEl.parent()?.addNextSibling(clone); - setValueEl.parent()?.remove(); + const { parentElement } = setValueEl; + + if (parentElement != null) { + const clone = setValueEl.cloneNode(true); + + parentElement.replaceWith(clone); + } }); /* @@ -185,65 +223,47 @@ const correctAction = ( * Note that a label.setvalue is always to set a default value (with odk-new-repeat, odk-instance-first-load), never * a value change directive (with xforms-value-changed) */ - doc.find( + getNodesByXPathExpression( + doc, `//label[contains(@class, "${localName}")]/input[@data-${localName}]` ).forEach((setValueEl) => { - const name = setValueEl.attr('name')?.value(); - const questionSameName = doc.get( + const name = setValueEl.getAttribute('name'); + const [questionSameName] = getNodesByXPathExpression( + doc, `//*[@name="${name}" and ( contains(../@class, 'question') or contains(../../@class, 'option-wrapper')) and not(@type='hidden')]` ); if (questionSameName) { // Note that if the question has radiobuttons or checkboxes only the first of those gets the setvalue attributes. [`data-${localName}`, 'data-event'].forEach((name) => { - questionSameName.attr( + questionSameName.setAttribute( name, - setValueEl.attr(name)?.value() ?? name + setValueEl.getAttribute(name) ?? name ); }); - setValueEl.parent()?.remove(); + setValueEl.parentElement?.remove(); } }); }; -const parseXML = (xmlStr: string) => - new Promise((resolve, reject) => { - try { - const doc = libxmljs.parseXml(xmlStr); - - resolve(doc); - } catch (e) { - reject(e); - } - }); - -const replaceTheme = (doc: XMLJSDocument, theme?: string) => { +const replaceTheme = (doc: DOM.Document, theme?: string) => { const HAS_THEME = /(theme-)[^"'\s]+/; if (!theme) { return; } - const formClassAttr = doc.root().get('/root/form')?.attr('class'); - - if (formClassAttr == null) { - return; - } - - const formClassValue = formClassAttr.value(); + const [form] = getNodesByXPathExpression(doc.documentElement, '/root/form'); + const formClass = form.getAttribute('class'); - if ( - formClassAttr != null && - formClassValue != null && - HAS_THEME.test(formClassValue) - ) { - formClassAttr.value(formClassValue.replace(HAS_THEME, `$1${theme}`)); + if (formClass != null && HAS_THEME.test(formClass)) { + form.setAttribute('class', formClass.replace(HAS_THEME, `$1${theme}`)); } else { - formClassAttr.value(`${formClassValue} theme-${theme}`); + form.setAttribute('class', `${formClass ?? ''} theme-${theme}`); } }; -const replaceMediaSources = ( - root: T, +const replaceMediaSources = ( + root: DOM.Document, mediaMap?: Record ) => { if (!mediaMap) { @@ -251,26 +271,37 @@ const replaceMediaSources = ( } // iterate through each element with a src attribute - root.find('//*[@src] | //a[@href]').forEach((mediaEl) => { - const attribute = mediaEl.name().toLowerCase() === 'a' ? 'href' : 'src'; - const src = mediaEl.attr(attribute)?.value(); - - if (src == null) { - return; - } + getNodesByXPathExpression(root, '//*[@src] | //a[@href]').forEach( + (mediaEl) => { + const attribute = + mediaEl.nodeName.toLowerCase() === 'a' ? 'href' : 'src'; + const src = mediaEl.getAttribute(attribute); + + if (src == null) { + return; + } - const replacement = getMediaPath(mediaMap, src); + const replacement = getMediaPath(mediaMap, src); - if (replacement) { - mediaEl.attr(attribute, replacement); + if (replacement) { + mediaEl.setAttribute(attribute, replacement); + } } - }); + ); // add form logo element if applicable const formLogo = mediaMap['form_logo.png']; - const formLogoEl = root.get('//*[@class="form-logo"]'); + const [formLogoEl] = getNodesByXPathExpression( + root, + '//*[@class="form-logo"]' + ); if (formLogo && formLogoEl) { - formLogoEl.node('img').attr('src', formLogo).attr('alt', 'form logo'); + const formLogoImg = root.createElement('img'); + + formLogoImg.setAttribute('src', formLogo); + formLogoImg.setAttribute('alt', 'form logo'); + + formLogoEl.append(formLogoImg); } }; @@ -280,16 +311,17 @@ const replaceMediaSources = ( * * @see http://www.w3.org/International/questions/qa-choosing-language-tags */ -const replaceLanguageTags = (doc: XMLJSDocument) => { +const replaceLanguageTags = (doc: DOM.Document) => { const languageMap: Record = {}; - const languageElements = doc.find( + const languageElements = getNodesByXPathExpression( + doc, '/root/form/select[@id="form-languages"]/option' ); // List of parsed language objects const languages = languageElements.map((el) => { - const lang = el.text(); + const lang = el.textContent ?? ''; return parseLanguage(lang, getLanguageSampleText(doc, lang)); }); @@ -301,14 +333,15 @@ const replaceLanguageTags = (doc: XMLJSDocument) => { // add or correct dir and value attributes, and amend textcontent of options in language selector languageElements.forEach((el, index) => { - const val = el.attr('value')?.value(); + const val = el.getAttribute('value'); + if (val && val !== languages[index].tag) { languageMap[val] = languages[index].tag; } - el.attr({ - 'data-dir': languages[index].directionality, - value: languages[index].tag, - }).text(languages[index].description); + + el.setAttribute('data-dir', languages[index].directionality); + el.setAttribute('value', languages[index].tag); + el.textContent = languages[index].description; }); // correct lang attributes @@ -316,24 +349,26 @@ const replaceLanguageTags = (doc: XMLJSDocument) => { if (sourceLanguage === tag) { return; } - doc.find(`/root/form//*[@lang="${sourceLanguage}"]`).forEach((el) => { - el.attr({ - lang: tag, - }); + getNodesByXPathExpression( + doc, + `/root/form//*[@lang="${sourceLanguage}"]` + ).forEach((el) => { + el.setAttribute('lang', tag); }); }); // correct default lang attribute - const langSelectorElement = doc.get('/root/form/*[@data-default-lang]'); + const [langSelectorElement] = getNodesByXPathExpression( + doc, + '/root/form/*[@data-default-lang]' + ); if (langSelectorElement) { - const defaultLang = langSelectorElement - .attr('data-default-lang') - ?.value(); + const defaultLang = + langSelectorElement.getAttribute('data-default-lang'); + languages.some(({ sourceLanguage, tag }) => { if (sourceLanguage === defaultLang) { - langSelectorElement.attr({ - 'data-default-lang': tag, - }); + langSelectorElement.setAttribute('data-default-lang', tag); return true; } @@ -348,45 +383,58 @@ const replaceLanguageTags = (doc: XMLJSDocument) => { /** * Obtains a non-empty hint text or other text sample of a particular form language. */ -const getLanguageSampleText = (doc: XMLJSDocument, language: string) => { +const getLanguageSampleText = (doc: DOM.Document, language: string) => { // First find non-empty text content of a hint with that lang attribute. // If not found, find any span with that lang attribute. - const langSampleEl = - doc.get( - `/root/form//span[contains(@class, "or-hint") and @lang="${language}" and normalize-space() and not(./text() = '-')]` - ) || - doc.get( + const [langSampleEl] = getNodesByXPathExpression( + doc, + `/root/form//span[contains(@class, "or-hint") and @lang="${language}" and normalize-space() and not(./text() = '-')]` + ).concat( + getNodesByXPathExpression( + doc, `/root/form//span[@lang="${language}" and normalize-space() and not(./text() = '-')]` - ); + ) + ); - return langSampleEl?.text().trim() || 'nothing'; + return langSampleEl?.textContent?.trim() || 'nothing'; }; /** * Temporary function to add a /meta/instanceID node if this is missing. * This used to be done in enketo-xslt but was removed when support for namespaces was added. */ -const addInstanceIdNodeIfMissing = (doc: XMLJSDocument) => { +const addInstanceIdNodeIfMissing = (doc: DOM.Document) => { const xformsPath = '/xmlns:root/xmlns:model/xmlns:instance/*/xmlns:meta/xmlns:instanceID'; const openrosaPath = '/xmlns:root/xmlns:model/xmlns:instance/*/orx:meta/orx:instanceID'; - const instanceIdEl = doc.get(`${xformsPath} | ${openrosaPath}`, NAMESPACES); + const [instanceIdEl] = getNodesByXPathExpression( + doc, + `${xformsPath} | ${openrosaPath}`, + NAMESPACES + ); if (!instanceIdEl) { - const rootEl = doc.get( + const [rootEl] = getNodesByXPathExpression( + doc, '/xmlns:root/xmlns:model/xmlns:instance/*', NAMESPACES ); - const metaEl = doc.get( + const [metaEl] = getNodesByXPathExpression( + doc, '/xmlns:root/xmlns:model/xmlns:instance/*/xmlns:meta', NAMESPACES ); + const instanceID = doc.createElementNS(NAMESPACES.xmlns, 'instanceID'); + if (metaEl) { - metaEl.node('instanceID'); + metaEl.append(instanceID); } else if (rootEl) { - rootEl.node('meta').node('instanceID'); + const meta = doc.createElementNS(NAMESPACES.xmlns, 'meta'); + + rootEl.append(meta); + meta.append(instanceID); } } }; @@ -395,63 +443,62 @@ const addInstanceIdNodeIfMissing = (doc: XMLJSDocument) => { * Converts a subset of Markdown in all textnode children of labels and hints into HTML */ const renderMarkdown = ( - htmlDoc: XMLJSDocument, + htmlDoc: DOM.Document, mediaMap: Record ) => { const replacements: Record = {}; // First turn all outputs into text so * { - const key = `---output-${index}`; - const textNode = el.childNodes()[0].clone(); - replacements[key] = el.toString(); - textNode.text(key); - el.replace(textNode); - // Note that we end up in a situation where we likely have sibling text nodes... - }); - - // Now render markdown - htmlDoc - .find( - '/root/form//span[contains(@class, "question-label") or contains(@class, "or-hint")]' - ) - .forEach((el, index) => { - let key; - /** - * Using text() is done because: - * a) We are certain that these s do not contain other elements, other than formatting/markdown s. - * b) This avoids the need to merge any sibling text nodes that could have been created in the previous step. - * - * Note that text() will convert > to > - */ - const original = el - .text() - .replace('<', '<') - .replace('>', '>'); - let rendered = markdownToHTML(original); - - if (original !== rendered) { - const fragment = libxmljs.parseHtmlFragment( - `
${rendered}
` - ); - - replaceMediaSources(fragment, mediaMap); + getNodesByXPathExpression( + htmlDoc, + '/root/form//span[contains(@class, "or-output")]' + ).forEach((el, index) => { + const key = `---output-${index}`; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const textNode = el.firstChild!.cloneNode(true); + replacements[key] = el.outerHTML; + textNode.textContent = key; + el.replaceWith(textNode); + // Note that we end up in a situation where we likely have sibling text nodes... + }); - rendered = fragment - .root() - .childNodes() - .map((node) => node.toString(false)) - .join(''); + const domParser = new DOMParser(); - key = `$$$${index}`; - replacements[key] = rendered; - el.text(key); - } - }); + // Now render markdown + getNodesByXPathExpression( + htmlDoc, + '/root/form//span[contains(@class, "question-label") or contains(@class, "or-hint")]' + ).forEach((el, index) => { + let key; + /** + * Using text() is done because: + * a) We are certain that these s do not contain other elements, other than formatting/markdown s. + * b) This avoids the need to merge any sibling text nodes that could have been created in the previous step. + * + * Note that text() will convert > to > + */ + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const original = el + .textContent!.replace('<', '<') + .replace('>', '>'); + let rendered = markdownToHTML(original); + + if (original !== rendered) { + const tempDoc = domParser.parseFromString( + `${rendered}`, + 'text/html' + ); + + correctHTMLDocHierarchy(tempDoc); + replaceMediaSources(tempDoc, mediaMap); + + rendered = docToString(tempDoc); + key = `$$$${index}`; + replacements[key] = rendered; + el.textContent = key; + } + }); - // TODO: does this result in self-closing tags? let htmlStr = docToString(htmlDoc); // Now replace the placeholders with the rendered HTML @@ -473,37 +520,23 @@ const renderMarkdown = ( return htmlStr; }; -const docToString = (doc: XMLJSDocument) => { - const element = doc.root().get('*'); - - if (element == null) { - throw new Error('Document has no elements'); - } - - // TODO: does this result in self-closing tags? - return element.toString(false); -}; - -const md5 = (message: string | Buffer) => { - const hash = crypto.createHash('md5'); - hash.update(message); +const docToString = (doc: DOM.Document) => { + const { outerHTML } = doc.documentElement; - return hash.digest('hex'); + // It would be tempting to use `innerHTML`, as this is semantically + // equivalent. But removing the open and closing tags from `outerHTML` + // produces consistent namespace declarations across environments. + return outerHTML.replace(/^<[^>]+>/, '').replace(/<\/[^>]+>(?!.|\n)$/, ''); }; -/** @package */ -export const PACKAGE_VERSION = pkg.version; - -const VERSION = md5(xslForm + xslModel + PACKAGE_VERSION); - -export { VERSION as version }; +export const version = VERSION; export const sheets = { xslForm, xslModel, }; -export { escapeURLPath }; +export { escapeURLPath, NAMESPACES }; /** * Exported for backwards compatibility, prefer named imports from enketo-transformer's index module. diff --git a/test/bad-external.spec.ts b/test/bad-external.spec.ts index 4374cdc..e8ac6cf 100644 --- a/test/bad-external.spec.ts +++ b/test/bad-external.spec.ts @@ -1,4 +1,4 @@ -import { NAMESPACES } from '../src/transformer'; +import { NAMESPACES } from '../src/shared'; import { Document, HTMLDocument, @@ -14,201 +14,210 @@ import type { } from '../src/transformer'; import type { Element } from './shared'; -describe('for incompatible forms that require preprocessing', () => { - let preprocessed: TransformedSurvey; - let preprocessedForm: Document; +describe.runIf(ENV === 'node')( + 'for incompatible forms that require preprocessing', + () => { + let preprocessed: TransformedSurvey; + let preprocessedForm: Document; - const preprocess: TransformPreprocess = function (doc) { - const model = doc.get('/h:html/h:head/xmlns:model', NAMESPACES); + const preprocess: TransformPreprocess = function (doc) { + const model = doc.get('/h:html/h:head/xmlns:model', NAMESPACES); - if (!model) { - return doc; - } + if (!model) { + return doc; + } - doc.find('/h:html/h:body//xmlns:input[@query]', NAMESPACES).forEach( - (input) => { - const q = input.attr('query'); - const r = input.attr('ref'); + doc.find('/h:html/h:body//xmlns:input[@query]', NAMESPACES).forEach( + (input) => { + const q = input.attr('query'); + const r = input.attr('ref'); - if (!q || !r) { - return; - } + if (!q || !r) { + return; + } - const query = q.value()!; - const ref = r.value(); - - /** - * Preprocess Model - * - add instances - */ - const match = query?.match(/^instance\('([^)]+)'\)/); - const id = match?.length ? match[1] : null; - - if ( - id && - !model.get(`//xmlns:instance[@id="${id}"]`, NAMESPACES) - ) { - model - .node('instance') - .namespace(NAMESPACES.xmlns) - .attr({ - id, - src: `esri://file-csv/list_name/${id}/itemsets.csv`, + const query = q.value()!; + const ref = r.value(); + + /** + * Preprocess Model + * - add instances + */ + const match = query?.match(/^instance\('([^)]+)'\)/); + const id = match?.length ? match[1] : null; + + if ( + id && + !model.get(`//xmlns:instance[@id="${id}"]`, NAMESPACES) + ) { + model + .node('instance') + .namespace(NAMESPACES.xmlns) + .attr({ + id, + src: `esri://file-csv/list_name/${id}/itemsets.csv`, + }); + } + + /** + * Preprocess Bind + * - correct type + */ + const bind = doc.get( + `/h:html/h:head/xmlns:model/xmlns:bind[@nodeset="${ref}"]`, + NAMESPACES + ); + if (bind) { + bind.attr({ + type: 'select1', }); - } + } - /** - * Preprocess Bind - * - correct type - */ - const bind = doc.get( - `/h:html/h:head/xmlns:model/xmlns:bind[@nodeset="${ref}"]`, - NAMESPACES - ); - if (bind) { - bind.attr({ - type: 'select1', + /** + * Preprocess Body + * - convert to + + */ + const children = input.childNodes(); + const attrs = input.attrs(); + const select1 = new this.Element(doc, 'select1').namespace( + NAMESPACES.xmlns + ); + + // add all attributes including unknowns, except the query attribute + attrs.forEach((attr) => { + const name = attr.name(); + + if (name !== 'query') { + const value = attr.value(); + + select1.attr(name, value!); + } }); - } - /** - * Preprocess Body - * - convert to + - */ - const children = input.childNodes(); - const attrs = input.attrs(); - const select1 = new this.Element(doc, 'select1').namespace( - NAMESPACES.xmlns - ); - - // add all attributes including unknowns, except the query attribute - attrs.forEach((attr) => { - const name = attr.name(); + // add all existing children + children.forEach((child) => { + select1.addChild(child); + }); - if (name !== 'query') { - const value = attr.value(); + // add the itemset with fixed label and value references + const itemset = select1 + .node('itemset') + .namespace(NAMESPACES.xmlns) + .attr({ + nodeset: query, + }); + itemset.node('value').namespace(NAMESPACES.xmlns).attr({ + ref: 'name', + }); + itemset.node('label').namespace(NAMESPACES.xmlns).attr({ + ref: 'translate(label)', + }); - select1.attr(name, value!); - } - }); + input.replace(select1); + } + ); - // add all existing children - children.forEach((child) => { - select1.addChild(child); - }); + return doc; + }; - // add the itemset with fixed label and value references - const itemset = select1 - .node('itemset') - .namespace(NAMESPACES.xmlns) - .attr({ - nodeset: query, - }); - itemset.node('value').namespace(NAMESPACES.xmlns).attr({ - ref: 'name', - }); - itemset.node('label').namespace(NAMESPACES.xmlns).attr({ - ref: 'translate(label)', + beforeAll(async () => { + if (ENV === 'node') { + preprocessed = await getTransformedForm('bad-external.xml', { + preprocess, }); - - input.replace(select1); + preprocessedForm = parser.parseFromString( + preprocessed.form, + 'text/html' + ); } - ); + }); - return doc; - }; + it('preprocess fn does nothing if not provided...', async () => { + const doc = await getTransformedModelDocument('bad-external.xml'); - beforeAll(async () => { - preprocessed = await getTransformedForm('bad-external.xml', { - preprocess, - }); - preprocessedForm = parser.parseFromString( - preprocessed.form, - 'text/html' - ); - }); - - it('preprocess fn does nothing if not provided...', async () => { - const doc = await getTransformedModelDocument('bad-external.xml'); - - expect(doc).to.be.an.instanceOf(XMLDocument); - expect(doc.getElementsByTagName('instance')).to.have.length(2); - expect(doc.getElementById('existing')).to.not.be.null; - expect(doc.getElementById('existing')!.getAttribute('src')).to.equal( - 'jr://file/existing.xml' - ); - expect(doc.getElementById('counties')).to.be.null; - expect(doc.getElementById('cities')).to.be.null; - }); - - it('preprocess fn corrects instances if necessary', async () => { - const preprocessedModel = parser.parseFromString( - preprocessed.model, - 'text/xml' - ); - - expect(preprocessedModel).to.be.an.instanceOf(XMLDocument); - expect( - preprocessedModel.getElementsByTagName('instance') - ).to.have.length(4); - expect(preprocessedModel.getElementById('existing')).to.not.be.null; - expect( - preprocessedModel.getElementById('existing')!.getAttribute('src') - ).to.equal('jr://file/existing.xml'); - expect(preprocessedModel.getElementById('counties')).to.not.be.null; - expect( - preprocessedModel.getElementById('counties')!.getAttribute('src') - ).to.equal('esri://file-csv/list_name/counties/itemsets.csv'); - expect(preprocessedModel.getElementById('cities')).to.not.be.null; - expect( - preprocessedModel.getElementById('cities')!.getAttribute('src') - ).to.equal('esri://file-csv/list_name/cities/itemsets.csv'); - }); - - it('fn corrects body elements if necessary', () => { - const selects = preprocessedForm.getElementsByTagName('select'); - - return Promise.all([ - expect(selects).to.have.length(2), // language selector and the one with appearance=minimal - expect(selects[1].getAttribute('name')).to.equal( - '/select_one_external/city2' - ), - expect(selects[1].getAttribute('data-type-xml')).to.equal( - 'select1' - ), + expect(doc).to.be.an.instanceOf(XMLDocument); + expect(doc.getElementsByTagName('instance')).to.have.length(2); + expect(doc.getElementById('existing')).to.not.be.null; expect( - selects[1] - .getElementsByTagName('option')[0] - .getAttribute('class') - ).to.equal('itemset-template'), + doc.getElementById('existing')!.getAttribute('src') + ).to.equal('jr://file/existing.xml'); + expect(doc.getElementById('counties')).to.be.null; + expect(doc.getElementById('cities')).to.be.null; + }); + + it('preprocess fn corrects instances if necessary', async () => { + const preprocessedModel = parser.parseFromString( + preprocessed.model, + 'text/xml' + ); + + expect(preprocessedModel).to.be.an.instanceOf(XMLDocument); expect( - selects[1] - .getElementsByTagName('option')[0] - .getAttribute('data-items-path') - ).to.equal( - "instance('cities')/root/item[state= /select_one_external/state and county= /select_one_external/county ]" - ), + preprocessedModel.getElementsByTagName('instance') + ).to.have.length(4); + expect(preprocessedModel.getElementById('existing')).to.not.be.null; expect( - (selects[1].nextSibling!.nextSibling! as Element).getAttribute( - 'class' - ) - ).to.equal('itemset-labels'), + preprocessedModel + .getElementById('existing')! + .getAttribute('src') + ).to.equal('jr://file/existing.xml'); + expect(preprocessedModel.getElementById('counties')).to.not.be.null; expect( - (selects[1].nextSibling!.nextSibling! as Element).getAttribute( - 'data-label-ref' - ) - ).to.equal('translate(label)'), + preprocessedModel + .getElementById('counties')! + .getAttribute('src') + ).to.equal('esri://file-csv/list_name/counties/itemsets.csv'); + expect(preprocessedModel.getElementById('cities')).to.not.be.null; expect( - (selects[1].nextSibling!.nextSibling! as Element).getAttribute( - 'data-value-ref' - ) - ).to.equal('name'), - ]); - }); - - it('fn does not correct instances if not necessary', async () => - Promise.all([ - expect(preprocessedForm).to.be.an.instanceOf(HTMLDocument), - expect(preprocessedForm.getElementById('counties')).to.be.null, - ])); -}); + preprocessedModel.getElementById('cities')!.getAttribute('src') + ).to.equal('esri://file-csv/list_name/cities/itemsets.csv'); + }); + + it('fn corrects body elements if necessary', () => { + const selects = preprocessedForm.getElementsByTagName('select'); + + return Promise.all([ + expect(selects).to.have.length(2), // language selector and the one with appearance=minimal + expect(selects[1].getAttribute('name')).to.equal( + '/select_one_external/city2' + ), + expect(selects[1].getAttribute('data-type-xml')).to.equal( + 'select1' + ), + expect( + selects[1] + .getElementsByTagName('option')[0] + .getAttribute('class') + ).to.equal('itemset-template'), + expect( + selects[1] + .getElementsByTagName('option')[0] + .getAttribute('data-items-path') + ).to.equal( + "instance('cities')/root/item[state= /select_one_external/state and county= /select_one_external/county ]" + ), + expect( + ( + selects[1].nextSibling!.nextSibling! as Element + ).getAttribute('class') + ).to.equal('itemset-labels'), + expect( + ( + selects[1].nextSibling!.nextSibling! as Element + ).getAttribute('data-label-ref') + ).to.equal('translate(label)'), + expect( + ( + selects[1].nextSibling!.nextSibling! as Element + ).getAttribute('data-value-ref') + ).to.equal('name'), + ]); + }); + + it('fn does not correct instances if not necessary', async () => + Promise.all([ + expect(preprocessedForm).to.be.an.instanceOf(HTMLDocument), + expect(preprocessedForm.getElementById('counties')).to.be.null, + ])); + } +); diff --git a/test/benchmarks.ts b/test/benchmarks.ts index 3fd14af..7ebbf18 100644 --- a/test/benchmarks.ts +++ b/test/benchmarks.ts @@ -3,8 +3,7 @@ import type Benchmark from 'benchmark'; import { setFlagsFromString } from 'v8'; import { runInNewContext } from 'vm'; import { writeFileSync } from 'fs'; -import { transform } from '../src/transformer'; -import { fixtures } from './shared'; +import { fixtures, reload, transform } from './shared'; /** * @see {@link https://stackoverflow.com/a/75007985} @@ -26,6 +25,8 @@ const suites = new Map( const expectedOutliersPattern = /SOAR|va_who/i; +const RELOAD_WORKAROUND = 'RELOAD WORKAROUND'; + fixtures.forEach(({ fileName, origin, xform }) => { const suite = suites.get(origin)!; const outlierMultiplier = expectedOutliersPattern.test(fileName) ? 5 : 1; @@ -44,19 +45,53 @@ fixtures.forEach(({ fileName, origin, xform }) => { minSamples: 5, minTime: 0.25 * outlierMultiplier, onStart: () => { - gc(); + if (ENV === 'node') { + gc(); + } }, onCycle: () => { - gc(); + if (ENV === 'node') { + gc(); + } }, } ); + + if (ENV === 'web') { + suite.add( + RELOAD_WORKAROUND, + async (deferred: Benchmark.Deferred) => { + await reload(); + deferred.resolve(); + }, + { + async: true, + defer: true, + delay: 0, + maxTime: 0.01, + minSamples: 1, + minTime: 0.01, + onStart: () => { + gc(); + }, + onCycle: () => { + gc(); + }, + } + ); + } }); +interface CycleEvent { + target: Benchmark; +} + const runSuite = async (suite: Suite) => new Promise((resolve) => { - suite.on('cycle', async (event: Event) => { - console.log(String(event.target)); + suite.on('cycle', async (event: CycleEvent) => { + if (event.target.name !== RELOAD_WORKAROUND) { + console.log(String(event.target)); + } }); suite.on('complete', resolve); suite.run({ async: true }); @@ -74,6 +109,7 @@ if (GITHUB_STEP_SUMMARY) { const benchmarks = [...suites.values()] .flatMap((suite): Benchmark[] => suite.slice(0, suite.length)) + .filter((benchmark) => benchmark.name !== RELOAD_WORKAROUND) .sort((a, b) => a.hz - b.hz); const times = benchmarks.map(({ times }) => times!.elapsed); @@ -181,3 +217,5 @@ if (GITHUB_STEP_SUMMARY) { writeFileSync(GITHUB_STEP_SUMMARY, summary); } + +process.exit(0); diff --git a/test/shared.ts b/test/shared.ts index a72389a..bb274df 100644 --- a/test/shared.ts +++ b/test/shared.ts @@ -2,10 +2,125 @@ import { DOMParser } from 'linkedom'; import type { Attr } from 'linkedom/types/interface/attr'; import type { Element as BaseElement } from 'linkedom/types/interface/element'; import type { Node } from 'linkedom/types/interface/node'; -import { basename } from 'path'; -import { transform } from '../src/transformer'; +import { basename, resolve } from 'path'; +import { fileURLToPath } from 'url'; +import type { Survey, Transform, TransformedSurvey } from '../src/transformer'; -import type { Survey } from '../src/transformer'; +// eslint-disable-next-line import/no-mutable-exports +let reload: () => Promise; + +// eslint-disable-next-line import/no-mutable-exports +let transform: Transform; + +declare const enketo: { + transformer: { + transform: Transform; + }; +}; + +if (ENV === 'node') { + reload = () => Promise.resolve(); + transform = (await import('../src/transformer')).transform; +} else { + const { createServer } = await import('vite'); + const root = fileURLToPath(new URL('..', import.meta.url)); + const configFile = resolve(root, './vite.config.ts'); + const server = await createServer({ + configFile, + define: { + PACKAGE_VERSION: JSON.stringify(PACKAGE_VERSION), + VERSION: JSON.stringify(VERSION), + ENV: JSON.stringify(ENV), + BROWSER: JSON.stringify(BROWSER), + }, + root, + }); + + await server.listen(); + + server.printUrls(); + + const playwright = await import('playwright'); + const browserType = playwright[BROWSER]; + const browser = await browserType.launch(); + + let page = await browser.newPage(); + + let isLoading = false; + + page.on('console', async (message) => { + if (!isLoading) { + console.log( + ...(await Promise.all( + message.args().map((arg) => arg.jsonValue()) + )) + ); + } + }); + + let isFirstLoad = true; + + reload = async () => { + isLoading = true; + const url = 'http://localhost:8085'; + + if (isFirstLoad) { + await page.goto(url); + isFirstLoad = false; + } else { + await page.close(); + + const context = await browser.newContext(); + + page = await context.newPage(); + await page.goto(url); + } + + await page.waitForFunction(() => typeof enketo !== 'undefined'); + + isLoading = false; + }; + + await reload(); + + transform = async ( + survey: T + ): Promise> => { + delete survey.preprocess; + + const { error, result } = await page.evaluate( + async ([input]) => { + try { + const result = await enketo.transformer.transform(input); + + return { result }; + } catch (error) { + const { message, stack } = + error instanceof Error + ? error + : new Error(String(error)); + + return { error: { message, stack } }; + } + }, + [survey] + ); + + if (error == null) { + Object.keys(survey).forEach((key) => { + if (!Object.prototype.hasOwnProperty.call(result, key)) { + delete survey[key as keyof Survey]; + } + }); + + return Object.assign(survey, result); + } + + throw error; + }; +} + +export { reload, transform }; interface Fixture { fileName: string; diff --git a/test/snapshot.spec.ts b/test/snapshot.spec.ts index 5ba956c..db78280 100644 --- a/test/snapshot.spec.ts +++ b/test/snapshot.spec.ts @@ -11,14 +11,15 @@ import prettier from 'prettier'; import { format as prettyFormat } from 'pretty-format'; import type { Options as PrettierOptions } from 'prettier'; import prettierPluginXML from '@prettier/plugin-xml'; -import { NAMESPACES, PACKAGE_VERSION, transform } from '../src/transformer'; +import { NAMESPACES } from '../src/shared'; import type { TransformedSurvey } from '../src/transformer'; import { + DOMMimeType, + Element, getTransformedForm, parser, serializer, - DOMMimeType, - Element, + transform, } from './shared'; describe('Snapshots', () => { @@ -364,41 +365,55 @@ describe('Snapshots', () => { expect(result).toMatchSnapshot(); }, 60_000); - it(`transforms ${fileName} consistently with a preprocess function`, async () => { - const result = await getTransformedForm(formPath, { - preprocess: (document) => { - const body = document.get('/h:html/h:body', NAMESPACES); - - body!.attr('snapshot', 'snapshot value'); - - return document; - }, - }); - - expect(result).toMatchSnapshot(); - }, 60_000); - - it(`transforms ${fileName} consistently with a preprocess method referencing libxmljs as the 'this' variable`, async () => { - const result = await getTransformedForm(formPath, { - preprocess(document) { - const model = document.get( - '/h:html/h:head/xmlns:model', - NAMESPACES - ); - const instance = new this.Element(document, 'instance') - .namespace(NAMESPACES.xmlns) - .attr({ - id: 'snapshot', - }); - - model?.addChild(instance); - - return document; - }, - }); + it.runIf(ENV === 'node')( + `transforms ${fileName} consistently with a preprocess function`, + async () => { + const result = await getTransformedForm(formPath, { + preprocess: (document) => { + const body = document.get( + '/h:html/h:body', + NAMESPACES + ); + + body!.attr('snapshot', 'snapshot value'); + + return document; + }, + }); + + expect(result).toMatchSnapshot(); + }, + 60_000 + ); - expect(result).toMatchSnapshot(); - }, 60_000); + it.runIf(ENV === 'node')( + `transforms ${fileName} consistently with a preprocess method referencing libxmljs as the 'this' variable`, + async () => { + const result = await getTransformedForm(formPath, { + preprocess(document) { + const model = document.get( + '/h:html/h:head/xmlns:model', + NAMESPACES + ); + const instance = new this.Element( + document, + 'instance' + ) + .namespace(NAMESPACES.xmlns) + .attr({ + id: 'snapshot', + }); + + model?.addChild(instance); + + return document; + }, + }); + + expect(result).toMatchSnapshot(); + }, + 60_000 + ); it(`transforms ${fileName} consistently with a theme`, async () => { const result = await getTransformedForm(formPath, { diff --git a/test/transformer.spec.ts b/test/transformer.spec.ts index 9506b0f..6f2ec98 100644 --- a/test/transformer.spec.ts +++ b/test/transformer.spec.ts @@ -1,12 +1,12 @@ -import { Survey, transform } from '../src/transformer'; +import type { Survey, TransformedSurvey } from '../src/transformer'; import { getTransformedForm, getTransformedFormDocument, getXForm, parser, + transform, } from './shared'; -import type { TransformedSurvey } from '../src/transformer'; import type { Document } from './shared'; function findElementByName( @@ -75,7 +75,7 @@ describe('transformer', () => { } let survey: ExtraneousProperty & Survey; - let transformed: ExtraneousProperty & TransformedSurvey; + let transformed: TransformedSurvey; beforeAll(async () => { survey = { @@ -864,14 +864,14 @@ describe('transformer', () => { // eliminate some acceptable differences: const modifiedSelectMinimalResult = results[0].form .replace('or-appearance-minimal', '') - .replace(/data-type-xml=".+" /, '') - .replace(/data-name=".+" /, ''); + .replace(/data-type-xml=".+"[ >]/, '') + .replace(/data-name=".+"[ >]/, ''); const modifiedRangePickerResult = results[1].form .replace('or-appearance-picker', '') - .replace(/data-type-xml=".+" /, '') - .replace(/min=".+" /, '') - .replace(/max=".+" /, '') - .replace(/step=".+" /, ''); + .replace(/data-type-xml=".+"[ >]/, '') + .replace(/min=".+"[ >]/, '') + .replace(/max=".+"[ >]/, '') + .replace(/step=".+"[ >]/, ''); expect(modifiedSelectMinimalResult).to.equal( modifiedRangePickerResult @@ -1032,7 +1032,6 @@ describe('transformer', () => { const { form } = await transform({ xform: xform2, }); - // console.log('form', form); const doc = parser.parseFromString(form, 'text/html'); const target = findElementByName( doc, diff --git a/test/tsconfig.json b/test/tsconfig.json index c3f17b9..8e17eca 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -1,6 +1,11 @@ { "extends": "../tsconfig.base.json", - "exclude": ["../node_modules"], - "include": [".", "..src", "../typings"], + "compilerOptions": { + "paths": { + "enketo-transformer/dom": ["src/dom/node/index.ts"] + } + }, + "exclude": ["../node_modules", "../src/dom/web"], + "include": [".", "../src", "../typings"], "files": ["../typings/test.d.ts"] } diff --git a/tsconfig.json b/tsconfig.json index 37ad1a2..7ef01b6 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,11 @@ { "extends": "./tsconfig.base.json", - "exclude": ["dist", "node_modules", "./typings/test.d.ts"], - "include": ["app.ts", "config", "src", "typings"], + "compilerOptions": { + "paths": { + "enketo-transformer/dom": ["src/dom/node"] + } + }, + "exclude": ["dist", "node_modules", "./src/dom/web", "./typings/test.d.ts"], + "include": ["vite.config.ts", "config", "src", "typings"], "files": ["./typings/env.d.ts"] } diff --git a/tsconfig.typedefs.json b/tsconfig.typedefs.json index 22143cc..92521a8 100644 --- a/tsconfig.typedefs.json +++ b/tsconfig.typedefs.json @@ -3,8 +3,11 @@ "declaration": true, "emitDeclarationOnly": true, "noEmit": false, - "outDir": "./dist" + "outDir": "./dist/types", + "paths": { + "enketo-transformer/dom": ["src/dom/node/index.ts"] + } }, "extends": "./tsconfig.json", - "include": ["./src/transformer.ts", "./typings"] + "include": ["./src", "./typings"] } diff --git a/tsconfig.web.json b/tsconfig.web.json new file mode 100644 index 0000000..25fe8bf --- /dev/null +++ b/tsconfig.web.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "paths": { + "enketo-transformer/dom": ["src/dom/web/index"] + } + }, + "exclude": ["dist", "node_modules", "./typings/test.d.ts"], + "include": ["app.ts", "config", "src", "typings"], + "files": ["./typings/env.d.ts"] +} diff --git a/typings/env.d.ts b/typings/env.d.ts index 11f02fe..fe3f929 100644 --- a/typings/env.d.ts +++ b/typings/env.d.ts @@ -1 +1,5 @@ /// + +declare const PACKAGE_VERSION: string; +declare const VERSION: string; +declare const ENV: 'node' | 'web'; diff --git a/typings/libxmljs.d.ts b/typings/libxmljs.d.ts index 90226bd..7a5b0b9 100644 --- a/typings/libxmljs.d.ts +++ b/typings/libxmljs.d.ts @@ -1,24 +1,41 @@ +/* eslint-disable max-classes-per-file */ declare module 'libxmljs' { - export interface Node { - replace(node: Node): unknown; + export interface Namespace { + href(): string; + prefix(): string; } - export interface NamedNode extends Node { + export class Node { + addNextSibling(sibling: Node): this; + addPrevSibling(sibling: Node): this; + + /** + * @param deep defaults to `true` + */ + clone(deep?: boolean): this; + + doc(): Document; name(): string; - namespace(uri: string): this; + namespaces(): Namespace[]; + parent(): Node | null; + remove(): this; + replace(node: Node): unknown; + text(): string; + text(value: string): this; + toString(format?: boolean): string; + type(): 'attribute' | 'comment' | 'document' | 'element' | 'text'; } - export interface Attr extends NamedNode { - name(): string; + export class Attr extends Node { value(): string | null; value(value: string): this; } - interface ParentNode extends NamedNode { - addChild(child: this): this; - addNextSibling(sibling: this): this; + class ParentNode extends Node { + addChild(child: Node): this; attrs(): Attr[]; - childNodes(): Element[]; + child(index: number): Node; + childNodes(): Node[]; get( expression: string, @@ -31,33 +48,23 @@ declare module 'libxmljs' { ): Element[]; node(localName: string): this; - toString(unknownOption?: boolean): string; } - export class Element { + export class Element extends ParentNode { constructor(document: Document, name: string); - } - - export interface Element extends ParentNode { attr(name: string): Attr | null; attr(name: string, value: string): Element; attr(attributes: Record): Element; - clone(): this; - parent(): this | null; // Maybe `Element | Document | null`? - remove(): unknown; // Probably `boolean`? - text(): string; - text(value: string): this; + defineNamespace(namespceURI: string, prefix: string): Namespace; + namespace(uri: string): this; + namespace(namespace: Namespace): Element; } - export interface Document extends ParentNode { + export class Document extends ParentNode { root(): Element; } export const parseXml: (xml: string) => Document; - export interface DocumentFragment extends ParentNode { - root(): ParentNode; - } - - export const parseHtmlFragment: (html: string) => DocumentFragment; + export const parseHtmlFragment: (html: string) => Document; } diff --git a/typings/libxslt.d.ts b/typings/libxslt.d.ts index 5846fa1..77b8a43 100644 --- a/typings/libxslt.d.ts +++ b/typings/libxslt.d.ts @@ -14,6 +14,8 @@ declare module 'libxslt' { ); interface XSLTStylesheet { + apply(doc: XMLJSDocument, params: Record): XMLJSDocument; + apply( doc: XMLJSDocument, params: Record, @@ -21,8 +23,10 @@ declare module 'libxslt' { ): void; } - export const parse: ( - xsl: string, - callback: ResultCallback - ) => void; + interface Parse { + (xsl: string, callback: ResultCallback): void; + (xsl: XMLJSDocument): XSLTStylesheet; + } + + export const parse: Parse; } diff --git a/typings/test.d.ts b/typings/test.d.ts index 6a345df..cdb9941 100644 --- a/typings/test.d.ts +++ b/typings/test.d.ts @@ -1,2 +1,4 @@ /// /// + +declare const BROWSER: 'firefox' | 'chromium' | 'webkit'; diff --git a/vite.config.ts b/vite.config.ts index 2aea1f4..a37042e 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,60 +1,198 @@ +import { createHash } from 'crypto'; +import { readFileSync } from 'fs'; import { resolve } from 'path'; +import type { LibraryFormats } from 'vite'; +import type { UserConfig } from 'vitest/config'; import { defineConfig } from 'vitest/config'; -import { config, external } from './config/build.shared'; - -export default defineConfig({ - assetsInclude: ['**/*.xml', '**/*.xsl'], - build: { - lib: { - entry: resolve(__dirname, './src/transformer.ts'), - name: 'enketo-transformer', - }, - minify: false, - outDir: 'dist', - rollupOptions: { - external, - output: { - // This suppresses a warning for modules with both named and - // default exporrs when building for CommonJS (UMD in our - // current build). It's safe to suppress this warning because we - // have explicit tests ensuring both the default and named - // exports are consistent with the existing public API. - exports: 'named', +import config from './config/config.json'; +import pkg from './package.json'; + +const md5 = (message: string | Buffer) => { + const hash = createHash('md5'); + hash.update(message); + + return hash.digest('hex'); +}; + +export default defineConfig(async () => { + const ENV = process.env.ENV === 'web' ? 'web' : 'node'; + const isWeb = ENV === 'web'; + const entryNames = isWeb ? ['transformer'] : ['app', 'transformer']; + const entry = entryNames.map((name) => + resolve(__dirname, `./src/${name}.ts`) + ); + const formats = (isWeb ? ['es'] : ['es', 'cjs']) satisfies LibraryFormats[]; + const emptyOutDir = process.env.EMPTY_OUT_DIR === 'true'; + const minify = isWeb; + + const external = [ + 'body-parser', + 'crypto', + 'css.escape', + 'express', + 'fs', + 'libxslt', + 'module', + 'node1-libxmljsmt-myh', + 'path', + 'undici', + 'url', + 'vite-node', + 'vite', + ]; + + if (isWeb) { + external.push('libxslt'); + } else { + external.push('language-tags', 'string-direction'); + } + + const input = isWeb + ? ['./src/transformer.ts', 'language-tags', 'string-direction'] + : ['./src/app.ts', './src/transformer.ts', './config/config.json']; + + const isViteNodeRuntime = process.argv.some((arg) => + arg.endsWith('/vite-node') + ); + const isViteRuntime = + isViteNodeRuntime || + process.argv.some((arg) => arg.endsWith(`/vitest`)); + + /** + * Use Vite's default {@link https://vitejs.dev/config/build-options.html#build-target `modules`} target for Vite runtimes (app.js, test) and web. + */ + const target = isWeb || isViteRuntime ? 'modules' : 'node14'; + + const XSL_FORM = readFileSync('./src/xsl/openrosa2html5form.xsl', 'utf-8'); + const XSL_MODEL = readFileSync('./src/xsl/openrosa2xmlmodel.xsl', 'utf-8'); + const PACKAGE_VERSION = pkg.version; + const VERSION = md5(`${XSL_FORM}${XSL_MODEL}${PACKAGE_VERSION}`); + + type Browser = 'firefox' | 'chromium' | 'webkit'; + + const browsers = new Map([ + ['firefox', 'firefox'], + ['chromium', 'chromium'], + ['webkit', 'webkit'], + ]); + + const BROWSER = browsers.get(process.env.BROWSER as Browser) ?? 'firefox'; + + const define = { + PACKAGE_VERSION: JSON.stringify(PACKAGE_VERSION), + VERSION: JSON.stringify(VERSION), + ENV: JSON.stringify(ENV), + BROWSER: JSON.stringify(BROWSER), + }; + + const include = isWeb ? ['language-tags', 'string-direction'] : []; + const needsInterop = [...include]; + + const alias = isWeb + ? [ + { + find: /^libxslt$/, + replacement: './src/dom/web/libxslt.ts', + }, + { + find: /^enketo-transformer\/dom$/, + replacement: './src/dom/web/index.ts', + }, + { + find: /^\/@fs\/(.*)/, + replacement: '$1', + }, + ] + : [ + { + find: /^enketo-transformer\/dom$/, + replacement: './src/dom/node/index.ts', + }, + ]; + + return { + assetsInclude: ['**/*.xml', '**/*.xsl'], + build: { + lib: { + entry, + formats, + name: 'enketo-transformer', + fileName(format, entryName) { + const extension = format === 'es' ? '.js' : '.cjs'; + + if (isWeb) { + const resolved = entryName + .replace('src/', '@enketo/transformer-web/') + .replace( + 'node_modules/.vite/deps_build-dist/', + '@enketo/transformer-web/deps/' + ); + + return `${resolved}${extension}`; + } + + return `enketo-transformer/${entryName.replace( + 'src/', + '' + )}${extension}`; + }, }, + emptyOutDir, + minify, + outDir: 'dist', + rollupOptions: { + external, + input, + output: { + // This suppresses a warning for modules with both named and + // default exporrs when building for CommonJS (UMD in our + // current build). It's safe to suppress this warning because we + // have explicit tests ensuring both the default and named + // exports are consistent with the existing public API. + exports: 'named', + preserveModules: true, + }, + treeshake: true, + }, + sourcemap: true, + target, + }, + define, + esbuild: { + define, + format: 'esm', + sourcemap: true, + }, + optimizeDeps: { + disabled: !isWeb, + exclude: external, + include, + needsInterop, }, - sourcemap: true, - }, - esbuild: { - sourcemap: 'inline', - }, - optimizeDeps: { - disabled: true, - }, - server: { - port: config.port, - }, - ssr: { - target: 'node', - }, - test: { - // Vitest uses thread-based concurrency by defualt. - // While this would significantly improve the speed - // of test runs, native Node extensions using N-API - // are often not thread safe. In this case, that - // means we cannot use concurrency for testing - // functionality which depends on libxmljs/libxslt. - threads: false, - - coverage: { - provider: 'istanbul', - include: ['src/**/*.ts'], - reporter: ['html', 'text-summary', 'json'], - reportsDirectory: './test-coverage', + resolve: { alias }, + server: { + port: config.port, }, + test: { + // Vitest uses thread-based concurrency by defualt. + // While this would significantly improve the speed + // of test runs, native Node extensions using N-API + // are often not thread safe. In this case, that + // means we cannot use concurrency for testing + // functionality which depends on libxmljs/libxslt. + threads: false, - globals: true, - include: ['test/**/*.spec.ts'], - reporters: 'verbose', - sequence: { shuffle: true }, - }, + coverage: { + provider: 'istanbul', + include: ['src/**/*.ts'], + reporter: ['html', 'text-summary', 'json'], + reportsDirectory: './test-coverage', + }, + + globals: true, + include: ['test/**/*.spec.ts'], + reporters: 'verbose', + sequence: { shuffle: true }, + }, + } satisfies UserConfig; }); From 916e2e3ca1e0c14eef38030e615f515755df86cb Mon Sep 17 00:00:00 2001 From: eyelidlessness Date: Sun, 19 Feb 2023 13:16:38 -0800 Subject: [PATCH 03/24] Fix: consistent URL escaping in web environments This addresses a slight difference between Node's and browsers' respective implementations of `URL`, namely that browsers do not implicitly escape special path characters for unknown schemes (i.e. `jr`). This change is a workaround, temporarily substituting the `jr` scheme to consistently take advantage of built-in escaping behavior, then restoring it for the final return value. --- src/url.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/url.ts b/src/url.ts index 6498c1a..9c96e88 100644 --- a/src/url.ts +++ b/src/url.ts @@ -4,14 +4,15 @@ * @param value - a fully qualified URL, or a relative path */ export const escapeURLPath = (value: string): string => { - const isFullyQualified = /^[a-z]+:/i.test(value); + const [scheme] = value.match(/^[a-z]+:/) ?? []; + const isFullyQualified = scheme != null; const urlString = isFullyQualified - ? value - : `file:///${value.replace(/^\//, '')}`; + ? value.replace(/^jr:\/*/, 'http://') + : `http://example.com/${value.replace(/^\//, '')}`; const url = new URL(urlString); if (isFullyQualified) { - return url.href; + return url.href.replace('http:', scheme); } const { pathname, search } = url; From a0238fedf87b26cc343e36ee8559c9d8fa08c317 Mon Sep 17 00:00:00 2001 From: eyelidlessness Date: Sun, 19 Feb 2023 13:23:30 -0800 Subject: [PATCH 04/24] Fix: HTML document/"fragment" hierarchy This addresses: - an inconsistency between how `libxslt` and the native DOM `XSLTProcessor` handle XSLT transforms to HTML.`libxslt` (correctly, IMO) treats the XSLT document's expressed root element as the resulting document element, whereas browsers produce a document with an implicit `html > body > root` structure. - a slight change in `renderMarkdown` which parses to a document rather than a fragment, for the purpose of a simpler DOM compatibiity API in this case. (That call to `correctHTMLDocHierarchy` was mistakenly included in an earlier commit, but I'm hoping this subsequent commit will be clear enough and we'll likely squash these commits anyhow.) --- src/transformer.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/transformer.ts b/src/transformer.ts index 60edf2e..4b2f2c2 100644 --- a/src/transformer.ts +++ b/src/transformer.ts @@ -70,6 +70,7 @@ export const transform: Transform = async (survey) => { const htmlDoc = xslTransform(xslFormDoc, xformDoc, xsltParams); + correctHTMLDocHierarchy(htmlDoc); correctAction(htmlDoc, 'setgeopoint'); correctAction(htmlDoc, 'setvalue'); replaceTheme(htmlDoc, theme); @@ -548,3 +549,14 @@ export default { sheets, escapeURLPath, }; + +const correctHTMLDocHierarchy = (doc: DOM.Document) => { + const { documentElement } = doc; + + if (documentElement.nodeName.toLowerCase() === 'html') { + const [root] = getNodesByXPathExpression(doc, '/html/body/root'); + + documentElement.replaceWith(root); + } +}; + From cda915a38730e2e88217488ff0f97885bc75dcb8 Mon Sep 17 00:00:00 2001 From: eyelidlessness Date: Sun, 19 Feb 2023 13:49:19 -0800 Subject: [PATCH 05/24] Fix: namespaces on instance root nodes --- src/transformer.ts | 79 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/src/transformer.ts b/src/transformer.ts index 4b2f2c2..e127339 100644 --- a/src/transformer.ts +++ b/src/transformer.ts @@ -84,6 +84,7 @@ export const transform: Transform = async (survey) => { const xslModelDoc = domParser.parseFromString(xslModel, 'text/xml'); const xmlDoc = xslTransform(xslModelDoc, xformDoc); + correctModelNamespaces(xslModelDoc, xformDoc, xmlDoc); replaceMediaSources(xmlDoc, mediaMap); addInstanceIdNodeIfMissing(xmlDoc); @@ -560,3 +561,81 @@ const correctHTMLDocHierarchy = (doc: DOM.Document) => { } }; +const XMLNS_URI = 'http://www.w3.org/2000/xmlns/'; + +declare const document: DOM.Document | undefined; + +/** + * This addresses a difference in how Firefox treats XML namespace declarations + * versus other browsers, as well as `libxslt`. In `openrosa2xmlmodel.xsl`, it's + * expected that `xmlns` and `xmlns:*` are treated as attributes, but evidently + * this is not the case in Firefox. So for consistency we copy the namespace + * declarations in the browser DOM. + * + * An important note: understanding what the actual behavior originally was + * turned out to be rather difficult, so this is the current behavior (which may + * not exactly be *expected* e.g. by Enketo Core): + * + * For each namespace declaration defined on the XForm's root `html` element, + * assign them to the transformed model's primary `instance` element, **except if**: + * + * - The namespace is also defined on the `model`. + * - The namespace prefix is used on any of the `model`'s attributes. + * - The namespace is also defined in `openrosa2xmlmodel.xsl`. + * + * TODO (2023-01-16): + * + * - All of the exceptions described above are either known bugs or likely to be. + * + * - This leaves very little remaining responsibilities of + * `openrosa2xmlmodel.xsl`. We should seriously consider moving the remainder + * to DOM code. + */ +const correctModelNamespaces = ( + xslDoc: DOM.Document, + xformDoc: DOM.Document, + modelDoc: DOM.Document +) => { + if (typeof document === 'undefined') { + return; + } + + const { documentElement: xslRoot } = xslDoc; + const instanceRoots = getNodesByXPathExpression( + modelDoc, + '/xmlns:root/xmlns:model/xmlns:instance/*', + NAMESPACES + ); + const model = instanceRoots[0].parentElement?.parentElement; + const [xformModel] = getNodesByXPathExpression( + xformDoc, + '/h:html/h:head/xmlns:model', + NAMESPACES + ); + + if (model == null || xformModel == null) { + throw new Error('XForm is missing a model element.'); + } + + instanceRoots.forEach((instanceRoot) => { + const xformModelAttrNamespaces = [...xformModel.attributes] + .filter( + ({ name }) => name !== 'xmlns' && !name.startsWith('xmlns:') + ) + .map(({ namespaceURI }) => namespaceURI); + + const missingNamespaceAttrs = [ + ...xformDoc.documentElement.attributes, + ].filter( + ({ name, value }) => + (name === 'xmlns' || name.startsWith('xmlns:')) && + !xslRoot.hasAttribute(name) && + !xformModelAttrNamespaces.includes(value) && + !instanceRoot.hasAttribute(name) + ); + + missingNamespaceAttrs.forEach(({ name, value }) => { + instanceRoot.setAttributeNS(XMLNS_URI, name, value); + }); + }); +}; From b46e7b56dcead9beb697874907f176f484bdd9ce Mon Sep 17 00:00:00 2001 From: eyelidlessness Date: Sun, 19 Feb 2023 13:50:11 -0800 Subject: [PATCH 06/24] Remove fatal errors from XSL from unsupported extensions The functionality depending on them will be reimplemented with DOM APIs --- src/xsl/openrosa2html5form.xsl | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/xsl/openrosa2html5form.xsl b/src/xsl/openrosa2html5form.xsl index a16b67a..09f15fb 100644 --- a/src/xsl/openrosa2html5form.xsl +++ b/src/xsl/openrosa2html5form.xsl @@ -109,15 +109,6 @@ XSLT Stylesheet that transforms OpenRosa style (X)Forms into valid HTMl5 forms FATAL ERROR: exsl:node-set function is not available in this XSLT processor - - FATAL ERROR: str:replace function is not available in this XSLT processor - - - FATAL ERROR: dyn:evaluate function is not available in this XSLT processor - - - FATAL ERROR: str:tokenize function is not available in this XSLT processor - WARNING: Found binding(s) with relative nodeset attribute (form may work correctly if relative nodesets were used consistently throughout xml form in bindings as well as body, otherwise it will certainly be messed up). From 29a733f330bb3b80656a85490207f136c7cd4572 Mon Sep 17 00:00:00 2001 From: eyelidlessness Date: Sun, 19 Feb 2023 13:53:32 -0800 Subject: [PATCH 07/24] Fix: Firefox does not apply templates to attributes It's possible there are other attribute cases I haven't identified, but these are the ones I was able to find in test failures, snapshot mismatches, and the spec. --- src/xsl/openrosa2html5form.xsl | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/xsl/openrosa2html5form.xsl b/src/xsl/openrosa2html5form.xsl index 09f15fb..c2d763b 100644 --- a/src/xsl/openrosa2html5form.xsl +++ b/src/xsl/openrosa2html5form.xsl @@ -1421,10 +1421,19 @@ XSLT Stylesheet that transforms OpenRosa style (X)Forms into valid HTMl5 forms - - - - + + + + + + + + + + + + + From 4227fe439e5d37e9ddf10d4baf221dce73a26695 Mon Sep 17 00:00:00 2001 From: eyelidlessness Date: Sun, 19 Feb 2023 13:55:04 -0800 Subject: [PATCH 08/24] Fix: dynamic itemset itext translations These dynamic template calls are now injected into the XSL, allowing us to eliminate the use of `str:replace` and `dyn:evaluate` extensions. --- src/transformer.ts | 167 +++++++++++++++++++++++++++++++++ src/xsl/openrosa2html5form.xsl | 76 ++++----------- 2 files changed, 187 insertions(+), 56 deletions(-) diff --git a/src/transformer.ts b/src/transformer.ts index e127339..eb85e58 100644 --- a/src/transformer.ts +++ b/src/transformer.ts @@ -67,6 +67,7 @@ export const transform: Transform = async (survey) => { } processBinaryDefaults(xformDoc, mediaMap); + injectItemsetTemplateCalls(xslFormDoc, xformDoc); const htmlDoc = xslTransform(xslFormDoc, xformDoc, xsltParams); @@ -561,6 +562,172 @@ const correctHTMLDocHierarchy = (doc: DOM.Document) => { } }; +/** @see {@link injectItemsetTemplateCalls} */ +const substringBefore = (haystack: string, needle: string) => + haystack.split(needle, 1)[0]; + +/** @see {@link injectItemsetTemplateCalls} */ +const substringAfter = (haystack: string, needle: string) => + haystack.substring(haystack.indexOf(needle) + needle.length); + +/** + * This is a replacement for the XSL template named `strip-filter`. The original + * XSL commentary follows: + * + * ---------------------------------------------------------------------------- + * turns: /path/to/node[value=/some/other/node] into: /path/to/node this + * function is probably way too aggressive but will work for xls-form generated + * forms to do this properly a regexp:replace is required, but not supported in + * libXML kept the recursion in, even though it is not being used right now + * ---------------------------------------------------------------------------- + * + * Contrary to the JSDoc comment for @see {@link injectItemsetTemplateCalls}, + * this implementation deviates from the original XSL logic, which uses + * substrings and recursion, because it's (hopefully) much easier to understand + * this way. + * + * It is *also* worth noting that in the process of migrating to browser DOM, + * the original commentary was found to be wrong! The recursion was certainly in + * use, and without it some snapshot tests failed. + */ +const stripFilter = (expression: string) => expression.replace(/\[.*?\]/g, ''); + +/** + * This is a replacement for the dynamic logic in the XSL template + * `match="xf:itemset" mode="labels"`. Moving it to DOM code allows us to drop + * our reliance on the unsupported `dyn` extension. The intent is to match the + * naming and semantics of the original XSL logic to ensure there is no + * potential for regressions. + */ +const injectItemsetTemplateCalls = ( + xslDoc: DOM.Document, + xformDoc: DOM.Document +) => { + const itemsets = getNodesByXPathExpression( + xformDoc, + '//xmlns:itemset', + NAMESPACES + ); + + if (itemsets.length === 0) { + return; + } + + const itemsetParameters = itemsets.map((itemset) => { + const [valueEl] = getNodesByXPathExpression( + itemset, + './xmlns:value', + NAMESPACES + ); + const valueRef = valueEl.getAttribute('ref') ?? ''; + const [labelEl] = getNodesByXPathExpression( + itemset, + './xmlns:label', + NAMESPACES + ); + const labelRef = labelEl.getAttribute('ref') ?? ''; + const nodeset = itemset.getAttribute('nodeset') ?? ''; + const iwq = substringBefore(substringAfter(nodeset, 'instance('), ')'); + + // TODO (2023-01-15): The following comment is directly from the + // previous XSL implementation. But because we *do* now implement this + // in a general purpose language, we can address these limitations. + + // Needs to also deal with randomize(instance("id")/path/to/node), randomize(instance("id")/path/to/node, 3) + // Super inelegant and not robust without regexp:match + let instancePathTemp: string; + + const nodesetIncludesRandomize = nodeset.includes('randomize('); + + if (nodesetIncludesRandomize && nodeset.includes(',')) { + instancePathTemp = substringBefore( + substringAfter(nodeset, ')'), + ',' + ); + } else if (nodesetIncludesRandomize) { + instancePathTemp = substringBefore( + substringAfter(nodeset, ')'), + ')' + ); + } else { + instancePathTemp = substringAfter(nodeset, ')'); + } + + const instancePath = instancePathTemp.replace(/\//g, '/xf:'); + const instancePathNoFilter = stripFilter(instancePath); + const instanceId = iwq.substring(1, iwq.length - 1); + const itextPath = `/h:html/h:head/xf:model/xf:instance[@id="${instanceId}"]${instancePathNoFilter}`; + + return { + valueRef, + labelRef, + itextPath, + }; + }); + + const ids: string[] = []; + + itemsets.forEach((itemset, index) => { + let id = itemset.getAttribute('id'); + + if (id == null) { + id = `itemset-${index}`; + } + + itemset.setAttributeNS(null, 'id', id); + ids.push(id); + }); + + const templateCalls = itemsetParameters.map((parameters, index) => { + const id = ids[index]; + const match = `xf:itemset[@id = '${id}']`; + + const template = xslDoc.createElementNS(NAMESPACES.xsl, 'xsl:template'); + + template.setAttribute('match', match); + template.setAttribute('mode', 'labels'); + + const callTemplate = xslDoc.createElementNS( + NAMESPACES.xsl, + 'xsl:call-template' + ); + + callTemplate.setAttribute('name', 'itemset-itext-labels'); + + const withValueRef = xslDoc.createElementNS( + NAMESPACES.xsl, + 'xsl:with-param' + ); + + withValueRef.setAttribute('name', 'valueRef'); + withValueRef.setAttribute('select', `'${parameters.valueRef}'`); + + const withLabelRef = xslDoc.createElementNS( + NAMESPACES.xsl, + 'xsl:with-param' + ); + + withLabelRef.setAttribute('name', 'labelRef'); + withLabelRef.setAttribute('select', `'${parameters.labelRef}'`); + + const withItextPath = xslDoc.createElementNS( + NAMESPACES.xsl, + 'xsl:with-param' + ); + + withItextPath.setAttribute('name', 'itextPath'); + withItextPath.setAttribute('select', parameters.itextPath); + + callTemplate.append(withValueRef, withLabelRef, withItextPath); + + template.append(callTemplate); + + return template; + }); + + xslDoc.documentElement.append(...templateCalls); +}; + const XMLNS_URI = 'http://www.w3.org/2000/xmlns/'; declare const document: DOM.Document | undefined; diff --git a/src/xsl/openrosa2html5form.xsl b/src/xsl/openrosa2html5form.xsl index c2d763b..1db124a 100644 --- a/src/xsl/openrosa2html5form.xsl +++ b/src/xsl/openrosa2html5form.xsl @@ -717,47 +717,35 @@ XSLT Stylesheet that transforms OpenRosa style (X)Forms into valid HTMl5 forms - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + - + - + + + select="substring(substring-after($labelRef, 'itext('),1,string-length(substring-after($labelRef, 'itext('))-1)"/> - + + @@ -768,38 +756,14 @@ XSLT Stylesheet that transforms OpenRosa style (X)Forms into valid HTMl5 forms - + - - + - - - - - - - - - - - - - - - - - - From 3d93e1b23f93a1e106b04f777afc3cf2bdf296e2 Mon Sep 17 00:00:00 2001 From: eyelidlessness Date: Sun, 19 Feb 2023 14:28:49 -0800 Subject: [PATCH 09/24] Fix: transform appearance classes in transformer.ts This eliminates the need to use `str:tokenize` extension --- src/dom/abstract/Element.d.ts | 1 + src/dom/node/Element.ts | 10 +++++ src/transformer.ts | 74 ++++++++++++++++++++++++++++++++++ src/xsl/openrosa2html5form.xsl | 67 ++++++++++++++---------------- typings/libxmljs.d.ts | 1 + 5 files changed, 116 insertions(+), 37 deletions(-) diff --git a/src/dom/abstract/Element.d.ts b/src/dom/abstract/Element.d.ts index 9bc029e..da8c743 100644 --- a/src/dom/abstract/Element.d.ts +++ b/src/dom/abstract/Element.d.ts @@ -10,6 +10,7 @@ export interface Element extends Node { readonly attributes: NamedNodeMap; readonly firstChild: Node | null; readonly firstElementChild: Element | null; + readonly localName: string; readonly nodeName: string; readonly outerHTML: string; append(...nodes: Array): void; diff --git a/src/dom/node/Element.ts b/src/dom/node/Element.ts index f6ae6b0..d61c4f8 100644 --- a/src/dom/node/Element.ts +++ b/src/dom/node/Element.ts @@ -31,6 +31,16 @@ export class DOMExtendedElement implements DOM.Element { return (this as any as DOMExtendedElement & Element).get('*') ?? null; } + get localName() { + const prefix = (this as any as Element).namespace()?.prefix(); + + if (prefix == null) { + return this.nodeName; + } + + return this.nodeName.replace(`${prefix}:`, ''); + } + get nodeName() { return (this as any as Element).name(); } diff --git a/src/transformer.ts b/src/transformer.ts index eb85e58..fc7260e 100644 --- a/src/transformer.ts +++ b/src/transformer.ts @@ -74,6 +74,7 @@ export const transform: Transform = async (survey) => { correctHTMLDocHierarchy(htmlDoc); correctAction(htmlDoc, 'setgeopoint'); correctAction(htmlDoc, 'setvalue'); + transformAppearances(htmlDoc); replaceTheme(htmlDoc, theme); replaceMediaSources(htmlDoc, mediaMap); @@ -728,6 +729,79 @@ const injectItemsetTemplateCalls = ( xslDoc.documentElement.append(...templateCalls); }; +/** + * This is a replacement for the logic previously implemented in the + * `appearance` template in `openrosa2html5form.xsl`. That template now + * transforms existing appearance values directly to a `data-appearance` + * attribute, and the previous logic is applied here based on those values. + */ +const transformAppearances = (doc: DOM.Document) => { + const appearanceElements = getNodesByXPathExpression( + doc, + '//*[@data-appearances]' + ); + + appearanceElements.forEach((element) => { + const selectType = element.hasAttribute('data-appearances-select-type'); + + if (selectType) { + element.removeAttribute('data-appearances-select-type'); + } + + const appearances = + element + .getAttribute('data-appearances') + ?.trim() + .toLowerCase() + .split(/\s+/) ?? []; + + const appearanceClasses = appearances.flatMap((appearance) => { + const results = [`or-appearance-${appearance}`]; + + // Convert deprecated appearances, but leave the deprecated ones. + if (selectType) { + if (appearance === 'horizontal') { + results.push('or-appearance-columns'); + } + + if (appearance === 'horizontal-compact') { + results.push('or-appearance-columns-pack'); + } + + if (appearance === 'compact') { + results.push( + 'or-appearance-columns-pack', + 'or-appearance-no-buttons' + ); + } + + if (appearance.startsWith('compact-')) { + results.push( + appearance.replace('compact-', ''), + 'or-appearance-no-buttons' + ); + } + } + + return results; + }); + + const classes = + element.getAttribute('class')?.trim()?.split(/\s+/) ?? []; + + const className = classes + .flatMap((className) => + className === 'or-appearances-placeholder' + ? appearanceClasses + : className + ) + .join(' '); + + element.setAttribute('class', className); + element.removeAttribute('data-appearances'); + }); +}; + const XMLNS_URI = 'http://www.w3.org/2000/xmlns/'; declare const document: DOM.Document | undefined; diff --git a/src/xsl/openrosa2html5form.xsl b/src/xsl/openrosa2html5form.xsl index 1db124a..4be4573 100644 --- a/src/xsl/openrosa2html5form.xsl +++ b/src/xsl/openrosa2html5form.xsl @@ -295,7 +295,9 @@ XSLT Stylesheet that transforms OpenRosa style (X)Forms into valid HTMl5 forms - + + + @@ -306,6 +308,7 @@ XSLT Stylesheet that transforms OpenRosa style (X)Forms into valid HTMl5 forms + @@ -366,8 +369,11 @@ XSLT Stylesheet that transforms OpenRosa style (X)Forms into valid HTMl5 forms - + + + + @@ -403,38 +409,18 @@ XSLT Stylesheet that transforms OpenRosa style (X)Forms into valid HTMl5 forms - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - - - + + + + + + + + @@ -497,8 +483,11 @@ XSLT Stylesheet that transforms OpenRosa style (X)Forms into valid HTMl5 forms - + + + + @@ -823,13 +812,14 @@ XSLT Stylesheet that transforms OpenRosa style (X)Forms into valid HTMl5 forms - + + + +
diff --git a/typings/libxmljs.d.ts b/typings/libxmljs.d.ts index 7a5b0b9..b1b0bf4 100644 --- a/typings/libxmljs.d.ts +++ b/typings/libxmljs.d.ts @@ -56,6 +56,7 @@ declare module 'libxmljs' { attr(name: string, value: string): Element; attr(attributes: Record): Element; defineNamespace(namespceURI: string, prefix: string): Namespace; + namespace(): Namespace | null; namespace(uri: string): this; namespace(namespace: Namespace): Element; } From 538bcfe4023fc7f4c1420eeebe65031dadf4e3ca Mon Sep 17 00:00:00 2001 From: eyelidlessness Date: Tue, 21 Feb 2023 08:51:32 -0800 Subject: [PATCH 10/24] Add web demo --- .eslintrc.json | 25 +- .vscode/settings.json | 4 + demo/demo.tsx | 338 + demo/index.html | 16 + demo/package-lock.json | 10039 +++++++++++++++++ demo/package.json | 23 + demo/public/OpenSans-Bold-webfont.woff | Bin 0 -> 68096 bytes demo/public/OpenSans-BoldItalic-webfont.woff | Bin 0 -> 71664 bytes demo/public/OpenSans-Italic-webfont.woff | Bin 0 -> 72588 bytes demo/public/OpenSans-Regular-webfont.woff | Bin 0 -> 68220 bytes demo/public/demo.css | 225 + demo/public/icon.png | Bin 0 -> 7913 bytes demo/public/theme.css | 36 + demo/tsconfig.json | 9 + demo/vite.config.ts | 28 + package.json | 19 +- src/transformer.ts | 3 +- test/fixtures.ts | 42 + test/shared.ts | 45 +- tsconfig.web.json | 2 +- 20 files changed, 10804 insertions(+), 50 deletions(-) create mode 100644 demo/demo.tsx create mode 100644 demo/index.html create mode 100644 demo/package-lock.json create mode 100644 demo/package.json create mode 100644 demo/public/OpenSans-Bold-webfont.woff create mode 100644 demo/public/OpenSans-BoldItalic-webfont.woff create mode 100644 demo/public/OpenSans-Italic-webfont.woff create mode 100644 demo/public/OpenSans-Regular-webfont.woff create mode 100644 demo/public/demo.css create mode 100644 demo/public/icon.png create mode 100644 demo/public/theme.css create mode 100644 demo/tsconfig.json create mode 100644 demo/vite.config.ts create mode 100644 test/fixtures.ts diff --git a/.eslintrc.json b/.eslintrc.json index fa2e9e1..6b0cd5e 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -21,13 +21,13 @@ "ecmaVersion": 2020 }, "settings": { - "import/extensions": [".ts"], + "import/extensions": [".ts", ".tsx"], "import/parsers": { - "@typescript-eslint/parser": [".ts"] + "@typescript-eslint/parser": [".ts", ".tsx"] }, "import/resolver": { "node": { - "extensions": [".js", ".ts"] + "extensions": [".js", ".ts", ".tsx"] } }, "jsdoc": { @@ -93,7 +93,7 @@ }, { - "files": ["./**/*.ts"], + "files": ["./**/*.ts", "./demo/**/*.tsx"], "rules": { "consistent-return": "off", "no-useless-constructor": "off", @@ -128,6 +128,23 @@ } }, + { + "env": { + "browser": true, + "node": false + }, + "files": ["./demo/**/*"], + "rules": { + "react/destructuring-assignment": "off", + "react/jsx-filename-extension": [ + "error", + { "extensions": [".jsx", ".tsx"] } + ], + "react/no-unknown-property": "off", + "react/react-in-jsx-scope": "off" + } + }, + { "files": ["./test/**/*.ts"], "rules": { diff --git a/.vscode/settings.json b/.vscode/settings.json index 88f7aeb..e059db1 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -22,6 +22,10 @@ "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true }, + "[typescriptreact]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.formatOnSave": true + }, // Note: it would be nice to reverse this! But it's currently preventing a *ton* of whitespace diff noise "[xml]": { "editor.formatOnSave": false diff --git a/demo/demo.tsx b/demo/demo.tsx new file mode 100644 index 0000000..a077f4c --- /dev/null +++ b/demo/demo.tsx @@ -0,0 +1,338 @@ +/* eslint-disable jsx-a11y/label-has-associated-control */ +import { Router, Routes, Route, useSearchParams } from '@solidjs/router'; +import { transform } from 'enketo-transformer/web'; +import { + createEffect, + createResource, + createSignal, + on, + splitProps, +} from 'solid-js'; +import type { JSX } from 'solid-js'; +import { For, Match, Show, Switch, render } from 'solid-js/web'; +import { fixtures as baseFixtures } from '../test/fixtures'; + +interface CodeBlockProps + extends Omit { + children: string | undefined | Array; +} + +function CodeBlock(props: CodeBlockProps) { + const [childProps, rest] = splitProps(props, ['children']); + const code = () => + (Array.isArray(childProps.children) + ? childProps.children + : [childProps.children] + ) + .filter((child): child is string => child != null) + .flatMap((child) => child.trim().split('\n')); + + return ( + // eslint-disable-next-line react/jsx-props-no-spreading +
+            
+                
+                    {(line) => {
+                        const [indentation] = line.match(/^\s*/) ?? [''];
+                        const outdent = indentation.length + 4;
+
+                        return (
+                            
{`${line}\n`}
+ ); + }} +
+
+
+ ); +} + +const fixtures = baseFixtures.map(({ origin, fileName, ...rest }) => ({ + ...rest, + origin, + fileName, + key: `${origin}-${fileName}`, +})); + +const xformsByKey = new Map( + fixtures.map((fixture) => [fixture.key, fixture.xform]) +); + +function Demo() { + const [language, setLanguage] = createSignal(null); + + let formContainer!: HTMLDivElement; + + createEffect( + on( + language, + (current) => { + const active = formContainer.querySelectorAll( + '.active[lang]:not([lang=""])' + ); + + active.forEach((element) => { + element.classList.remove('active'); + }); + + const activate = formContainer.querySelectorAll( + `[lang="${CSS.escape(current ?? '')}"]` + ); + + activate.forEach((element) => { + element.classList.add('active'); + }); + }, + { defer: true } + ) + ); + + const [params, setParams] = useSearchParams(); + const key = () => params.xform; + const xform = () => { + const xform = key(); + + if (xform == null) { + return; + } + + return xformsByKey.get(xform); + }; + const [error, setError] = createSignal(null); + const logo = () => params.logo !== 'false'; + const openclinica = () => params.openclinica === 'true'; + const markdown = () => params.markdown !== 'false'; + const theme = () => params.theme === 'true'; + const [duration, setDuration] = createSignal(null); + const [transformed, setTransformed] = createResource(async () => { + const selected = xform(); + + if (selected == null) { + return; + } + + const start = performance.now(); + const result = await transform({ + xform: selected, + media: logo() ? { 'form_logo.png': '/icon.png' } : {}, + openclinica: openclinica() ? 1 : 0, + markdown: markdown(), + theme: theme() ? 'mytheme' : undefined, + }); + + setDuration(performance.now() - start); + + return result; + }); + + createEffect( + on( + [key, xform, error, logo, openclinica, markdown, theme], + async () => { + setError(null); + setLanguage(null); + setDuration(null); + + setTimeout(() => { + setTransformed.refetch(); + }, 0); + }, + { defer: true } + ) + ); + + return ( + <> +
+

+ Enketo Transformer Demo +

+ +
+ +
+ +
+ + + + + + + +
+
+ ⏲️{' '} + + Transforming... + + Transformed in {duration()?.toFixed(2)} ms + + +
+
+ + {(error) => ( +
+

Error

+ + + {error.message} + {'\n'} + {error.stack} + +
+ )} +
+ + {({ form, model, ...rest }) => ( +
+
+ + 📄 + XForm + + {xform()} +
+ +
{ + if (e.target.id === 'form-languages') { + setLanguage( + CSS.escape( + (e.target as HTMLSelectElement) + .value + ) + ); + } + }} + /> + +
+ + 🌐 + Form HTML + + {form} +
+ +
+

❎ Model

+ {model} +
+ +
+

Data

+ + {JSON.stringify(rest, null, 4)} + +
+
+ )} + + + ); +} + +render( + () => ( + + + + + {/* */} + + + ), + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + document.getElementById('app')! +); diff --git a/demo/index.html b/demo/index.html new file mode 100644 index 0000000..031c8b4 --- /dev/null +++ b/demo/index.html @@ -0,0 +1,16 @@ + + + + + + + + + Enketo Transformer - web demo + + +
+ + + + diff --git a/demo/package-lock.json b/demo/package-lock.json new file mode 100644 index 0000000..9fb2f5b --- /dev/null +++ b/demo/package-lock.json @@ -0,0 +1,10039 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/compat-data": { + "version": "7.20.10", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.10.tgz", + "integrity": "sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg==" + }, + "@babel/core": { + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", + "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helpers": "^7.20.7", + "@babel/parser": "^7.20.7", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.12", + "@babel/types": "^7.20.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + } + }, + "@babel/generator": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.7.tgz", + "integrity": "sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw==", + "requires": { + "@babel/types": "^7.20.7", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", + "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "requires": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.12.tgz", + "integrity": "sha512-9OunRkbT0JQcednL0UFvbfXpAsUXiGjUk0a7sN8fUXX7Mue79cUSMjHGDRRi/Vz9vYlpIhLV5fMD5dKoMhhsNQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-member-expression-to-functions": "^7.20.7", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/helper-split-export-declaration": "^7.18.6" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" + }, + "@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "requires": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.20.7.tgz", + "integrity": "sha512-9J0CxJLq315fEdi4s7xK5TQaNYjZw+nDVpVqr1axNGKzdrdwYBD5b4uKv3n75aABG0rCCTK8Im8Ww7eYfMrZgw==", + "requires": { + "@babel/types": "^7.20.7" + } + }, + "@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-module-transforms": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", + "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.10", + "@babel/types": "^7.20.7" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", + "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==" + }, + "@babel/helper-replace-supers": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", + "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", + "requires": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-member-expression-to-functions": "^7.20.7", + "@babel/helper-optimise-call-expression": "^7.18.6", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.7", + "@babel/types": "^7.20.7" + } + }, + "@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "requires": { + "@babel/types": "^7.20.2" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", + "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "requires": { + "@babel/types": "^7.20.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "requires": { + "@babel/types": "^7.18.6" + } + }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==" + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" + }, + "@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==" + }, + "@babel/helpers": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz", + "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==", + "requires": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.13", + "@babel/types": "^7.20.7" + } + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.13.tgz", + "integrity": "sha512-gFDLKMfpiXCsjt4za2JA9oTMn70CeseCehb11kRZgvd7+F67Hih3OHOK24cRrWECJ/ljfPGac6ygXAs/C8kIvw==" + }, + "@babel/plugin-syntax-jsx": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", + "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz", + "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.19.0" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.13.tgz", + "integrity": "sha512-O7I/THxarGcDZxkgWKMUrk7NK1/WbHAg3Xx86gqS6x9MTrNL6AwIluuZ96ms4xeDe6AVx6rjHbWHP7x26EPQBA==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.20.12", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-typescript": "^7.20.0" + } + }, + "@babel/preset-typescript": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", + "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/helper-validator-option": "^7.18.6", + "@babel/plugin-transform-typescript": "^7.18.6" + } + }, + "@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + } + }, + "@babel/traverse": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz", + "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==", + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.13", + "@babel/types": "^7.20.7", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, + "@esbuild/android-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz", + "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==", + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz", + "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==", + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz", + "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==", + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz", + "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==", + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz", + "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==", + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz", + "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==", + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz", + "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==", + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz", + "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==", + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz", + "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==", + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz", + "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==", + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz", + "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==", + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz", + "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==", + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz", + "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==", + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz", + "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==", + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz", + "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==", + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz", + "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==", + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz", + "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==", + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz", + "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==", + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz", + "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==", + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz", + "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==", + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz", + "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==", + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz", + "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==", + "optional": true + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "@solidjs/router": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@solidjs/router/-/router-0.7.0.tgz", + "integrity": "sha512-8HI84twe5FjYRebSLMAhtkL9bRuTDIlxJK56kjfjU9WKGoUCTaWpCnkuj8Hqde1bWZ0X+GOZxKDfNkn1CjtjxA==" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", + "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "babel-plugin-jsx-dom-expressions": { + "version": "0.35.14", + "resolved": "https://registry.npmjs.org/babel-plugin-jsx-dom-expressions/-/babel-plugin-jsx-dom-expressions-0.35.14.tgz", + "integrity": "sha512-Eywfw/7cNbBsStTgj46JRvyGTb+RLyF2EJ0AV3/W2cUwbw3R3syOBqdzFLdHN2MPOs4nJA80XtGl9kSMjEekhA==", + "requires": { + "@babel/helper-module-imports": "7.18.6", + "@babel/plugin-syntax-jsx": "^7.18.6", + "@babel/types": "^7.20.7", + "html-entities": "2.3.3", + "validate-html-nesting": "^1.2.0" + } + }, + "babel-preset-solid": { + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/babel-preset-solid/-/babel-preset-solid-1.6.9.tgz", + "integrity": "sha512-Dz4xROTGtAZ2B9+79KYUzi/bhjNGsx+8c+AD3VO/Cg1CisM1qq29XsnkWrRJeTMMn3XZkAI/Bf5Rz37d/gvPVQ==", + "requires": { + "babel-plugin-jsx-dom-expressions": "^0.35.13" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "requires": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + } + }, + "busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "requires": { + "streamsearch": "^1.1.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001446", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001446.tgz", + "integrity": "sha512-fEoga4PrImGcwUUGEol/PoFCSBnSkA9drgdkxXkJLsUBOnJ8rs3zDv6ApqYXGQFOyMPsjh79naWhF4DAxbF8rw==" + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==" + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" + }, + "csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==" + }, + "electron-to-chromium": { + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==" + }, + "enketo-transformer": { + "version": "file:..", + "requires": { + "body-parser": "^1.20.1", + "css.escape": "^1.5.1", + "express": "^4.18.2", + "language-tags": "1.0.5", + "libxslt": "0.10.0", + "linkedom": "^0.14.21", + "prettier": "^2.8.3", + "string-direction": "0.1.x", + "undici": "^5.18.0", + "xpath-to-css": "^1.1.0" + }, + "dependencies": { + "@actions/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.0.tgz", + "integrity": "sha512-2aZDDa3zrrZbP5ZYg159sNoLRb61nQ7awl5pSvIq5Qpj81vwDzdMRKzkWJGJuwVvWpvZKx7vspJALyvaaIQyug==", + "requires": { + "@actions/http-client": "^2.0.1", + "uuid": "^8.3.2" + } + }, + "@actions/http-client": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.0.1.tgz", + "integrity": "sha512-PIXiMVtz6VvyaRsGY268qvj57hXQEpsYogYOu2nrQhlf+XCGmZstmuZBbAybUl1nQGnvS1k1eEsQ69ZoD7xlSw==", + "requires": { + "tunnel": "^0.0.6" + } + }, + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/compat-data": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", + "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==" + }, + "@babel/core": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.0.tgz", + "integrity": "sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.0", + "@babel/helper-module-transforms": "^7.15.0", + "@babel/helpers": "^7.14.8", + "@babel/parser": "^7.15.0", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "requires": { + "@babel/highlight": "^7.14.5" + } + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "@babel/eslint-parser": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.17.0.tgz", + "integrity": "sha512-PUEJ7ZBXbRkbq3qqM/jZ2nIuakUBqCYc7Qf52Lj7dlZ6zERnqisdHioL0l4wwQZnmskMeasqUNzLBFKs3nylXA==", + "requires": { + "eslint-scope": "^5.1.1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.0" + } + }, + "@babel/generator": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz", + "integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==", + "requires": { + "@babel/types": "^7.15.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz", + "integrity": "sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==", + "requires": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + } + }, + "@babel/helper-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", + "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", + "requires": { + "@babel/helper-get-function-arity": "^7.14.5", + "@babel/template": "^7.14.5", + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", + "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", + "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz", + "integrity": "sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==", + "requires": { + "@babel/types": "^7.15.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", + "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-module-transforms": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz", + "integrity": "sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==", + "requires": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-replace-supers": "^7.15.0", + "@babel/helper-simple-access": "^7.14.8", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", + "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-replace-supers": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz", + "integrity": "sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.15.0", + "@babel/helper-optimise-call-expression": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", + "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", + "requires": { + "@babel/types": "^7.14.8" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", + "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "requires": { + "@babel/types": "^7.14.5" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==" + }, + "@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==" + }, + "@babel/helpers": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.3.tgz", + "integrity": "sha512-HwJiz52XaS96lX+28Tnbu31VeFSQJGOeKHJeaEPQlTl7PnlhFElWPj8tUXtqFIzeN86XxXoBr+WFAyK2PPVz6g==", + "requires": { + "@babel/template": "^7.14.5", + "@babel/traverse": "^7.15.0", + "@babel/types": "^7.15.0" + } + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.14.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz", + "integrity": "sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==" + } + } + }, + "@babel/parser": { + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", + "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==" + }, + "@babel/runtime": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz", + "integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==", + "requires": { + "regenerator-runtime": "^0.13.11" + } + }, + "@babel/runtime-corejs3": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.20.6.tgz", + "integrity": "sha512-tqeujPiuEfcH067mx+7otTQWROVMKHXEaOQcAeNV5dDdbPWvPcFA8/W9LXw2NfjNmOetqLl03dfnG2WALPlsRQ==", + "requires": { + "core-js-pure": "^3.25.1", + "regenerator-runtime": "^0.13.11" + } + }, + "@babel/template": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", + "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.14.5", + "@babel/types": "^7.14.5" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "requires": { + "@babel/highlight": "^7.14.5" + } + } + } + }, + "@babel/traverse": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz", + "integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.0", + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-hoist-variables": "^7.14.5", + "@babel/helper-split-export-declaration": "^7.14.5", + "@babel/parser": "^7.15.0", + "@babel/types": "^7.15.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", + "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "requires": { + "@babel/highlight": "^7.14.5" + } + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "@babel/types": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz", + "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "@es-joy/jsdoccomment": { + "version": "0.10.8", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.10.8.tgz", + "integrity": "sha512-3P1JiGL4xaR9PoTKUHa2N/LKwa2/eUdRqGwijMWWgBqbFEqJUVpmaOi2TcjcemrsRMgFLBzQCK4ToPhrSVDiFQ==", + "requires": { + "comment-parser": "1.2.4", + "esquery": "^1.4.0", + "jsdoc-type-pratt-parser": "1.1.1" + }, + "dependencies": { + "jsdoc-type-pratt-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.1.1.tgz", + "integrity": "sha512-uelRmpghNwPBuZScwgBG/OzodaFk5RbO5xaivBdsAY70icWfShwZ7PCMO0x1zSkOa8T1FzHThmrdoyg/0AwV5g==" + } + } + }, + "@esbuild/android-arm": { + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.10.tgz", + "integrity": "sha512-RmJjQTRrO6VwUWDrzTBLmV4OJZTarYsiepLGlF2rYTVB701hSorPywPGvP6d8HCuuRibyXa5JX4s3jN2kHEtjQ==", + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.10.tgz", + "integrity": "sha512-47Y+NwVKTldTlDhSgJHZ/RpvBQMUDG7eKihqaF/u6g7s0ZPz4J1vy8A3rwnnUOF2CuDn7w7Gj/QcMoWz3U3SJw==", + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.10.tgz", + "integrity": "sha512-C4PfnrBMcuAcOurQzpF1tTtZz94IXO5JmICJJ3NFJRHbXXsQUg9RFG45KvydKqtFfBaFLCHpduUkUfXwIvGnRg==", + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.10.tgz", + "integrity": "sha512-bH/bpFwldyOKdi9HSLCLhhKeVgRYr9KblchwXgY2NeUHBB/BzTUHtUSBgGBmpydB1/4E37m+ggXXfSrnD7/E7g==", + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.10.tgz", + "integrity": "sha512-OXt7ijoLuy+AjDSKQWu+KdDFMBbdeaL6wtgMKtDUXKWHiAMKHan5+R1QAG6HD4+K0nnOvEJXKHeA9QhXNAjOTQ==", + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.10.tgz", + "integrity": "sha512-shSQX/3GHuspE3Uxtq5kcFG/zqC+VuMnJkqV7LczO41cIe6CQaXHD3QdMLA4ziRq/m0vZo7JdterlgbmgNIAlQ==", + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.10.tgz", + "integrity": "sha512-5YVc1zdeaJGASijZmTzSO4h6uKzsQGG3pkjI6fuXvolhm3hVRhZwnHJkforaZLmzvNv5Tb7a3QL2FAVmrgySIA==", + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.10.tgz", + "integrity": "sha512-c360287ZWI2miBnvIj23bPyVctgzeMT2kQKR+x94pVqIN44h3GF8VMEs1SFPH1UgyDr3yBbx3vowDS1SVhyVhA==", + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.10.tgz", + "integrity": "sha512-2aqeNVxIaRfPcIaMZIFoblLh588sWyCbmj1HHCCs9WmeNWm+EIN0SmvsmPvTa/TsNZFKnxTcvkX2eszTcCqIrA==", + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.10.tgz", + "integrity": "sha512-sqMIEWeyrLGU7J5RB5fTkLRIFwsgsQ7ieWXlDLEmC2HblPYGb3AucD7inw2OrKFpRPKsec1l+lssiM3+NV5aOw==", + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.10.tgz", + "integrity": "sha512-O7Pd5hLEtTg37NC73pfhUOGTjx/+aXu5YoSq3ahCxcN7Bcr2F47mv+kG5t840thnsEzrv0oB70+LJu3gUgchvg==", + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.10.tgz", + "integrity": "sha512-FN8mZOH7531iPHM0kaFhAOqqNHoAb6r/YHW2ZIxNi0a85UBi2DO4Vuyn7t1p4UN8a4LoAnLOT1PqNgHkgBJgbA==", + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.10.tgz", + "integrity": "sha512-Dg9RiqdvHOAWnOKIOTsIx8dFX9EDlY2IbPEY7YFzchrCiTZmMkD7jWA9UdZbNUygPjdmQBVPRCrLydReFlX9yg==", + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.10.tgz", + "integrity": "sha512-XMqtpjwzbmlar0BJIxmzu/RZ7EWlfVfH68Vadrva0Wj5UKOdKvqskuev2jY2oPV3aoQUyXwnMbMrFmloO2GfAw==", + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.10.tgz", + "integrity": "sha512-fu7XtnoeRNFMx8DjK3gPWpFBDM2u5ba+FYwg27SjMJwKvJr4bDyKz5c+FLXLUSSAkMAt/UL+cUbEbra+rYtUgw==", + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.10.tgz", + "integrity": "sha512-61lcjVC/RldNNMUzQQdyCWjCxp9YLEQgIxErxU9XluX7juBdGKb0pvddS0vPNuCvotRbzijZ1pzII+26haWzbA==", + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.10.tgz", + "integrity": "sha512-JeZXCX3viSA9j4HqSoygjssdqYdfHd6yCFWyfSekLbz4Ef+D2EjvsN02ZQPwYl5a5gg/ehdHgegHhlfOFP0HCA==", + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.10.tgz", + "integrity": "sha512-3qpxQKuEVIIg8SebpXsp82OBrqjPV/OwNWmG+TnZDr3VGyChNnGMHccC1xkbxCHDQNnnXjxhMQNyHmdFJbmbRA==", + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.10.tgz", + "integrity": "sha512-z+q0xZ+et/7etz7WoMyXTHZ1rB8PMSNp/FOqURLJLOPb3GWJ2aj4oCqFCjPwEbW1rsT7JPpxeH/DwGAWk/I1Bg==", + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.10.tgz", + "integrity": "sha512-+YYu5sbQ9npkNT9Dec+tn1F/kjg6SMgr6bfi/6FpXYZvCRfu2YFPZGb+3x8K30s8eRxFpoG4sGhiSUkr1xbHEw==", + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.10.tgz", + "integrity": "sha512-Aw7Fupk7XNehR1ftHGYwUteyJ2q+em/aE+fVU3YMTBN2V5A7Z4aVCSV+SvCp9HIIHZavPFBpbdP3VfjQpdf6Xg==", + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.10.tgz", + "integrity": "sha512-qddWullt3sC1EIpfHvCRBq3H4g3L86DZpD6n8k2XFjFVyp01D++uNbN1hT/JRsHxTbyyemZcpwL5aRlJwc/zFw==", + "optional": true + }, + "@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "globals": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "requires": { + "type-fest": "^0.20.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + } + } + }, + "@esm-bundle/chai": { + "version": "4.3.4-fix.0", + "resolved": "https://registry.npmjs.org/@esm-bundle/chai/-/chai-4.3.4-fix.0.tgz", + "integrity": "sha512-26SKdM4uvDWlY8/OOOxSB1AqQWeBosCX3wRYUZO7enTAj03CtVxIiCimYVG2WpULcyV51qapK4qTovwkUr5Mlw==", + "requires": { + "@types/chai": "^4.2.12" + } + }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==" + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" + } + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==" + }, + "@jest/schemas": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", + "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "requires": { + "@sinclair/typebox": "^0.24.1" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "@mapbox/node-pre-gyp": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.10.tgz", + "integrity": "sha512-4ySo4CjzStuprMwk35H5pPbkymjv1SF3jGLj6rAHp/xT/RF7TL7bd9CTm1xDY49K2qF7jmR/g7k+SkLETP6opA==", + "requires": { + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" + }, + "dependencies": { + "are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "gauge": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==", + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "object-assign": "^4.1.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + } + }, + "minipass": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz", + "integrity": "sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "requires": { + "abbrev": "1" + } + }, + "npmlog": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==", + "requires": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^3.0.0", + "set-blocking": "^2.0.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "tar": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", + "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^4.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + } + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@prettier/plugin-xml": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@prettier/plugin-xml/-/plugin-xml-2.2.0.tgz", + "integrity": "sha512-UWRmygBsyj4bVXvDiqSccwT1kmsorcwQwaIy30yVh8T+Gspx4OlC0shX1y+ZuwXZvgnafmpRYKks0bAu9urJew==", + "requires": { + "@xml-tools/parser": "^1.0.11", + "prettier": ">=2.4.0" + } + }, + "@rollup/plugin-node-resolve": { + "version": "13.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz", + "integrity": "sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw==", + "requires": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "deepmerge": "^4.2.2", + "is-builtin-module": "^3.1.0", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + }, + "dependencies": { + "@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "requires": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + } + }, + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + } + } + }, + "@rollup/pluginutils": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "requires": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + } + }, + "@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==" + }, + "@types/accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha512-jOdnI/3qTpHABjM5cx1Hc0sKsPoYCp+DP/GJRGtDlPd7fiV9oXGGIcjW/ZOxLIvjGz8MA+uMZI9metHlgqbgwQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/babel__code-frame": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@types/babel__code-frame/-/babel__code-frame-7.0.3.tgz", + "integrity": "sha512-2TN6oiwtNjOezilFVl77zwdNPwQWaDBBCCWWxyo1ctiO3vAtd7H/aB/CBJdw9+kqq3+latD0SXoedIuHySSZWw==" + }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==" + }, + "@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "requires": { + "@types/chai": "*" + } + }, + "@types/co-body": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/co-body/-/co-body-6.1.0.tgz", + "integrity": "sha512-3e0q2jyDAnx/DSZi0z2H0yoZ2wt5yRDZ+P7ymcMObvq0ufWRT4tsajyO+Q1VwVWiv9PRR4W3YEjEzBjeZlhF+w==", + "requires": { + "@types/node": "*", + "@types/qs": "*" + } + }, + "@types/command-line-args": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.0.tgz", + "integrity": "sha512-UuKzKpJJ/Ief6ufIaIzr3A/0XnluX7RvFgwkV89Yzvm77wCh1kFaFmqN8XEnGcN62EuHdedQjEMb8mYxFLGPyA==" + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "requires": { + "@types/node": "*" + } + }, + "@types/content-disposition": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@types/content-disposition/-/content-disposition-0.5.5.tgz", + "integrity": "sha512-v6LCdKfK6BwcqMo+wYW05rLS12S0ZO0Fl4w1h4aaZMD7bqT3gVUns6FvLJKGZHQmYn3SX55JWGpziwJRwVgutA==" + }, + "@types/convert-source-map": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@types/convert-source-map/-/convert-source-map-1.5.2.tgz", + "integrity": "sha512-tHs++ZeXer40kCF2JpE51Hg7t4HPa18B1b1Dzy96S0eCw8QKECNMYMfwa1edK/x8yCN0r4e6ewvLcc5CsVGkdg==" + }, + "@types/cookies": { + "version": "0.7.7", + "resolved": "https://registry.npmjs.org/@types/cookies/-/cookies-0.7.7.tgz", + "integrity": "sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==", + "requires": { + "@types/connect": "*", + "@types/express": "*", + "@types/keygrip": "*", + "@types/node": "*" + } + }, + "@types/css.escape": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@types/css.escape/-/css.escape-1.5.0.tgz", + "integrity": "sha512-671nGwh8AQrhdjS584m9wypN0cJEzy7A97sReLuwypIXPiRqRcjKVnrO7Z72sS0QrwxlU7HraNgNITyr9u9Rpw==" + }, + "@types/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-epMsEE85fi4lfmJUH/89/iV/LI+F5CvNIvmgs5g5jYFPfhO2S/ae8WSsLOKWdwtoaZw9Q2IhJ4tQ5tFCcS/4HA==" + }, + "@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" + }, + "@types/express": { + "version": "4.17.14", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", + "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.31", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", + "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "@types/http-assert": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@types/http-assert/-/http-assert-1.5.3.tgz", + "integrity": "sha512-FyAOrDuQmBi8/or3ns4rwPno7/9tJTijVW6aQQjK02+kOQ8zmoNg2XJtAuQhvQcy1ASJq38wirX5//9J1EqoUA==" + }, + "@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" + }, + "@types/keygrip": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@types/keygrip/-/keygrip-1.0.2.tgz", + "integrity": "sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==" + }, + "@types/koa": { + "version": "2.13.5", + "resolved": "https://registry.npmjs.org/@types/koa/-/koa-2.13.5.tgz", + "integrity": "sha512-HSUOdzKz3by4fnqagwthW/1w/yJspTgppyyalPVbgZf8jQWvdIXcVW5h2DGtw4zYntOaeRGx49r1hxoPWrD4aA==", + "requires": { + "@types/accepts": "*", + "@types/content-disposition": "*", + "@types/cookies": "*", + "@types/http-assert": "*", + "@types/http-errors": "*", + "@types/keygrip": "*", + "@types/koa-compose": "*", + "@types/node": "*" + } + }, + "@types/koa-compose": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@types/koa-compose/-/koa-compose-3.2.5.tgz", + "integrity": "sha512-B8nG/OoE1ORZqCkBVsup/AKcvjdgoHnfi4pZMn5UwAPCbhk/96xyv284eBYW8JlQbQ7zDmnpFr68I/40mFoIBQ==", + "requires": { + "@types/koa": "*" + } + }, + "@types/mime": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", + "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==" + }, + "@types/mocha": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.3.tgz", + "integrity": "sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw==" + }, + "@types/node": { + "version": "18.11.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.17.tgz", + "integrity": "sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng==" + }, + "@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==" + }, + "@types/parse5": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", + "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==" + }, + "@types/prettier": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", + "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==" + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, + "@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "requires": { + "@types/node": "*" + } + }, + "@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==" + }, + "@types/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", + "requires": { + "@types/mime": "*", + "@types/node": "*" + } + }, + "@types/ws": { + "version": "7.4.7", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", + "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", + "requires": { + "@types/node": "*" + } + }, + "@types/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "optional": true, + "requires": { + "@types/node": "*" + } + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.47.0.tgz", + "integrity": "sha512-AHZtlXAMGkDmyLuLZsRpH3p4G/1iARIwc/T0vIem2YB+xW6pZaXYXzCBnZSF/5fdM97R9QqZWZ+h3iW10XgevQ==", + "requires": { + "@typescript-eslint/scope-manager": "5.47.0", + "@typescript-eslint/type-utils": "5.47.0", + "@typescript-eslint/utils": "5.47.0", + "debug": "^4.3.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/parser": { + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.47.0.tgz", + "integrity": "sha512-udPU4ckK+R1JWCGdQC4Qa27NtBg7w020ffHqGyAK8pAgOVuNw7YaKXGChk+udh+iiGIJf6/E/0xhVXyPAbsczw==", + "requires": { + "@typescript-eslint/scope-manager": "5.47.0", + "@typescript-eslint/types": "5.47.0", + "@typescript-eslint/typescript-estree": "5.47.0", + "debug": "^4.3.4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.47.0.tgz", + "integrity": "sha512-dvJab4bFf7JVvjPuh3sfBUWsiD73aiftKBpWSfi3sUkysDQ4W8x+ZcFpNp7Kgv0weldhpmMOZBjx1wKN8uWvAw==", + "requires": { + "@typescript-eslint/types": "5.47.0", + "@typescript-eslint/visitor-keys": "5.47.0" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.47.0.tgz", + "integrity": "sha512-1J+DFFrYoDUXQE1b7QjrNGARZE6uVhBqIvdaXTe5IN+NmEyD68qXR1qX1g2u4voA+nCaelQyG8w30SAOihhEYg==", + "requires": { + "@typescript-eslint/typescript-estree": "5.47.0", + "@typescript-eslint/utils": "5.47.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "@typescript-eslint/types": { + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.47.0.tgz", + "integrity": "sha512-eslFG0Qy8wpGzDdYKu58CEr3WLkjwC5Usa6XbuV89ce/yN5RITLe1O8e+WFEuxnfftHiJImkkOBADj58ahRxSg==" + }, + "@typescript-eslint/typescript-estree": { + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.47.0.tgz", + "integrity": "sha512-LxfKCG4bsRGq60Sqqu+34QT5qT2TEAHvSCCJ321uBWywgE2dS0LKcu5u+3sMGo+Vy9UmLOhdTw5JHzePV/1y4Q==", + "requires": { + "@typescript-eslint/types": "5.47.0", + "@typescript-eslint/visitor-keys": "5.47.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/utils": { + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.47.0.tgz", + "integrity": "sha512-U9xcc0N7xINrCdGVPwABjbAKqx4GK67xuMV87toI+HUqgXj26m6RBp9UshEXcTrgCkdGYFzgKLt8kxu49RilDw==", + "requires": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.47.0", + "@typescript-eslint/types": "5.47.0", + "@typescript-eslint/typescript-estree": "5.47.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + }, + "dependencies": { + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "requires": { + "eslint-visitor-keys": "^2.0.0" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/visitor-keys": { + "version": "5.47.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.47.0.tgz", + "integrity": "sha512-ByPi5iMa6QqDXe/GmT/hR6MZtVPi0SqMQPDx15FczCBXJo/7M8T88xReOALAfpBLm+zxpPfmhuEvPb577JRAEg==", + "requires": { + "@typescript-eslint/types": "5.47.0", + "eslint-visitor-keys": "^3.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==" + } + } + }, + "@vitest/coverage-istanbul": { + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/@vitest/coverage-istanbul/-/coverage-istanbul-0.26.2.tgz", + "integrity": "sha512-3tU7vrgnPiGdIoX9VpIqR2geBuk5er4+2m0flO563R+1lV4guqO2bKbCNqEGpnIRcmnWJKQI1LeXndPexqIHtA==", + "requires": { + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-instrument": "^5.2.1", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.1", + "istanbul-reports": "^3.1.5", + "test-exclude": "^6.0.0", + "vitest": "0.26.2" + }, + "dependencies": { + "istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + } + }, + "istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + } + } + }, + "@web/browser-logs": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@web/browser-logs/-/browser-logs-0.2.5.tgz", + "integrity": "sha512-Qxo1wY/L7yILQqg0jjAaueh+tzdORXnZtxQgWH23SsTCunz9iq9FvsZa8Q5XlpjnZ3vLIsFEuEsCMqFeohJnEg==", + "requires": { + "errorstacks": "^2.2.0" + } + }, + "@web/config-loader": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@web/config-loader/-/config-loader-0.1.3.tgz", + "integrity": "sha512-XVKH79pk4d3EHRhofete8eAnqto1e8mCRAqPV00KLNFzCWSe8sWmLnqKCqkPNARC6nksMaGrATnA5sPDRllMpQ==", + "requires": { + "semver": "^7.3.4" + }, + "dependencies": { + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@web/dev-server": { + "version": "0.1.35", + "resolved": "https://registry.npmjs.org/@web/dev-server/-/dev-server-0.1.35.tgz", + "integrity": "sha512-E7TSTSFdGPzhkiE3kIVt8i49gsiAYpJIZHzs1vJmVfdt8U4rsmhE+5roezxZo0hkEw4mNsqj9zCc4Dzqy/IFHg==", + "requires": { + "@babel/code-frame": "^7.12.11", + "@types/command-line-args": "^5.0.0", + "@web/config-loader": "^0.1.3", + "@web/dev-server-core": "^0.3.19", + "@web/dev-server-rollup": "^0.3.19", + "camelcase": "^6.2.0", + "command-line-args": "^5.1.1", + "command-line-usage": "^6.1.1", + "debounce": "^1.2.0", + "deepmerge": "^4.2.2", + "ip": "^1.1.5", + "nanocolors": "^0.2.1", + "open": "^8.0.2", + "portfinder": "^1.0.32" + }, + "dependencies": { + "async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "requires": { + "lodash": "^4.17.14" + } + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "requires": { + "minimist": "^1.2.6" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "portfinder": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", + "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", + "requires": { + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" + } + } + } + }, + "@web/dev-server-core": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@web/dev-server-core/-/dev-server-core-0.3.19.tgz", + "integrity": "sha512-Q/Xt4RMVebLWvALofz1C0KvP8qHbzU1EmdIA2Y1WMPJwiFJFhPxdr75p9YxK32P2t0hGs6aqqS5zE0HW9wYzYA==", + "requires": { + "@types/koa": "^2.11.6", + "@types/ws": "^7.4.0", + "@web/parse5-utils": "^1.2.0", + "chokidar": "^3.4.3", + "clone": "^2.1.2", + "es-module-lexer": "^1.0.0", + "get-stream": "^6.0.0", + "is-stream": "^2.0.0", + "isbinaryfile": "^4.0.6", + "koa": "^2.13.0", + "koa-etag": "^4.0.0", + "koa-send": "^5.0.1", + "koa-static": "^5.0.0", + "lru-cache": "^6.0.0", + "mime-types": "^2.1.27", + "parse5": "^6.0.1", + "picomatch": "^2.2.2", + "ws": "^7.4.2" + } + }, + "@web/dev-server-rollup": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@web/dev-server-rollup/-/dev-server-rollup-0.3.19.tgz", + "integrity": "sha512-IwiwI+fyX0YuvAOldStlYJ+Zm/JfSCk9OSGIs7+fWbOYysEHwkEVvBwoPowaclSZA44Tobvqt+6ej9udbbZ/WQ==", + "requires": { + "@rollup/plugin-node-resolve": "^13.0.4", + "@web/dev-server-core": "^0.3.19", + "nanocolors": "^0.2.1", + "parse5": "^6.0.1", + "rollup": "^2.67.0", + "whatwg-url": "^11.0.0" + }, + "dependencies": { + "rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "requires": { + "fsevents": "~2.3.2" + } + } + } + }, + "@web/parse5-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@web/parse5-utils/-/parse5-utils-1.3.0.tgz", + "integrity": "sha512-Pgkx3ECc8EgXSlS5EyrgzSOoUbM6P8OKS471HLAyvOBcP1NCBn0to4RN/OaKASGq8qa3j+lPX9H14uA5AHEnQg==", + "requires": { + "@types/parse5": "^6.0.1", + "parse5": "^6.0.1" + } + }, + "@web/test-runner": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@web/test-runner/-/test-runner-0.15.0.tgz", + "integrity": "sha512-8gliiQPRY4oDeq90i53mb5LiilCIzfW6SRGkmZ3K62c1DpOdZsCIgt7GH2OsFF8mB9rb4olK7qQ0gdmRgm27jw==", + "requires": { + "@web/browser-logs": "^0.2.2", + "@web/config-loader": "^0.1.3", + "@web/dev-server": "^0.1.35", + "@web/test-runner-chrome": "^0.11.0", + "@web/test-runner-commands": "^0.6.3", + "@web/test-runner-core": "^0.10.27", + "@web/test-runner-mocha": "^0.7.5", + "camelcase": "^6.2.0", + "command-line-args": "^5.1.1", + "command-line-usage": "^6.1.1", + "convert-source-map": "^1.7.0", + "diff": "^5.0.0", + "globby": "^11.0.1", + "nanocolors": "^0.2.1", + "portfinder": "^1.0.32", + "source-map": "^0.7.3" + }, + "dependencies": { + "async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "requires": { + "lodash": "^4.17.14" + } + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "requires": { + "minimist": "^1.2.6" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "portfinder": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.32.tgz", + "integrity": "sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==", + "requires": { + "async": "^2.6.4", + "debug": "^3.2.7", + "mkdirp": "^0.5.6" + } + }, + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==" + } + } + }, + "@web/test-runner-chrome": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@web/test-runner-chrome/-/test-runner-chrome-0.11.0.tgz", + "integrity": "sha512-3Eq8C1XEGmfq7iwUvXy0xXfI/fbJNIq2ImDKTVdnwT4+5uTt1i8UFZxZ0PLdkWrhXVtiWI6zcZK/2VBzsGyHBA==", + "requires": { + "@web/test-runner-core": "^0.10.20", + "@web/test-runner-coverage-v8": "^0.5.0", + "chrome-launcher": "^0.15.0", + "puppeteer-core": "^13.1.3" + } + }, + "@web/test-runner-commands": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@web/test-runner-commands/-/test-runner-commands-0.6.5.tgz", + "integrity": "sha512-W+wLg10jEAJY9N6tNWqG1daKmAzxGmTbO/H9fFfcgOgdxdn+hHiR4r2/x1iylKbFLujHUQlnjNQeu2d6eDPFqg==", + "requires": { + "@web/test-runner-core": "^0.10.27", + "mkdirp": "^1.0.4" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, + "@web/test-runner-core": { + "version": "0.10.27", + "resolved": "https://registry.npmjs.org/@web/test-runner-core/-/test-runner-core-0.10.27.tgz", + "integrity": "sha512-ClV/hSxs4wDm/ANFfQOdRRFb/c0sYywC1QfUXG/nS4vTp3nnt7x7mjydtMGGLmvK9f6Zkubkc1aa+7ryfmVwNA==", + "requires": { + "@babel/code-frame": "^7.12.11", + "@types/babel__code-frame": "^7.0.2", + "@types/co-body": "^6.1.0", + "@types/convert-source-map": "^1.5.1", + "@types/debounce": "^1.2.0", + "@types/istanbul-lib-coverage": "^2.0.3", + "@types/istanbul-reports": "^3.0.0", + "@web/browser-logs": "^0.2.1", + "@web/dev-server-core": "^0.3.18", + "chokidar": "^3.4.3", + "cli-cursor": "^3.1.0", + "co-body": "^6.1.0", + "convert-source-map": "^1.7.0", + "debounce": "^1.2.0", + "dependency-graph": "^0.11.0", + "globby": "^11.0.1", + "ip": "^1.1.5", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-reports": "^3.0.2", + "log-update": "^4.0.0", + "nanocolors": "^0.2.1", + "nanoid": "^3.1.25", + "open": "^8.0.2", + "picomatch": "^2.2.2", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==" + } + } + }, + "@web/test-runner-coverage-v8": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@web/test-runner-coverage-v8/-/test-runner-coverage-v8-0.5.0.tgz", + "integrity": "sha512-4eZs5K4JG7zqWEhVSO8utlscjbVScV7K6JVwoWWcObFTGAaBMbDVzwGRimyNSzvmfTdIO/Arze4CeUUfCl4iLQ==", + "requires": { + "@web/test-runner-core": "^0.10.20", + "istanbul-lib-coverage": "^3.0.0", + "picomatch": "^2.2.2", + "v8-to-istanbul": "^9.0.1" + } + }, + "@web/test-runner-mocha": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@web/test-runner-mocha/-/test-runner-mocha-0.7.5.tgz", + "integrity": "sha512-12/OBq6efPCAvJpcz3XJs2OO5nHe7GtBibZ8Il1a0QtsGpRmuJ4/m1EF0Fj9f6KHg7JdpGo18A37oE+5hXjHwg==", + "requires": { + "@types/mocha": "^8.2.0", + "@web/test-runner-core": "^0.10.20" + } + }, + "@web/test-runner-playwright": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@web/test-runner-playwright/-/test-runner-playwright-0.9.0.tgz", + "integrity": "sha512-RhWkz1CY3KThHoX89yZ/gz9wDSPujxd2wMWNxqhov4y/XDI+0TS44TWKBfWXnuvlQFZPi8JFT7KibCo3pb/Mcg==", + "requires": { + "@web/test-runner-core": "^0.10.20", + "@web/test-runner-coverage-v8": "^0.5.0", + "playwright": "^1.22.2" + } + }, + "@xml-tools/parser": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@xml-tools/parser/-/parser-1.0.11.tgz", + "integrity": "sha512-aKqQ077XnR+oQtHJlrAflaZaL7qZsulWc/i/ZEooar5JiWj1eLt0+Wg28cpa+XLney107wXqneC+oG1IZvxkTA==", + "requires": { + "chevrotain": "7.1.1" + } + }, + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=" + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "optional": true + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "requires": { + "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" + } + } + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + } + } + }, + "aria-query": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", + "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", + "requires": { + "@babel/runtime": "^7.10.2", + "@babel/runtime-corejs3": "^7.10.2" + } + }, + "array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==" + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "array-includes": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz", + "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + } + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==" + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + }, + "array.prototype.flat": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", + "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.2", + "es-shim-unscopables": "^1.0.0" + }, + "dependencies": { + "es-abstract": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.5.tgz", + "integrity": "sha512-Aa2G2+Rd3b6kxEUKTF4TaW67czBLyAv3z7VOhYRU50YBx+bbsYZ9xQP4lMNazePuFlybXI0V4MruPos7qUo5fA==", + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "requires": { + "call-bind": "^1.0.2" + } + } + } + }, + "array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "dependencies": { + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "es-abstract": { + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", + "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "unbox-primitive": "^1.0.2" + } + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + } + } + }, + "array.prototype.tosorted": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + }, + "dependencies": { + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "es-abstract": { + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", + "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "unbox-primitive": "^1.0.2" + } + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + } + } + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" + }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==" + }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==" + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + }, + "axe-core": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.5.2.tgz", + "integrity": "sha512-u2MVsXfew5HBvjsczCv+xlwdNnB1oQR9HlAcsejZttNjKKSkeDNVwB1vMThIUIFI9GoT57Vtk8iQLwqOfAkboA==" + }, + "axobject-query": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", + "integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "basic-auth": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.1.0.tgz", + "integrity": "sha1-RSIe5Cn37h5QNb4/UVM/HN/SmIQ=" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.16.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.8.tgz", + "integrity": "sha512-sc2m9ohR/49sWEbPj14ZSSZqp+kbi16aLao42Hmn3Z8FpjuMaq2xCA2l4zl9ITfyzvnvyE0hcg62YkIGKxgaNQ==", + "requires": { + "caniuse-lite": "^1.0.30001251", + "colorette": "^1.3.0", + "electron-to-chromium": "^1.3.811", + "escalade": "^3.1.1", + "node-releases": "^1.1.75" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "builtin-modules": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz", + "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==" + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==" + }, + "cache-content-type": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", + "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", + "requires": { + "mime-types": "^2.1.18", + "ylru": "^1.2.0" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" + }, + "caniuse-lite": { + "version": "1.0.30001252", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001252.tgz", + "integrity": "sha512-I56jhWDGMtdILQORdusxBOH+Nl/KgQSdDmpJezYddnAkVOmnoU8zwjTV9xAjMIYxr0iPreEAVylCGcmHCjfaOw==" + }, + "chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + } + }, + "chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "requires": { + "check-error": "^1.0.2" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=" + }, + "chevrotain": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-7.1.1.tgz", + "integrity": "sha512-wy3mC1x4ye+O+QkEinVJkPf5u2vsrDIYW9G7ZuwFl6v/Yu0LwUuT2POsb+NUWApebyxfkQq6+yDfRExbnI5rcw==", + "requires": { + "regexp-to-ast": "0.5.0" + } + }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "chrome-launcher": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.1.tgz", + "integrity": "sha512-UugC8u59/w2AyX5sHLZUHoxBAiSiunUhZa3zZwMH6zPVis0C3dDKiRWyUGIo14tTbZHGVviWxv3PQWZ7taZ4fg==", + "requires": { + "@types/node": "*", + "escape-string-regexp": "^4.0.0", + "is-wsl": "^2.2.0", + "lighthouse-logger": "^1.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + } + } + }, + "clean-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", + "integrity": "sha1-jffHquUf02h06PjQW5GAvBGj/tc=", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==" + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==" + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==" + }, + "co-body": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.1.0.tgz", + "integrity": "sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==", + "requires": { + "inflation": "^2.0.0", + "qs": "^6.5.2", + "raw-body": "^2.3.3", + "type-is": "^1.6.16" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" + }, + "colorette": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.3.0.tgz", + "integrity": "sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==" + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" + }, + "command-line-args": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "requires": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + } + }, + "command-line-usage": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", + "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", + "requires": { + "array-back": "^4.0.2", + "chalk": "^2.4.2", + "table-layout": "^1.0.2", + "typical": "^5.2.0" + }, + "dependencies": { + "array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==" + }, + "typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==" + } + } + }, + "comment-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.2.4.tgz", + "integrity": "sha512-pm0b+qv+CkWNriSTMsfnjChF9kH0kxz55y44Wo5le9qLxMj5xDQAaEd9ZN1ovSuk9CsrncWaFwgpOMg7ClJwkw==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==" + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "requires": { + "safe-buffer": "~5.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "cookies": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", + "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", + "requires": { + "depd": "~2.0.0", + "keygrip": "~1.1.0" + } + }, + "core-js-pure": { + "version": "3.26.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.26.1.tgz", + "integrity": "sha512-VVXcDpp/xJ21KdULRq/lXdLzQAtX7+37LzpyfFM973il0tWSsDEoyzG38G14AjTpK9VTfiNM9jnFauq/CpaWGQ==" + }, + "corser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", + "integrity": "sha1-jtolLsqrWEDc2XXOuQ2TcMgZ/4c=" + }, + "cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "requires": { + "node-fetch": "2.6.7" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" + }, + "cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==" + }, + "damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==" + }, + "debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==" + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==" + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=" + }, + "devtools-protocol": { + "version": "0.0.981744", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.981744.tgz", + "integrity": "sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg==" + }, + "diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==" + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "requires": { + "path-type": "^4.0.0" + } + }, + "docdash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/docdash/-/docdash-1.2.0.tgz", + "integrity": "sha512-IYZbgYthPTspgqYeciRJNPhSwL51yer7HAwDXhF5p+H7mTDbPvY3PCk/QDjNxdPCpWkaJVFC4t7iCNB/t9E5Kw==" + }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "requires": { + "esutils": "^2.0.2" + } + }, + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "dependencies": { + "entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==" + } + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "electron-to-chromium": { + "version": "1.3.827", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.827.tgz", + "integrity": "sha512-ye+4uQOY/jbjRutMcE/EmOcNwUeo1qo9aKL2tPyb09cU3lmxNeyDF4RWiemmkknW+p29h7dyDqy02higTxc9/A==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "requires": { + "ansi-colors": "^4.1.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "errorstacks": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/errorstacks/-/errorstacks-2.4.0.tgz", + "integrity": "sha512-5ecWhU5gt0a5G05nmQcgCxP5HperSMxLDzvWlT5U+ZSKkuDK0rJ3dbCQny6/vSCIXjwrhwSecXBbw1alr295hQ==" + }, + "es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-module-lexer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.1.0.tgz", + "integrity": "sha512-fJg+1tiyEeS8figV+fPcPpm8WqJEflG3yPU0NOm5xMvrNkuiy7HzX/Ljng4Y0hAoiw4/3hQTCFYw+ub8+a2pRA==" + }, + "es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "requires": { + "has": "^1.0.3" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "esbuild": { + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.10.tgz", + "integrity": "sha512-z5dIViHoVnw2l+NCJ3zj5behdXjYvXne9gL18OOivCadXDUhyDkeSvEtLcGVAJW2fNmh33TDUpsi704XYlDodw==", + "requires": { + "@esbuild/android-arm": "0.16.10", + "@esbuild/android-arm64": "0.16.10", + "@esbuild/android-x64": "0.16.10", + "@esbuild/darwin-arm64": "0.16.10", + "@esbuild/darwin-x64": "0.16.10", + "@esbuild/freebsd-arm64": "0.16.10", + "@esbuild/freebsd-x64": "0.16.10", + "@esbuild/linux-arm": "0.16.10", + "@esbuild/linux-arm64": "0.16.10", + "@esbuild/linux-ia32": "0.16.10", + "@esbuild/linux-loong64": "0.16.10", + "@esbuild/linux-mips64el": "0.16.10", + "@esbuild/linux-ppc64": "0.16.10", + "@esbuild/linux-riscv64": "0.16.10", + "@esbuild/linux-s390x": "0.16.10", + "@esbuild/linux-x64": "0.16.10", + "@esbuild/netbsd-x64": "0.16.10", + "@esbuild/openbsd-x64": "0.16.10", + "@esbuild/sunos-x64": "0.16.10", + "@esbuild/win32-arm64": "0.16.10", + "@esbuild/win32-ia32": "0.16.10", + "@esbuild/win32-x64": "0.16.10" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "requires": { + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.2.0" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=" + }, + "estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=" + }, + "source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "requires": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "globals": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "requires": { + "type-fest": "^0.20.2" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + } + } + }, + "eslint-config-airbnb": { + "version": "19.0.4", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz", + "integrity": "sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==", + "requires": { + "eslint-config-airbnb-base": "^15.0.0", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5" + } + }, + "eslint-config-airbnb-base": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", + "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", + "requires": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.5", + "semver": "^6.3.0" + } + }, + "eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==" + }, + "eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "requires": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "requires": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + } + } + }, + "eslint-module-utils": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz", + "integrity": "sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==", + "requires": { + "debug": "^3.2.7", + "find-up": "^2.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "eslint-plugin-chai-friendly": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-chai-friendly/-/eslint-plugin-chai-friendly-0.7.2.tgz", + "integrity": "sha512-LOIfGx5sZZ5FwM1shr2GlYAWV9Omdi+1/3byuVagvQNoGUuU0iHhp7AfjA1uR+4dJ4Isfb4+FwBJgQajIw9iAg==" + }, + "eslint-plugin-import": { + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", + "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", + "requires": { + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.3", + "has": "^1.0.3", + "is-core-module": "^2.8.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.5", + "resolve": "^1.22.0", + "tsconfig-paths": "^3.14.1" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "requires": { + "esutils": "^2.0.2" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "requires": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + } + } + }, + "eslint-plugin-jsdoc": { + "version": "36.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-36.1.1.tgz", + "integrity": "sha512-nuLDvH1EJaKx0PCa9oeQIxH6pACIhZd1gkalTUxZbaxxwokjs7TplqY0Q8Ew3CoZaf5aowm0g/Z3JGHCatt+gQ==", + "requires": { + "@es-joy/jsdoccomment": "0.10.8", + "comment-parser": "1.2.4", + "debug": "^4.3.2", + "esquery": "^1.4.0", + "jsdoc-type-pratt-parser": "^1.1.1", + "lodash": "^4.17.21", + "regextras": "^0.8.0", + "semver": "^7.3.5", + "spdx-expression-parse": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "eslint-plugin-jsx-a11y": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.6.1.tgz", + "integrity": "sha512-sXgFVNHiWffBq23uiS/JaP6eVR622DqwB4yTzKvGZGcPq6/yZ3WmOZfuBks/vHWo9GaFOqC2ZK4i6+C35knx7Q==", + "requires": { + "@babel/runtime": "^7.18.9", + "aria-query": "^4.2.2", + "array-includes": "^3.1.5", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.4.3", + "axobject-query": "^2.2.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.3.2", + "language-tags": "^1.0.5", + "minimatch": "^3.1.2", + "semver": "^6.3.0" + }, + "dependencies": { + "array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + } + }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "es-abstract": { + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", + "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "unbox-primitive": "^1.0.2" + } + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + } + } + }, + "eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "requires": { + "prettier-linter-helpers": "^1.0.0" + } + }, + "eslint-plugin-react": { + "version": "7.31.11", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz", + "integrity": "sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw==", + "requires": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.3", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.8" + }, + "dependencies": { + "array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + } + }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "requires": { + "esutils": "^2.0.2" + } + }, + "es-abstract": { + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", + "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "unbox-primitive": "^1.0.2" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + } + } + }, + "eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==" + }, + "eslint-plugin-unicorn": { + "version": "36.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-36.0.0.tgz", + "integrity": "sha512-xxN2vSctGWnDW6aLElm/LKIwcrmk6mdiEcW55Uv5krcrVcIFSWMmEgc/hwpemYfZacKZ5npFERGNz4aThsp1AA==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "ci-info": "^3.2.0", + "clean-regexp": "^1.0.0", + "eslint-template-visitor": "^2.3.2", + "eslint-utils": "^3.0.0", + "is-builtin-module": "^3.1.0", + "lodash": "^4.17.21", + "pluralize": "^8.0.0", + "read-pkg-up": "^7.0.1", + "regexp-tree": "^0.1.23", + "safe-regex": "^2.1.1", + "semver": "^7.3.5" + }, + "dependencies": { + "ci-info": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz", + "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==" + }, + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "requires": { + "eslint-visitor-keys": "^2.0.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "eslint-plugin-vitest": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/eslint-plugin-vitest/-/eslint-plugin-vitest-0.0.21.tgz", + "integrity": "sha512-eer/eS0T9MW8X9CKHg6M9URKgSEOJ8I24CKQlz1WhD68Hz2Uuwepb61OHZ+33Fcuzp4YXl/qqd7XSSq+p8BJAw==", + "requires": { + "@typescript-eslint/utils": "^5.42.1" + } + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "eslint-template-visitor": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/eslint-template-visitor/-/eslint-template-visitor-2.3.2.tgz", + "integrity": "sha512-3ydhqFpuV7x1M9EK52BPNj6V0Kwu0KKkcIAfpUhwHbR8ocRln/oUHgfxQupY8O1h4Qv/POHDumb/BwwNfxbtnA==", + "requires": { + "@babel/core": "^7.12.16", + "@babel/eslint-parser": "^7.12.16", + "eslint-visitor-keys": "^2.0.0", + "esquery": "^1.3.1", + "multimap": "^1.1.0" + } + }, + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "requires": { + "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + } + } + }, + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==" + }, + "espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "requires": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + } + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=" + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "requires": { + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "fast-deep-equal": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + }, + "fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" + }, + "fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "fastq": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", + "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", + "requires": { + "reusify": "^1.0.4" + } + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "requires": { + "pend": "~1.2.0" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "requires": { + "flat-cache": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + } + }, + "find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "requires": { + "array-back": "^3.0.1" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "findup-sync": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", + "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", + "requires": { + "glob": "~5.0.0" + }, + "dependencies": { + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "requires": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + } + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==" + }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==" + }, + "follow-redirects": { + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "requires": { + "for-in": "^1.0.1" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==" + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==" + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "getobject": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz", + "integrity": "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==" + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "dependencies": { + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==" + } + } + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "requires": { + "get-intrinsic": "^1.1.3" + }, + "dependencies": { + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + } + } + }, + "grunt": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.5.3.tgz", + "integrity": "sha512-mKwmo4X2d8/4c/BmcOETHek675uOqw0RuA/zy12jaspWqvTp4+ZeQF1W+OTpcbncnaBsfbQJ6l0l4j+Sn/GmaQ==", + "requires": { + "dateformat": "~3.0.3", + "eventemitter2": "~0.4.13", + "exit": "~0.1.2", + "findup-sync": "~0.3.0", + "glob": "~7.1.6", + "grunt-cli": "~1.4.3", + "grunt-known-options": "~2.0.0", + "grunt-legacy-log": "~3.0.0", + "grunt-legacy-util": "~2.0.1", + "iconv-lite": "~0.4.13", + "js-yaml": "~3.14.0", + "minimatch": "~3.0.4", + "mkdirp": "~1.0.4", + "nopt": "~3.0.6", + "rimraf": "~3.0.2" + }, + "dependencies": { + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "grunt-cli": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz", + "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==", + "requires": { + "grunt-known-options": "~2.0.0", + "interpret": "~1.1.0", + "liftup": "~3.0.1", + "nopt": "~4.0.1", + "v8flags": "~3.2.0" + }, + "dependencies": { + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + } + } + }, + "minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, + "grunt-known-options": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz", + "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==" + }, + "grunt-legacy-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz", + "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==", + "requires": { + "colors": "~1.1.2", + "grunt-legacy-log-utils": "~2.1.0", + "hooker": "~0.2.3", + "lodash": "~4.17.19" + } + }, + "grunt-legacy-log-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz", + "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==", + "requires": { + "chalk": "~4.1.0", + "lodash": "~4.17.19" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + } + } + }, + "grunt-legacy-util": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz", + "integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==", + "requires": { + "async": "~3.2.0", + "exit": "~0.1.2", + "getobject": "~1.0.0", + "hooker": "~0.2.3", + "lodash": "~4.17.21", + "underscore.string": "~3.3.5", + "which": "~2.0.2" + }, + "dependencies": { + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "requires": { + "parse-passwd": "^1.0.0" + } + }, + "hooker": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", + "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=" + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "htmlparser2": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" + }, + "dependencies": { + "entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==" + } + } + }, + "http-assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", + "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", + "requires": { + "deep-equal": "~1.0.1", + "http-errors": "~1.8.0" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" + }, + "http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" + } + } + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-server": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/http-server/-/http-server-13.1.0.tgz", + "integrity": "sha512-MLqBMXeY/YN0FYMz4ifeOQCcg8pKj8YdmzX1pr/Vb2VrNnbxHN1s4K9BuZRVSyK/j3DQ8UVrrABb8m6EmFjWog==", + "requires": { + "basic-auth": "^1.0.3", + "chalk": "^4.1.2", + "corser": "^2.0.1", + "he": "^1.1.0", + "http-proxy": "^1.18.0", + "mime": "^1.6.0", + "minimist": "^1.2.5", + "opener": "^1.5.1", + "portfinder": "^1.0.25", + "secure-compare": "3.0.1", + "union": "~0.5.0", + "url-join": "^2.0.5" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + } + } + }, + "https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "requires": { + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "inflation": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", + "integrity": "sha512-m3xv4hJYR2oXw4o4Y5l6P5P16WYmazYof+el6Al3f+YlggGj6qT9kImBAnzDelRALnP5d3h4jGBPKzYCizjZZw==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.19", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.6.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + } + } + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=" + }, + "ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "requires": { + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-builtin-module": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.1.0.tgz", + "integrity": "sha512-OV7JjAgOTfAFJmHZLvpSTb4qi0nIILDV1gWPYDnDJUTNFM5aGlRAhk4QcT8i7TuAleeEV5Fdkqn3t4mS+Q11fg==", + "requires": { + "builtin-modules": "^3.0.0" + } + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==" + }, + "is-core-module": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" + }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "requires": { + "is-unc-path": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==" + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "requires": { + "unc-path-regex": "^0.1.2" + } + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "requires": { + "is-docker": "^2.0.0" + } + }, + "isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "istanbul": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", + "requires": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=" + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=" + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==" + }, + "istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "istanbul-reporter-shield-badge": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-reporter-shield-badge/-/istanbul-reporter-shield-badge-1.2.1.tgz", + "integrity": "sha512-BvBHpLKd2eV57umTB+qbOmsnWlYXv6wlyWpfmnUYikvO4KKuRg/cH7tYOsrWxCBRCI0k4m9rgmcGa3qaxaZ4ow==", + "requires": { + "istanbul": "^0.4.5", + "lodash.includes": "^4.3.0" + } + }, + "istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsdoc-type-pratt-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.2.0.tgz", + "integrity": "sha512-4STjeF14jp4bqha44nKMY1OUI6d2/g6uclHWUCZ7B4DoLzaB5bmpTkQrpqU+vSVzMD0LsKAOskcnI3I3VfIpmg==" + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==" + }, + "jsx-ast-utils": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", + "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "requires": { + "array-includes": "^3.1.5", + "object.assign": "^4.1.3" + }, + "dependencies": { + "array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + } + }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "es-abstract": { + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", + "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "unbox-primitive": "^1.0.2" + } + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + } + } + }, + "keygrip": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "requires": { + "tsscmp": "1.0.6" + } + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "koa": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.14.1.tgz", + "integrity": "sha512-USJFyZgi2l0wDgqkfD27gL4YGno7TfUkcmOe6UOLFOVuN+J7FwnNu4Dydl4CUQzraM1lBAiGed0M9OVJoT0Kqw==", + "requires": { + "accepts": "^1.3.5", + "cache-content-type": "^1.0.0", + "content-disposition": "~0.5.2", + "content-type": "^1.0.4", + "cookies": "~0.8.0", + "debug": "^4.3.2", + "delegates": "^1.0.0", + "depd": "^2.0.0", + "destroy": "^1.0.4", + "encodeurl": "^1.0.2", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.3.0", + "http-errors": "^1.6.3", + "is-generator-function": "^1.0.7", + "koa-compose": "^4.1.0", + "koa-convert": "^2.0.0", + "on-finished": "^2.3.0", + "only": "~0.0.2", + "parseurl": "^1.3.2", + "statuses": "^1.5.0", + "type-is": "^1.6.16", + "vary": "^1.1.2" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" + } + } + }, + "koa-compose": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", + "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==" + }, + "koa-convert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", + "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", + "requires": { + "co": "^4.6.0", + "koa-compose": "^4.1.0" + } + }, + "koa-etag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/koa-etag/-/koa-etag-4.0.0.tgz", + "integrity": "sha512-1cSdezCkBWlyuB9l6c/IFoe1ANCDdPBxkDkRiaIup40xpUub6U/wwRXoKBZw/O5BifX9OlqAjYnDyzM6+l+TAg==", + "requires": { + "etag": "^1.8.1" + } + }, + "koa-send": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/koa-send/-/koa-send-5.0.1.tgz", + "integrity": "sha512-tmcyQ/wXXuxpDxyNXv5yNNkdAMdFRqwtegBXUaowiQzUKqJehttS0x2j0eOZDQAyloAth5w6wwBImnFzkUz3pQ==", + "requires": { + "debug": "^4.1.1", + "http-errors": "^1.7.3", + "resolve-path": "^1.4.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" + }, + "http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" + } + } + }, + "koa-static": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/koa-static/-/koa-static-5.0.0.tgz", + "integrity": "sha512-UqyYyH5YEXaJrf9S8E23GoJFQZXkBVJ9zYYMPGz919MSX1KuvAcycIuS0ci150HCoPf4XQVhQ84Qf8xRPWxFaQ==", + "requires": { + "debug": "^3.1.0", + "koa-send": "^5.0.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "language-subtag-registry": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", + "integrity": "sha512-L0IqwlIXjilBVVYKFT37X9Ih11Um5NEl9cbJIuU/SwP/zEEAbBPOnEeeuxVMf45ydWQRDQN3Nqc96OgbH1K+Pg==" + }, + "language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "requires": { + "language-subtag-registry": "~0.3.2" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "libxmljs": { + "version": "0.19.10", + "resolved": "https://registry.npmjs.org/libxmljs/-/libxmljs-0.19.10.tgz", + "integrity": "sha512-RY5/MD8Po8sGVocbODbYcdrbP6pJyA171LjFyd7Bp9wwxhmA8C5bm/VmXfpdED07fdW0FeC3lopxhG7UbwGx+g==", + "requires": { + "@mapbox/node-pre-gyp": "^1.0.9", + "bindings": "~1.3.0", + "nan": "~2.14.0" + }, + "dependencies": { + "bindings": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.1.tgz", + "integrity": "sha512-i47mqjF9UbjxJhxGf+pZ6kSxrnI3wBLlnGI2ArWJ4r0VrvDS7ZYXkprq/pLaBWYq4GM0r4zdHY+NNRqEMU7uew==" + } + } + }, + "liftup": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", + "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==", + "requires": { + "extend": "^3.0.2", + "findup-sync": "^4.0.0", + "fined": "^1.2.0", + "flagged-respawn": "^1.0.1", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.1", + "rechoir": "^0.7.0", + "resolve": "^1.19.0" + }, + "dependencies": { + "findup-sync": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", + "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", + "requires": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^4.0.2", + "resolve-dir": "^1.0.1" + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + } + } + }, + "lighthouse-logger": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.3.0.tgz", + "integrity": "sha512-BbqAKApLb9ywUli+0a+PcV04SyJ/N1q/8qgCNe6U97KbPCS1BTksEuHFLYdvc8DltuhfxIUBqDZsC0bBGtl3lA==", + "requires": { + "debug": "^2.6.9", + "marky": "^1.2.2" + } + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "linkedom": { + "version": "0.14.21", + "resolved": "https://registry.npmjs.org/linkedom/-/linkedom-0.14.21.tgz", + "integrity": "sha512-V+c0AAFMTVJA2iAhrdd+u44lL0TjL6hBenVB061VQ6BHqTAHtXw1v5F1/CHGKtwg0OHm+hrGbepb9ZSFJ7lJkg==", + "requires": { + "css-select": "^5.1.0", + "cssom": "^0.5.0", + "html-escaper": "^3.0.3", + "htmlparser2": "^8.0.1", + "uhyphen": "^0.1.0" + }, + "dependencies": { + "html-escaper": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-3.0.3.tgz", + "integrity": "sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==" + } + } + }, + "local-pkg": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.2.tgz", + "integrity": "sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg==" + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + } + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" + }, + "lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=" + }, + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "requires": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "requires": { + "get-func-name": "^2.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + } + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "requires": { + "kind-of": "^6.0.2" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "markdown-eslint-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/markdown-eslint-parser/-/markdown-eslint-parser-1.2.1.tgz", + "integrity": "sha512-ImxZH4YUT1BsYrusLPL8tWSZYUN4EZSjaSNL7KC8nsAYWavUgcK/Y1CuufbbkoSlqzv/tjFYLpyxcsaxo97dEA==", + "requires": { + "eslint": "^6.8.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==" + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "esutils": "^2.0.2", + "file-entry-cache": "^5.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.0.0", + "globals": "^12.1.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" + }, + "espree": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", + "requires": { + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" + } + }, + "file-entry-cache": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", + "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "requires": { + "flat-cache": "^2.0.1" + } + }, + "flat-cache": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", + "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "requires": { + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==" + }, + "globals": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "requires": { + "type-fest": "^0.8.1" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==" + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "requires": { + "glob": "^7.1.3" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + } + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "table": { + "version": "5.4.6", + "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", + "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "requires": { + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + } + } + } + }, + "marky": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz", + "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==" + }, + "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==" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + }, + "dependencies": { + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + } + } + }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, + "mlly": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.1.0.tgz", + "integrity": "sha512-cwzBrBfwGC1gYJyfcy8TcZU1f+dbH/T+TuOhtYP2wLv/Fb51/uV7HJQfBPtEupZ2ORLRU1EKFS/QfS3eo9+kBQ==", + "requires": { + "acorn": "^8.8.1", + "pathe": "^1.0.0", + "pkg-types": "^1.0.1", + "ufo": "^1.0.1" + }, + "dependencies": { + "acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==" + }, + "pathe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.0.0.tgz", + "integrity": "sha512-nPdMG0Pd09HuSsr7QOKUXO2Jr9eqaDiZvDwdyIhNG5SHYujkQHYKDfGQkulBxvbDHz8oHLsTgKN86LSwYzSHAg==" + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "multimap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multimap/-/multimap-1.1.0.tgz", + "integrity": "sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw==" + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + }, + "nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" + }, + "nanocolors": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/nanocolors/-/nanocolors-0.2.13.tgz", + "integrity": "sha512-0n3mSAQLPpGLV9ORXT5+C/D4mwew7Ebws69Hx4E2sgz2ZA5+32Q80B9tL8PbL7XHnRDiAxH/pnrUJ9a4fkTNTA==" + }, + "nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==" + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "requires": { + "whatwg-url": "^5.0.0" + }, + "dependencies": { + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + } + } + }, + "node-releases": { + "version": "1.1.75", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.75.tgz", + "integrity": "sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==" + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "requires": { + "boolbase": "^1.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==" + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "requires": { + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "object.entries": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz", + "integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "object.fromentries": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "dependencies": { + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "es-abstract": { + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", + "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "unbox-primitive": "^1.0.2" + } + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + } + } + }, + "object.hasown": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "requires": { + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "dependencies": { + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "es-abstract": { + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", + "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "unbox-primitive": "^1.0.2" + } + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + } + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "requires": { + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "only": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", + "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==" + }, + "open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==" + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==" + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "^1.1.0" + }, + "dependencies": { + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "requires": { + "p-try": "^1.0.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + } + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "requires": { + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=" + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "requires": { + "path-root-regex": "^0.1.0" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "pathe": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-0.2.0.tgz", + "integrity": "sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==" + }, + "pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==" + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + } + } + }, + "pkg-types": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.1.tgz", + "integrity": "sha512-jHv9HB+Ho7dj6ItwppRDDl0iZRYBD0jsakHXtFgoLr+cHSF6xC+QL54sJmWxyGxOLYSHm0afhXhXcQDQqH9z8g==", + "requires": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.0.0", + "pathe": "^1.0.0" + }, + "dependencies": { + "pathe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.0.0.tgz", + "integrity": "sha512-nPdMG0Pd09HuSsr7QOKUXO2Jr9eqaDiZvDwdyIhNG5SHYujkQHYKDfGQkulBxvbDHz8oHLsTgKN86LSwYzSHAg==" + } + } + }, + "playwright": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.29.1.tgz", + "integrity": "sha512-lasC+pMqsQ2uWhNurt3YK3xo0gWlMjslYUylKbHcqF/NTjwp9KStRGO7S6wwz2f52GcSnop8XUK/GymJjdzrxw==", + "requires": { + "playwright-core": "1.29.1" + }, + "dependencies": { + "playwright-core": { + "version": "1.29.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.29.1.tgz", + "integrity": "sha512-20Ai3d+lMkWpI9YZYlxk8gxatfgax5STW8GaMozAHwigLiyiKQrdkt7gaoT9UQR8FIVDg6qVXs9IoZUQrDjIIg==" + } + } + }, + "pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==" + }, + "portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "dependencies": { + "async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "requires": { + "lodash": "^4.17.14" + } + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "postcss": { + "version": "8.4.20", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.20.tgz", + "integrity": "sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==", + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "dependencies": { + "nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" + } + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" + }, + "prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "requires": { + "fast-diff": "^1.1.2" + } + }, + "pretty-format": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", + "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", + "requires": { + "@jest/schemas": "^29.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + } + } + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "puppeteer-core": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-13.7.0.tgz", + "integrity": "sha512-rXja4vcnAzFAP1OVLq/5dWNfwBGuzcOARJ6qGV7oAZhnLmVRU8G5MsdeQEAOy332ZhkIOnn9jp15R89LKHyp2Q==", + "requires": { + "cross-fetch": "3.1.5", + "debug": "4.3.4", + "devtools-protocol": "0.0.981744", + "extract-zip": "2.0.1", + "https-proxy-agent": "5.0.1", + "pkg-dir": "4.2.0", + "progress": "2.0.3", + "proxy-from-env": "1.1.0", + "rimraf": "3.0.2", + "tar-fs": "2.1.1", + "unbzip2-stream": "1.4.3", + "ws": "8.5.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "ws": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==" + } + } + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "dependencies": { + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==" + } + } + }, + "read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "requires": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + } + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "requires": { + "resolve": "^1.9.0" + } + }, + "reduce-flatten": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", + "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==" + }, + "regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "regexp-to-ast": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz", + "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==" + }, + "regexp-tree": { + "version": "0.1.24", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.24.tgz", + "integrity": "sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw==" + }, + "regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==" + }, + "regextras": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.8.0.tgz", + "integrity": "sha512-k519uI04Z3SaY0fLX843MRXnDeG2+vHOFsyhiPZvNLe7r8rD2YNRjq4BQLZZ0oAr2NrtvZlICsXysGNFPGa3CQ==" + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + }, + "resolve-path": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/resolve-path/-/resolve-path-1.4.0.tgz", + "integrity": "sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==", + "requires": { + "http-errors": "~1.6.2", + "path-is-absolute": "1.0.1" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" + } + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "rollup": { + "version": "3.7.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.7.5.tgz", + "integrity": "sha512-z0ZbqHBtS/et2EEUKMrAl2CoSdwN7ZPzL17UMiKN9RjjqHShTlv7F9J6ZJZJNREYjBh3TvBrdfjkFDIXFNeuiQ==", + "requires": { + "fsevents": "~2.3.2" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safe-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-2.1.1.tgz", + "integrity": "sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==", + "requires": { + "regexp-tree": "~0.1.1" + } + }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "dependencies": { + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + } + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "secure-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", + "integrity": "sha1-8aAymzCLIh+uN7mXTz1XjQypmeM=" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==" + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + } + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz", + "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==" + }, + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + }, + "string-direction": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/string-direction/-/string-direction-0.1.2.tgz", + "integrity": "sha512-NJHQRg6GlOEMLA6jEAlSy21KaXvJDNoAid/v6fBAJbqdvOEIiPpCrIPTHnl4636wUF/IGyktX5A9eddmETb1Cw==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "string.prototype.matchall": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4" + }, + "dependencies": { + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "es-abstract": { + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", + "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "unbox-primitive": "^1.0.2" + } + }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "requires": { + "call-bind": "^1.0.2" + } + }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + } + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "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==", + "requires": { + "safe-buffer": "~5.1.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + } + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" + }, + "strip-literal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.0.tgz", + "integrity": "sha512-5o4LsH1lzBzO9UFH63AJ2ad2/S2AVx6NtjOcaz+VTT2h1RiRvbipW72z8M/lxEhcPHDBQwpDrnTF7sXy/7OwCQ==", + "requires": { + "acorn": "^8.8.1" + }, + "dependencies": { + "acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==" + } + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "requires": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ajv": { + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", + "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "table-layout": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", + "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", + "requires": { + "array-back": "^4.0.1", + "deep-extend": "~0.6.0", + "typical": "^5.2.0", + "wordwrapjs": "^4.0.0" + }, + "dependencies": { + "array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==" + }, + "typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==" + } + } + }, + "tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "tinybench": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.3.1.tgz", + "integrity": "sha512-hGYWYBMPr7p4g5IarQE7XhlyWveh1EKhy4wUBS1LrHXCKYgvz+4/jCqgmJqZxxldesn05vccrtME2RLLZNW7iA==" + }, + "tinypool": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.3.0.tgz", + "integrity": "sha512-NX5KeqHOBZU6Bc0xj9Vr5Szbb1j8tUHIeD18s41aDJaPeC5QTdEhK0SpdpUrZlj2nv5cctNcSjaKNanXlfcVEQ==" + }, + "tinyspy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-1.0.2.tgz", + "integrity": "sha512-bSGlgwLBYf7PnUsQ6WOc6SJ3pGOcd+d8AA6EUnLDDM0kWEstC1JIlSZA3UNliDXhd9ABoS7hiRBDCu+XP/sf1Q==" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "requires": { + "punycode": "^2.1.1" + } + }, + "tsconfig-paths": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + } + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==" + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "requires": { + "tslib": "^1.8.1" + } + }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typescript": { + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==" + }, + "typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==" + }, + "ufo": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.0.1.tgz", + "integrity": "sha512-boAm74ubXHY7KJQZLlXrtMz52qFvpsbOxDcZOnw/Wf+LS4Mmyu7JxmzD4tDLtUQtmZECypJ0FrCz4QIe6dvKRA==" + }, + "uglify-js": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.0.tgz", + "integrity": "sha512-R/tiGB1ZXp2BC+TkRGLwj8xUZgdfT2f4UZEgX6aVjJ5uttPrr4fYmwTWDGqVnBCLbOXRMY6nr/BTbwCtVfps0g==", + "optional": true + }, + "uhyphen": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/uhyphen/-/uhyphen-0.1.0.tgz", + "integrity": "sha512-o0QVGuFg24FK765Qdd5kk0zU/U4dEsCtN/GSiwNI9i8xsSVtjIAOdTaVhLwZ1nrbWxFVMxNDDl+9fednsOMsBw==" + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "requires": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" + }, + "underscore.string": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz", + "integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==", + "requires": { + "sprintf-js": "^1.1.1", + "util-deprecate": "^1.0.2" + } + }, + "union": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz", + "integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==", + "requires": { + "qs": "^6.4.0" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, + "url-join": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-2.0.5.tgz", + "integrity": "sha1-WvIvGMBSoACkjXuCxenC4v7tpyg=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==" + }, + "v8-to-istanbul": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz", + "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==", + "requires": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0" + } + }, + "v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "requires": { + "homedir-polyfill": "^1.0.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "vite": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.0.3.tgz", + "integrity": "sha512-HvuNv1RdE7deIfQb8mPk51UKjqptO/4RXZ5yXSAvurd5xOckwS/gg8h9Tky3uSbnjYTgUm0hVCet1cyhKd73ZA==", + "requires": { + "esbuild": "^0.16.3", + "fsevents": "~2.3.2", + "postcss": "^8.4.20", + "resolve": "^1.22.1", + "rollup": "^3.7.0" + }, + "dependencies": { + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + } + } + }, + "vite-node": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.27.2.tgz", + "integrity": "sha512-IDwuVhslF10qCnWOGJui7/2KksAOBHi+UbVo6Pqt4f5lgn+kS2sVvYDsETRG5PSuslisGB5CFGvb9I6FQgymBQ==", + "requires": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "mlly": "^1.1.0", + "pathe": "^0.2.0", + "picocolors": "^1.0.0", + "source-map": "^0.6.1", + "source-map-support": "^0.5.21", + "vite": "^3.0.0 || ^4.0.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "vite-plugin-istanbul": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/vite-plugin-istanbul/-/vite-plugin-istanbul-4.0.0.tgz", + "integrity": "sha512-r5TUlEprFyp+L+by/waG1RsIMiqfy7LBAZvheFlXjxzm69146rHGW6bh9TDzXg7wJB6DsyjqKFtvAX50d/I/IQ==", + "requires": { + "@istanbuljs/load-nyc-config": "^1.1.0", + "istanbul-lib-instrument": "^5.1.0", + "picocolors": "^1.0.0", + "test-exclude": "^6.0.0" + } + }, + "vite-plugin-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vite-plugin-node/-/vite-plugin-node-1.0.0.tgz", + "integrity": "sha512-oCB7PbeBtx0dWz+rQL3JXA1s6kqlqF8Mor9QTwhyQ7ChuJRzVs/ddVRuUfU/ZPMo9GSsaYUn7qsVNU8rS1EZdw==", + "requires": { + "@rollup/pluginutils": "^4.1.1", + "chalk": "^4.1.2", + "debug": "^4.3.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "vitest": { + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.26.2.tgz", + "integrity": "sha512-Jvqxh6SDy9SsuslkDjts0iDewDIdq4rveEt69YgDuAb1tVDGV0lDepVaeAFraoySWqneJmOt4TngFFNhlw7GfA==", + "requires": { + "@types/chai": "^4.3.4", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "acorn": "^8.8.1", + "acorn-walk": "^8.2.0", + "chai": "^4.3.7", + "debug": "^4.3.4", + "local-pkg": "^0.4.2", + "source-map": "^0.6.1", + "strip-literal": "^1.0.0", + "tinybench": "^2.3.1", + "tinypool": "^0.3.0", + "tinyspy": "^1.0.2", + "vite": "^3.0.0 || ^4.0.0", + "vite-node": "0.26.2" + }, + "dependencies": { + "acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==" + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "vite-node": { + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.26.2.tgz", + "integrity": "sha512-4M/zlatItZAyvrQG+82zQBhgDjRZRhVJYFW4T9wcAKh7eMmSiPOVSeI5zsV9UzHXgCcIDKX0o0r3s4OxExTHqg==", + "requires": { + "debug": "^4.3.4", + "mlly": "^1.0.0", + "pathe": "^0.2.0", + "source-map": "^0.6.1", + "source-map-support": "^0.5.21", + "vite": "^3.0.0 || ^4.0.0" + } + } + } + }, + "webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" + }, + "whatwg-url": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" + }, + "wordwrapjs": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", + "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", + "requires": { + "reduce-flatten": "^2.0.0", + "typical": "^5.2.0" + }, + "dependencies": { + "typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==" + } + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "write": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", + "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", + "requires": { + "mkdirp": "^0.5.1" + } + }, + "ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "ylru": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.3.2.tgz", + "integrity": "sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==" + } + } + }, + "esbuild": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", + "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", + "requires": { + "@esbuild/android-arm": "0.16.17", + "@esbuild/android-arm64": "0.16.17", + "@esbuild/android-x64": "0.16.17", + "@esbuild/darwin-arm64": "0.16.17", + "@esbuild/darwin-x64": "0.16.17", + "@esbuild/freebsd-arm64": "0.16.17", + "@esbuild/freebsd-x64": "0.16.17", + "@esbuild/linux-arm": "0.16.17", + "@esbuild/linux-arm64": "0.16.17", + "@esbuild/linux-ia32": "0.16.17", + "@esbuild/linux-loong64": "0.16.17", + "@esbuild/linux-mips64el": "0.16.17", + "@esbuild/linux-ppc64": "0.16.17", + "@esbuild/linux-riscv64": "0.16.17", + "@esbuild/linux-s390x": "0.16.17", + "@esbuild/linux-x64": "0.16.17", + "@esbuild/netbsd-x64": "0.16.17", + "@esbuild/openbsd-x64": "0.16.17", + "@esbuild/sunos-x64": "0.16.17", + "@esbuild/win32-arm64": "0.16.17", + "@esbuild/win32-ia32": "0.16.17", + "@esbuild/win32-x64": "0.16.17" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "requires": { + "minipass": "^2.6.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, + "html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.4.tgz", + "integrity": "sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==", + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "requires": { + "has": "^1.0.3" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-what": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.8.tgz", + "integrity": "sha512-yq8gMao5upkPoGEU9LsB2P+K3Kt8Q3fQFCGyNCWOAnJAMzEXVV9drYb0TXr42TTliLLhKIBvulgAXgtLLnwzGA==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" + }, + "libxslt": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/libxslt/-/libxslt-0.10.0.tgz", + "integrity": "sha512-COIaTGdrgnhZzk8II6vTDiNSI+Z/HcrpXVondyLsy2z9JuIOX5i4NKFsEFyySvYGcv9vgmbQiI8OV8x8R/rTOg==", + "requires": { + "bindings": "^1.5.0", + "nan": "~2.14.2", + "node1-libxmljsmt-myh": "1.0.4" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "merge-anything": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/merge-anything/-/merge-anything-5.1.4.tgz", + "integrity": "sha512-7PWKwGOs5WWcpw+/OvbiFiAvEP6bv/QHiicigpqMGKIqPPAtGhBLR8LFJW+Zu6m9TXiR/a8+AiPlGG0ko1ruoQ==", + "requires": { + "is-what": "^4.1.8" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "requires": { + "minimist": "^1.2.6" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" + }, + "nanoid": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" + }, + "needle": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", + "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "node-pre-gyp": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.9.1.tgz", + "integrity": "sha512-UC2aXFhMN318gagWle+eV4inrJ9UiQF93rpMqc7qsUisI+0uONtiA1I/q8VAlVq+vfQH1AmW4Are/STGDuhmGQ==", + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.0", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "node-releases": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.8.tgz", + "integrity": "sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A==" + }, + "node1-libxmljsmt-myh": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/node1-libxmljsmt-myh/-/node1-libxmljsmt-myh-1.0.4.tgz", + "integrity": "sha512-2Kncs49q0NDz6MvIS5ipOnbs7TxzFXZSvdcvN6dunwCMixOdwcMqAlzRCsy3WxeoHqeGTlA/gCKj/NiR282kqw==", + "requires": { + "bindings": "^1.3.0", + "nan": "~2.14.0", + "node-pre-gyp": "^0.9.1" + } + }, + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npm-bundled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" + }, + "npm-packlist": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==" + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "postcss": { + "version": "8.4.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "requires": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "prettier": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", + "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "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" + } + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "rollup": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.10.1.tgz", + "integrity": "sha512-3Er+yel3bZbZX1g2kjVM+FW+RUWDxbG87fcqFM5/9HbPCTpbVp6JOLn7jlxnNlbu7s/N/uDA4EV/91E2gWnxzw==", + "requires": { + "fsevents": "~2.3.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "solid-js": { + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.6.9.tgz", + "integrity": "sha512-kV3fMmm+1C2J95c8eDOPKGfZHnuAkHUBLG4hX1Xu08bXeAIPqmxuz/QdH3B8SIdTp3EatBVIyA6RCes3hrGzpg==", + "requires": { + "csstype": "^3.1.0" + } + }, + "solid-refresh": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/solid-refresh/-/solid-refresh-0.4.2.tgz", + "integrity": "sha512-6g1HsgQkY0X0ZmsaydNgHwRaQIhH3bAbagZiYwWnGO7mqli50ehlwQUN18RZ2MH3fTIs9Y1bankZapVhMVuijg==", + "requires": { + "@babel/generator": "^7.18.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/types": "^7.18.4" + } + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" + }, + "streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "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==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "tar": { + "version": "4.4.19", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", + "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", + "requires": { + "chownr": "^1.1.4", + "fs-minipass": "^1.2.7", + "minipass": "^2.9.0", + "minizlib": "^1.3.3", + "mkdirp": "^0.5.5", + "safe-buffer": "^5.2.1", + "yallist": "^3.1.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" + }, + "undici": { + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.20.0.tgz", + "integrity": "sha512-J3j60dYzuo6Eevbawwp1sdg16k5Tf768bxYK4TUJRH7cBM4kFCbf3mOnM/0E3vQYXvpxITbbWmBafaDbxLDz3g==", + "requires": { + "busboy": "^1.6.0" + } + }, + "update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "validate-html-nesting": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/validate-html-nesting/-/validate-html-nesting-1.2.0.tgz", + "integrity": "sha512-sI65QUd3T/e5wbQkdPKjikFsIVLPIaOQK+9uowPp6/k609SN8hs5eqBLrnN5DeW9Kd932Q4Imo0fzK2dxoOsCA==" + }, + "vite": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.0.4.tgz", + "integrity": "sha512-xevPU7M8FU0i/80DMR+YhgrzR5KS2ORy1B4xcX/cXLsvnUWvfHuqMmVU6N0YiJ4JWGRJJsLCgjEzKjG9/GKoSw==", + "requires": { + "esbuild": "^0.16.3", + "fsevents": "~2.3.2", + "postcss": "^8.4.20", + "resolve": "^1.22.1", + "rollup": "^3.7.0" + } + }, + "vite-plugin-solid": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/vite-plugin-solid/-/vite-plugin-solid-2.5.0.tgz", + "integrity": "sha512-VneGd3RyFJvwaiffsqgymeMaofn0IzQLPwDzafTV2f1agoWeeJlk5VrI5WqT9BTtLe69vNNbCJWqLhHr9fOdDw==", + "requires": { + "@babel/core": "^7.20.5", + "@babel/preset-typescript": "^7.18.6", + "babel-preset-solid": "^1.6.3", + "merge-anything": "^5.1.4", + "solid-refresh": "^0.4.1", + "vitefu": "^0.2.3" + } + }, + "vitefu": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.4.tgz", + "integrity": "sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==" + }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "xpath-to-css": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xpath-to-css/-/xpath-to-css-1.1.0.tgz", + "integrity": "sha512-+LkgkWUFj10DQujqovkQKiHdnfF01exhbr0UrXbIkq88vXTuAF1RcUvYV9YzE8dSKR9exKtCc8hgwl1xfs701A==" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } +} diff --git a/demo/package.json b/demo/package.json new file mode 100644 index 0000000..584bb6e --- /dev/null +++ b/demo/package.json @@ -0,0 +1,23 @@ +{ + "private": true, + "engines": { + "node": ">=14 <17", + "npm": ">=6 <7" + }, + "volta": { + "node": "16.5.0", + "npm": "6.14.13" + }, + "scripts": { + "demo": "vite", + "postinstall": "NPM_BIN=`which npm`; ($NPM_BIN explore enketo-transformer -- $NPM_BIN run build)" + }, + "dependencies": { + "@solidjs/router": "^0.7.0", + "babel-preset-solid": "^1.6.9", + "enketo-transformer": "file:..", + "solid-js": "^1.6.9", + "vite": "^4.0.4", + "vite-plugin-solid": "^2.5.0" + } +} diff --git a/demo/public/OpenSans-Bold-webfont.woff b/demo/public/OpenSans-Bold-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..138089c2ba0aa48380cc464136e061ffa28bf460 GIT binary patch literal 68096 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

3obB}3{&Y!NpNmR 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 JiGx#7{TB)lY)AkA literal 0 HcmV?d00001 diff --git a/demo/public/OpenSans-Regular-webfont.woff b/demo/public/OpenSans-Regular-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..a3f58d41a423316dd23596d965b2c3eeaebe57b2 GIT binary patch literal 68220 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 z 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 A*8l(j literal 0 HcmV?d00001 diff --git a/demo/public/demo.css b/demo/public/demo.css new file mode 100644 index 0000000..03a9c81 --- /dev/null +++ b/demo/public/demo.css @@ -0,0 +1,225 @@ +html, +body, +input, +select, +textarea { + font: 16px sans-serif; +} + +html, +body, +#app { + margin: 0; + padding: 0; + position: relative; + width: 100%; +} + +.grid, +.grid > .grid, +form.or { + display: grid; + row-gap: 1rem; + grid-column: 1 / -1; + grid-template-columns: 1rem calc(100% - 2rem) 1rem; + max-width: 100%; +} + +.grid > *, +form.or > * { + grid-column: 2; +} + +h1 a { + color: #059; + text-decoration: none; +} + +form.or { + border-color: rgb(121, 137, 150); + border-style: solid; + border-width: 0.5px 0; + display: block; + font-family: Georgia, 'Times New Roman', Times, serif; + padding: 1rem; +} + +.question, +.question-label, +.or-hint, +.or-constraint-msg, +[class*='or-constraint'], +.or-required-msg, +[class*='or-required'], +.or-relevant-msg, +[class*='or-relevant'] { + display: block; +} + +.required { + color: red; + font-size: 1.25rem; + font-weight: bold; + margin-right: 0.25em; + width: 1rem; +} + +legend { + display: flex; +} + +legend > * { + order: 1; +} + +legend > .required { + order: 0; +} + +.or-hint:before { + content: 'ℹ️'; + font-size: 1.25em; + margin-right: 0.25rem; + width: 1ch; +} + +.question { + margin: 1em 0; +} + +fieldset:not(.question) { + border: 0; +} + +.question-label::before { + content: '❓'; + font-size: 1.25em; + margin-right: 0.25rem; + width: 1ch; +} + +form.or [lang]:not(.active) { + display: none; +} + +#demo { + background: #fff5ee; + border-bottom: 1px solid #ffa06d; + padding: 1rem 0; +} + +#demo h1 { + margin: 0; + line-height: 1; +} + +#demo a { + color: #60220d; +} + +h3 { + line-height: 1; + margin: 0; +} + +#transform-options label { + display: inline-block; + margin-left: 1rem; +} + +#transform-options label:first-child { + margin-left: 0; +} + +.form-logo, +#form-title { + display: inline-block; + position: relative; + vertical-align: middle; +} + +.form-logo img { + height: 2.5rem; + margin-right: 1rem; + width: 2.5rem; +} + +#form-title + * { + display: block; +} + +.form-logo:empty { + margin-right: 1rem; +} + +.form-logo:empty::before { + content: 'Logo'; + display: block; + line-height: 1rem; + position: absolute; +} + +.form-logo:empty::after { + content: '🚫'; + font-size: 2.5rem; + left: 0; + line-height: 0.6; + position: relative; + text-align: center; + width: 2.5rem; +} + +.decorated-details { + display: grid; + grid-template-columns: 1rem calc(100% - 1.25rem); + column-gap: 0.25rem; +} + +details { + max-width: 100%; +} + +summary::marker, +summary::-webkit-details-marker { + display: none; +} + +summary { + column-gap: 0.5rem; + cursor: pointer; + display: grid; + grid-template-columns: auto 1fr; + line-height: 1; +} + +summary.decorated { + grid-template-columns: auto auto 1fr; +} + +summary::after { + content: '▸'; +} + +details[open] summary::after { + content: '▾'; +} + +pre { + overflow-x: auto; + white-space: pre-wrap; +} + +details pre { + border-left: 0.25rem solid rgb(47, 135, 206); + margin-left: 0.25rem; + padding-left: 0.75rem; +} + +#model { + background-color: #f7f7f7; + border-color: #ddd; + border-style: solid; + border-width: 1px 0; + grid-column: 1 / -1; + padding: 1rem; +} diff --git a/demo/public/icon.png b/demo/public/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a0746faf988e6915453f1a1bb13d9e1e601cfc0d GIT binary patch literal 7913 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 { let xformDoc: DOM.Document = domParser.parseFromString(xform, 'text/xml'); if (typeof preprocess === 'function' && ENV === 'node') { + const { libxmljs } = await import('libxslt'); + xformDoc = preprocess.call(libxmljs, xformDoc as any); } diff --git a/test/fixtures.ts b/test/fixtures.ts new file mode 100644 index 0000000..d625f18 --- /dev/null +++ b/test/fixtures.ts @@ -0,0 +1,42 @@ +const basename = (path: string) => path.replace(/.*[\\/]([^\\/]+)/, '$1'); + +interface Fixture { + fileName: string; + origin: string; + fixturePath: string; + xform: string; +} + +/** @package */ +export const fixtures = ( + await Promise.all( + Object.entries( + import.meta.glob('./**/*.xml', { + as: 'raw', + eager: false, + }) + ).map(async ([fixturePath, importXForm]): Promise => { + const xform = await importXForm(); + const origin = + fixturePath.match(/\/external-fixtures\/([^/]+)/)?.[1] ?? + 'enketo-transformer'; + const fileName = basename(fixturePath); + + return { + fileName, + origin, + fixturePath, + xform, + }; + }) + ) +).sort((A, B) => { + const a = A.fileName.toLowerCase().replace(/.*\/([^/]+)$/, '$1'); + const b = B.fileName.toLowerCase().replace(/.*\/([^/]+)$/, '$1'); + + if (a > b) { + return 1; + } + + return b > a ? -1 : 0; +}); diff --git a/test/shared.ts b/test/shared.ts index bb274df..4f21c27 100644 --- a/test/shared.ts +++ b/test/shared.ts @@ -2,9 +2,12 @@ import { DOMParser } from 'linkedom'; import type { Attr } from 'linkedom/types/interface/attr'; import type { Element as BaseElement } from 'linkedom/types/interface/element'; import type { Node } from 'linkedom/types/interface/node'; -import { basename, resolve } from 'path'; +import { resolve } from 'path'; import { fileURLToPath } from 'url'; import type { Survey, Transform, TransformedSurvey } from '../src/transformer'; +import { fixtures } from './fixtures'; + +export { fixtures }; // eslint-disable-next-line import/no-mutable-exports let reload: () => Promise; @@ -122,46 +125,6 @@ if (ENV === 'node') { export { reload, transform }; -interface Fixture { - fileName: string; - origin: string; - fixturePath: string; - xform: string; -} - -export const fixtures = ( - await Promise.all( - Object.entries( - import.meta.glob('./**/*.xml', { - as: 'raw', - eager: false, - }) - ).map(async ([fixturePath, importXForm]): Promise => { - const xform = await importXForm(); - const origin = - fixturePath.match(/\/external-fixtures\/([^/]+)/)?.[1] ?? - 'enketo-transformer'; - const fileName = basename(fixturePath); - - return { - fileName, - origin, - fixturePath, - xform, - }; - }) - ) -).sort((A, B) => { - const a = A.fileName.toLowerCase().replace(/.*\/([^/]+)$/, '$1'); - const b = B.fileName.toLowerCase().replace(/.*\/([^/]+)$/, '$1'); - - if (a > b) { - return 1; - } - - return b > a ? -1 : 0; -}); - const xformsByPath = Object.fromEntries( fixtures.flatMap(({ fileName, fixturePath, xform }) => [ [fileName, xform], diff --git a/tsconfig.web.json b/tsconfig.web.json index 25fe8bf..e046e6f 100644 --- a/tsconfig.web.json +++ b/tsconfig.web.json @@ -6,6 +6,6 @@ } }, "exclude": ["dist", "node_modules", "./typings/test.d.ts"], - "include": ["app.ts", "config", "src", "typings"], + "include": ["config", "src", "typings"], "files": ["./typings/env.d.ts"] } From d9ae798a9fee7aa529b48d94f16946a57eec40c6 Mon Sep 17 00:00:00 2001 From: eyelidlessness Date: Tue, 21 Feb 2023 09:42:32 -0800 Subject: [PATCH 11/24] Web test/benchmark setup refinements Faster Firefox startup, improved logging --- config/firefox.json | 34 +++++++++++++ index.html | 11 +++-- test/browser-env.ts | 9 ++++ test/shared.ts | 114 ++++++++++++++++++++++++++------------------ 4 files changed, 118 insertions(+), 50 deletions(-) create mode 100644 config/firefox.json create mode 100644 test/browser-env.ts diff --git a/config/firefox.json b/config/firefox.json new file mode 100644 index 0000000..45fe5b1 --- /dev/null +++ b/config/firefox.json @@ -0,0 +1,34 @@ +{ + "browser.cache.memory.capacity": 65536, + "browser.chrome.toolbar_style": 1, + "browser.display.show_image_placeholders": false, + "browser.display.use_document_colors": false, + "browser.display.use_document_fonts": 0, + "browser.display.use_system_colors": true, + "browser.formfill.enable": false, + "browser.helperApps.deleteTempFileOnExit": true, + "browser.pocket.enabled": false, + "browser.shell.checkDefaultBrowser": false, + "browser.startup.homepage": "about:blank", + "browser.startup.page": 0, + "browser.tabs.forceHide": true, + "browser.urlbar.autocomplete.enabled": false, + "browser.urlbar.autoFill": false, + "browser.urlbar.showPopup": false, + "browser.urlbar.showSearch": false, + "content.notify.interval": 500000, + "content.notify.ontimer": true, + "content.switch.threshold": 250000, + "extensions.checkCompatibility": false, + "extensions.checkUpdateSecurity": false, + "extensions.update.autoUpdateEnabled": false, + "extensions.update.enabled": false, + "general.startup.browser": false, + "loop.enabled": false, + "network.http.pipelining.maxrequests": 8, + "network.http.pipelining": true, + "network.http.proxy.pipelining": true, + "permissions.default.image": 2, + "plugin.default_plugin_disabled": false, + "reader.parse-on-load.enabled": false +} diff --git a/index.html b/index.html index 20465c3..a2f8694 100644 --- a/index.html +++ b/index.html @@ -2,11 +2,10 @@ - + + Enketo Transformer (web) - - + + +

+ Nothing to see here! This page is used for running browser tests and + benchmarks. +

diff --git a/test/browser-env.ts b/test/browser-env.ts new file mode 100644 index 0000000..e9fbbaa --- /dev/null +++ b/test/browser-env.ts @@ -0,0 +1,9 @@ +import type { Transform } from '../src/transformer'; + +declare global { + const enketo: { + transformer: { + transform: Transform; + }; + }; +} diff --git a/test/shared.ts b/test/shared.ts index 4f21c27..ce3f818 100644 --- a/test/shared.ts +++ b/test/shared.ts @@ -3,24 +3,20 @@ import type { Attr } from 'linkedom/types/interface/attr'; import type { Element as BaseElement } from 'linkedom/types/interface/element'; import type { Node } from 'linkedom/types/interface/node'; import { resolve } from 'path'; +import type { Page } from 'playwright'; import { fileURLToPath } from 'url'; +import firefoxUserPrefs from '../config/firefox.json'; import type { Survey, Transform, TransformedSurvey } from '../src/transformer'; import { fixtures } from './fixtures'; export { fixtures }; // eslint-disable-next-line import/no-mutable-exports -let reload: () => Promise; +let reload: () => Promise; // eslint-disable-next-line import/no-mutable-exports let transform: Transform; -declare const enketo: { - transformer: { - transform: Transform; - }; -}; - if (ENV === 'node') { reload = () => Promise.resolve(); transform = (await import('../src/transformer')).transform; @@ -28,70 +24,94 @@ if (ENV === 'node') { const { createServer } = await import('vite'); const root = fileURLToPath(new URL('..', import.meta.url)); const configFile = resolve(root, './vite.config.ts'); - const server = await createServer({ - configFile, - define: { - PACKAGE_VERSION: JSON.stringify(PACKAGE_VERSION), - VERSION: JSON.stringify(VERSION), - ENV: JSON.stringify(ENV), - BROWSER: JSON.stringify(BROWSER), - }, - root, - }); - - await server.listen(); - - server.printUrls(); const playwright = await import('playwright'); const browserType = playwright[BROWSER]; - const browser = await browserType.launch(); - let page = await browser.newPage(); + const [server, browser] = await Promise.all([ + createServer({ + configFile, + // clearScreen: false, + define: { + PACKAGE_VERSION: JSON.stringify(PACKAGE_VERSION), + VERSION: JSON.stringify(VERSION), + ENV: JSON.stringify(ENV), + BROWSER: JSON.stringify(BROWSER), + }, + root, + }), + browserType.launch({ + firefoxUserPrefs, + }), + ]); - let isLoading = false; + await server.listen(); - page.on('console', async (message) => { - if (!isLoading) { - console.log( - ...(await Promise.all( - message.args().map((arg) => arg.jsonValue()) - )) - ); - } - }); + const url = server.resolvedUrls!.local[0]!; - let isFirstLoad = true; + let page: Page | null = null; + let isLoading = false; - reload = async () => { + const load = async () => { isLoading = true; - const url = 'http://localhost:8085'; - if (isFirstLoad) { - await page.goto(url); - isFirstLoad = false; - } else { - await page.close(); + const [context] = await Promise.all([ + browser.newContext(), + page?.close(), + ]); - const context = await browser.newContext(); + page = await context.newPage(); - page = await context.newPage(); - await page.goto(url); - } + page.on('console', async (message) => { + // This basically just suppresses useless built-in Vite logging + if (!isLoading) { + let type = message.type(); + + if (type === 'warning') { + type = 'warn'; + } + + const args = await Promise.all( + message.args().map((arg) => arg.jsonValue()) + ); + if (type === 'trace') { + type = 'log'; + args.push(message.location()); + } + + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore - even if the return type for `message.type` were more + // accurate, this would still fail because some console methods are + // not variadic. We just have to trust that Playwright is passing + // the correct arguments for whichever console method was called. + console[type](...args); + } + }); + + await page.goto(url); await page.waitForFunction(() => typeof enketo !== 'undefined'); isLoading = false; + + return page; }; - await reload(); + page = await load(); + + reload = load; transform = async ( survey: T ): Promise> => { + // The *intent* here is that the global declaration will only affect web + // environments. Unfortunately, like TypeScript's DOM lib, there is no + // such thing as conditional global augmentation. + await import('./browser-env'); + delete survey.preprocess; - const { error, result } = await page.evaluate( + const { error, result } = await page!.evaluate( async ([input]) => { try { const result = await enketo.transformer.transform(input); From 97c1513578ca1c181e568f3de146f288078c130f Mon Sep 17 00:00:00 2001 From: eyelidlessness Date: Tue, 21 Feb 2023 09:57:56 -0800 Subject: [PATCH 12/24] Update README with web details --- README.md | 57 ++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 46 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 955ecfa..20cc4c9 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ ODK XForms are based off of [W3C XForms](https://en.wikipedia.org/wiki/XForms) w Historically, forms with many questions or many translations were prohibitively slow to transform. Starting in Enketo Transformer v2.2.1 (Feb 2023), they are much faster. Our current primary goals are: + - Using standard DOM APIs so the transformation can be performed client-side. - Identifying and addressing remaining performance bottlenecks to remove the need for server-side caching. @@ -24,14 +25,10 @@ Longer term, we intend to rethink transformation to be as minimal as possible, i 1. Volta (optional, but recommended) 1. Node.js 16 and npm 6 (Node.js 14 is also supported) -### Install as module - -```bash -npm install enketo-transformer --save -``` - ### Use as module +#### Node + ```ts import { transform } from 'enketo-transformer'; @@ -60,7 +57,45 @@ const result = await transform({ // ... do something with result ``` +### Web + +Enketo Transformer may also be used on the web as an ESM module. It is exported as `enketo-transformer/web`: + +```ts +import { transform } from 'enketo-transformer/web'; + +const xformResponse = await fetch('https://url/to/xform.xml'); +const xform = await xformResponse.text(); +const result = await transform({ + xform, + // ... +}); +``` + +**Note:** because `preprocess` depends on `libxmljs` which is only available for Node, `preprocess` is also not supported on the web. If you must preprocess an XForm before it is transformed, you may do that before calling `transform`. + ### Development/local usage + +#### Install + +```sh +npm install +``` + +#### Interactive web demo + +Enketo Transformer provides a simple web demo which allows you to select any of the XForms used as fixtures in its test suites to view their transformed output, as well as toggling several of the available transform options to see how they affect the transform. To run the demo: + +```sh +cd ./demo +npm install +npm run demo +``` + +This will print out the demo URL (typically `http://localhost:3000`, unless that port is already in use). + +#### Test/dev server + Enketo Transformer provides a simple server API. It may be used for testing locally, but isn't a robust or secure server implementation so it should not be used in production. You can start it in a local dev environment by running: ```sh @@ -84,7 +119,7 @@ sample POST request: curl -d "xform=x&theme=plain&media[myfile.png]=/path/to/somefile.png&media[this]=that" http://localhost:8085/transform ``` -#### Response format +**Response format:** ```json { @@ -95,7 +130,7 @@ curl -d "xform=x&theme=plain&media[myfile.png]=/path/to/somefile. } ``` -### Test +#### Test - run tests with `npm test` - run tests in watch mode with `npm run test:watch` @@ -115,7 +150,7 @@ Optionally, you can add a keyboard shortcut to select launch tasks: 2. Search for `workbench.action.debug.selectandstart` 3. Click the + button to add your preferred keybinding keybinding -### Develop +#### Develop The script `npm run develop` runs the app on port 8085 and also serves test/forms on port 8081. You could test the transformation output by placing an XForm in test/forms and running http://localhost:8085/transform?xform=http://localhost:8081/autocomplete.xml @@ -129,7 +164,7 @@ A vagrant configuration file and provisioning script is also included. Use DEBUG DEBUG=api,transformer,markdown,language node app.js ``` -### Release +#### Release Releases are done each time a dependent tool needs an `enketo-transformer` change. @@ -153,7 +188,7 @@ Releases are done each time a dependent tool needs an `enketo-transformer` chang See [license document](./LICENSE). -In addition, any product that uses enketo-transformer or parts thereof is required to have a "Powered by Enketo" footer, according to the specifications below, on all screens in which the output of enketo-xslt, or parts thereof, are used, unless explicity exempted from this requirement by Enketo LLC in writing. Partners and sponsors of the Enketo Project, listed on [https://enketo.org/#about](https://enketo.org/#about) and on [https://github.com/enketo/enketo-core#sponsors](https://github.com/enketo/enketo-core#sponsors) are exempted from this requirements and so are contributors listed in [package.json](./package.json). +In addition, any product that uses enketo-transformer or parts thereof is required to have a "Powered by Enketo" footer, according to the specifications below, on all screens in which the output of enketo-transformer, or parts thereof, are used, unless explicity exempted from this requirement by Enketo LLC in writing. Partners and sponsors of the Enketo Project, listed on [https://enketo.org/#about](https://enketo.org/#about) and on [https://github.com/enketo/enketo-core#sponsors](https://github.com/enketo/enketo-core#sponsors) are exempted from this requirements and so are contributors listed in [package.json](./package.json). The aim of this requirement is to force adopters to give something back to the Enketo project, by at least spreading the word and thereby encouraging further adoption. From 9a4a1a174c1c20695308fa13c88eed0b8d486222 Mon Sep 17 00:00:00 2001 From: eyelidlessness Date: Tue, 21 Feb 2023 10:27:08 -0800 Subject: [PATCH 13/24] Fix build/test in CI, improve types somewhat --- index.html | 14 ++++---- package.json | 8 ++--- src/transformer.ts | 22 ++++++++++-- test/benchmarks.ts | 8 ++++- test/browser-env.ts | 9 ----- test/shared.ts | 41 +++++++--------------- test/web/setup.ts | 50 +++++++++++++++++++++++++++ tsconfig.json | 8 +++-- tsconfig.typedefs.json | 13 ------- tsconfig.web.json | 8 +++-- typings/env/node.d.ts | 4 +++ typings/{env.d.ts => env/shared.d.ts} | 1 - typings/env/web.d.ts | 7 ++++ typings/test.d.ts | 1 + vite.config.ts | 26 +++++++------- 15 files changed, 133 insertions(+), 87 deletions(-) delete mode 100644 test/browser-env.ts create mode 100644 test/web/setup.ts delete mode 100644 tsconfig.typedefs.json create mode 100644 typings/env/node.d.ts rename typings/{env.d.ts => env/shared.d.ts} (75%) create mode 100644 typings/env/web.d.ts diff --git a/index.html b/index.html index a2f8694..e6bd351 100644 --- a/index.html +++ b/index.html @@ -2,10 +2,14 @@ - - Enketo Transformer (web) + + +

+ Nothing to see here! This page is used for running browser tests and + benchmarks. +

- - -

- Nothing to see here! This page is used for running browser tests and - benchmarks. -

diff --git a/package.json b/package.json index aae275a..201535f 100644 --- a/package.json +++ b/package.json @@ -22,14 +22,12 @@ "./dom": { "import": "./dist/enketo-transformer/dom/node/index.js", "require": "./dist/enketo-transformer/dom/node/index.cjs", - "browser": "./dist/@enketo/transformer-web/dom/web/index.js", + "browser": "./dist/dom/web/index.js", "types": "./dist/types/src/dom/node/index.d.ts" }, "./web": { "default": "./dist/@enketo/transformer-web/transformer.js", - "import": "./dist/@enketo/transformer-web/transformer.js", - "browser": "./dist/@enketo/transformer-web/transformer.js", - "types": "./dist/types/src/transformer.d.ts" + "types": "./dist/@enketo/transformer-web/src/transformer.d.ts" } }, "typesVersions": { @@ -65,7 +63,7 @@ "test:watch": "vitest", "test:watch:web": "ENV=web vitest", "develop": "DEBUG=api,transformer,markdown,language vite-node ./src/app.ts & http-server test/forms -p 8081", - "tsc": "tsc --project ./tsconfig.json && tsc --project ./tsconfig.web.json && tsc --project ./tsconfig.typedefs.json && tsc --project ./test/tsconfig.json" + "tsc": "tsc --project ./tsconfig.json && tsc --project ./tsconfig.web.json && tsc --project ./test/tsconfig.json" }, "repository": { "type": "git", diff --git a/src/transformer.ts b/src/transformer.ts index f4c9346..432705e 100644 --- a/src/transformer.ts +++ b/src/transformer.ts @@ -14,6 +14,8 @@ export type TransformPreprocess = ( doc: LibXMLJS.Document ) => LibXMLJS.Document; +type NodeOnly = [typeof ENV] extends ['web'] ? undefined : T; + export interface Survey { xform: string; markdown?: boolean; @@ -25,7 +27,7 @@ export interface Survey { * * Only supported in Node environments. */ - preprocess?: TransformPreprocess; + preprocess?: NodeOnly; theme?: string; } @@ -41,11 +43,23 @@ export type Transform = ( survey: T ) => Promise>; +const getPreprocess = ( + survey: Survey +): typeof ENV extends 'web' ? void : TransformPreprocess | void => { + if (String(ENV) === 'node' && typeof survey.preprocess === 'function') { + return survey.preprocess; + } +}; + +const isFunction = any>( + value: unknown +): value is T => typeof value === 'function'; + /** * Performs XSLT transformation on XForm and process the result. */ export const transform: Transform = async (survey) => { - const { xform, markdown, media, openclinica, preprocess, theme } = survey; + const { xform, markdown, media, openclinica, theme } = survey; const xsltParams = openclinica ? { @@ -61,7 +75,9 @@ export const transform: Transform = async (survey) => { let xformDoc: DOM.Document = domParser.parseFromString(xform, 'text/xml'); - if (typeof preprocess === 'function' && ENV === 'node') { + const preprocess = getPreprocess(survey); + + if (isFunction(preprocess)) { const { libxmljs } = await import('libxslt'); xformDoc = preprocess.call(libxmljs, xformDoc as any); diff --git a/test/benchmarks.ts b/test/benchmarks.ts index 7ebbf18..efed7c9 100644 --- a/test/benchmarks.ts +++ b/test/benchmarks.ts @@ -3,7 +3,13 @@ import type Benchmark from 'benchmark'; import { setFlagsFromString } from 'v8'; import { runInNewContext } from 'vm'; import { writeFileSync } from 'fs'; -import { fixtures, reload, transform } from './shared'; +import { setup } from './web/setup'; + +if (ENV === 'web') { + await setup(); +} + +const { fixtures, reload, transform } = await import('./shared'); /** * @see {@link https://stackoverflow.com/a/75007985} diff --git a/test/browser-env.ts b/test/browser-env.ts deleted file mode 100644 index e9fbbaa..0000000 --- a/test/browser-env.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { Transform } from '../src/transformer'; - -declare global { - const enketo: { - transformer: { - transform: Transform; - }; - }; -} diff --git a/test/shared.ts b/test/shared.ts index ce3f818..3074d7d 100644 --- a/test/shared.ts +++ b/test/shared.ts @@ -2,9 +2,8 @@ import { DOMParser } from 'linkedom'; import type { Attr } from 'linkedom/types/interface/attr'; import type { Element as BaseElement } from 'linkedom/types/interface/element'; import type { Node } from 'linkedom/types/interface/node'; -import { resolve } from 'path'; import type { Page } from 'playwright'; -import { fileURLToPath } from 'url'; +import { port } from '../config/config.json'; import firefoxUserPrefs from '../config/firefox.json'; import type { Survey, Transform, TransformedSurvey } from '../src/transformer'; import { fixtures } from './fixtures'; @@ -21,33 +20,22 @@ if (ENV === 'node') { reload = () => Promise.resolve(); transform = (await import('../src/transformer')).transform; } else { - const { createServer } = await import('vite'); - const root = fileURLToPath(new URL('..', import.meta.url)); - const configFile = resolve(root, './vite.config.ts'); - const playwright = await import('playwright'); const browserType = playwright[BROWSER]; - const [server, browser] = await Promise.all([ - createServer({ - configFile, - // clearScreen: false, - define: { - PACKAGE_VERSION: JSON.stringify(PACKAGE_VERSION), - VERSION: JSON.stringify(VERSION), - ENV: JSON.stringify(ENV), - BROWSER: JSON.stringify(BROWSER), - }, - root, - }), - browserType.launch({ - firefoxUserPrefs, - }), - ]); + const browser = await browserType.launch({ + firefoxUserPrefs: BROWSER === 'firefox' ? firefoxUserPrefs : undefined, + }); - await server.listen(); + const url = `http://localhost:${port}`; - const url = server.resolvedUrls!.local[0]!; + interface EnketoGlobal { + transformer: { + transform: Transform; + }; + } + + let enketo!: EnketoGlobal; let page: Page | null = null; let isLoading = false; @@ -104,11 +92,6 @@ if (ENV === 'node') { transform = async ( survey: T ): Promise> => { - // The *intent* here is that the global declaration will only affect web - // environments. Unfortunately, like TypeScript's DOM lib, there is no - // such thing as conditional global augmentation. - await import('./browser-env'); - delete survey.preprocess; const { error, result } = await page!.evaluate( diff --git a/test/web/setup.ts b/test/web/setup.ts new file mode 100644 index 0000000..a3f291c --- /dev/null +++ b/test/web/setup.ts @@ -0,0 +1,50 @@ +import { createHash } from 'crypto'; +import { readFileSync } from 'fs'; +import { resolve } from 'path'; +import { fileURLToPath } from 'url'; +import { createServer } from 'vite'; +import pkg from '../../package.json'; + +const ENV = 'web'; + +const md5 = (message: string | Buffer) => { + const hash = createHash('md5'); + hash.update(message); + + return hash.digest('hex'); +}; + +const XSL_FORM = readFileSync('./src/xsl/openrosa2html5form.xsl', 'utf-8'); +const XSL_MODEL = readFileSync('./src/xsl/openrosa2xmlmodel.xsl', 'utf-8'); +const PACKAGE_VERSION = pkg.version; +const VERSION = md5(`${XSL_FORM}${XSL_MODEL}${PACKAGE_VERSION}`); + +type Browser = 'firefox' | 'chromium' | 'webkit'; + +const browsers = new Map([ + ['firefox', 'firefox'], + ['chromium', 'chromium'], + ['webkit', 'webkit'], +]); + +const BROWSER = browsers.get(process.env.BROWSER as Browser) ?? 'firefox'; + +const define = { + PACKAGE_VERSION: JSON.stringify(PACKAGE_VERSION), + VERSION: JSON.stringify(VERSION), + ENV: JSON.stringify(ENV), + BROWSER: JSON.stringify(BROWSER), +}; + +export const setup = async () => { + const root = fileURLToPath(new URL('../..', import.meta.url)); + const configFile = resolve(root, './vite.config.ts'); + + const server = await createServer({ + configFile, + define, + root, + }); + + await server.listen(); +}; diff --git a/tsconfig.json b/tsconfig.json index 7ef01b6..7eddb0b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,11 +1,15 @@ { "extends": "./tsconfig.base.json", "compilerOptions": { + "declaration": true, + "emitDeclarationOnly": true, + "noEmit": false, + "outDir": "./dist/types", "paths": { - "enketo-transformer/dom": ["src/dom/node"] + "enketo-transformer/dom": ["src/dom/node/index.ts"] } }, "exclude": ["dist", "node_modules", "./src/dom/web", "./typings/test.d.ts"], "include": ["vite.config.ts", "config", "src", "typings"], - "files": ["./typings/env.d.ts"] + "files": ["./typings/env/node.d.ts"] } diff --git a/tsconfig.typedefs.json b/tsconfig.typedefs.json deleted file mode 100644 index 92521a8..0000000 --- a/tsconfig.typedefs.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "compilerOptions": { - "declaration": true, - "emitDeclarationOnly": true, - "noEmit": false, - "outDir": "./dist/types", - "paths": { - "enketo-transformer/dom": ["src/dom/node/index.ts"] - } - }, - "extends": "./tsconfig.json", - "include": ["./src", "./typings"] -} diff --git a/tsconfig.web.json b/tsconfig.web.json index e046e6f..4f40cf3 100644 --- a/tsconfig.web.json +++ b/tsconfig.web.json @@ -1,11 +1,15 @@ { "extends": "./tsconfig.base.json", "compilerOptions": { + "declaration": true, + "emitDeclarationOnly": true, + "noEmit": false, + "outDir": "./dist/@enketo/transformer-web", "paths": { - "enketo-transformer/dom": ["src/dom/web/index"] + "enketo-transformer/dom": ["src/dom/web/index.ts"] } }, "exclude": ["dist", "node_modules", "./typings/test.d.ts"], "include": ["config", "src", "typings"], - "files": ["./typings/env.d.ts"] + "files": ["./typings/env/web.d.ts"] } diff --git a/typings/env/node.d.ts b/typings/env/node.d.ts new file mode 100644 index 0000000..21b4239 --- /dev/null +++ b/typings/env/node.d.ts @@ -0,0 +1,4 @@ +// eslint-disable-next-line @typescript-eslint/triple-slash-reference +/// + +declare const ENV: 'node'; diff --git a/typings/env.d.ts b/typings/env/shared.d.ts similarity index 75% rename from typings/env.d.ts rename to typings/env/shared.d.ts index fe3f929..59b175d 100644 --- a/typings/env.d.ts +++ b/typings/env/shared.d.ts @@ -2,4 +2,3 @@ declare const PACKAGE_VERSION: string; declare const VERSION: string; -declare const ENV: 'node' | 'web'; diff --git a/typings/env/web.d.ts b/typings/env/web.d.ts new file mode 100644 index 0000000..21de98d --- /dev/null +++ b/typings/env/web.d.ts @@ -0,0 +1,7 @@ +/// +/// + +// eslint-disable-next-line @typescript-eslint/triple-slash-reference +/// + +declare const ENV: 'web'; diff --git a/typings/test.d.ts b/typings/test.d.ts index cdb9941..aaf43cf 100644 --- a/typings/test.d.ts +++ b/typings/test.d.ts @@ -2,3 +2,4 @@ /// declare const BROWSER: 'firefox' | 'chromium' | 'webkit'; +declare const ENV: 'node' | 'web'; diff --git a/vite.config.ts b/vite.config.ts index a37042e..38923ef 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -23,7 +23,6 @@ export default defineConfig(async () => { ); const formats = (isWeb ? ['es'] : ['es', 'cjs']) satisfies LibraryFormats[]; const emptyOutDir = process.env.EMPTY_OUT_DIR === 'true'; - const minify = isWeb; const external = [ 'body-parser', @@ -41,14 +40,14 @@ export default defineConfig(async () => { 'vite', ]; - if (isWeb) { - external.push('libxslt'); - } else { - external.push('language-tags', 'string-direction'); + const webDeps = ['language-tags', 'string-direction']; + + if (!isWeb) { + external.push(...webDeps); } const input = isWeb - ? ['./src/transformer.ts', 'language-tags', 'string-direction'] + ? ['./src/transformer.ts'] : ['./src/app.ts', './src/transformer.ts', './config/config.json']; const isViteNodeRuntime = process.argv.some((arg) => @@ -85,9 +84,6 @@ export default defineConfig(async () => { BROWSER: JSON.stringify(BROWSER), }; - const include = isWeb ? ['language-tags', 'string-direction'] : []; - const needsInterop = [...include]; - const alias = isWeb ? [ { @@ -126,6 +122,10 @@ export default defineConfig(async () => { .replace( 'node_modules/.vite/deps_build-dist/', '@enketo/transformer-web/deps/' + ) + .replace( + 'node_modules/', + '@enketo/transformer-web/deps/' ); return `${resolved}${extension}`; @@ -138,7 +138,7 @@ export default defineConfig(async () => { }, }, emptyOutDir, - minify, + minify: false, outDir: 'dist', rollupOptions: { external, @@ -150,7 +150,7 @@ export default defineConfig(async () => { // have explicit tests ensuring both the default and named // exports are consistent with the existing public API. exports: 'named', - preserveModules: true, + preserveModules: isWeb, }, treeshake: true, }, @@ -164,10 +164,7 @@ export default defineConfig(async () => { sourcemap: true, }, optimizeDeps: { - disabled: !isWeb, exclude: external, - include, - needsInterop, }, resolve: { alias }, server: { @@ -190,6 +187,7 @@ export default defineConfig(async () => { }, globals: true, + globalSetup: 'test/web/setup.ts', include: ['test/**/*.spec.ts'], reporters: 'verbose', sequence: { shuffle: true }, From 5c6f898f985efed3a188ca5adf3e073af37517e7 Mon Sep 17 00:00:00 2001 From: eyelidlessness Date: Tue, 21 Feb 2023 14:53:22 -0800 Subject: [PATCH 14/24] Fix: bundle for web, preserve modules for Node --- vite.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vite.config.ts b/vite.config.ts index 38923ef..7a01b96 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -150,7 +150,7 @@ export default defineConfig(async () => { // have explicit tests ensuring both the default and named // exports are consistent with the existing public API. exports: 'named', - preserveModules: isWeb, + preserveModules: !isWeb, }, treeshake: true, }, From fdb904c6361d4a36902a75015388836cc72a1b33 Mon Sep 17 00:00:00 2001 From: eyelidlessness Date: Tue, 21 Feb 2023 15:26:41 -0800 Subject: [PATCH 15/24] Move redundant config stuff to shared module again --- config/build.shared.ts | 35 +++++++++++++++++++++++++++++++++++ test/web/setup.ts | 35 +---------------------------------- vite.config.ts | 34 +--------------------------------- 3 files changed, 37 insertions(+), 67 deletions(-) create mode 100644 config/build.shared.ts diff --git a/config/build.shared.ts b/config/build.shared.ts new file mode 100644 index 0000000..81e60c1 --- /dev/null +++ b/config/build.shared.ts @@ -0,0 +1,35 @@ +import { createHash } from 'crypto'; +import { readFileSync } from 'fs'; +import pkg from '../package.json'; + +export const ENV = process.env.ENV?.toLowerCase() === 'web' ? 'web' : 'node'; + +const md5 = (message: string | Buffer) => { + const hash = createHash('md5'); + hash.update(message); + + return hash.digest('hex'); +}; + +const XSL_FORM = readFileSync('./src/xsl/openrosa2html5form.xsl', 'utf-8'); +const XSL_MODEL = readFileSync('./src/xsl/openrosa2xmlmodel.xsl', 'utf-8'); +const PACKAGE_VERSION = pkg.version; +const VERSION = md5(`${XSL_FORM}${XSL_MODEL}${PACKAGE_VERSION}`); + +type Browser = 'firefox' | 'chromium' | 'webkit'; + +const browsers = new Map([ + ['firefox', 'firefox'], + ['chromium', 'chromium'], + ['webkit', 'webkit'], +]); + +const BROWSER = + browsers.get(process.env.BROWSER?.toLowerCase() as Browser) ?? 'firefox'; + +export const define = { + PACKAGE_VERSION: JSON.stringify(PACKAGE_VERSION), + VERSION: JSON.stringify(VERSION), + ENV: JSON.stringify(ENV), + BROWSER: JSON.stringify(BROWSER), +}; diff --git a/test/web/setup.ts b/test/web/setup.ts index a3f291c..ece79df 100644 --- a/test/web/setup.ts +++ b/test/web/setup.ts @@ -1,40 +1,7 @@ -import { createHash } from 'crypto'; -import { readFileSync } from 'fs'; import { resolve } from 'path'; import { fileURLToPath } from 'url'; import { createServer } from 'vite'; -import pkg from '../../package.json'; - -const ENV = 'web'; - -const md5 = (message: string | Buffer) => { - const hash = createHash('md5'); - hash.update(message); - - return hash.digest('hex'); -}; - -const XSL_FORM = readFileSync('./src/xsl/openrosa2html5form.xsl', 'utf-8'); -const XSL_MODEL = readFileSync('./src/xsl/openrosa2xmlmodel.xsl', 'utf-8'); -const PACKAGE_VERSION = pkg.version; -const VERSION = md5(`${XSL_FORM}${XSL_MODEL}${PACKAGE_VERSION}`); - -type Browser = 'firefox' | 'chromium' | 'webkit'; - -const browsers = new Map([ - ['firefox', 'firefox'], - ['chromium', 'chromium'], - ['webkit', 'webkit'], -]); - -const BROWSER = browsers.get(process.env.BROWSER as Browser) ?? 'firefox'; - -const define = { - PACKAGE_VERSION: JSON.stringify(PACKAGE_VERSION), - VERSION: JSON.stringify(VERSION), - ENV: JSON.stringify(ENV), - BROWSER: JSON.stringify(BROWSER), -}; +import { define } from '../../config/build.shared'; export const setup = async () => { const root = fileURLToPath(new URL('../..', import.meta.url)); diff --git a/vite.config.ts b/vite.config.ts index 7a01b96..2238044 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,21 +1,11 @@ -import { createHash } from 'crypto'; -import { readFileSync } from 'fs'; import { resolve } from 'path'; import type { LibraryFormats } from 'vite'; import type { UserConfig } from 'vitest/config'; import { defineConfig } from 'vitest/config'; import config from './config/config.json'; -import pkg from './package.json'; - -const md5 = (message: string | Buffer) => { - const hash = createHash('md5'); - hash.update(message); - - return hash.digest('hex'); -}; +import { define, ENV } from './config/build.shared'; export default defineConfig(async () => { - const ENV = process.env.ENV === 'web' ? 'web' : 'node'; const isWeb = ENV === 'web'; const entryNames = isWeb ? ['transformer'] : ['app', 'transformer']; const entry = entryNames.map((name) => @@ -62,28 +52,6 @@ export default defineConfig(async () => { */ const target = isWeb || isViteRuntime ? 'modules' : 'node14'; - const XSL_FORM = readFileSync('./src/xsl/openrosa2html5form.xsl', 'utf-8'); - const XSL_MODEL = readFileSync('./src/xsl/openrosa2xmlmodel.xsl', 'utf-8'); - const PACKAGE_VERSION = pkg.version; - const VERSION = md5(`${XSL_FORM}${XSL_MODEL}${PACKAGE_VERSION}`); - - type Browser = 'firefox' | 'chromium' | 'webkit'; - - const browsers = new Map([ - ['firefox', 'firefox'], - ['chromium', 'chromium'], - ['webkit', 'webkit'], - ]); - - const BROWSER = browsers.get(process.env.BROWSER as Browser) ?? 'firefox'; - - const define = { - PACKAGE_VERSION: JSON.stringify(PACKAGE_VERSION), - VERSION: JSON.stringify(VERSION), - ENV: JSON.stringify(ENV), - BROWSER: JSON.stringify(BROWSER), - }; - const alias = isWeb ? [ { From 77eb952924e534a3732ca4682777b256ad18c419 Mon Sep 17 00:00:00 2001 From: eyelidlessness Date: Tue, 21 Feb 2023 15:27:11 -0800 Subject: [PATCH 16/24] Attempt to report summaries to PR Also bumps actions versions which have been warning about Node 12 for no apparent reason --- .github/workflows/npmjs.yml | 35 ++++++---- .gitignore | 1 + config/build.shared.ts | 5 +- test/benchmarks.ts | 127 +++++++++++++++++++----------------- vite.config.ts | 4 +- 5 files changed, 96 insertions(+), 76 deletions(-) diff --git a/.github/workflows/npmjs.yml b/.github/workflows/npmjs.yml index 2387fd9..4402832 100644 --- a/.github/workflows/npmjs.yml +++ b/.github/workflows/npmjs.yml @@ -10,30 +10,32 @@ on: jobs: build: runs-on: ubuntu-latest + permissions: + pull-requests: write strategy: matrix: - target: ['node'] + target: ['Node'] node: ['14', '16'] include: - - target: web + - target: Web node: 16 - browser: firefox - - target: web + browser: Firefox + - target: Web node: 16 - browser: chromium - - target: web + browser: Chromium + - target: Web node: 16 - browser: webkit + browser: WebKit steps: - - uses: actions/checkout@v2 - - uses: actions/cache@v2 + - uses: actions/checkout@v3 + - uses: actions/cache@v3 id: cache with: path: | node_modules ~/.cache/ms-playwright key: ${{ matrix.node }}-${{ hashFiles('**/package-lock.json') }} - - uses: actions/setup-node@v2 + - uses: actions/setup-node@v3 with: node-version: ${{ matrix.node }} registry-url: https://registry.npmjs.org/ @@ -43,7 +45,18 @@ jobs: - if: matrix.node == '16' && matrix.browser == 'webkit' run: sudo npx playwright install-deps - run: ENV=${{ matrix.target }} BROWSER=${{ matrix.browser }} npm test - - run: ENV=${{ matrix.target }} BROWSER=${{ matrix.browser }} npm run benchmarks + - id: benchmarks + run: ENV=${{ matrix.target }} BROWSER=${{ matrix.browser }} npm run benchmarks + - uses: marocchino/sticky-pull-request-comment@v2 + if: matrix.target == 'Node' + with: + header: Node ${{ matrix.node }} + path: ./.benchmarks.md + - uses: marocchino/sticky-pull-request-comment@v2 + if: matrix.target == 'Web' + with: + header: ${{ matrix.browser}} + path: ./.benchmarks.md - if: github.event_name == 'release' && github.event.action == 'published' && matrix.node == '16' && matrix.target == 'node' run: npm publish env: diff --git a/.gitignore b/.gitignore index 3bcac18..46e3b73 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ Thumbs.db test-coverage coverage.shield.badge.md dist +.benchmarks.md diff --git a/config/build.shared.ts b/config/build.shared.ts index 81e60c1..818ae5f 100644 --- a/config/build.shared.ts +++ b/config/build.shared.ts @@ -2,7 +2,8 @@ import { createHash } from 'crypto'; import { readFileSync } from 'fs'; import pkg from '../package.json'; -export const ENV = process.env.ENV?.toLowerCase() === 'web' ? 'web' : 'node'; +export const TARGET_ENV = + process.env.ENV?.toLowerCase() === 'web' ? 'web' : 'node'; const md5 = (message: string | Buffer) => { const hash = createHash('md5'); @@ -30,6 +31,6 @@ const BROWSER = export const define = { PACKAGE_VERSION: JSON.stringify(PACKAGE_VERSION), VERSION: JSON.stringify(VERSION), - ENV: JSON.stringify(ENV), + ENV: JSON.stringify(TARGET_ENV), BROWSER: JSON.stringify(BROWSER), }; diff --git a/test/benchmarks.ts b/test/benchmarks.ts index efed7c9..20e49dc 100644 --- a/test/benchmarks.ts +++ b/test/benchmarks.ts @@ -1,8 +1,9 @@ import { Suite } from 'benchmark'; import type Benchmark from 'benchmark'; +import { writeFileSync } from 'fs'; import { setFlagsFromString } from 'v8'; import { runInNewContext } from 'vm'; -import { writeFileSync } from 'fs'; +import { fileURLToPath } from 'url'; import { setup } from './web/setup'; if (ENV === 'web') { @@ -107,70 +108,69 @@ for await (const suite of suites.values()) { await runSuite(suite); } -const { GITHUB_STEP_SUMMARY } = process.env; +const SUMMARY_PATH = fileURLToPath( + new URL('../.benchmarks.md', import.meta.url) +); -if (GITHUB_STEP_SUMMARY) { - const sum = (ns: number[]) => ns.reduce((acc, n) => acc + n, 0); - const avg = (ns: number[]) => sum(ns) / ns.length; - - const benchmarks = [...suites.values()] - .flatMap((suite): Benchmark[] => suite.slice(0, suite.length)) - .filter((benchmark) => benchmark.name !== RELOAD_WORKAROUND) - .sort((a, b) => a.hz - b.hz); - - const times = benchmarks.map(({ times }) => times!.elapsed); - const time = sum(times).toFixed(2); - const means = benchmarks.map(({ stats }) => stats.mean * 1000); - const average = avg(means); - const nonOutlierIndex = Math.max( - means.findIndex((mean, index) => { - if (index === 0 || index > means.length - 2) { - return false; - } +const sum = (ns: number[]) => ns.reduce((acc, n) => acc + n, 0); +const avg = (ns: number[]) => sum(ns) / ns.length; + +const benchmarks = [...suites.values()] + .flatMap((suite): Benchmark[] => suite.slice(0, suite.length)) + .filter((benchmark) => benchmark.name !== RELOAD_WORKAROUND) + .sort((a, b) => a.hz - b.hz); + +const times = benchmarks.map(({ times }) => times!.elapsed); +const time = sum(times).toFixed(2); +const means = benchmarks.map(({ stats }) => stats.mean * 1000); +const average = avg(means); +const nonOutlierIndex = Math.max( + means.findIndex((mean, index) => { + if (index === 0 || index > means.length - 2) { + return false; + } - const previous = means[index - 1]; - const next = means[index + 1]; + const previous = means[index - 1]; + const next = means[index + 1]; - return ( - previous / average > (mean / average) * 2 && - mean / average <= (next / average) * 2 - ); - }), - 0 - ); - const averageWithoutOutliers = avg(means.slice(nonOutlierIndex)); - - /** - * Roughly based on {@link https://github.com/bestiejs/benchmark.js/blob/42f3b732bac3640eddb3ae5f50e445f3141016fd/benchmark.js#L1525}, simplified and modified to output a GitHub Actions summary. - */ - const summaries = benchmarks.map((bench, index) => { - const { error, name, stats } = bench; - let result = error?.message; - - if (result == null) { - const size = stats.sample.length; - const mean = `${means[index].toFixed(2)} ms`; - - const [hzWhole, hzFractional] = String( - bench.hz.toFixed(bench.hz < 100 ? 2 : 0) - ).split('.'); - const hz = - hzWhole.replace(/(?=(?:\d{3})+$)(?!\b)/g, ',') + - (hzFractional ? `.${hzFractional}` : ''); - const rme = `±${stats.rme.toFixed(2)}%`; - const samples = `${size} run${size === 1 ? '' : 's'}`; - - result = `${mean} (${hz} ops/s ${rme}, ${samples})`; - } + return ( + previous / average > (mean / average) * 2 && + mean / average <= (next / average) * 2 + ); + }), + 0 +); +const averageWithoutOutliers = avg(means.slice(nonOutlierIndex)); - return [name, result]; - }); - const [slowest] = summaries; - const fastest = summaries[summaries.length - 1]; +/** + * Roughly based on {@link https://github.com/bestiejs/benchmark.js/blob/42f3b732bac3640eddb3ae5f50e445f3141016fd/benchmark.js#L1525}, simplified and modified to output a GitHub Actions summary. + */ +const summaries = benchmarks.map((bench, index) => { + const { error, name, stats } = bench; + let result = error?.message; + + if (result == null) { + const size = stats.sample.length; + const mean = `${means[index].toFixed(2)} ms`; + + const [hzWhole, hzFractional] = String( + bench.hz.toFixed(bench.hz < 100 ? 2 : 0) + ).split('.'); + const hz = + hzWhole.replace(/(?=(?:\d{3})+$)(?!\b)/g, ',') + + (hzFractional ? `.${hzFractional}` : ''); + const rme = `±${stats.rme.toFixed(2)}%`; + const samples = `${size} run${size === 1 ? '' : 's'}`; + + result = `${mean} (${hz} ops/s ${rme}, ${samples})`; + } - const summary = /* html */ ` -

Benchmarks

+ return [name, result]; +}); +const [slowest] = summaries; +const fastest = summaries[summaries.length - 1]; +const summary = /* html */ ` @@ -218,9 +218,14 @@ if (GITHUB_STEP_SUMMARY) {
` - .trim() - .replace(/(^|\n)\s+/g, '$1'); + .trim() + .replace(/(^|\n)\s+/g, '$1'); + +writeFileSync(SUMMARY_PATH, summary); + +const { GITHUB_STEP_SUMMARY } = process.env; +if (GITHUB_STEP_SUMMARY != null) { writeFileSync(GITHUB_STEP_SUMMARY, summary); } diff --git a/vite.config.ts b/vite.config.ts index 2238044..b272fc0 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -3,10 +3,10 @@ import type { LibraryFormats } from 'vite'; import type { UserConfig } from 'vitest/config'; import { defineConfig } from 'vitest/config'; import config from './config/config.json'; -import { define, ENV } from './config/build.shared'; +import { define, TARGET_ENV } from './config/build.shared'; export default defineConfig(async () => { - const isWeb = ENV === 'web'; + const isWeb = TARGET_ENV === 'web'; const entryNames = isWeb ? ['transformer'] : ['app', 'transformer']; const entry = entryNames.map((name) => resolve(__dirname, `./src/${name}.ts`) From 51595b4949e34a3f2134cf9e67e7261ebd327057 Mon Sep 17 00:00:00 2001 From: eyelidlessness Date: Wed, 22 Feb 2023 13:18:23 -0800 Subject: [PATCH 17/24] GitHub does not allow forks to write PR comments at all --- .github/workflows/npmjs.yml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/.github/workflows/npmjs.yml b/.github/workflows/npmjs.yml index 4402832..8454567 100644 --- a/.github/workflows/npmjs.yml +++ b/.github/workflows/npmjs.yml @@ -10,8 +10,6 @@ on: jobs: build: runs-on: ubuntu-latest - permissions: - pull-requests: write strategy: matrix: target: ['Node'] @@ -47,16 +45,6 @@ jobs: - run: ENV=${{ matrix.target }} BROWSER=${{ matrix.browser }} npm test - id: benchmarks run: ENV=${{ matrix.target }} BROWSER=${{ matrix.browser }} npm run benchmarks - - uses: marocchino/sticky-pull-request-comment@v2 - if: matrix.target == 'Node' - with: - header: Node ${{ matrix.node }} - path: ./.benchmarks.md - - uses: marocchino/sticky-pull-request-comment@v2 - if: matrix.target == 'Web' - with: - header: ${{ matrix.browser}} - path: ./.benchmarks.md - if: github.event_name == 'release' && github.event.action == 'published' && matrix.node == '16' && matrix.target == 'node' run: npm publish env: From 69109d08ffc8fee44b916c4d3cc17578f9f676ad Mon Sep 17 00:00:00 2001 From: eyelidlessness Date: Wed, 1 Mar 2023 09:28:16 -0800 Subject: [PATCH 18/24] Fix build paths (hopefully for good this time!) --- package.json | 10 +++++----- tsconfig.web.json | 2 +- vite.config.ts | 22 +++++----------------- 3 files changed, 11 insertions(+), 23 deletions(-) diff --git a/package.json b/package.json index 201535f..b6c8031 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "type": "module", "main": "./dist/enketo-transformer/transformer.cjs", "module": "./dist/enketo-transformer/enketo-transformer.js", - "browser": "./dist/@enketo/transformer-web/transformer.js", + "browser": "./dist/enketo-transformer/web/transformer.js", "types": "./dist/types/src/transformer.d.ts", "files": [ "app.js", @@ -16,7 +16,7 @@ ".": { "import": "./dist/enketo-transformer/enketo-transformer.js", "require": "./dist/enketo-transformer/transformer.cjs", - "browser": "./dist/@enketo/transformer-web/transformer.js", + "browser": "./dist/enketo-transformer/web/transformer.js", "types": "./dist/types/src/transformer.d.ts" }, "./dom": { @@ -26,14 +26,14 @@ "types": "./dist/types/src/dom/node/index.d.ts" }, "./web": { - "default": "./dist/@enketo/transformer-web/transformer.js", - "types": "./dist/@enketo/transformer-web/src/transformer.d.ts" + "default": "./dist/enketo-transformer/web/transformer.js", + "types": "./dist/enketo-transformer/web/src/transformer.d.ts" } }, "typesVersions": { "*": { "web": [ - "./dist/types/src/transformer.d.ts" + "./dist/enketo-transformer/web/src/transformer.d.ts" ] } }, diff --git a/tsconfig.web.json b/tsconfig.web.json index 4f40cf3..c9d4216 100644 --- a/tsconfig.web.json +++ b/tsconfig.web.json @@ -4,7 +4,7 @@ "declaration": true, "emitDeclarationOnly": true, "noEmit": false, - "outDir": "./dist/@enketo/transformer-web", + "outDir": "./dist/enketo-transformer/web", "paths": { "enketo-transformer/dom": ["src/dom/web/index.ts"] } diff --git a/vite.config.ts b/vite.config.ts index b272fc0..e98453b 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -74,32 +74,20 @@ export default defineConfig(async () => { }, ]; + const baseName = isWeb ? 'enketo-transformer/web' : 'enketo-transformer'; + return { assetsInclude: ['**/*.xml', '**/*.xsl'], build: { lib: { entry, formats, - name: 'enketo-transformer', + name: baseName, + // Note: this is only called for Node builds. fileName(format, entryName) { const extension = format === 'es' ? '.js' : '.cjs'; - if (isWeb) { - const resolved = entryName - .replace('src/', '@enketo/transformer-web/') - .replace( - 'node_modules/.vite/deps_build-dist/', - '@enketo/transformer-web/deps/' - ) - .replace( - 'node_modules/', - '@enketo/transformer-web/deps/' - ); - - return `${resolved}${extension}`; - } - - return `enketo-transformer/${entryName.replace( + return `${baseName}/${entryName.replace( 'src/', '' )}${extension}`; From 50d2f765fef15947aba5ccafe6aec6221a25ee7c Mon Sep 17 00:00:00 2001 From: eyelidlessness Date: Wed, 1 Mar 2023 09:28:30 -0800 Subject: [PATCH 19/24] Don't show "Transforming..." in demo when not transforming --- demo/demo.tsx | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/demo/demo.tsx b/demo/demo.tsx index a077f4c..563a775 100644 --- a/demo/demo.tsx +++ b/demo/demo.tsx @@ -246,15 +246,19 @@ function Demo() { Theme

-q#=v4&8RPgNfyn1>$Q6HI{9j*R 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 literal 0 HcmV?d00001 diff --git a/demo/public/OpenSans-BoldItalic-webfont.woff b/demo/public/OpenSans-BoldItalic-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..06d3a92c66e93c48e22dd157ab02db55a2b9e878 GIT binary patch literal 71664 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

-
- ⏲️{' '} - - Transforming... - - Transformed in {duration()?.toFixed(2)} ms - - -
+ +
+ ⏲️{' '} + + + Transforming... + + + Transformed in {duration()?.toFixed(2)} ms + + +
+
{(error) => ( From 13b1e9caf675151ee0093ea3c65903e1692bb44e Mon Sep 17 00:00:00 2001 From: eyelidlessness Date: Thu, 2 Mar 2023 13:59:29 -0800 Subject: [PATCH 20/24] Address initial review feedback - Update README - Clarify change to URL escaping implementation per initial review feedback --- README.md | 22 ++++++++++++++++++---- src/url.ts | 12 +++++++++++- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 20cc4c9..76b216d 100644 --- a/README.md +++ b/README.md @@ -13,13 +13,13 @@ ODK XForms are based off of [W3C XForms](https://en.wikipedia.org/wiki/XForms) w Historically, forms with many questions or many translations were prohibitively slow to transform. Starting in Enketo Transformer v2.2.1 (Feb 2023), they are much faster. +In v2.3.0 (Mar 2023), a web compatibility layer was introduced so that Enketo Transformer can be run in either a web browser using native DOM/web APIs, or in Node using a partial DOM compatibility layer wrapping equivalent `libxmljs` APIs/behavior. Each respective implementation is aliased as `enketo-transformer/dom`, resolved at build time to `src/dom/web/index.ts` or `src/dom/node/index.ts` respectively. Interfaces for the subset of DOM APIs in use are defined in `src/dom/abstract`, which ensures the Node compatibility layer conforms to the same browser-native interfaces. + Our current primary goals are: -- Using standard DOM APIs so the transformation can be performed client-side. +- Rethink transformation to be as minimal as possible, ideally without XSLT, and moving most (or all) of Enketo Transformer's current responsibilities to other parts of the Enketo stack. - Identifying and addressing remaining performance bottlenecks to remove the need for server-side caching. -Longer term, we intend to rethink transformation to be as minimal as possible, ideally without XSLT. - ### Prerequisites 1. Volta (optional, but recommended) @@ -57,7 +57,7 @@ const result = await transform({ // ... do something with result ``` -### Web +#### Web Enketo Transformer may also be used on the web as an ESM module. It is exported as `enketo-transformer/web`: @@ -130,6 +130,20 @@ curl -d "xform=x&theme=plain&media[myfile.png]=/path/to/somefile. } ``` +### How Enketo Transformer is used by other Enketo projects + +Enketo Core uses the `transform` function directly to transform XForm fixtures used in development and test modes. It also currently uses the test/dev server in development mode to transform external XForms. It does not currently use any transformation functionality in production. + +Enketo Express uses the `transform` function to serve requests to its server-side transformation API endpoints, and caches transformed XForms in Redis. It also uses the `escapeURLPath` function (implemented in `url.ts`). + +Neither project currently uses the following functionality: + +- Media URL mapping. Enketo Express has its own implementation of this functionality, so that dynamic media replacements are not cached. This functionality is maintained for backwards compatibility. + +- The `openclinica` flag. This functionality is used by OpenClinica's fork of Enketo Express. + +- The deprecated `preprocess` option. This functionality _may_ be used to update XForms with deprecated content, but its use is discouraged as users can achieve the same thing by preprocessing their XForms before calling `transform`. + #### Test - run tests with `npm test` diff --git a/src/url.ts b/src/url.ts index 9c96e88..2d557a4 100644 --- a/src/url.ts +++ b/src/url.ts @@ -1,3 +1,5 @@ +const TEMPORARY_HOST = 'http://example.com'; + /** * @package * @@ -6,9 +8,17 @@ export const escapeURLPath = (value: string): string => { const [scheme] = value.match(/^[a-z]+:/) ?? []; const isFullyQualified = scheme != null; + + /** + * Browser implementations of `URL` do not escape URLs with unknown schemes + * like `jr:, nor do they escape known URLs without a domain like `file:`. + * To work around this limitation, we use a temporary HTTP host to escape + * `jr:` URL paths. + */ const urlString = isFullyQualified ? value.replace(/^jr:\/*/, 'http://') - : `http://example.com/${value.replace(/^\//, '')}`; + : `${TEMPORARY_HOST}/${value.replace(/^\//, '')}`; + const url = new URL(urlString); if (isFullyQualified) { From 885eac7ed173d1744763c26d10bf5744ab9b37aa Mon Sep 17 00:00:00 2001 From: eyelidlessness Date: Thu, 2 Mar 2023 14:00:51 -0800 Subject: [PATCH 21/24] Fix: isolation of global DOM types --- .eslintrc.json | 1 + src/dom/web/DOMParser.ts | 3 --- src/dom/web/XSLTProcessor.ts | 3 --- test/tsconfig.json | 2 +- tsconfig.base.json | 3 +-- tsconfig.json | 11 +++++++++-- tsconfig.web.json | 8 +++++++- typings/env/node.d.ts | 7 ++++--- typings/{ => env}/test.d.ts | 0 typings/env/web.d.ts | 10 ++++------ 10 files changed, 27 insertions(+), 21 deletions(-) rename typings/{ => env}/test.d.ts (100%) diff --git a/.eslintrc.json b/.eslintrc.json index 6b0cd5e..baa6de9 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -119,6 +119,7 @@ "error", "ignorePackages", { + "": "never", "js": "never", "jsx": "never", "ts": "never", diff --git a/src/dom/web/DOMParser.ts b/src/dom/web/DOMParser.ts index 2a3a508..a8b3187 100644 --- a/src/dom/web/DOMParser.ts +++ b/src/dom/web/DOMParser.ts @@ -1,6 +1,3 @@ -/// -/// - import type { DOM } from '../abstract'; /** @package */ diff --git a/src/dom/web/XSLTProcessor.ts b/src/dom/web/XSLTProcessor.ts index 6df5354..dd7498c 100644 --- a/src/dom/web/XSLTProcessor.ts +++ b/src/dom/web/XSLTProcessor.ts @@ -1,6 +1,3 @@ -/// -/// - import type { DOM } from '../abstract'; /** @package */ diff --git a/test/tsconfig.json b/test/tsconfig.json index 8e17eca..61baa75 100644 --- a/test/tsconfig.json +++ b/test/tsconfig.json @@ -7,5 +7,5 @@ }, "exclude": ["../node_modules", "../src/dom/web"], "include": [".", "../src", "../typings"], - "files": ["../typings/test.d.ts"] + "files": ["../typings/env/test.d.ts"] } diff --git a/tsconfig.base.json b/tsconfig.base.json index 64a2080..9d4a2ec 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -21,7 +21,6 @@ "resolveJsonModule": true, "skipLibCheck": true, "strict": true, - "target": "es2020", - "types": ["node"] + "target": "es2020" } } diff --git a/tsconfig.json b/tsconfig.json index 7eddb0b..75e94a6 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,9 +7,16 @@ "outDir": "./dist/types", "paths": { "enketo-transformer/dom": ["src/dom/node/index.ts"] - } + }, + "types": ["node"] }, - "exclude": ["dist", "node_modules", "./src/dom/web", "./typings/test.d.ts"], + "exclude": [ + "dist", + "node_modules", + "./src/dom/web/*", + "./typings/env/web.d.ts", + "./typings/env/test.d.ts" + ], "include": ["vite.config.ts", "config", "src", "typings"], "files": ["./typings/env/node.d.ts"] } diff --git a/tsconfig.web.json b/tsconfig.web.json index c9d4216..97e4186 100644 --- a/tsconfig.web.json +++ b/tsconfig.web.json @@ -3,13 +3,19 @@ "compilerOptions": { "declaration": true, "emitDeclarationOnly": true, + "lib": ["DOM", "DOM.Iterable"], "noEmit": false, "outDir": "./dist/enketo-transformer/web", "paths": { "enketo-transformer/dom": ["src/dom/web/index.ts"] } }, - "exclude": ["dist", "node_modules", "./typings/test.d.ts"], + "exclude": [ + "dist", + "node_modules", + "./typings/env/node.d.ts", + "./typings/env/test.d.ts" + ], "include": ["config", "src", "typings"], "files": ["./typings/env/web.d.ts"] } diff --git a/typings/env/node.d.ts b/typings/env/node.d.ts index 21b4239..66b059f 100644 --- a/typings/env/node.d.ts +++ b/typings/env/node.d.ts @@ -1,4 +1,5 @@ -// eslint-disable-next-line @typescript-eslint/triple-slash-reference -/// +import './shared'; -declare const ENV: 'node'; +declare global { + const ENV: 'node'; +} diff --git a/typings/test.d.ts b/typings/env/test.d.ts similarity index 100% rename from typings/test.d.ts rename to typings/env/test.d.ts diff --git a/typings/env/web.d.ts b/typings/env/web.d.ts index 21de98d..f0c46f9 100644 --- a/typings/env/web.d.ts +++ b/typings/env/web.d.ts @@ -1,7 +1,5 @@ -/// -/// +import './shared'; -// eslint-disable-next-line @typescript-eslint/triple-slash-reference -/// - -declare const ENV: 'web'; +declare global { + const ENV: 'web'; +} From e480bfedc016ce736d31b0f503f3f8b154c603fc Mon Sep 17 00:00:00 2001 From: eyelidlessness Date: Thu, 2 Mar 2023 15:28:40 -0800 Subject: [PATCH 22/24] Process itemset itext labels in XForm doc, rather than injecting templates into XSLT --- src/transformer.ts | 93 ++++++++-------------------------- src/xsl/openrosa2html5form.xsl | 21 +++----- 2 files changed, 28 insertions(+), 86 deletions(-) diff --git a/src/transformer.ts b/src/transformer.ts index 432705e..994e7bd 100644 --- a/src/transformer.ts +++ b/src/transformer.ts @@ -84,7 +84,7 @@ export const transform: Transform = async (survey) => { } processBinaryDefaults(xformDoc, mediaMap); - injectItemsetTemplateCalls(xslFormDoc, xformDoc); + processItemsets(xformDoc); const htmlDoc = xslTransform(xslFormDoc, xformDoc, xsltParams); @@ -580,11 +580,11 @@ const correctHTMLDocHierarchy = (doc: DOM.Document) => { } }; -/** @see {@link injectItemsetTemplateCalls} */ +/** @see {@link processItemsets} */ const substringBefore = (haystack: string, needle: string) => haystack.split(needle, 1)[0]; -/** @see {@link injectItemsetTemplateCalls} */ +/** @see {@link processItemsets} */ const substringAfter = (haystack: string, needle: string) => haystack.substring(haystack.indexOf(needle) + needle.length); @@ -599,7 +599,7 @@ const substringAfter = (haystack: string, needle: string) => * libXML kept the recursion in, even though it is not being used right now * ---------------------------------------------------------------------------- * - * Contrary to the JSDoc comment for @see {@link injectItemsetTemplateCalls}, + * Contrary to the JSDoc comment for @see {@link processItemsets}, * this implementation deviates from the original XSL logic, which uses * substrings and recursion, because it's (hopefully) much easier to understand * this way. @@ -617,10 +617,7 @@ const stripFilter = (expression: string) => expression.replace(/\[.*?\]/g, ''); * naming and semantics of the original XSL logic to ensure there is no * potential for regressions. */ -const injectItemsetTemplateCalls = ( - xslDoc: DOM.Document, - xformDoc: DOM.Document -) => { +const processItemsets = (xformDoc: DOM.Document) => { const itemsets = getNodesByXPathExpression( xformDoc, '//xmlns:itemset', @@ -631,7 +628,7 @@ const injectItemsetTemplateCalls = ( return; } - const itemsetParameters = itemsets.map((itemset) => { + itemsets.forEach((itemset) => { const [valueEl] = getNodesByXPathExpression( itemset, './xmlns:value', @@ -676,74 +673,26 @@ const injectItemsetTemplateCalls = ( const instanceId = iwq.substring(1, iwq.length - 1); const itextPath = `/h:html/h:head/xf:model/xf:instance[@id="${instanceId}"]${instancePathNoFilter}`; - return { - valueRef, - labelRef, - itextPath, - }; - }); + itemset.setAttribute('valueRef', valueRef); + itemset.setAttribute('labelRef', labelRef); + itemset.setAttribute('itextPath', `${itextPath}`); - const ids: string[] = []; + const [, labelNodeName] = labelRef.match(/itext\((.*)\)/) ?? []; - itemsets.forEach((itemset, index) => { - let id = itemset.getAttribute('id'); + if (labelNodeName != null) { + const labelPath = `${itextPath.replace( + /\/xf:/g, + '/xmlns:' + )}/*[name() = "${labelNodeName}"]`; + const items = getNodesByXPathExpression( + xformDoc, + labelPath, + NAMESPACES + ); - if (id == null) { - id = `itemset-${index}`; + itemset.append(...items.map((item) => item.cloneNode(true))); } - - itemset.setAttributeNS(null, 'id', id); - ids.push(id); - }); - - const templateCalls = itemsetParameters.map((parameters, index) => { - const id = ids[index]; - const match = `xf:itemset[@id = '${id}']`; - - const template = xslDoc.createElementNS(NAMESPACES.xsl, 'xsl:template'); - - template.setAttribute('match', match); - template.setAttribute('mode', 'labels'); - - const callTemplate = xslDoc.createElementNS( - NAMESPACES.xsl, - 'xsl:call-template' - ); - - callTemplate.setAttribute('name', 'itemset-itext-labels'); - - const withValueRef = xslDoc.createElementNS( - NAMESPACES.xsl, - 'xsl:with-param' - ); - - withValueRef.setAttribute('name', 'valueRef'); - withValueRef.setAttribute('select', `'${parameters.valueRef}'`); - - const withLabelRef = xslDoc.createElementNS( - NAMESPACES.xsl, - 'xsl:with-param' - ); - - withLabelRef.setAttribute('name', 'labelRef'); - withLabelRef.setAttribute('select', `'${parameters.labelRef}'`); - - const withItextPath = xslDoc.createElementNS( - NAMESPACES.xsl, - 'xsl:with-param' - ); - - withItextPath.setAttribute('name', 'itextPath'); - withItextPath.setAttribute('select', parameters.itextPath); - - callTemplate.append(withValueRef, withLabelRef, withItextPath); - - template.append(callTemplate); - - return template; }); - - xslDoc.documentElement.append(...templateCalls); }; /** diff --git a/src/xsl/openrosa2html5form.xsl b/src/xsl/openrosa2html5form.xsl index 4be4573..ce30906 100644 --- a/src/xsl/openrosa2html5form.xsl +++ b/src/xsl/openrosa2html5form.xsl @@ -706,24 +706,16 @@ XSLT Stylesheet that transforms OpenRosa style (X)Forms into valid HTMl5 forms - - - - - + + + + - @@ -734,9 +726,10 @@ XSLT Stylesheet that transforms OpenRosa style (X)Forms into valid HTMl5 forms - + - + + From 671d5c6bcc5fae8905d791b1181c551820c41fef Mon Sep 17 00:00:00 2001 From: eyelidlessness Date: Thu, 2 Mar 2023 15:36:29 -0800 Subject: [PATCH 23/24] Use single node XPath where appropriate --- src/dom/abstract/Document.d.ts | 15 +---- src/dom/abstract/XPathResult.d.ts | 15 +++++ src/dom/abstract/index.d.ts | 12 ++-- src/dom/node/Document.ts | 39 ++++++------ src/dom/node/XPathResult.ts | 29 +++++++++ src/dom/node/index.ts | 1 + src/dom/web/XPathResult.ts | 5 ++ src/dom/web/index.ts | 1 + src/transformer.ts | 100 ++++++++++++++++++++---------- 9 files changed, 147 insertions(+), 70 deletions(-) create mode 100644 src/dom/abstract/XPathResult.d.ts create mode 100644 src/dom/node/XPathResult.ts create mode 100644 src/dom/web/XPathResult.ts diff --git a/src/dom/abstract/Document.d.ts b/src/dom/abstract/Document.d.ts index 6550c2d..f3c837d 100644 --- a/src/dom/abstract/Document.d.ts +++ b/src/dom/abstract/Document.d.ts @@ -1,17 +1,6 @@ import type { Element } from './Element'; import type { Node } from './Node'; - -/** @package */ -export interface NamespaceResolver { - lookupNamespaceURI(prefix: string): string | null; -} - -/** @package */ -export interface XPathResult { - ORDERED_NODE_SNAPSHOT_TYPE?: number; - snapshotItem?(index: number): Node | null; - snapshotLength?: number; -} +import type { XPathResult } from './XPathResult'; /** @package */ export interface Document { @@ -27,7 +16,7 @@ export interface Document { createElementNS(namespaceURI: string | null, name: string): Element; evaluate( xpathExpression: string, - contextNode: Node | Document, + contextNode: Node, namespaceResolver: NamespaceResolver | null, resultType: number ): XPathResult; diff --git a/src/dom/abstract/XPathResult.d.ts b/src/dom/abstract/XPathResult.d.ts new file mode 100644 index 0000000..1eaa1fc --- /dev/null +++ b/src/dom/abstract/XPathResult.d.ts @@ -0,0 +1,15 @@ +/** @package */ +export interface NamespaceResolver { + lookupNamespaceURI(prefix: string): string | null; +} + +/** @package */ +export class XPathResult { + static FIRST_ORDERED_NODE_TYPE: number; + static ORDERED_NODE_SNAPSHOT_TYPE: number; + readonly singleNodeValue: Node | null; + snapshotItem(index: number): Node | null; + readonly snapshotLength: number; +} + +export type XPathResultType = number; diff --git a/src/dom/abstract/index.d.ts b/src/dom/abstract/index.d.ts index 8ee8007..2cd7f3b 100644 --- a/src/dom/abstract/index.d.ts +++ b/src/dom/abstract/index.d.ts @@ -1,12 +1,13 @@ import type { Attr as AbstractAttr } from './Attr'; -import type { - Document as AbstractDocument, - NamespaceResolver as AbstractNamespaceResolver, - XPathResult as AbstractXPathResult, -} from './Document'; +import type { Document as AbstractDocument } from './Document'; import type { DOMParser as AbstractDOMParser } from './DOMParser'; import type { Element as AbstractElement } from './Element'; import type { Node as AbstractNode } from './Node'; +import type { + NamespaceResolver as AbstractNamespaceResolver, + XPathResult as AbstractXPathResult, + XPathResultType as AbstractXPathResultType, +} from './XPathResult'; import type { XSLTProcessor as AbstractXSLTProcessor } from './XSLTProcessor'; /** @package */ @@ -19,5 +20,6 @@ export namespace DOM { export type Node = AbstractNode; export type Element = AbstractElement; export type XPathResult = AbstractXPathResult; + export type XPathResultType = AbstractXPathResultType; export type XSLTProcessor = AbstractXSLTProcessor; } diff --git a/src/dom/node/Document.ts b/src/dom/node/Document.ts index 2188fda..912798e 100644 --- a/src/dom/node/Document.ts +++ b/src/dom/node/Document.ts @@ -1,18 +1,11 @@ -import type { ParentNode } from 'libxmljs'; import { libxmljs } from 'libxslt'; import { NAMESPACES } from '../../shared'; import type { DOM } from '../abstract'; import { NodeTypes } from '../shared'; +import { XPathResult } from './XPathResult'; const { Document, Element } = libxmljs; -/** @package */ -export const XPathResult = { - ORDERED_NODE_SNAPSHOT_TYPE: 6 as const, - snapshotItem: () => null, - snapshotLength: 0, -} satisfies DOM.XPathResult; - /** @package */ // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface DOMExtendedDocument extends DOM.Node {} @@ -53,13 +46,10 @@ export class DOMExtendedDocument implements DOM.Document { evaluate( this: Document & DOMExtendedDocument, xpathExpression: string, - contextNode: ParentNode, + contextNode: Document | Element, namespaceResolver: DOM.NamespaceResolver | null, - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - this is part of the interface! - // eslint-disable-next-line @typescript-eslint/no-unused-vars - resultType: XPathResult['ORDERED_NODE_SNAPSHOT_TYPE'] - ) { + resultType: number + ): DOM.XPathResult { const namespaces = namespaceResolver == null ? undefined @@ -71,19 +61,28 @@ export class DOMExtendedDocument implements DOM.Document { ) ); - const results = (contextNode ?? this).find(xpathExpression, namespaces); + if (resultType === XPathResult.FIRST_ORDERED_NODE_TYPE) { + const result = (contextNode ?? this).get( + xpathExpression, + namespaces + ) as (Node & DOM.Node) | null; + const results = result == null ? [] : [result]; + + return new XPathResult(results); + } + + const results = (contextNode ?? this).find( + xpathExpression, + namespaces + ) as Array; - return { - snapshotItem: (index: number) => results[index], - snapshotLength: results.length, - }; + return new XPathResult(results); } } /* eslint-disable @typescript-eslint/no-redeclare */ type Document = InstanceType; type Element = InstanceType; -export type XPathResult = typeof XPathResult; /* eslint-enable @typescript-eslint/no-redeclare */ const { constructor: _, ...descriptors } = Object.getOwnPropertyDescriptors( diff --git a/src/dom/node/XPathResult.ts b/src/dom/node/XPathResult.ts new file mode 100644 index 0000000..35a5934 --- /dev/null +++ b/src/dom/node/XPathResult.ts @@ -0,0 +1,29 @@ +import type { DOM } from '../abstract'; + +/** @package */ +export class XPathResult implements DOM.XPathResult { + static ORDERED_NODE_SNAPSHOT_TYPE = 6 as const; + + static FIRST_ORDERED_NODE_TYPE = 9 as const; + + get singleNodeValue() { + return this.results[0] ?? null; + } + + get snapshotLength() { + return this.results.length; + } + + constructor(private results: Node[]) {} + + snapshotItem(index: number) { + return this.results[index]; + } +} + +type XPathResultTypeKeys = { + [K in keyof XPathResult]: K extends `${string}_TYPE` ? K : never; +}[keyof XPathResult]; + +/** @package */ +export type XPathResultType = XPathResult[XPathResultTypeKeys]; diff --git a/src/dom/node/index.ts b/src/dom/node/index.ts index 89f3736..4513a66 100644 --- a/src/dom/node/index.ts +++ b/src/dom/node/index.ts @@ -2,5 +2,6 @@ import './Document'; import './Node'; import './Element'; +export * from './XPathResult'; export * from './DOMParser'; export * from './XSLTProcessor'; diff --git a/src/dom/web/XPathResult.ts b/src/dom/web/XPathResult.ts new file mode 100644 index 0000000..ed7a048 --- /dev/null +++ b/src/dom/web/XPathResult.ts @@ -0,0 +1,5 @@ +import type { DOM } from '../abstract'; + +/** @package */ +export const XPathResult = + globalThis.XPathResult satisfies new () => DOM.XPathResult; diff --git a/src/dom/web/index.ts b/src/dom/web/index.ts index 9eaa1b4..18f8cd0 100644 --- a/src/dom/web/index.ts +++ b/src/dom/web/index.ts @@ -1,2 +1,3 @@ export * from './DOMParser'; +export * from './XPathResult'; export * from './XSLTProcessor'; diff --git a/src/transformer.ts b/src/transformer.ts index 994e7bd..eda7986 100644 --- a/src/transformer.ts +++ b/src/transformer.ts @@ -1,4 +1,4 @@ -import { DOMParser, XSLTProcessor } from 'enketo-transformer/dom'; +import { DOMParser, XPathResult, XSLTProcessor } from 'enketo-transformer/dom'; import type LibXMLJS from 'libxmljs'; import type { DOM } from './dom/abstract'; import { NodeTypes } from './dom/shared'; @@ -151,14 +151,12 @@ const getNamespaceResolver = (namespaces: Record) => ({ const isDocument = (node: DOM.Node | DOM.Document): node is DOM.Document => node.nodeType === NodeTypes.DOCUMENT_NODE; -const getNodesByXPathExpression = < - T extends DOM.Element | DOM.Attr = DOM.Element ->( +const evaluateXPathExpression = ( context: DOM.Document | DOM.Element, expression: string, + resultType: DOM.XPathResultType, namespaces?: Record ) => { - const results: T[] = []; const namespaceResolver = namespaces == null ? null : getNamespaceResolver(namespaces); const doc = isDocument(context) ? context : context.ownerDocument; @@ -167,15 +165,48 @@ const getNodesByXPathExpression = < throw new Error('Could not find owner document'); } - const result = doc.evaluate(expression, context, namespaceResolver, 6); + return doc.evaluate(expression, context, namespaceResolver, resultType); +}; + +const getNodesByXPathExpression = < + T extends DOM.Element | DOM.Attr = DOM.Element +>( + context: DOM.Document | DOM.Element, + expression: string, + namespaces?: Record +) => { + const results: T[] = []; + const result = evaluateXPathExpression( + context, + expression, + XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, + namespaces + ); for (let i = 0; i < (result.snapshotLength ?? 0); i += 1) { - results.push(result.snapshotItem?.(i) as T); + results.push(result.snapshotItem?.(i) as DOM.Node as T); } return results; }; +const getNodeByXPathExpression = < + T extends DOM.Element | DOM.Attr = DOM.Element +>( + context: DOM.Document | DOM.Element, + expression: string, + namespaces?: Record +) => { + const { singleNodeValue } = evaluateXPathExpression( + context, + expression, + XPathResult.FIRST_ORDERED_NODE_TYPE, + namespaces + ); + + return singleNodeValue as T | null; +}; + const processBinaryDefaults = ( doc: DOM.Document, mediaMap: Record @@ -192,7 +223,7 @@ const processBinaryDefaults = ( /\//g, '/xmlns:' )}`; - const [dataNode] = getNodesByXPathExpression(doc, path, NAMESPACES); + const dataNode = getNodeByXPathExpression(doc, path, NAMESPACES); if (dataNode) { const text = dataNode.textContent ?? ''; @@ -249,7 +280,7 @@ const correctAction = ( `//label[contains(@class, "${localName}")]/input[@data-${localName}]` ).forEach((setValueEl) => { const name = setValueEl.getAttribute('name'); - const [questionSameName] = getNodesByXPathExpression( + const questionSameName = getNodeByXPathExpression( doc, `//*[@name="${name}" and ( contains(../@class, 'question') or contains(../../@class, 'option-wrapper')) and not(@type='hidden')]` ); @@ -273,7 +304,12 @@ const replaceTheme = (doc: DOM.Document, theme?: string) => { return; } - const [form] = getNodesByXPathExpression(doc.documentElement, '/root/form'); + const form = getNodeByXPathExpression(doc.documentElement, '/root/form'); + + if (form == null) { + throw new Error('Form is missing'); + } + const formClass = form.getAttribute('class'); if (formClass != null && HAS_THEME.test(formClass)) { @@ -312,7 +348,7 @@ const replaceMediaSources = ( // add form logo element if applicable const formLogo = mediaMap['form_logo.png']; - const [formLogoEl] = getNodesByXPathExpression( + const formLogoEl = getNodeByXPathExpression( root, '//*[@class="form-logo"]' ); @@ -379,7 +415,7 @@ const replaceLanguageTags = (doc: DOM.Document) => { }); // correct default lang attribute - const [langSelectorElement] = getNodesByXPathExpression( + const langSelectorElement = getNodeByXPathExpression( doc, '/root/form/*[@data-default-lang]' ); @@ -407,15 +443,15 @@ const replaceLanguageTags = (doc: DOM.Document) => { const getLanguageSampleText = (doc: DOM.Document, language: string) => { // First find non-empty text content of a hint with that lang attribute. // If not found, find any span with that lang attribute. - const [langSampleEl] = getNodesByXPathExpression( - doc, - `/root/form//span[contains(@class, "or-hint") and @lang="${language}" and normalize-space() and not(./text() = '-')]` - ).concat( - getNodesByXPathExpression( + const langSampleEl = + getNodeByXPathExpression( + doc, + `/root/form//span[contains(@class, "or-hint") and @lang="${language}" and normalize-space() and not(./text() = '-')]` + ) || + getNodeByXPathExpression( doc, `/root/form//span[@lang="${language}" and normalize-space() and not(./text() = '-')]` - ) - ); + ); return langSampleEl?.textContent?.trim() || 'nothing'; }; @@ -429,19 +465,19 @@ const addInstanceIdNodeIfMissing = (doc: DOM.Document) => { '/xmlns:root/xmlns:model/xmlns:instance/*/xmlns:meta/xmlns:instanceID'; const openrosaPath = '/xmlns:root/xmlns:model/xmlns:instance/*/orx:meta/orx:instanceID'; - const [instanceIdEl] = getNodesByXPathExpression( + const instanceIdEl = getNodeByXPathExpression( doc, `${xformsPath} | ${openrosaPath}`, NAMESPACES ); if (!instanceIdEl) { - const [rootEl] = getNodesByXPathExpression( + const rootEl = getNodeByXPathExpression( doc, '/xmlns:root/xmlns:model/xmlns:instance/*', NAMESPACES ); - const [metaEl] = getNodesByXPathExpression( + const metaEl = getNodeByXPathExpression( doc, '/xmlns:root/xmlns:model/xmlns:instance/*/xmlns:meta', NAMESPACES @@ -574,7 +610,11 @@ const correctHTMLDocHierarchy = (doc: DOM.Document) => { const { documentElement } = doc; if (documentElement.nodeName.toLowerCase() === 'html') { - const [root] = getNodesByXPathExpression(doc, '/html/body/root'); + const root = getNodeByXPathExpression(doc, '/html/body/root'); + + if (root == null) { + throw new Error('Missing root node.'); + } documentElement.replaceWith(root); } @@ -624,23 +664,19 @@ const processItemsets = (xformDoc: DOM.Document) => { NAMESPACES ); - if (itemsets.length === 0) { - return; - } - itemsets.forEach((itemset) => { - const [valueEl] = getNodesByXPathExpression( + const valueEl = getNodeByXPathExpression( itemset, './xmlns:value', NAMESPACES ); - const valueRef = valueEl.getAttribute('ref') ?? ''; - const [labelEl] = getNodesByXPathExpression( + const valueRef = valueEl?.getAttribute('ref') ?? ''; + const labelEl = getNodeByXPathExpression( itemset, './xmlns:label', NAMESPACES ); - const labelRef = labelEl.getAttribute('ref') ?? ''; + const labelRef = labelEl?.getAttribute('ref') ?? ''; const nodeset = itemset.getAttribute('nodeset') ?? ''; const iwq = substringBefore(substringAfter(nodeset, 'instance('), ')'); @@ -814,7 +850,7 @@ const correctModelNamespaces = ( NAMESPACES ); const model = instanceRoots[0].parentElement?.parentElement; - const [xformModel] = getNodesByXPathExpression( + const xformModel = getNodeByXPathExpression( xformDoc, '/h:html/h:head/xmlns:model', NAMESPACES From 6efd980a0ab440f75ece455b1a03ac29f7b78644 Mon Sep 17 00:00:00 2001 From: eyelidlessness Date: Thu, 2 Mar 2023 16:06:12 -0800 Subject: [PATCH 24/24] Demo tweaks - Add demo dev mode (very useful for manual testing during dev) - Actually display errors - Don't show Invalid state on errors --- config/build.shared.ts | 13 +++++++++++-- demo/demo.tsx | 37 ++++++++++++++++++++----------------- demo/package.json | 2 ++ demo/tsconfig.json | 1 + demo/vite.config.ts | 25 ++++++++++++++++++++++--- 5 files changed, 56 insertions(+), 22 deletions(-) diff --git a/config/build.shared.ts b/config/build.shared.ts index 818ae5f..6401a27 100644 --- a/config/build.shared.ts +++ b/config/build.shared.ts @@ -1,5 +1,7 @@ import { createHash } from 'crypto'; import { readFileSync } from 'fs'; +import { resolve } from 'path'; +import { fileURLToPath } from 'url'; import pkg from '../package.json'; export const TARGET_ENV = @@ -12,8 +14,15 @@ const md5 = (message: string | Buffer) => { return hash.digest('hex'); }; -const XSL_FORM = readFileSync('./src/xsl/openrosa2html5form.xsl', 'utf-8'); -const XSL_MODEL = readFileSync('./src/xsl/openrosa2xmlmodel.xsl', 'utf-8'); +const basePath = fileURLToPath(new URL('..', import.meta.url)); +const XSL_FORM = readFileSync( + resolve(basePath, './src/xsl/openrosa2html5form.xsl'), + 'utf-8' +); +const XSL_MODEL = readFileSync( + resolve(basePath, './src/xsl/openrosa2xmlmodel.xsl'), + 'utf-8' +); const PACKAGE_VERSION = pkg.version; const VERSION = md5(`${XSL_FORM}${XSL_MODEL}${PACKAGE_VERSION}`); diff --git a/demo/demo.tsx b/demo/demo.tsx index 563a775..60bef44 100644 --- a/demo/demo.tsx +++ b/demo/demo.tsx @@ -116,22 +116,30 @@ function Demo() { } const start = performance.now(); - const result = await transform({ - xform: selected, - media: logo() ? { 'form_logo.png': '/icon.png' } : {}, - openclinica: openclinica() ? 1 : 0, - markdown: markdown(), - theme: theme() ? 'mytheme' : undefined, - }); - setDuration(performance.now() - start); + try { + const result = await transform({ + xform: selected, + media: logo() ? { 'form_logo.png': '/icon.png' } : {}, + openclinica: openclinica() ? 1 : 0, + markdown: markdown(), + theme: theme() ? 'mytheme' : undefined, + }); - return result; + setDuration(performance.now() - start); + + return result; + } catch (error) { + console.error('error', error); + + setError(error as Error); + setTransformed.mutate(undefined); + } }); createEffect( on( - [key, xform, error, logo, openclinica, markdown, theme], + [key, xform, logo, openclinica, markdown, theme], async () => { setError(null); setLanguage(null); @@ -158,7 +166,6 @@ function Demo() { onChange={(event) => { const { key: xform } = fixtures[Number(event.currentTarget.value)]; - setError(null); setParams({ ...params, xform, @@ -246,7 +253,7 @@ function Demo() { Theme - +
⏲️{' '} @@ -265,11 +272,7 @@ function Demo() {

Error

- - {error.message} - {'\n'} - {error.stack} - +
{error.stack}
)} diff --git a/demo/package.json b/demo/package.json index 584bb6e..580408f 100644 --- a/demo/package.json +++ b/demo/package.json @@ -1,4 +1,5 @@ { + "type": "module", "private": true, "engines": { "node": ">=14 <17", @@ -10,6 +11,7 @@ }, "scripts": { "demo": "vite", + "dev": "ENV=dev vite", "postinstall": "NPM_BIN=`which npm`; ($NPM_BIN explore enketo-transformer -- $NPM_BIN run build)" }, "dependencies": { diff --git a/demo/tsconfig.json b/demo/tsconfig.json index 061e725..fe69849 100644 --- a/demo/tsconfig.json +++ b/demo/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "../tsconfig.json", "compilerOptions": { + "lib": ["DOM", "DOM.Iterable"], "jsx": "preserve", "jsxImportSource": "solid-js" }, diff --git a/demo/vite.config.ts b/demo/vite.config.ts index 909f969..562312e 100644 --- a/demo/vite.config.ts +++ b/demo/vite.config.ts @@ -1,6 +1,11 @@ import { defineConfig } from 'vite'; +import type { AliasOptions, ResolveOptions } from 'vite'; import solidPlugin from 'vite-plugin-solid'; +import { define } from '../config/build.shared'; + +const { ENV } = process.env; + const external = [ '../src/api.ts', '../src/app.ts', @@ -8,8 +13,23 @@ const external = [ 'path', ]; +interface Resolve extends ResolveOptions { + alias?: AliasOptions; +} + +const resolve: Resolve = + ENV === 'dev' + ? { + alias: { + 'enketo-transformer/dom': '../src/dom/web/index.ts', + 'enketo-transformer/web': '../src/transformer.ts', + }, + } + : {}; + export default defineConfig({ appType: 'spa', + assetsInclude: ['**/*.xml', '**/*.xsl', '../**/*.xml', '../**/*.xsl'], build: { rollupOptions: { external, @@ -18,10 +38,9 @@ export default defineConfig({ }, target: 'esnext', }, - optimizeDeps: { - disabled: true, - }, + define, plugins: [solidPlugin()], + resolve, server: { port: 3000, },