From f5c4c6cd72bafd294ce7e3337bbbaa13dcbd04e1 Mon Sep 17 00:00:00 2001 From: Davor Hrg Date: Tue, 17 Dec 2024 23:00:05 +0100 Subject: [PATCH] fork 3mf-export --- file-format/3mf-export-compact/.gitignore | 4 + file-format/3mf-export-compact/.prettierrc | 17 + file-format/3mf-export-compact/README.md | 48 + file-format/3mf-export-compact/changelog.md | 7 + file-format/3mf-export-compact/index.js | 161 ++ .../3mf-export-compact/package-lock.json | 2204 +++++++++++++++++ file-format/3mf-export-compact/package.json | 33 + .../3mf-export-compact/src/defMatrix.js | 12 + .../3mf-export-compact/src/makeItem.js | 11 + .../3mf-export-compact/src/matrix2str.js | 23 + .../3mf-export-compact/src/pushHeader.js | 48 + .../src/pushObjectComponent.js | 19 + .../3mf-export-compact/src/pushObjectMesh.js | 39 + .../3mf-export-compact/src/staticFiles.js | 12 + .../3mf-export-compact/src/toDate3mf.js | 2 + file-format/3mf-export-compact/testGen.js | 71 + .../3mf-export-compact/testThumbnail.png | Bin 0 -> 37277 bytes file-format/3mf-export-compact/tsconfig.json | 7 + .../3mf-export-compact/xml-schema-3mf.d.ts | 83 + 19 files changed, 2801 insertions(+) create mode 100644 file-format/3mf-export-compact/.gitignore create mode 100644 file-format/3mf-export-compact/.prettierrc create mode 100644 file-format/3mf-export-compact/README.md create mode 100644 file-format/3mf-export-compact/changelog.md create mode 100644 file-format/3mf-export-compact/index.js create mode 100644 file-format/3mf-export-compact/package-lock.json create mode 100644 file-format/3mf-export-compact/package.json create mode 100644 file-format/3mf-export-compact/src/defMatrix.js create mode 100644 file-format/3mf-export-compact/src/makeItem.js create mode 100644 file-format/3mf-export-compact/src/matrix2str.js create mode 100644 file-format/3mf-export-compact/src/pushHeader.js create mode 100644 file-format/3mf-export-compact/src/pushObjectComponent.js create mode 100644 file-format/3mf-export-compact/src/pushObjectMesh.js create mode 100644 file-format/3mf-export-compact/src/staticFiles.js create mode 100644 file-format/3mf-export-compact/src/toDate3mf.js create mode 100644 file-format/3mf-export-compact/testGen.js create mode 100644 file-format/3mf-export-compact/testThumbnail.png create mode 100644 file-format/3mf-export-compact/tsconfig.json create mode 100644 file-format/3mf-export-compact/xml-schema-3mf.d.ts diff --git a/file-format/3mf-export-compact/.gitignore b/file-format/3mf-export-compact/.gitignore new file mode 100644 index 00000000..b587c402 --- /dev/null +++ b/file-format/3mf-export-compact/.gitignore @@ -0,0 +1,4 @@ +testfile.3mf +cjs +iife +esm diff --git a/file-format/3mf-export-compact/.prettierrc b/file-format/3mf-export-compact/.prettierrc new file mode 100644 index 00000000..0cb9aabc --- /dev/null +++ b/file-format/3mf-export-compact/.prettierrc @@ -0,0 +1,17 @@ +{ + "plugins": ["@trivago/prettier-plugin-sort-imports"], + "semi": false, + "tabWidth": 2, + "arrowParens": "avoid", + "printWidth": 120, + + "endOfLine": "auto", + + "singleQuote": true, + + "trailingComma": "all", + + "importOrder": ["^components/(.*)$", "^[./]"], + "importOrderSeparation": true, + "importOrderSortSpecifiers": true +} diff --git a/file-format/3mf-export-compact/README.md b/file-format/3mf-export-compact/README.md new file mode 100644 index 00000000..1f6504cb --- /dev/null +++ b/file-format/3mf-export-compact/README.md @@ -0,0 +1,48 @@ +# 3mf export MVP + +This is a fork from `3mf-export` to allow it to move forward with a robust XML library. + +`3mf-export-comapct` + +- is less robust for XML (may break xml if some attribute velues are not sanitised) +- has no dependencies +- could be preferred by some people because of small footprint +- I want to keep it as proud example of using arrays and join to gain nice performance. + + +[![npm version](https://badge.fury.io/js/@jscadui%2F3mf-export-compact.svg)](https://www.npmjs.com/package/@jscadui%2F3mf-export-compact) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) + +This is a set of functions to generate 3mf content for exporting 3d models and optionally embedding a thumbnail. + +reference: https://github.com/3MFConsortium/spec_core/blob/master/3MF%20Core%20Specification.md + +Format is defined by openxmlformats. + +3mf file is a zip file that you need to produce using a zip library of your choice. + +# object ids > 0 + +lib3mf cannot recognize things with id 0, so it is recommended to not use zero as id + +# contents of said zip file + +File names (with path) and metadata are hardcoded as it is not important for the purpose of exporting a model. + +File names +- `[Content_Types].xml` - static file describing content types [src/staticFiles.js] +- `_rels/.rels` - [src/staticFiles.js] +- `/3D/3dmodel.model` - you must use this exact path to store model data +- `/Metadata/thumbnail.png` - you must use this exact path to store the optional thumbnail + + +# sample code to generate 3mf + +Checkout the code from github and run `npm install` then `node testGen.js`. + +Sample code to generate 3mf file is in [testGen.js]. It uses `fflate` which is intentionally set as +devDependency so others can generate the zip file with own preferred library. + +To demonstrate that it is simple to include a thumbnail, I am using one already generated by my old jscad prototype +where this 3mf code is from. Final usage will of course be to take a snapshot from canvas while exporting the mesh. +Sample of such code is left in [testGen.js] but unused. +![testThumbnail.png](testThumbnail.png) \ No newline at end of file diff --git a/file-format/3mf-export-compact/changelog.md b/file-format/3mf-export-compact/changelog.md new file mode 100644 index 00000000..96a0df56 --- /dev/null +++ b/file-format/3mf-export-compact/changelog.md @@ -0,0 +1,7 @@ + + + +## 0.5.0 + + - `_rels/.rels` content is no longer a static file from this import: `fileForRelThumbnail`, use `FileForRelThumbnail` class to generate it + diff --git a/file-format/3mf-export-compact/index.js b/file-format/3mf-export-compact/index.js new file mode 100644 index 00000000..9e6589fb --- /dev/null +++ b/file-format/3mf-export-compact/index.js @@ -0,0 +1,161 @@ +import { XMLBuilder } from 'fast-xml-parser' +import { genItem } from './src/makeItem.js' +import { genModel } from './src/pushHeader.js' +import { genObjectWithComponents } from './src/pushObjectComponent.js' +import { genObjectWithMesh } from './src/pushObjectMesh.js' +import { fileForContentTypes } from './src/staticFiles.js' + +export * from './src/staticFiles.js' + +/** + * @typedef Mesh3MF + * @prop {number} id + * @prop {Float32Array} vertices + * @prop {Uint32Array} indices + * @prop {string} [name] + * + * @typedef Mesh3MFSimpleExt + * @prop {import('./src/defMatrix.js').mat4} [transform] + * + * @typedef {Mesh3MF & Mesh3MFSimpleExt} Mesh3MFSimple + * + * @typedef Component3MF + * @prop {number} id + * @prop {string} name + * @prop {Array} children + * + * @typedef Child3MF + * @prop {number} objectID + * @prop {import('./src/defMatrix.js').mat4} [transform] + * + * @typedef To3MF + * @prop {Array} meshes - manually declare meshes + * @prop {Array} [components] - components can combine items + * @prop {Array} items - output items, each pointing to component or mesh with objectID + * @prop {number} [precision] + * @prop {import('./src/pushHeader.js').Header} [header] + */ + +/** + * @param {To3MF} options + * @returns {string} + */ +export function to3dmodel({ meshes = [], components = [], items = [], precision = 17, header }) { + /** @type {import('./xml-schema-3mf.js').Xml3mf} */ + const data = { + '?xml': { '@_version': '1.0', '@_encoding': 'UTF-8' }, + model: genModel( + header ?? {}, + [ + //Mesh objects + ...meshes.map(({ id, vertices, indices, name }) => ({ + object: genObjectWithMesh(id, vertices, indices, precision, name) + })), + //Component objects + ...components.map(({ id, children, name }) => ({ + object: genObjectWithComponents(id, children, name) + })), + ], + { item: items.map(v => genItem(v.objectID, v.transform)) }, + ) + } + + const builder = new XMLBuilder({ + ignoreAttributes: false, + format: true, + suppressEmptyNode: true + }) + + return builder.build(data) +} + +/** + * Simple export provided meshes that have transform attached to them and autocreate items and pass to to3dmodel. + * @param {Array} meshes + * @param {import('./src/pushHeader.js').Header} [header] + * @param {number} [precision] + * @returns {string} + */ +export function to3dmodelSimple(meshes, header, precision) { + /** @type {Child3MF[]} */ + const items = meshes.map(({ id, transform }) => ({ objectID: id, transform })) + + return to3dmodel({ meshes, items, header, precision }) +} + +/** + * @typedef {[string,Uint8Array,boolean]} ZipContent FileName, FileContent, CanBeCompressed + */ + +/** + * @param {To3MF} options + * @param {Uint8Array | undefined} [thumbnailPng] + * @returns {ZipContent[]} + */ +export function to3mfZipContent(options, thumbnailPng) { + /** @type {ZipContent[]} */ + const result = [] + const utf8Encoder = new TextEncoder() + + result.push([fileForContentTypes.name, utf8Encoder.encode(fileForContentTypes.content), true]) + + const fileForRelThumbnail = new FileForRelThumbnail() + fileForRelThumbnail.add3dModel('3D/3dmodel.model') + + if (thumbnailPng !== undefined) { + result.push(['Metadata/thumbnail.png', thumbnailPng, false]) + fileForRelThumbnail.addThumbnail('Metadata/thumbnail.png') + } + + result.push(['3D/3dmodel.model', utf8Encoder.encode(to3dmodel(options)), true]) + result.push([fileForRelThumbnail.name, utf8Encoder.encode(fileForRelThumbnail.content), true]) + + return result +} + +/** + * @param {{meshes:Array,header?:import('./src/pushHeader.js').Header,precision?:number}} options + * @param {Uint8Array | undefined} [thumbnailPng] + * @returns {ZipContent[]} + */ +export function to3mfZipContentSimple({ meshes, header, precision }, thumbnailPng) { + const items = meshes.map(({ id, transform }) => ({ objectID: id, transform })) + + return to3mfZipContent({ meshes, items, header, precision }, thumbnailPng) +} + +/** File that describes file relationships inside a 3mf */ +export class FileForRelThumbnail { + idSeq = 0 + name = '_rels/.rels' + + /** @type {import('./xml-schema-3mf.js').Xml3mfRelationFile} */ + data = { + '?xml': { '@_version': '1.0', '@_encoding': 'UTF-8' }, + Relationships: { + '@_xmlns': 'http://schemas.openxmlformats.org/package/2006/relationships', + Relationship: [] + }, + } + + /** + * @param {string} target file path + * @param {string} xmlType xml schema url + */ + addRel(target, xmlType) { + this.data.Relationships.Relationship.push( + { '@_Target': target, "@_Id": `rel-${++this.idSeq}`, '@_Type': xmlType } + ) + } + + /** @param {string} path */ + add3dModel = (path) => this.addRel(path, 'http://schemas.microsoft.com/3dmanufacturing/2013/01/3dmodel') + + /** @param {string} path */ + addThumbnail = (path) => this.addRel(path, 'http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail') + + get content() { + const builder = new XMLBuilder({ ignoreAttributes: false, format: true, suppressEmptyNode: true }) + return builder.build(this.data) + } +} diff --git a/file-format/3mf-export-compact/package-lock.json b/file-format/3mf-export-compact/package-lock.json new file mode 100644 index 00000000..8212f6ef --- /dev/null +++ b/file-format/3mf-export-compact/package-lock.json @@ -0,0 +1,2204 @@ +{ + "name": "@jscadui/3mf-export", + "version": "0.1.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "@jscadui/3mf-export", + "version": "0.1.0", + "license": "MIT", + "devDependencies": { + "@trivago/prettier-plugin-sort-imports": "~3.3.0", + "@types/node": "18.11.9", + "esbuild": "^0.16.7", + "fflate": "0.8.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@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==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz", + "integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", + "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.7", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helpers": "^7.17.8", + "@babel/parser": "^7.17.8", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.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" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", + "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", + "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.0", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@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==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@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==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name/node_modules/@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@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==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables/node_modules/@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@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==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports/node_modules/@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", + "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", + "dev": true, + "dependencies": { + "@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.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms/node_modules/@babel/generator": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.5.tgz", + "integrity": "sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.5", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms/node_modules/@babel/parser": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", + "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-module-transforms/node_modules/@babel/traverse": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.5.tgz", + "integrity": "sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.5", + "@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.5", + "@babel/types": "^7.20.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms/node_modules/@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms/node_modules/@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==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@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==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access/node_modules/@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@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==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration/node_modules/@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@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==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@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==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@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==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.6.tgz", + "integrity": "sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers/node_modules/@babel/generator": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.5.tgz", + "integrity": "sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.5", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers/node_modules/@babel/parser": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", + "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helpers/node_modules/@babel/traverse": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.5.tgz", + "integrity": "sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.5", + "@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.5", + "@babel/types": "^7.20.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers/node_modules/@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers/node_modules/@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==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz", + "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template/node_modules/@babel/parser": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", + "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template/node_modules/@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", + "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.10.tgz", + "integrity": "sha512-RmJjQTRrO6VwUWDrzTBLmV4OJZTarYsiepLGlF2rYTVB701hSorPywPGvP6d8HCuuRibyXa5JX4s3jN2kHEtjQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@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==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.10.tgz", + "integrity": "sha512-C4PfnrBMcuAcOurQzpF1tTtZz94IXO5JmICJJ3NFJRHbXXsQUg9RFG45KvydKqtFfBaFLCHpduUkUfXwIvGnRg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@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==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@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==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@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==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.10.tgz", + "integrity": "sha512-5YVc1zdeaJGASijZmTzSO4h6uKzsQGG3pkjI6fuXvolhm3hVRhZwnHJkforaZLmzvNv5Tb7a3QL2FAVmrgySIA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@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==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@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==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@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==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@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==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@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==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.10.tgz", + "integrity": "sha512-Dg9RiqdvHOAWnOKIOTsIx8dFX9EDlY2IbPEY7YFzchrCiTZmMkD7jWA9UdZbNUygPjdmQBVPRCrLydReFlX9yg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@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==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@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==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@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==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@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==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@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==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@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==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@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==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@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==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@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==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@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==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@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==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@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==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@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==", + "dev": true + }, + "node_modules/@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==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@trivago/prettier-plugin-sort-imports": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-3.3.1.tgz", + "integrity": "sha512-ITGspeOlFnK1dwJVjqOguGW3Ja8hakxOPFudhpP0YfsDHT0yM0u4TU+62Vl83hCatnhB4+fYhlSZyiifUv4xSg==", + "dev": true, + "dependencies": { + "@babel/core": "7.17.8", + "@babel/generator": "7.17.7", + "@babel/parser": "7.18.9", + "@babel/traverse": "7.17.3", + "@babel/types": "7.17.0", + "javascript-natural-sort": "0.7.1", + "lodash": "4.17.21" + }, + "peerDependencies": { + "prettier": "2.x" + } + }, + "node_modules/@types/node": { + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "dev": true + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001439", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001439.tgz", + "integrity": "sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/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==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.10.tgz", + "integrity": "sha512-z5dIViHoVnw2l+NCJ3zj5behdXjYvXne9gL18OOivCadXDUhyDkeSvEtLcGVAJW2fNmh33TDUpsi704XYlDodw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@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" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fflate": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.0.tgz", + "integrity": "sha512-FAdS4qMuFjsJj6XHbBaZeXOgaypXp8iw/Tpyuq/w3XA41jjLHT8NPA+n7czH/DDhdncq0nAyDZmPeWXh2qmdIg==", + "dev": true + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/javascript-natural-sort": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", + "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json5": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.2.tgz", + "integrity": "sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/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==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/prettier": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz", + "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==", + "dev": true, + "peer": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/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==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "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==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/compat-data": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz", + "integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==", + "dev": true + }, + "@babel/core": { + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz", + "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.7", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helpers": "^7.17.8", + "@babel/parser": "^7.17.8", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.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" + } + }, + "@babel/generator": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz", + "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==", + "dev": true, + "requires": { + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.20.0", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", + "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.20.0", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "semver": "^6.3.0" + } + }, + "@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==", + "dev": true + }, + "@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==", + "dev": true, + "requires": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + }, + "dependencies": { + "@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.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==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + }, + "dependencies": { + "@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + }, + "dependencies": { + "@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/helper-module-transforms": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz", + "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==", + "dev": true, + "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.18.10", + "@babel/traverse": "^7.20.1", + "@babel/types": "^7.20.2" + }, + "dependencies": { + "@babel/generator": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.5.tgz", + "integrity": "sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==", + "dev": true, + "requires": { + "@babel/types": "^7.20.5", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + } + }, + "@babel/parser": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", + "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", + "dev": true + }, + "@babel/traverse": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.5.tgz", + "integrity": "sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.5", + "@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.5", + "@babel/types": "^7.20.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, + "@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==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/types": "^7.20.2" + }, + "dependencies": { + "@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.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==", + "dev": true, + "requires": { + "@babel/types": "^7.18.6" + }, + "dependencies": { + "@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@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==", + "dev": true + }, + "@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==", + "dev": true + }, + "@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==", + "dev": true + }, + "@babel/helpers": { + "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.6.tgz", + "integrity": "sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==", + "dev": true, + "requires": { + "@babel/template": "^7.18.10", + "@babel/traverse": "^7.20.5", + "@babel/types": "^7.20.5" + }, + "dependencies": { + "@babel/generator": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.5.tgz", + "integrity": "sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==", + "dev": true, + "requires": { + "@babel/types": "^7.20.5", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + } + }, + "@babel/parser": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", + "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", + "dev": true + }, + "@babel/traverse": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.5.tgz", + "integrity": "sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.5", + "@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.5", + "@babel/types": "^7.20.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, + "@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==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + } + } + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.9.tgz", + "integrity": "sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==", + "dev": true + }, + "@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + }, + "dependencies": { + "@babel/parser": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz", + "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==", + "dev": true + }, + "@babel/types": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz", + "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + } + } + }, + "@babel/traverse": { + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz", + "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.3", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.3", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, + "@esbuild/android-arm": { + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.10.tgz", + "integrity": "sha512-RmJjQTRrO6VwUWDrzTBLmV4OJZTarYsiepLGlF2rYTVB701hSorPywPGvP6d8HCuuRibyXa5JX4s3jN2kHEtjQ==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true + }, + "@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==", + "dev": true + }, + "@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==", + "dev": true + }, + "@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==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "@trivago/prettier-plugin-sort-imports": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@trivago/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-3.3.1.tgz", + "integrity": "sha512-ITGspeOlFnK1dwJVjqOguGW3Ja8hakxOPFudhpP0YfsDHT0yM0u4TU+62Vl83hCatnhB4+fYhlSZyiifUv4xSg==", + "dev": true, + "requires": { + "@babel/core": "7.17.8", + "@babel/generator": "7.17.7", + "@babel/parser": "7.18.9", + "@babel/traverse": "7.17.3", + "@babel/types": "7.17.0", + "javascript-natural-sort": "0.7.1", + "lodash": "4.17.21" + } + }, + "@types/node": { + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "browserslist": { + "version": "4.21.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", + "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001400", + "electron-to-chromium": "^1.4.251", + "node-releases": "^2.0.6", + "update-browserslist-db": "^1.0.9" + } + }, + "caniuse-lite": { + "version": "1.0.30001439", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001439.tgz", + "integrity": "sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "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==", + "dev": true + }, + "esbuild": { + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.10.tgz", + "integrity": "sha512-z5dIViHoVnw2l+NCJ3zj5behdXjYvXne9gL18OOivCadXDUhyDkeSvEtLcGVAJW2fNmh33TDUpsi704XYlDodw==", + "dev": true, + "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==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "fflate": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.0.tgz", + "integrity": "sha512-FAdS4qMuFjsJj6XHbBaZeXOgaypXp8iw/Tpyuq/w3XA41jjLHT8NPA+n7czH/DDhdncq0nAyDZmPeWXh2qmdIg==", + "dev": true + }, + "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==", + "dev": true + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "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==", + "dev": true + }, + "javascript-natural-sort": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", + "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json5": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.2.tgz", + "integrity": "sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==", + "dev": true + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "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==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "prettier": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz", + "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==", + "dev": true, + "peer": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + } + } +} diff --git a/file-format/3mf-export-compact/package.json b/file-format/3mf-export-compact/package.json new file mode 100644 index 00000000..59ee7dd1 --- /dev/null +++ b/file-format/3mf-export-compact/package.json @@ -0,0 +1,33 @@ +{ + "type": "module", + "sideEffects": false, + "name": "@jscadui/3mf-export", + "version": "0.5.0", + "description": "3mf export", + "main": "index.js", + "unpkg": "cjs/index.js", + "module": "./index.js", + "files": [ + "index.js", + "src", + "esm", + "iife", + "cjs" + ], + "scripts": { + "build": "esbuild index.js --outdir=esm --bundle --sourcemap --minify --loader:.js=jsx --format=esm", + "build-cjs": "esbuild index.js --outdir=cjs --bundle --sourcemap --minify --loader:.js=jsx --format=cjs", + "build-iife": "esbuild index.js --outdir=iife --bundle --sourcemap --minify --loader:.js=jsx --format=iife --global-name=juExport3mf", + "prepublishOnly": "npm run build && npm run build-cjs && npm run build-iife" + }, + "devDependencies": { + "fflate": "0.8.0", + "esbuild": "^0.16.7", + "@types/node": "18.11.9", + "@trivago/prettier-plugin-sort-imports": "~3.3.0" + }, + "license": "MIT", + "dependencies": { + "fast-xml-parser": "^4.5.0" + } +} diff --git a/file-format/3mf-export-compact/src/defMatrix.js b/file-format/3mf-export-compact/src/defMatrix.js new file mode 100644 index 00000000..7c13f8c8 --- /dev/null +++ b/file-format/3mf-export-compact/src/defMatrix.js @@ -0,0 +1,12 @@ +/** + * @typedef {number []} mat4 + */ + +/* prettier-ignore */ +/** @type {mat4} */ +export const defMatrix = [ + 1, 0, 0, 0, + 0, 1, 0, 0, + 0, 0, 1, 0, + 0, 0, 0, 1 + ] diff --git a/file-format/3mf-export-compact/src/makeItem.js b/file-format/3mf-export-compact/src/makeItem.js new file mode 100644 index 00000000..558aff95 --- /dev/null +++ b/file-format/3mf-export-compact/src/makeItem.js @@ -0,0 +1,11 @@ +import { matrix2str } from './matrix2str.js' + +/** + * @param {number} id - must start with 1, can not be zero by spec + * @param {import('./defMatrix.js').mat4} [matrix] + * @returns {import('../xml-schema-3mf.js').Xml3mfItem} + */ +export const genItem = (id, matrix) => ({ + '@_objectid': id, + '@_transform': matrix !== undefined ? matrix2str(matrix) : undefined, +}) \ No newline at end of file diff --git a/file-format/3mf-export-compact/src/matrix2str.js b/file-format/3mf-export-compact/src/matrix2str.js new file mode 100644 index 00000000..ca223202 --- /dev/null +++ b/file-format/3mf-export-compact/src/matrix2str.js @@ -0,0 +1,23 @@ + +/** transform for attribute as specified in 3mf format + * + * When objects need to be transformed for rotation, scaling, or translation purposes, + * row-major affine 3D matrices (4x4) are used. The matrix SHOULD NOT be singular or nearly singular. + * Transforms are of the form, where only the first 3 column values are specified. + * The last column is never provided, and has the fixed values 0.0, 0.0, 0.0, 1.0. + * When specified as an attribute value, + * matrices have the form "m00 m01 m02 m10 m11 m12 m20 m21 m22 m30 m31 m32" + * where each value is a decimal number of arbitrary precision. + * + * @param {import("./defMatrix").mat4} m + * @return string transform attribute value +*/ +export const matrix2str = m=>{ + let str = '' + for(let i=0; i<16; i++){ + if(i % 4 == 3) continue + if(i>0) str += ' ' + str += m[i] || 0 + } + return str +} \ No newline at end of file diff --git a/file-format/3mf-export-compact/src/pushHeader.js b/file-format/3mf-export-compact/src/pushHeader.js new file mode 100644 index 00000000..ea1db966 --- /dev/null +++ b/file-format/3mf-export-compact/src/pushHeader.js @@ -0,0 +1,48 @@ +import { toDate3mf } from './toDate3mf.js' + +/** + * @typedef Header + * @prop {import('../xml-schema-3mf.js').Xml3mfUnit} [unit] + * @prop {string} [title] + * @prop {string} [author] + * @prop {string} [description] + * @prop {string} [application] + * @prop {Date} [creationDate] + * @prop {string} [license] + * @prop {string} [copyright] + * @prop {Date} [modificationDate] + * @prop {string} [rating] + */ + +/** + * @param {Header} header + * @param {import('../xml-schema-3mf.js').Xml3mfResource[]} resources + * @param {import('../xml-schema-3mf.js').Xml3mfBuild} build + * @returns {import('../xml-schema-3mf.js').Xml3mfModel} + */ +export const genModel = (header, resources, build) => { + /** @type {import('../xml-schema-3mf.js').Xml3mfModel} */ + const result = { + '@_unit': header.unit ?? 'millimeter', + '@_xml:lang': 'en-US', + '@_xmlns': 'http://schemas.microsoft.com/3dmanufacturing/core/2015/02', + '@_xmlns:slic3rpe': 'http://schemas.slic3r.org/3mf/2017/06', + metadata: [ + { '@_name': 'slic3rpe:Version3mf', '#text': '1' }, + ], + resources, + build, + } + + if (header.title !== undefined) result.metadata.push({ '@_name': 'Title', '#text': header.title }) + if (header.author !== undefined) result.metadata.push({ '@_name': 'Designer', '#text': header.author }) + if (header.description !== undefined) result.metadata.push({ '@_name': 'Description', '#text': header.description }) + if (header.copyright !== undefined) result.metadata.push({ '@_name': 'Copyright', '#text': header.copyright }) + if (header.license !== undefined) result.metadata.push({ '@_name': 'LicenseTerms', '#text': header.license }) + if (header.rating !== undefined) result.metadata.push({ '@_name': 'Rating', '#text': header.rating }) + if (header.application !== undefined) result.metadata.push({ '@_name': 'Application', '#text': header.application }) + result.metadata.push({ '@_name': 'CreationDate', '#text': toDate3mf(header.creationDate ?? new Date()) }) + result.metadata.push({ '@_name': 'ModificationDate', '#text': toDate3mf(header.modificationDate ?? new Date()) }) + + return result +} \ No newline at end of file diff --git a/file-format/3mf-export-compact/src/pushObjectComponent.js b/file-format/3mf-export-compact/src/pushObjectComponent.js new file mode 100644 index 00000000..48ecc695 --- /dev/null +++ b/file-format/3mf-export-compact/src/pushObjectComponent.js @@ -0,0 +1,19 @@ +import {matrix2str} from './matrix2str.js' + +/** + * @param {number} id + * @param {import('../index.js').Child3MF[]} components + * @param {string} [name] + * @return {import('../xml-schema-3mf').Xml3mfComponentObject} + */ +export const genObjectWithComponents = (id, components, name) => ({ + '@_id': id, + '@_type': 'model', + '@_name': name, + components: { + component: components.map(({ objectID, transform }) => ({ + '@_objectid': objectID, + '@_transform': transform !== undefined ? matrix2str(transform) : undefined, + })) + } +}) \ No newline at end of file diff --git a/file-format/3mf-export-compact/src/pushObjectMesh.js b/file-format/3mf-export-compact/src/pushObjectMesh.js new file mode 100644 index 00000000..41d98109 --- /dev/null +++ b/file-format/3mf-export-compact/src/pushObjectMesh.js @@ -0,0 +1,39 @@ +/** + * @param {number} id + * @param {Float32Array} vertices + * @param {Uint32Array} indices + * @param {number} precision + * @param {string} [name] + * @return {import('../xml-schema-3mf').Xml3mfMeshObject} + */ +export const genObjectWithMesh = (id, vertices, indices, precision, name) => { + /** @type { import('../xml-schema-3mf').Xml3mfVertex[]} */ + const xmlVertex = [] + for (let i = 0; i < vertices.length; i += 3) { + xmlVertex.push({ + '@_x': vertices[i].toPrecision(precision), + '@_y': vertices[i + 1].toPrecision(precision), + '@_z': vertices[i + 2].toPrecision(precision), + }) + } + + /** @type { import('../xml-schema-3mf').Xml3mfTriangle[]} */ + const xmlTriangles = [] + for (let i = 0; i < indices.length; i += 3) { + xmlTriangles.push({ + '@_v1': indices[i], + '@_v2': indices[i + 1], + '@_v3': indices[i + 2], + }) + } + + return { + '@_id': id, + '@_type': 'model', + '@_name': name, + mesh: { + vertices: { vertex: xmlVertex }, + triangles: { triangle: xmlTriangles }, + }, + } +} \ No newline at end of file diff --git a/file-format/3mf-export-compact/src/staticFiles.js b/file-format/3mf-export-compact/src/staticFiles.js new file mode 100644 index 00000000..d36d69f8 --- /dev/null +++ b/file-format/3mf-export-compact/src/staticFiles.js @@ -0,0 +1,12 @@ + +/** File that describes content types inside a 3mf */ +export const fileForContentTypes = { + name:'[Content_Types].xml', + content: ` + + + + +` +} + diff --git a/file-format/3mf-export-compact/src/toDate3mf.js b/file-format/3mf-export-compact/src/toDate3mf.js new file mode 100644 index 00000000..0e35c365 --- /dev/null +++ b/file-format/3mf-export-compact/src/toDate3mf.js @@ -0,0 +1,2 @@ +/** @param {Date} d */ +export const toDate3mf = d => (d ? d.toISOString().substring(0, 10) : '') diff --git a/file-format/3mf-export-compact/testGen.js b/file-format/3mf-export-compact/testGen.js new file mode 100644 index 00000000..da80cfcd --- /dev/null +++ b/file-format/3mf-export-compact/testGen.js @@ -0,0 +1,71 @@ +// if not in browser +import { Blob } from 'buffer' +import { Zip, ZipDeflate, ZipPassThrough } from 'fflate' +import { readFileSync, writeFileSync } from 'fs' + +import { to3mfZipContentSimple } from './index.js' + +//#region hardcoded cube data +let vertices = new Float32Array([ + -1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1, 1, -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, -1, -1, -1, 1, -1, -1, 1, -1, 1, + -1, -1, 1, -1, 1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1, -1, -1, -1, 1, 1, -1, 1, 1, + 1, 1, -1, 1, 1, +]) + +let indices = new Uint32Array([ + 0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 8, 9, 10, 8, 10, 11, 12, 13, 14, 12, 14, 15, 16, 17, 18, 16, 18, 19, 20, 21, 22, + 20, 22, 23, +]) +//#endregion + +const zipParts = [] +const zip = new Zip(async (err, dat, final) => { + if (!err) { + // output of the streams + zipParts.push(dat) + // if (final) { // web version + // let blob = new Blob(parts, { type: 'application/octet-stream' }) + // writeFileSync('testfile.3mf', blob) + // } + writeFileSync('./testfile.3mf', dat, { flag: zipParts.length === 1 ? 'w' : 'a' }) + } +}) + + +const thumb = readFileSync('testThumbnail.png') +const zipContents = to3mfZipContentSimple({ + meshes: [{ vertices, indices, id: 1 }], + header: { application: 'jscad.app', title: 'jscad model' } +}, thumb) + +for (const [fileName, fileContent, canBeCompressed] of zipContents) { + const fileStream = canBeCompressed ? new ZipDeflate(fileName, { level: 9 }) : new ZipPassThrough(fileName) + zip.add(fileStream) + fileStream.push(fileContent, true) +} + +zip.end() + +/** example how to generate thumb from canvas +* @param {HTMLCanvasElement} canvas +*/ +function canvasToPngA8(canvas) { + let url = canvas.toDataURL('image/png') + url = url.substring(url.indexOf(',') + 1) + //Convert to utf8 Uint8Array + return new TextEncoder().encode(url) +} + +/** intentionally not part of the lib, you may or may not need it in your export code +* @param {*} blob +*/ +async function blobToArrayBuffer(blob) { + if ('arrayBuffer' in blob) return await blob.arrayBuffer() + + return new Promise((resolve, reject) => { + const reader = new FileReader() + reader.onload = () => resolve(reader.result) + reader.onerror = (e) => reject(e) + reader.readAsArrayBuffer(blob) + }) +} diff --git a/file-format/3mf-export-compact/testThumbnail.png b/file-format/3mf-export-compact/testThumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..1795bc3b680615845fb0cdc94e582d10993e32cf GIT binary patch literal 37277 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 N002ovPDHLkV1mxGdjtRg literal 0 HcmV?d00001 diff --git a/file-format/3mf-export-compact/tsconfig.json b/file-format/3mf-export-compact/tsconfig.json new file mode 100644 index 00000000..ae357036 --- /dev/null +++ b/file-format/3mf-export-compact/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "strict": true, + "noEmit": true, + "checkJs": true + } +} \ No newline at end of file diff --git a/file-format/3mf-export-compact/xml-schema-3mf.d.ts b/file-format/3mf-export-compact/xml-schema-3mf.d.ts new file mode 100644 index 00000000..f9e142bc --- /dev/null +++ b/file-format/3mf-export-compact/xml-schema-3mf.d.ts @@ -0,0 +1,83 @@ +export interface Xml3mf { + '?xml': { + '@_version': '1.0' + '@_encoding': 'UTF-8' + } + model: Xml3mfModel +} + +export interface Xml3mfModel { + '@_unit': Xml3mfUnit + '@_xml:lang': 'en-US' + '@_xmlns': 'http://schemas.microsoft.com/3dmanufacturing/core/2015/02' + '@_xmlns:slic3rpe': 'http://schemas.slic3r.org/3mf/2017/06' + metadata: { '@_name': string, '#text': string }[] + resources: Xml3mfResource[] + build: Xml3mfBuild +} + +export interface Xml3mfResource { + object: Xml3mfMeshObject | Xml3mfComponentObject +} + +interface Xml3mfObjectBase { + '@_id': number + '@_type': 'model' + '@_name'?: string +} + +export interface Xml3mfMeshObject extends Xml3mfObjectBase { + mesh: Xml3mfMesh +} + +export interface Xml3mfComponentObject extends Xml3mfObjectBase { + components: { component: Xml3mfComponent[] } +} + +export interface Xml3mfMesh { + vertices: { vertex: Xml3mfVertex[] } + triangles: { triangle: Xml3mfTriangle[] } +} + +export interface Xml3mfVertex { + '@_x': string + '@_y': string + '@_z': string +} + +export interface Xml3mfTriangle { + '@_v1': number + '@_v2': number + '@_v3': number +} + +export interface Xml3mfBuild { + item: Xml3mfItem[] +} + +export interface Xml3mfItem { + '@_objectid': number + '@_transform'?: string +} + +export interface Xml3mfComponent { + '@_objectid': number + '@_transform'?: string +} + +export type Xml3mfUnit = 'micron' | 'millimeter' | 'centimeter' | 'inch' | 'foot' | 'meter' + +export interface Xml3mfRelationFile { + '?xml': { + '@_version': '1.0' + '@_encoding': 'UTF-8' + } + Relationships: { + '@_xmlns': 'http://schemas.openxmlformats.org/package/2006/relationships' + Relationship: { + '@_Target': string + '@_Id': string + '@_Type': string + }[] + } +} \ No newline at end of file