├── .firebaserc ├── .github └── workflows │ └── build.yml ├── .gitignore ├── .nvmrc ├── CHANGELOG.md ├── LICENSE ├── README.md ├── custom-elements.json ├── docs ├── index.html └── robots.txt ├── firebase.json ├── package.json ├── pnpm-lock.yaml ├── src ├── angular.ts ├── blazor.ts ├── index.ts ├── jsx.ts ├── preact.ts ├── react.ts ├── reserved.ts ├── typescript.ts └── utils.ts ├── tsconfig.json └── tsconfig.lib.json /.firebaserc: -------------------------------------------------------------------------------- 1 | { 2 | "projects": { 3 | "default": "sites-fc2cf" 4 | } 5 | } -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: [push, pull_request] 4 | 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: actions/checkout@v4 10 | with: 11 | lfs: true 12 | - uses: pnpm/action-setup@v4 13 | with: 14 | run_install: false 15 | - uses: actions/setup-node@v4 16 | with: 17 | node-version-file: './.nvmrc' 18 | cache: 'pnpm' 19 | - run: npm run setup 20 | - run: pnpm run ci -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | 3 | # Logs 4 | logs 5 | *.log 6 | npm-debug.log* 7 | yarn-debug.log* 8 | yarn-error.log* 9 | lerna-debug.log* 10 | 11 | # Diagnostic reports (https://nodejs.org/api/report.html) 12 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 13 | 14 | # Runtime data 15 | pids 16 | *.pid 17 | *.seed 18 | *.pid.lock 19 | 20 | # Directory for instrumented libs generated by jscoverage/JSCover 21 | lib-cov 22 | 23 | # Coverage directory used by tools like istanbul 24 | coverage 25 | *.lcov 26 | 27 | # nyc test coverage 28 | .nyc_output 29 | 30 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 31 | .grunt 32 | 33 | # Bower dependency directory (https://bower.io/) 34 | bower_components 35 | 36 | # node-waf configuration 37 | .lock-wscript 38 | 39 | # Compiled binary addons (https://nodejs.org/api/addons.html) 40 | build/Release 41 | 42 | # Dependency directories 43 | node_modules/ 44 | jspm_packages/ 45 | 46 | # TypeScript v1 declaration files 47 | typings/ 48 | 49 | # TypeScript cache 50 | *.tsbuildinfo 51 | 52 | # Optional npm cache directory 53 | .npm 54 | 55 | # Optional eslint cache 56 | .eslintcache 57 | 58 | # Microbundle cache 59 | .rpt2_cache/ 60 | .rts2_cache_cjs/ 61 | .rts2_cache_es/ 62 | .rts2_cache_umd/ 63 | 64 | # Optional REPL history 65 | .node_repl_history 66 | 67 | # Output of 'npm pack' 68 | *.tgz 69 | 70 | # Yarn Integrity file 71 | .yarn-integrity 72 | 73 | # dotenv environment variables file 74 | .env 75 | .env.test 76 | 77 | # parcel-bundler cache (https://parceljs.org/) 78 | .cache 79 | 80 | # Next.js build output 81 | .next 82 | 83 | # Nuxt.js build / generate output 84 | .nuxt 85 | dist 86 | 87 | # Gatsby files 88 | .cache/ 89 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 90 | # https://nextjs.org/blog/next-9-1#public-directory-support 91 | # public 92 | 93 | # vuepress build output 94 | .vuepress/dist 95 | 96 | # Serverless directories 97 | .serverless/ 98 | 99 | # FuseBox cache 100 | .fusebox/ 101 | 102 | # DynamoDB Local files 103 | .dynamodb/ 104 | 105 | # TernJS port file 106 | .tern-port 107 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | 22.14.0 -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## 0.2.8 4 | - update dependencies 5 | - update React to support React 19 6 | 7 | ## 0.2.7 8 | - update dependencies 9 | - update Angular output to standalone directives 10 | - fix temporary workaround for accessor based properties 11 | - fix cli binary entrypoint 12 | 13 | ## 0.2.6 14 | - ignore native props and events 15 | 16 | ## 0.2.5 17 | - ignore non attribute supported properties to prevent overide of native props 18 | 19 | ## 0.2.1 20 | - cleanup generated output formatting 21 | 22 | ## 0.2.0 23 | - Blazor support 24 | 25 | ## 0.1.0 26 | - add Preact type support 27 | 28 | ## 0.0.0 29 | 30 | - intial beta release 31 | - basic support for React experimental 32 | - basic support for Angular 33 | - basic support for TypeScript 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Crylan Software 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # custom-element-types 2 | 3 | [![npm version](https://badge.fury.io/js/custom-element-types.svg)](https://badge.fury.io/js/custom-element-types) ![CI Build](https://github.com/coryrylan/custom-element-types/actions/workflows/build.yml/badge.svg) 4 | 5 | A generator to create type definitions and framework bindings for applications using Web Components (Custom Elements). 6 | 7 | ## Getting Started 8 | 9 | Install via NPM 10 | 11 | ```bash 12 | npm install --save-dev custom-element-types 13 | ``` 14 | 15 | ## Playground 16 | 17 | If you have a published Web Component library you can try out the [generator playground](https://custom-element-types.web.app). 18 | 19 | ## CLI 20 | 21 | ```bash 22 | custom-element-types --write --type react --entrypoint @blueprintui/components 23 | ``` 24 | 25 | | Args | Description | 26 | | ----------------- | ---------------------------------------------------------------------------- | 27 | | type | `jsx`, `react`, `preact`, `angular`, `typescript`, `blazor` | 28 | | custom-elements | optional custom path to `custom-elements.json` file | 29 | | write | write to file, optionally provide a output directory path | 30 | | entrypoint | package name for base entrypoint import path, else defaults to relative path | 31 | 32 | ## Examples 33 | - React: https://stackblitz.com/edit/http-server-noh4jj 34 | - Angular: https://stackblitz.com/edit/node-1tthxz 35 | - Preact: https://stackblitz.com/edit/vitejs-vite-8qed1q 36 | - Blazor: https://github.com/coryrylan/clarity-blazor 37 | -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | BlueprintUI - Custom Element Types 5 | 6 | 7 | 8 | 9 | 10 | 11 | 33 | 34 | 35 |
36 | 37 | Warning, in beta. Subject to change. 38 | 39 |
40 |
41 |

Custom Element Types

42 |

Framework Type Generator for Web Components

43 | 44 |
45 | Github 46 | API Docs 47 |
48 |
49 |
50 |
51 |

Getting Started

52 | 53 | 54 | 55 |
56 |
57 |
58 |

59 | The Custom Element Types generator will use a custom-elements.json file to generate 60 | a specific type definition files or shims for a given framework enabling type checking in 61 | type aware templates such as TSX in React or Angular HTML templates. 62 |

63 |

64 | Most Web Component libraries ship with a custom-elements.json. However if not provided, a manifest can be generated using the Custom Elements Manifest Generator. 65 |

66 |
67 |
npm install --save-dev custom-element-types
 68 | 
 69 | custom-element-types --write --type react --entrypoint @blueprintui/components
70 |
71 |
72 | 73 |
74 |
75 | 76 | 77 | 78 | 79 |
80 |
81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 |
99 | 100 |
101 |

102 | Add a types.d.ts file to your project (React example). 103 |

104 | 105 | 109 | 110 | 113 | 114 | 117 | 118 | 133 |
134 |
135 | 139 |
140 |
141 | 142 | 143 |
144 |
145 |
146 |
147 |
148 | 160 | 161 | 162 | 244 | 245 | -------------------------------------------------------------------------------- /docs/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: -------------------------------------------------------------------------------- /firebase.json: -------------------------------------------------------------------------------- 1 | { 2 | "hosting": { 3 | "site": "custom-element-types", 4 | "public": "docs", 5 | "ignore": [ 6 | "firebase.json", 7 | "**/.*", 8 | "**/node_modules/**" 9 | ], 10 | "rewrites": [ ], 11 | "redirects": [ ] 12 | } 13 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "custom-element-types", 3 | "version": "0.0.2", 4 | "description": "A generator to create Framework integrations and types for Custom Elements using the Custom Elements Schema format.", 5 | "packageManager": "pnpm@10.7.0", 6 | "engines": { 7 | "node": "22.14.0" 8 | }, 9 | "bin": { 10 | "cet": "./dist/lib/index.js", 11 | "custom-element-types": "./dist/lib/index.js" 12 | }, 13 | "main": "./index.js", 14 | "module": "./index.js", 15 | "typings": "./index.d.ts", 16 | "type": "module", 17 | "files": [ 18 | "./dist", 19 | "./package.json", 20 | "./README.md", 21 | "./LICENSE.md" 22 | ], 23 | "exports": { 24 | "./package.json": "./package.json", 25 | "./*": { 26 | "types": "./dist/lib/*", 27 | "default": "./dist/lib/*" 28 | }, 29 | ".": { 30 | "types": "./dist/lib/index.d.ts", 31 | "default": "./dist/lib/index.js" 32 | } 33 | }, 34 | "scripts": { 35 | "start": "cd ./docs && lite-server", 36 | "ci": "pnpm run clean && pnpm run build && pnpm run build:react && pnpm run build:preact && pnpm run build:angular && pnpm run build:typescript && pnpm run build:blazor && pnpm run build:jsx", 37 | "setup": "curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.1/install.sh | bash && unset npm_config_prefix && . ~/.nvm/nvm.sh && nvm install && nvm use && npm install -g pnpm && pnpm run clean && pnpm i --frozen-lockfile && pnpm dlx playwright install chromium --with-deps chromium", 38 | "clean": "rm -rf dist", 39 | "build": "tsc --project ./tsconfig.lib.json", 40 | "build:watch": "tsc --watch --project ./tsconfig.lib.json", 41 | "build:react": "node ./dist/lib/index.js --type react --custom-elements ./custom-elements.json --write ./dist/react --entrypoint @blueprintui/components", 42 | "build:preact": "node ./dist/lib/index.js --type preact --custom-elements ./custom-elements.json --write ./dist/preact --entrypoint @blueprintui/components", 43 | "build:angular": "node ./dist/lib/index.js --type angular --custom-elements ./custom-elements.json --write ./dist/angular --entrypoint @blueprintui/components", 44 | "build:typescript": "node ./dist/lib/index.js --type typescript --custom-elements ./custom-elements.json --write ./dist/typescript --entrypoint @blueprintui/components", 45 | "build:blazor": "node ./dist/lib/index.js --type blazor --custom-elements ./custom-elements.json --write ./dist/blazor --entrypoint @blueprintui/components", 46 | "build:jsx": "node ./dist/lib/index.js --type jsx --custom-elements ./custom-elements.json --write ./dist/jsx --entrypoint @blueprintui/components", 47 | "deploy": "firebase deploy --only hosting:custom-element-types" 48 | }, 49 | "repository": { 50 | "type": "git", 51 | "url": "git+https://github.com/coryrylan/custom-element-types.git" 52 | }, 53 | "keywords": [ 54 | "web components", 55 | "custom elements", 56 | "react", 57 | "preact", 58 | "angular", 59 | "typescript", 60 | "blazor" 61 | ], 62 | "author": "Cory Rylan", 63 | "license": "MIT", 64 | "bugs": { 65 | "url": "https://github.com/coryrylan/custom-element-types/issues" 66 | }, 67 | "homepage": "https://github.com/coryrylan/custom-element-types#readme", 68 | "devDependencies": { 69 | "@types/fs-extra": "11.0.4", 70 | "@types/node": "22.14.0", 71 | "cpy-cli": "5.0.0", 72 | "custom-elements-manifest": "2.1.0", 73 | "lite-server": "2.6.1", 74 | "typescript": "5.8.3" 75 | }, 76 | "dependencies": { 77 | "fs-extra": "11.3.0", 78 | "yargs": "17.7.2" 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | fs-extra: 12 | specifier: 11.3.0 13 | version: 11.3.0 14 | yargs: 15 | specifier: 17.7.2 16 | version: 17.7.2 17 | devDependencies: 18 | '@types/fs-extra': 19 | specifier: 11.0.4 20 | version: 11.0.4 21 | '@types/node': 22 | specifier: 22.14.0 23 | version: 22.14.0 24 | cpy-cli: 25 | specifier: 5.0.0 26 | version: 5.0.0 27 | custom-elements-manifest: 28 | specifier: 2.1.0 29 | version: 2.1.0 30 | lite-server: 31 | specifier: 2.6.1 32 | version: 2.6.1 33 | typescript: 34 | specifier: 5.8.3 35 | version: 5.8.3 36 | 37 | packages: 38 | 39 | '@nodelib/fs.scandir@2.1.5': 40 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 41 | engines: {node: '>= 8'} 42 | 43 | '@nodelib/fs.stat@2.0.5': 44 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 45 | engines: {node: '>= 8'} 46 | 47 | '@nodelib/fs.walk@1.2.8': 48 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 49 | engines: {node: '>= 8'} 50 | 51 | '@socket.io/component-emitter@3.1.2': 52 | resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} 53 | 54 | '@types/cors@2.8.17': 55 | resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} 56 | 57 | '@types/fs-extra@11.0.4': 58 | resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} 59 | 60 | '@types/jsonfile@6.1.4': 61 | resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} 62 | 63 | '@types/node@22.14.0': 64 | resolution: {integrity: sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==} 65 | 66 | accepts@1.3.8: 67 | resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} 68 | engines: {node: '>= 0.6'} 69 | 70 | aggregate-error@4.0.1: 71 | resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} 72 | engines: {node: '>=12'} 73 | 74 | ansi-regex@5.0.1: 75 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 76 | engines: {node: '>=8'} 77 | 78 | ansi-styles@4.3.0: 79 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 80 | engines: {node: '>=8'} 81 | 82 | anymatch@3.1.3: 83 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 84 | engines: {node: '>= 8'} 85 | 86 | arrify@3.0.0: 87 | resolution: {integrity: sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==} 88 | engines: {node: '>=12'} 89 | 90 | async-each-series@0.1.1: 91 | resolution: {integrity: sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==} 92 | engines: {node: '>=0.8.0'} 93 | 94 | async@2.6.4: 95 | resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} 96 | 97 | axios@0.21.4: 98 | resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} 99 | 100 | balanced-match@1.0.2: 101 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 102 | 103 | base64id@2.0.0: 104 | resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} 105 | engines: {node: ^4.5.0 || >= 5.9} 106 | 107 | batch@0.6.1: 108 | resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} 109 | 110 | binary-extensions@2.3.0: 111 | resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} 112 | engines: {node: '>=8'} 113 | 114 | brace-expansion@1.1.11: 115 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 116 | 117 | braces@3.0.3: 118 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 119 | engines: {node: '>=8'} 120 | 121 | browser-sync-client@2.29.3: 122 | resolution: {integrity: sha512-4tK5JKCl7v/3aLbmCBMzpufiYLsB1+UI+7tUXCCp5qF0AllHy/jAqYu6k7hUF3hYtlClKpxExWaR+rH+ny07wQ==} 123 | engines: {node: '>=8.0.0'} 124 | 125 | browser-sync-ui@2.29.3: 126 | resolution: {integrity: sha512-kBYOIQjU/D/3kYtUIJtj82e797Egk1FB2broqItkr3i4eF1qiHbFCG6srksu9gWhfmuM/TNG76jMfzAdxEPakg==} 127 | 128 | browser-sync@2.29.3: 129 | resolution: {integrity: sha512-NiM38O6XU84+MN+gzspVmXV2fTOoe+jBqIBx3IBdhZrdeURr6ZgznJr/p+hQ+KzkKEiGH/GcC4SQFSL0jV49bg==} 130 | engines: {node: '>= 8.0.0'} 131 | hasBin: true 132 | 133 | bs-recipes@1.3.4: 134 | resolution: {integrity: sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw==} 135 | 136 | bytes@3.1.2: 137 | resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} 138 | engines: {node: '>= 0.8'} 139 | 140 | chalk@4.1.2: 141 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 142 | engines: {node: '>=10'} 143 | 144 | chokidar@3.6.0: 145 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 146 | engines: {node: '>= 8.10.0'} 147 | 148 | clean-stack@4.2.0: 149 | resolution: {integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==} 150 | engines: {node: '>=12'} 151 | 152 | cliui@7.0.4: 153 | resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} 154 | 155 | cliui@8.0.1: 156 | resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} 157 | engines: {node: '>=12'} 158 | 159 | color-convert@2.0.1: 160 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 161 | engines: {node: '>=7.0.0'} 162 | 163 | color-name@1.1.4: 164 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 165 | 166 | commander@2.20.3: 167 | resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} 168 | 169 | concat-map@0.0.1: 170 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 171 | 172 | connect-history-api-fallback@1.6.0: 173 | resolution: {integrity: sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==} 174 | engines: {node: '>=0.8'} 175 | 176 | connect-logger@0.0.1: 177 | resolution: {integrity: sha512-kC5FPWpcfgpW5HtICnXbdOAFa4uNilU4ZPmsH6RlXaDVfXLupyUjgI1otpj3kOcsoPpDxknxmcoM0wk0ApsjYQ==} 178 | 179 | connect@3.6.6: 180 | resolution: {integrity: sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ==} 181 | engines: {node: '>= 0.10.0'} 182 | 183 | cookie@0.7.2: 184 | resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} 185 | engines: {node: '>= 0.6'} 186 | 187 | cors@2.8.5: 188 | resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} 189 | engines: {node: '>= 0.10'} 190 | 191 | cp-file@10.0.0: 192 | resolution: {integrity: sha512-vy2Vi1r2epK5WqxOLnskeKeZkdZvTKfFZQCplE3XWsP+SUJyd5XAUFC9lFgTjjXJF2GMne/UML14iEmkAaDfFg==} 193 | engines: {node: '>=14.16'} 194 | 195 | cpy-cli@5.0.0: 196 | resolution: {integrity: sha512-fb+DZYbL9KHc0BC4NYqGRrDIJZPXUmjjtqdw4XRRg8iV8dIfghUX/WiL+q4/B/KFTy3sK6jsbUhBaz0/Hxg7IQ==} 197 | engines: {node: '>=16'} 198 | hasBin: true 199 | 200 | cpy@10.1.0: 201 | resolution: {integrity: sha512-VC2Gs20JcTyeQob6UViBLnyP0bYHkBh6EiKzot9vi2DmeGlFT9Wd7VG3NBrkNx/jYvFBeyDOMMHdHQhbtKLgHQ==} 202 | engines: {node: '>=16'} 203 | 204 | custom-elements-manifest@2.1.0: 205 | resolution: {integrity: sha512-4TU+YhBQpCGYWonsZVTOPx6aYJXenOiSRT7TNGvDB7ipa4SZSJKed1DYXG77XKL9JFZ86sDSDVkwgv1mqw3V3A==} 206 | 207 | debug@2.6.9: 208 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} 209 | peerDependencies: 210 | supports-color: '*' 211 | peerDependenciesMeta: 212 | supports-color: 213 | optional: true 214 | 215 | debug@4.3.2: 216 | resolution: {integrity: sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==} 217 | engines: {node: '>=6.0'} 218 | peerDependencies: 219 | supports-color: '*' 220 | peerDependenciesMeta: 221 | supports-color: 222 | optional: true 223 | 224 | debug@4.3.7: 225 | resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} 226 | engines: {node: '>=6.0'} 227 | peerDependencies: 228 | supports-color: '*' 229 | peerDependenciesMeta: 230 | supports-color: 231 | optional: true 232 | 233 | depd@1.1.2: 234 | resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} 235 | engines: {node: '>= 0.6'} 236 | 237 | depd@2.0.0: 238 | resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} 239 | engines: {node: '>= 0.8'} 240 | 241 | destroy@1.0.4: 242 | resolution: {integrity: sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==} 243 | 244 | dev-ip@1.0.1: 245 | resolution: {integrity: sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A==} 246 | engines: {node: '>= 0.8.0'} 247 | hasBin: true 248 | 249 | dir-glob@3.0.1: 250 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 251 | engines: {node: '>=8'} 252 | 253 | easy-extender@2.3.4: 254 | resolution: {integrity: sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==} 255 | engines: {node: '>= 4.0.0'} 256 | 257 | eazy-logger@4.1.0: 258 | resolution: {integrity: sha512-+mn7lRm+Zf1UT/YaH8WXtpU6PIV2iOjzP6jgKoiaq/VNrjYKp+OHZGe2znaLgDeFkw8cL9ffuaUm+nNnzcYyGw==} 259 | engines: {node: '>= 0.8.0'} 260 | 261 | ee-first@1.1.1: 262 | resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} 263 | 264 | emoji-regex@8.0.0: 265 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 266 | 267 | encodeurl@1.0.2: 268 | resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} 269 | engines: {node: '>= 0.8'} 270 | 271 | engine.io-client@6.6.3: 272 | resolution: {integrity: sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==} 273 | 274 | engine.io-parser@5.2.3: 275 | resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} 276 | engines: {node: '>=10.0.0'} 277 | 278 | engine.io@6.6.4: 279 | resolution: {integrity: sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==} 280 | engines: {node: '>=10.2.0'} 281 | 282 | escalade@3.2.0: 283 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 284 | engines: {node: '>=6'} 285 | 286 | escape-html@1.0.3: 287 | resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} 288 | 289 | escape-string-regexp@5.0.0: 290 | resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} 291 | engines: {node: '>=12'} 292 | 293 | etag@1.8.1: 294 | resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} 295 | engines: {node: '>= 0.6'} 296 | 297 | eventemitter3@4.0.7: 298 | resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} 299 | 300 | fast-glob@3.3.2: 301 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 302 | engines: {node: '>=8.6.0'} 303 | 304 | fastq@1.17.1: 305 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 306 | 307 | fill-range@7.1.1: 308 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 309 | engines: {node: '>=8'} 310 | 311 | finalhandler@1.1.0: 312 | resolution: {integrity: sha512-ejnvM9ZXYzp6PUPUyQBMBf0Co5VX2gr5H2VQe2Ui2jWXNlxv+PYZo8wpAymJNJdLsG1R4p+M4aynF8KuoUEwRw==} 313 | engines: {node: '>= 0.8'} 314 | 315 | follow-redirects@1.15.9: 316 | resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} 317 | engines: {node: '>=4.0'} 318 | peerDependencies: 319 | debug: '*' 320 | peerDependenciesMeta: 321 | debug: 322 | optional: true 323 | 324 | fresh@0.5.2: 325 | resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} 326 | engines: {node: '>= 0.6'} 327 | 328 | fs-extra@11.3.0: 329 | resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} 330 | engines: {node: '>=14.14'} 331 | 332 | fs-extra@3.0.1: 333 | resolution: {integrity: sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==} 334 | 335 | fsevents@2.3.3: 336 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 337 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 338 | os: [darwin] 339 | 340 | get-caller-file@2.0.5: 341 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 342 | engines: {node: 6.* || 8.* || >= 10.*} 343 | 344 | glob-parent@5.1.2: 345 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 346 | engines: {node: '>= 6'} 347 | 348 | globby@13.2.2: 349 | resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} 350 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 351 | 352 | graceful-fs@4.2.11: 353 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 354 | 355 | has-flag@4.0.0: 356 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 357 | engines: {node: '>=8'} 358 | 359 | http-errors@1.6.3: 360 | resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} 361 | engines: {node: '>= 0.6'} 362 | 363 | http-errors@2.0.0: 364 | resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} 365 | engines: {node: '>= 0.8'} 366 | 367 | http-proxy@1.18.1: 368 | resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} 369 | engines: {node: '>=8.0.0'} 370 | 371 | iconv-lite@0.4.24: 372 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 373 | engines: {node: '>=0.10.0'} 374 | 375 | ignore@5.3.2: 376 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 377 | engines: {node: '>= 4'} 378 | 379 | immutable@3.8.2: 380 | resolution: {integrity: sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==} 381 | engines: {node: '>=0.10.0'} 382 | 383 | indent-string@5.0.0: 384 | resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} 385 | engines: {node: '>=12'} 386 | 387 | inherits@2.0.3: 388 | resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} 389 | 390 | inherits@2.0.4: 391 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 392 | 393 | is-binary-path@2.1.0: 394 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 395 | engines: {node: '>=8'} 396 | 397 | is-extglob@2.1.1: 398 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 399 | engines: {node: '>=0.10.0'} 400 | 401 | is-fullwidth-code-point@3.0.0: 402 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 403 | engines: {node: '>=8'} 404 | 405 | is-glob@4.0.3: 406 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 407 | engines: {node: '>=0.10.0'} 408 | 409 | is-number-like@1.0.8: 410 | resolution: {integrity: sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==} 411 | 412 | is-number@7.0.0: 413 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 414 | engines: {node: '>=0.12.0'} 415 | 416 | is-wsl@1.1.0: 417 | resolution: {integrity: sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==} 418 | engines: {node: '>=4'} 419 | 420 | jsonfile@3.0.1: 421 | resolution: {integrity: sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==} 422 | 423 | jsonfile@6.1.0: 424 | resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} 425 | 426 | junk@4.0.1: 427 | resolution: {integrity: sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==} 428 | engines: {node: '>=12.20'} 429 | 430 | limiter@1.1.5: 431 | resolution: {integrity: sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==} 432 | 433 | lite-server@2.6.1: 434 | resolution: {integrity: sha512-d3oyB/C8AU4EwYQHlLxcu6vTQDnCaLb81v1KKNYABmFS5oeJ11A+YxlqtpbTclID1AFddJfcB5klf0q98vYIMw==} 435 | hasBin: true 436 | 437 | localtunnel@2.0.2: 438 | resolution: {integrity: sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==} 439 | engines: {node: '>=8.3.0'} 440 | hasBin: true 441 | 442 | lodash.isfinite@3.3.2: 443 | resolution: {integrity: sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==} 444 | 445 | lodash@4.17.21: 446 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 447 | 448 | meow@12.1.1: 449 | resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} 450 | engines: {node: '>=16.10'} 451 | 452 | merge2@1.4.1: 453 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 454 | engines: {node: '>= 8'} 455 | 456 | micromatch@4.0.8: 457 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 458 | engines: {node: '>=8.6'} 459 | 460 | mime-db@1.52.0: 461 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 462 | engines: {node: '>= 0.6'} 463 | 464 | mime-types@2.1.35: 465 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 466 | engines: {node: '>= 0.6'} 467 | 468 | mime@1.4.1: 469 | resolution: {integrity: sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==} 470 | hasBin: true 471 | 472 | minimatch@3.1.2: 473 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 474 | 475 | minimist@1.2.8: 476 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 477 | 478 | mitt@1.2.0: 479 | resolution: {integrity: sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==} 480 | 481 | moment@2.30.1: 482 | resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} 483 | 484 | ms@2.0.0: 485 | resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} 486 | 487 | ms@2.1.2: 488 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 489 | 490 | ms@2.1.3: 491 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 492 | 493 | negotiator@0.6.3: 494 | resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} 495 | engines: {node: '>= 0.6'} 496 | 497 | nested-error-stacks@2.1.1: 498 | resolution: {integrity: sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==} 499 | 500 | normalize-path@3.0.0: 501 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 502 | engines: {node: '>=0.10.0'} 503 | 504 | object-assign@4.1.1: 505 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 506 | engines: {node: '>=0.10.0'} 507 | 508 | on-finished@2.3.0: 509 | resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} 510 | engines: {node: '>= 0.8'} 511 | 512 | openurl@1.1.1: 513 | resolution: {integrity: sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==} 514 | 515 | opn@5.3.0: 516 | resolution: {integrity: sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==} 517 | engines: {node: '>=4'} 518 | 519 | p-event@5.0.1: 520 | resolution: {integrity: sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==} 521 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 522 | 523 | p-filter@3.0.0: 524 | resolution: {integrity: sha512-QtoWLjXAW++uTX67HZQz1dbTpqBfiidsB6VtQUC9iR85S120+s0T5sO6s+B5MLzFcZkrEd/DGMmCjR+f2Qpxwg==} 525 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 526 | 527 | p-map@5.5.0: 528 | resolution: {integrity: sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==} 529 | engines: {node: '>=12'} 530 | 531 | p-map@6.0.0: 532 | resolution: {integrity: sha512-T8BatKGY+k5rU+Q/GTYgrEf2r4xRMevAN5mtXc2aPc4rS1j3s+vWTaO2Wag94neXuCAUAs8cxBL9EeB5EA6diw==} 533 | engines: {node: '>=16'} 534 | 535 | p-timeout@5.1.0: 536 | resolution: {integrity: sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==} 537 | engines: {node: '>=12'} 538 | 539 | parseurl@1.3.3: 540 | resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} 541 | engines: {node: '>= 0.8'} 542 | 543 | path-type@4.0.0: 544 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 545 | engines: {node: '>=8'} 546 | 547 | picomatch@2.3.1: 548 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 549 | engines: {node: '>=8.6'} 550 | 551 | portscanner@2.2.0: 552 | resolution: {integrity: sha512-IFroCz/59Lqa2uBvzK3bKDbDDIEaAY8XJ1jFxcLWTqosrsc32//P4VuSB2vZXoHiHqOmx8B5L5hnKOxL/7FlPw==} 553 | engines: {node: '>=0.4', npm: '>=1.0.0'} 554 | 555 | queue-microtask@1.2.3: 556 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 557 | 558 | range-parser@1.2.1: 559 | resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} 560 | engines: {node: '>= 0.6'} 561 | 562 | raw-body@2.5.2: 563 | resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} 564 | engines: {node: '>= 0.8'} 565 | 566 | readdirp@3.6.0: 567 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 568 | engines: {node: '>=8.10.0'} 569 | 570 | require-directory@2.1.1: 571 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 572 | engines: {node: '>=0.10.0'} 573 | 574 | requires-port@1.0.0: 575 | resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} 576 | 577 | resp-modifier@6.0.2: 578 | resolution: {integrity: sha512-U1+0kWC/+4ncRFYqQWTx/3qkfE6a4B/h3XXgmXypfa0SPZ3t7cbbaFk297PjQS/yov24R18h6OZe6iZwj3NSLw==} 579 | engines: {node: '>= 0.8.0'} 580 | 581 | reusify@1.0.4: 582 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 583 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 584 | 585 | run-parallel@1.2.0: 586 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 587 | 588 | rx@4.1.0: 589 | resolution: {integrity: sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug==} 590 | 591 | safer-buffer@2.1.2: 592 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 593 | 594 | send@0.16.2: 595 | resolution: {integrity: sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==} 596 | engines: {node: '>= 0.8.0'} 597 | 598 | serve-index@1.9.1: 599 | resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} 600 | engines: {node: '>= 0.8.0'} 601 | 602 | serve-static@1.13.2: 603 | resolution: {integrity: sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==} 604 | engines: {node: '>= 0.8.0'} 605 | 606 | server-destroy@1.0.1: 607 | resolution: {integrity: sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==} 608 | 609 | setprototypeof@1.1.0: 610 | resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} 611 | 612 | setprototypeof@1.2.0: 613 | resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} 614 | 615 | slash@4.0.0: 616 | resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} 617 | engines: {node: '>=12'} 618 | 619 | socket.io-adapter@2.5.5: 620 | resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==} 621 | 622 | socket.io-client@4.8.1: 623 | resolution: {integrity: sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==} 624 | engines: {node: '>=10.0.0'} 625 | 626 | socket.io-parser@4.2.4: 627 | resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} 628 | engines: {node: '>=10.0.0'} 629 | 630 | socket.io@4.8.1: 631 | resolution: {integrity: sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==} 632 | engines: {node: '>=10.2.0'} 633 | 634 | statuses@1.3.1: 635 | resolution: {integrity: sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg==} 636 | engines: {node: '>= 0.6'} 637 | 638 | statuses@1.4.0: 639 | resolution: {integrity: sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==} 640 | engines: {node: '>= 0.6'} 641 | 642 | statuses@2.0.1: 643 | resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} 644 | engines: {node: '>= 0.8'} 645 | 646 | stream-throttle@0.1.3: 647 | resolution: {integrity: sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ==} 648 | engines: {node: '>= 0.10.0'} 649 | hasBin: true 650 | 651 | string-width@4.2.3: 652 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 653 | engines: {node: '>=8'} 654 | 655 | strip-ansi@6.0.1: 656 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 657 | engines: {node: '>=8'} 658 | 659 | supports-color@7.2.0: 660 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 661 | engines: {node: '>=8'} 662 | 663 | to-regex-range@5.0.1: 664 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 665 | engines: {node: '>=8.0'} 666 | 667 | toidentifier@1.0.1: 668 | resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} 669 | engines: {node: '>=0.6'} 670 | 671 | typescript@5.8.3: 672 | resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} 673 | engines: {node: '>=14.17'} 674 | hasBin: true 675 | 676 | ua-parser-js@1.0.40: 677 | resolution: {integrity: sha512-z6PJ8Lml+v3ichVojCiB8toQJBuwR42ySM4ezjXIqXK3M0HczmKQ3LF4rhU55PfD99KEEXQG6yb7iOMyvYuHew==} 678 | hasBin: true 679 | 680 | undici-types@6.21.0: 681 | resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} 682 | 683 | universalify@0.1.2: 684 | resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} 685 | engines: {node: '>= 4.0.0'} 686 | 687 | universalify@2.0.1: 688 | resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} 689 | engines: {node: '>= 10.0.0'} 690 | 691 | unpipe@1.0.0: 692 | resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} 693 | engines: {node: '>= 0.8'} 694 | 695 | utils-merge@1.0.1: 696 | resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} 697 | engines: {node: '>= 0.4.0'} 698 | 699 | vary@1.1.2: 700 | resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} 701 | engines: {node: '>= 0.8'} 702 | 703 | wrap-ansi@7.0.0: 704 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 705 | engines: {node: '>=10'} 706 | 707 | ws@8.17.1: 708 | resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} 709 | engines: {node: '>=10.0.0'} 710 | peerDependencies: 711 | bufferutil: ^4.0.1 712 | utf-8-validate: '>=5.0.2' 713 | peerDependenciesMeta: 714 | bufferutil: 715 | optional: true 716 | utf-8-validate: 717 | optional: true 718 | 719 | xmlhttprequest-ssl@2.1.2: 720 | resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} 721 | engines: {node: '>=0.4.0'} 722 | 723 | y18n@5.0.8: 724 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 725 | engines: {node: '>=10'} 726 | 727 | yargs-parser@20.2.9: 728 | resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} 729 | engines: {node: '>=10'} 730 | 731 | yargs-parser@21.1.1: 732 | resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 733 | engines: {node: '>=12'} 734 | 735 | yargs@17.1.1: 736 | resolution: {integrity: sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==} 737 | engines: {node: '>=12'} 738 | 739 | yargs@17.7.2: 740 | resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} 741 | engines: {node: '>=12'} 742 | 743 | snapshots: 744 | 745 | '@nodelib/fs.scandir@2.1.5': 746 | dependencies: 747 | '@nodelib/fs.stat': 2.0.5 748 | run-parallel: 1.2.0 749 | 750 | '@nodelib/fs.stat@2.0.5': {} 751 | 752 | '@nodelib/fs.walk@1.2.8': 753 | dependencies: 754 | '@nodelib/fs.scandir': 2.1.5 755 | fastq: 1.17.1 756 | 757 | '@socket.io/component-emitter@3.1.2': {} 758 | 759 | '@types/cors@2.8.17': 760 | dependencies: 761 | '@types/node': 22.14.0 762 | 763 | '@types/fs-extra@11.0.4': 764 | dependencies: 765 | '@types/jsonfile': 6.1.4 766 | '@types/node': 22.14.0 767 | 768 | '@types/jsonfile@6.1.4': 769 | dependencies: 770 | '@types/node': 22.14.0 771 | 772 | '@types/node@22.14.0': 773 | dependencies: 774 | undici-types: 6.21.0 775 | 776 | accepts@1.3.8: 777 | dependencies: 778 | mime-types: 2.1.35 779 | negotiator: 0.6.3 780 | 781 | aggregate-error@4.0.1: 782 | dependencies: 783 | clean-stack: 4.2.0 784 | indent-string: 5.0.0 785 | 786 | ansi-regex@5.0.1: {} 787 | 788 | ansi-styles@4.3.0: 789 | dependencies: 790 | color-convert: 2.0.1 791 | 792 | anymatch@3.1.3: 793 | dependencies: 794 | normalize-path: 3.0.0 795 | picomatch: 2.3.1 796 | 797 | arrify@3.0.0: {} 798 | 799 | async-each-series@0.1.1: {} 800 | 801 | async@2.6.4: 802 | dependencies: 803 | lodash: 4.17.21 804 | 805 | axios@0.21.4(debug@4.3.2): 806 | dependencies: 807 | follow-redirects: 1.15.9(debug@4.3.2) 808 | transitivePeerDependencies: 809 | - debug 810 | 811 | balanced-match@1.0.2: {} 812 | 813 | base64id@2.0.0: {} 814 | 815 | batch@0.6.1: {} 816 | 817 | binary-extensions@2.3.0: {} 818 | 819 | brace-expansion@1.1.11: 820 | dependencies: 821 | balanced-match: 1.0.2 822 | concat-map: 0.0.1 823 | 824 | braces@3.0.3: 825 | dependencies: 826 | fill-range: 7.1.1 827 | 828 | browser-sync-client@2.29.3: 829 | dependencies: 830 | etag: 1.8.1 831 | fresh: 0.5.2 832 | mitt: 1.2.0 833 | 834 | browser-sync-ui@2.29.3: 835 | dependencies: 836 | async-each-series: 0.1.1 837 | chalk: 4.1.2 838 | connect-history-api-fallback: 1.6.0 839 | immutable: 3.8.2 840 | server-destroy: 1.0.1 841 | socket.io-client: 4.8.1 842 | stream-throttle: 0.1.3 843 | transitivePeerDependencies: 844 | - bufferutil 845 | - supports-color 846 | - utf-8-validate 847 | 848 | browser-sync@2.29.3: 849 | dependencies: 850 | browser-sync-client: 2.29.3 851 | browser-sync-ui: 2.29.3 852 | bs-recipes: 1.3.4 853 | chalk: 4.1.2 854 | chokidar: 3.6.0 855 | connect: 3.6.6 856 | connect-history-api-fallback: 1.6.0 857 | dev-ip: 1.0.1 858 | easy-extender: 2.3.4 859 | eazy-logger: 4.1.0 860 | etag: 1.8.1 861 | fresh: 0.5.2 862 | fs-extra: 3.0.1 863 | http-proxy: 1.18.1 864 | immutable: 3.8.2 865 | localtunnel: 2.0.2 866 | micromatch: 4.0.8 867 | opn: 5.3.0 868 | portscanner: 2.2.0 869 | raw-body: 2.5.2 870 | resp-modifier: 6.0.2 871 | rx: 4.1.0 872 | send: 0.16.2 873 | serve-index: 1.9.1 874 | serve-static: 1.13.2 875 | server-destroy: 1.0.1 876 | socket.io: 4.8.1 877 | ua-parser-js: 1.0.40 878 | yargs: 17.7.2 879 | transitivePeerDependencies: 880 | - bufferutil 881 | - debug 882 | - supports-color 883 | - utf-8-validate 884 | 885 | bs-recipes@1.3.4: {} 886 | 887 | bytes@3.1.2: {} 888 | 889 | chalk@4.1.2: 890 | dependencies: 891 | ansi-styles: 4.3.0 892 | supports-color: 7.2.0 893 | 894 | chokidar@3.6.0: 895 | dependencies: 896 | anymatch: 3.1.3 897 | braces: 3.0.3 898 | glob-parent: 5.1.2 899 | is-binary-path: 2.1.0 900 | is-glob: 4.0.3 901 | normalize-path: 3.0.0 902 | readdirp: 3.6.0 903 | optionalDependencies: 904 | fsevents: 2.3.3 905 | 906 | clean-stack@4.2.0: 907 | dependencies: 908 | escape-string-regexp: 5.0.0 909 | 910 | cliui@7.0.4: 911 | dependencies: 912 | string-width: 4.2.3 913 | strip-ansi: 6.0.1 914 | wrap-ansi: 7.0.0 915 | 916 | cliui@8.0.1: 917 | dependencies: 918 | string-width: 4.2.3 919 | strip-ansi: 6.0.1 920 | wrap-ansi: 7.0.0 921 | 922 | color-convert@2.0.1: 923 | dependencies: 924 | color-name: 1.1.4 925 | 926 | color-name@1.1.4: {} 927 | 928 | commander@2.20.3: {} 929 | 930 | concat-map@0.0.1: {} 931 | 932 | connect-history-api-fallback@1.6.0: {} 933 | 934 | connect-logger@0.0.1: 935 | dependencies: 936 | moment: 2.30.1 937 | 938 | connect@3.6.6: 939 | dependencies: 940 | debug: 2.6.9 941 | finalhandler: 1.1.0 942 | parseurl: 1.3.3 943 | utils-merge: 1.0.1 944 | transitivePeerDependencies: 945 | - supports-color 946 | 947 | cookie@0.7.2: {} 948 | 949 | cors@2.8.5: 950 | dependencies: 951 | object-assign: 4.1.1 952 | vary: 1.1.2 953 | 954 | cp-file@10.0.0: 955 | dependencies: 956 | graceful-fs: 4.2.11 957 | nested-error-stacks: 2.1.1 958 | p-event: 5.0.1 959 | 960 | cpy-cli@5.0.0: 961 | dependencies: 962 | cpy: 10.1.0 963 | meow: 12.1.1 964 | 965 | cpy@10.1.0: 966 | dependencies: 967 | arrify: 3.0.0 968 | cp-file: 10.0.0 969 | globby: 13.2.2 970 | junk: 4.0.1 971 | micromatch: 4.0.8 972 | nested-error-stacks: 2.1.1 973 | p-filter: 3.0.0 974 | p-map: 6.0.0 975 | 976 | custom-elements-manifest@2.1.0: {} 977 | 978 | debug@2.6.9: 979 | dependencies: 980 | ms: 2.0.0 981 | 982 | debug@4.3.2: 983 | dependencies: 984 | ms: 2.1.2 985 | 986 | debug@4.3.7: 987 | dependencies: 988 | ms: 2.1.3 989 | 990 | depd@1.1.2: {} 991 | 992 | depd@2.0.0: {} 993 | 994 | destroy@1.0.4: {} 995 | 996 | dev-ip@1.0.1: {} 997 | 998 | dir-glob@3.0.1: 999 | dependencies: 1000 | path-type: 4.0.0 1001 | 1002 | easy-extender@2.3.4: 1003 | dependencies: 1004 | lodash: 4.17.21 1005 | 1006 | eazy-logger@4.1.0: 1007 | dependencies: 1008 | chalk: 4.1.2 1009 | 1010 | ee-first@1.1.1: {} 1011 | 1012 | emoji-regex@8.0.0: {} 1013 | 1014 | encodeurl@1.0.2: {} 1015 | 1016 | engine.io-client@6.6.3: 1017 | dependencies: 1018 | '@socket.io/component-emitter': 3.1.2 1019 | debug: 4.3.7 1020 | engine.io-parser: 5.2.3 1021 | ws: 8.17.1 1022 | xmlhttprequest-ssl: 2.1.2 1023 | transitivePeerDependencies: 1024 | - bufferutil 1025 | - supports-color 1026 | - utf-8-validate 1027 | 1028 | engine.io-parser@5.2.3: {} 1029 | 1030 | engine.io@6.6.4: 1031 | dependencies: 1032 | '@types/cors': 2.8.17 1033 | '@types/node': 22.14.0 1034 | accepts: 1.3.8 1035 | base64id: 2.0.0 1036 | cookie: 0.7.2 1037 | cors: 2.8.5 1038 | debug: 4.3.7 1039 | engine.io-parser: 5.2.3 1040 | ws: 8.17.1 1041 | transitivePeerDependencies: 1042 | - bufferutil 1043 | - supports-color 1044 | - utf-8-validate 1045 | 1046 | escalade@3.2.0: {} 1047 | 1048 | escape-html@1.0.3: {} 1049 | 1050 | escape-string-regexp@5.0.0: {} 1051 | 1052 | etag@1.8.1: {} 1053 | 1054 | eventemitter3@4.0.7: {} 1055 | 1056 | fast-glob@3.3.2: 1057 | dependencies: 1058 | '@nodelib/fs.stat': 2.0.5 1059 | '@nodelib/fs.walk': 1.2.8 1060 | glob-parent: 5.1.2 1061 | merge2: 1.4.1 1062 | micromatch: 4.0.8 1063 | 1064 | fastq@1.17.1: 1065 | dependencies: 1066 | reusify: 1.0.4 1067 | 1068 | fill-range@7.1.1: 1069 | dependencies: 1070 | to-regex-range: 5.0.1 1071 | 1072 | finalhandler@1.1.0: 1073 | dependencies: 1074 | debug: 2.6.9 1075 | encodeurl: 1.0.2 1076 | escape-html: 1.0.3 1077 | on-finished: 2.3.0 1078 | parseurl: 1.3.3 1079 | statuses: 1.3.1 1080 | unpipe: 1.0.0 1081 | transitivePeerDependencies: 1082 | - supports-color 1083 | 1084 | follow-redirects@1.15.9(debug@4.3.2): 1085 | optionalDependencies: 1086 | debug: 4.3.2 1087 | 1088 | fresh@0.5.2: {} 1089 | 1090 | fs-extra@11.3.0: 1091 | dependencies: 1092 | graceful-fs: 4.2.11 1093 | jsonfile: 6.1.0 1094 | universalify: 2.0.1 1095 | 1096 | fs-extra@3.0.1: 1097 | dependencies: 1098 | graceful-fs: 4.2.11 1099 | jsonfile: 3.0.1 1100 | universalify: 0.1.2 1101 | 1102 | fsevents@2.3.3: 1103 | optional: true 1104 | 1105 | get-caller-file@2.0.5: {} 1106 | 1107 | glob-parent@5.1.2: 1108 | dependencies: 1109 | is-glob: 4.0.3 1110 | 1111 | globby@13.2.2: 1112 | dependencies: 1113 | dir-glob: 3.0.1 1114 | fast-glob: 3.3.2 1115 | ignore: 5.3.2 1116 | merge2: 1.4.1 1117 | slash: 4.0.0 1118 | 1119 | graceful-fs@4.2.11: {} 1120 | 1121 | has-flag@4.0.0: {} 1122 | 1123 | http-errors@1.6.3: 1124 | dependencies: 1125 | depd: 1.1.2 1126 | inherits: 2.0.3 1127 | setprototypeof: 1.1.0 1128 | statuses: 1.4.0 1129 | 1130 | http-errors@2.0.0: 1131 | dependencies: 1132 | depd: 2.0.0 1133 | inherits: 2.0.4 1134 | setprototypeof: 1.2.0 1135 | statuses: 2.0.1 1136 | toidentifier: 1.0.1 1137 | 1138 | http-proxy@1.18.1: 1139 | dependencies: 1140 | eventemitter3: 4.0.7 1141 | follow-redirects: 1.15.9(debug@4.3.2) 1142 | requires-port: 1.0.0 1143 | transitivePeerDependencies: 1144 | - debug 1145 | 1146 | iconv-lite@0.4.24: 1147 | dependencies: 1148 | safer-buffer: 2.1.2 1149 | 1150 | ignore@5.3.2: {} 1151 | 1152 | immutable@3.8.2: {} 1153 | 1154 | indent-string@5.0.0: {} 1155 | 1156 | inherits@2.0.3: {} 1157 | 1158 | inherits@2.0.4: {} 1159 | 1160 | is-binary-path@2.1.0: 1161 | dependencies: 1162 | binary-extensions: 2.3.0 1163 | 1164 | is-extglob@2.1.1: {} 1165 | 1166 | is-fullwidth-code-point@3.0.0: {} 1167 | 1168 | is-glob@4.0.3: 1169 | dependencies: 1170 | is-extglob: 2.1.1 1171 | 1172 | is-number-like@1.0.8: 1173 | dependencies: 1174 | lodash.isfinite: 3.3.2 1175 | 1176 | is-number@7.0.0: {} 1177 | 1178 | is-wsl@1.1.0: {} 1179 | 1180 | jsonfile@3.0.1: 1181 | optionalDependencies: 1182 | graceful-fs: 4.2.11 1183 | 1184 | jsonfile@6.1.0: 1185 | dependencies: 1186 | universalify: 2.0.1 1187 | optionalDependencies: 1188 | graceful-fs: 4.2.11 1189 | 1190 | junk@4.0.1: {} 1191 | 1192 | limiter@1.1.5: {} 1193 | 1194 | lite-server@2.6.1: 1195 | dependencies: 1196 | browser-sync: 2.29.3 1197 | connect-history-api-fallback: 1.6.0 1198 | connect-logger: 0.0.1 1199 | lodash: 4.17.21 1200 | minimist: 1.2.8 1201 | transitivePeerDependencies: 1202 | - bufferutil 1203 | - debug 1204 | - supports-color 1205 | - utf-8-validate 1206 | 1207 | localtunnel@2.0.2: 1208 | dependencies: 1209 | axios: 0.21.4(debug@4.3.2) 1210 | debug: 4.3.2 1211 | openurl: 1.1.1 1212 | yargs: 17.1.1 1213 | transitivePeerDependencies: 1214 | - supports-color 1215 | 1216 | lodash.isfinite@3.3.2: {} 1217 | 1218 | lodash@4.17.21: {} 1219 | 1220 | meow@12.1.1: {} 1221 | 1222 | merge2@1.4.1: {} 1223 | 1224 | micromatch@4.0.8: 1225 | dependencies: 1226 | braces: 3.0.3 1227 | picomatch: 2.3.1 1228 | 1229 | mime-db@1.52.0: {} 1230 | 1231 | mime-types@2.1.35: 1232 | dependencies: 1233 | mime-db: 1.52.0 1234 | 1235 | mime@1.4.1: {} 1236 | 1237 | minimatch@3.1.2: 1238 | dependencies: 1239 | brace-expansion: 1.1.11 1240 | 1241 | minimist@1.2.8: {} 1242 | 1243 | mitt@1.2.0: {} 1244 | 1245 | moment@2.30.1: {} 1246 | 1247 | ms@2.0.0: {} 1248 | 1249 | ms@2.1.2: {} 1250 | 1251 | ms@2.1.3: {} 1252 | 1253 | negotiator@0.6.3: {} 1254 | 1255 | nested-error-stacks@2.1.1: {} 1256 | 1257 | normalize-path@3.0.0: {} 1258 | 1259 | object-assign@4.1.1: {} 1260 | 1261 | on-finished@2.3.0: 1262 | dependencies: 1263 | ee-first: 1.1.1 1264 | 1265 | openurl@1.1.1: {} 1266 | 1267 | opn@5.3.0: 1268 | dependencies: 1269 | is-wsl: 1.1.0 1270 | 1271 | p-event@5.0.1: 1272 | dependencies: 1273 | p-timeout: 5.1.0 1274 | 1275 | p-filter@3.0.0: 1276 | dependencies: 1277 | p-map: 5.5.0 1278 | 1279 | p-map@5.5.0: 1280 | dependencies: 1281 | aggregate-error: 4.0.1 1282 | 1283 | p-map@6.0.0: {} 1284 | 1285 | p-timeout@5.1.0: {} 1286 | 1287 | parseurl@1.3.3: {} 1288 | 1289 | path-type@4.0.0: {} 1290 | 1291 | picomatch@2.3.1: {} 1292 | 1293 | portscanner@2.2.0: 1294 | dependencies: 1295 | async: 2.6.4 1296 | is-number-like: 1.0.8 1297 | 1298 | queue-microtask@1.2.3: {} 1299 | 1300 | range-parser@1.2.1: {} 1301 | 1302 | raw-body@2.5.2: 1303 | dependencies: 1304 | bytes: 3.1.2 1305 | http-errors: 2.0.0 1306 | iconv-lite: 0.4.24 1307 | unpipe: 1.0.0 1308 | 1309 | readdirp@3.6.0: 1310 | dependencies: 1311 | picomatch: 2.3.1 1312 | 1313 | require-directory@2.1.1: {} 1314 | 1315 | requires-port@1.0.0: {} 1316 | 1317 | resp-modifier@6.0.2: 1318 | dependencies: 1319 | debug: 2.6.9 1320 | minimatch: 3.1.2 1321 | transitivePeerDependencies: 1322 | - supports-color 1323 | 1324 | reusify@1.0.4: {} 1325 | 1326 | run-parallel@1.2.0: 1327 | dependencies: 1328 | queue-microtask: 1.2.3 1329 | 1330 | rx@4.1.0: {} 1331 | 1332 | safer-buffer@2.1.2: {} 1333 | 1334 | send@0.16.2: 1335 | dependencies: 1336 | debug: 2.6.9 1337 | depd: 1.1.2 1338 | destroy: 1.0.4 1339 | encodeurl: 1.0.2 1340 | escape-html: 1.0.3 1341 | etag: 1.8.1 1342 | fresh: 0.5.2 1343 | http-errors: 1.6.3 1344 | mime: 1.4.1 1345 | ms: 2.0.0 1346 | on-finished: 2.3.0 1347 | range-parser: 1.2.1 1348 | statuses: 1.4.0 1349 | transitivePeerDependencies: 1350 | - supports-color 1351 | 1352 | serve-index@1.9.1: 1353 | dependencies: 1354 | accepts: 1.3.8 1355 | batch: 0.6.1 1356 | debug: 2.6.9 1357 | escape-html: 1.0.3 1358 | http-errors: 1.6.3 1359 | mime-types: 2.1.35 1360 | parseurl: 1.3.3 1361 | transitivePeerDependencies: 1362 | - supports-color 1363 | 1364 | serve-static@1.13.2: 1365 | dependencies: 1366 | encodeurl: 1.0.2 1367 | escape-html: 1.0.3 1368 | parseurl: 1.3.3 1369 | send: 0.16.2 1370 | transitivePeerDependencies: 1371 | - supports-color 1372 | 1373 | server-destroy@1.0.1: {} 1374 | 1375 | setprototypeof@1.1.0: {} 1376 | 1377 | setprototypeof@1.2.0: {} 1378 | 1379 | slash@4.0.0: {} 1380 | 1381 | socket.io-adapter@2.5.5: 1382 | dependencies: 1383 | debug: 4.3.7 1384 | ws: 8.17.1 1385 | transitivePeerDependencies: 1386 | - bufferutil 1387 | - supports-color 1388 | - utf-8-validate 1389 | 1390 | socket.io-client@4.8.1: 1391 | dependencies: 1392 | '@socket.io/component-emitter': 3.1.2 1393 | debug: 4.3.7 1394 | engine.io-client: 6.6.3 1395 | socket.io-parser: 4.2.4 1396 | transitivePeerDependencies: 1397 | - bufferutil 1398 | - supports-color 1399 | - utf-8-validate 1400 | 1401 | socket.io-parser@4.2.4: 1402 | dependencies: 1403 | '@socket.io/component-emitter': 3.1.2 1404 | debug: 4.3.7 1405 | transitivePeerDependencies: 1406 | - supports-color 1407 | 1408 | socket.io@4.8.1: 1409 | dependencies: 1410 | accepts: 1.3.8 1411 | base64id: 2.0.0 1412 | cors: 2.8.5 1413 | debug: 4.3.7 1414 | engine.io: 6.6.4 1415 | socket.io-adapter: 2.5.5 1416 | socket.io-parser: 4.2.4 1417 | transitivePeerDependencies: 1418 | - bufferutil 1419 | - supports-color 1420 | - utf-8-validate 1421 | 1422 | statuses@1.3.1: {} 1423 | 1424 | statuses@1.4.0: {} 1425 | 1426 | statuses@2.0.1: {} 1427 | 1428 | stream-throttle@0.1.3: 1429 | dependencies: 1430 | commander: 2.20.3 1431 | limiter: 1.1.5 1432 | 1433 | string-width@4.2.3: 1434 | dependencies: 1435 | emoji-regex: 8.0.0 1436 | is-fullwidth-code-point: 3.0.0 1437 | strip-ansi: 6.0.1 1438 | 1439 | strip-ansi@6.0.1: 1440 | dependencies: 1441 | ansi-regex: 5.0.1 1442 | 1443 | supports-color@7.2.0: 1444 | dependencies: 1445 | has-flag: 4.0.0 1446 | 1447 | to-regex-range@5.0.1: 1448 | dependencies: 1449 | is-number: 7.0.0 1450 | 1451 | toidentifier@1.0.1: {} 1452 | 1453 | typescript@5.8.3: {} 1454 | 1455 | ua-parser-js@1.0.40: {} 1456 | 1457 | undici-types@6.21.0: {} 1458 | 1459 | universalify@0.1.2: {} 1460 | 1461 | universalify@2.0.1: {} 1462 | 1463 | unpipe@1.0.0: {} 1464 | 1465 | utils-merge@1.0.1: {} 1466 | 1467 | vary@1.1.2: {} 1468 | 1469 | wrap-ansi@7.0.0: 1470 | dependencies: 1471 | ansi-styles: 4.3.0 1472 | string-width: 4.2.3 1473 | strip-ansi: 6.0.1 1474 | 1475 | ws@8.17.1: {} 1476 | 1477 | xmlhttprequest-ssl@2.1.2: {} 1478 | 1479 | y18n@5.0.8: {} 1480 | 1481 | yargs-parser@20.2.9: {} 1482 | 1483 | yargs-parser@21.1.1: {} 1484 | 1485 | yargs@17.1.1: 1486 | dependencies: 1487 | cliui: 7.0.4 1488 | escalade: 3.2.0 1489 | get-caller-file: 2.0.5 1490 | require-directory: 2.1.1 1491 | string-width: 4.2.3 1492 | y18n: 5.0.8 1493 | yargs-parser: 20.2.9 1494 | 1495 | yargs@17.7.2: 1496 | dependencies: 1497 | cliui: 8.0.1 1498 | escalade: 3.2.0 1499 | get-caller-file: 2.0.5 1500 | require-directory: 2.1.1 1501 | string-width: 4.2.3 1502 | y18n: 5.0.8 1503 | yargs-parser: 21.1.1 1504 | -------------------------------------------------------------------------------- /src/angular.ts: -------------------------------------------------------------------------------- 1 | import { generatedMessage, createElementMetadata, CustomElement } from './utils.js'; 2 | 3 | export function generate(config: { customElementsManifest: any, entrypoint: string }) { 4 | const elements = createElementMetadata(config.customElementsManifest, config.entrypoint); 5 | 6 | const src = ` 7 | /* 8 | * custom-element-types.module.ts 9 | * ${generatedMessage} 10 | */ 11 | import { Directive, Input, Output, EventEmitter, ElementRef } from '@angular/core'; 12 | ${elements.map(e => e.importType).join('\n')} 13 | 14 | ${elements.map(e => getDirective(e)).join('\n')}`.trim(); 15 | return [{ src, path: 'custom-element-types.module.ts' }];; 16 | } 17 | 18 | // https://github.com/angular/angular/issues/14761 19 | function getDirective(element: CustomElement) { 20 | return ` 21 | @Directive({ selector: '${element.tagName}', standalone: true }) 22 | export class ${element.name}Directive { 23 | protected element: Partial<${element.name}>; 24 | ${getInputProperties(element)} 25 | ${getOutputEvents(element)} 26 | constructor(elementRef: ElementRef) { 27 | this.element = elementRef.nativeElement; 28 | } 29 | }`; 30 | } 31 | 32 | function getInputProperties(element: CustomElement) { 33 | return element.propeties.map(prop => ` 34 | @Input() set ${prop.name}(value${prop.type === 'boolean' ? `: boolean | ''` : ''}) { this.element.${prop.name} = ${prop.type === 'boolean' ? `value === '' ? true : ` : ''}value; } 35 | get ${prop.name}() { return this.element.${prop.name}; }`).join('\n'); 36 | } 37 | 38 | function getOutputEvents(element: any) { 39 | return `${element.events?.length ? `\n${element.events?.map(event => ` @Output('${event.name}') ${event.name}Event: EventEmitter = new EventEmitter();`).join('\n\n')}` : ''}`; 40 | } 41 | -------------------------------------------------------------------------------- /src/blazor.ts: -------------------------------------------------------------------------------- 1 | import { generatedMessage, createElementMetadata } from './utils.js'; 2 | 3 | export function generate(config: { customElementsManifest: any, entrypoint: string }) { 4 | const elements = createElementMetadata(config.customElementsManifest, config.entrypoint); 5 | 6 | const eventObject = elements.reduce((prev, component) => { 7 | component.events?.forEach(event => { 8 | prev[event.name] = prev[event.name] ? [...prev[event.name] ?? [], { ...event, tagName: component.tagName }] : []; 9 | }); 10 | 11 | return prev; 12 | }, { }); 13 | 14 | 15 | const srcCS = ` 16 | /* 17 | * @experimental 18 | * 19 | * EventHandlers.cs 20 | * ${generatedMessage} 21 | */ 22 | 23 | using Microsoft.AspNetCore.Components; 24 | using System.Text.Json; 25 | 26 | namespace BlazorApp; 27 | ${Object.keys(eventObject).map(name => ({ name, descriptions: eventObject[name] })).map(e => { 28 | return ` 29 | [EventHandler("on${e.name}", typeof(CustomEventArgs))] // ${e.descriptions.map(d => `${d.tagName}`).join(', ')}`; 30 | }).join('')} 31 | public static class EventHandlers 32 | { 33 | 34 | } 35 | 36 | public class CustomEventArgs : EventArgs 37 | { 38 | public dynamic? Detail { get; set; } 39 | 40 | /* Returns the detail value of CustomEvent with given type */ 41 | public T GetDetail() { 42 | return JsonSerializer.Deserialize(Detail); // used to cast dynamic type, unknown until event occurs at runtime 43 | } 44 | }`.trim(); 45 | 46 | const srcJS = ` 47 | /** 48 | * @experimental 49 | * 50 | * wwwroot/custom-events.js 51 | * ${generatedMessage} 52 | */ 53 | 54 | const customEvents = {${Object.keys(eventObject) 55 | .map(name => ({ name, descriptions: eventObject[name] })) 56 | .map(e => ` 57 | ${e.name}: true, // ${e.descriptions.map(d => `${d.tagName}`).join(', ')}`)} 58 | }; 59 | 60 | /** 61 | * Workaround: Blazor ignores the event target and only listens to global events 62 | * this is a problem for most custom elements which dispatch CustomEvent types 63 | * that default to not bubbling. 64 | */ 65 | CustomEvent = class Bubbled extends CustomEvent { 66 | constructor(event, config) { 67 | const bubbles = customEvents[event] !== undefined ? customEvents[event] : config.bubbles; 68 | super(event, { ...config, bubbles }); 69 | } 70 | } 71 | 72 | Object.keys(customEvents).map(event => { 73 | Blazor.registerCustomEventType(event, { 74 | browserEventName: event, 75 | createEventArgs: event => { 76 | return { detail: event.detail }; 77 | } 78 | }); 79 | }); 80 | `; 81 | 82 | return [{ src: srcCS, path: 'CustomEvents.cs' }, { src: srcJS, path: 'custom-events.js' }]; 83 | } 84 | 85 | 86 | // export function afterStarted() { 87 | // ${Object.keys(eventObject).map(name => ({ name, descriptions: eventObject[name] })).map(e => ` 88 | // ${e.descriptions.map(d => ` // ${d.tagName}: ${d.description}`).join('\n')} 89 | // Blazor.registerCustomEventType('${e.name}', { 90 | // browserEventName: '${e.name}', 91 | // createEventArgs: event => { 92 | // return { detail: event.detail }; 93 | // } 94 | // });`)}`}; -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | import fs from 'fs-extra'; 4 | import path from 'path'; 5 | import yargs from 'yargs'; 6 | import { hideBin } from 'yargs/helpers'; 7 | 8 | import { generate as generateAngular } from './angular.js'; 9 | import { generate as generateReact } from './react.js'; 10 | import { generate as generatePreact } from './preact.js'; 11 | import { generate as generateTypeScript } from './typescript.js'; 12 | import { generate as generateBlazor } from './blazor.js'; 13 | import { generate as generateJSX } from './jsx.js'; 14 | 15 | const { ensureFileSync, writeFileSync, readJsonSync } = fs; 16 | const argv = yargs(hideBin(process.argv)).argv; 17 | const writePath = argv.write === true ? './' : argv.write; 18 | const manifestPath = argv.customElements ? argv.customElements : './custom-elements.json'; 19 | 20 | const generator = { 21 | angular: generateAngular, 22 | react: generateReact, 23 | preact: generatePreact, 24 | typescript: generateTypeScript, 25 | blazor: generateBlazor, 26 | jsx: generateJSX 27 | } 28 | 29 | export function run() { 30 | const customElementsManifest = readJsonSync(path.resolve(manifestPath)); 31 | let result = generator[argv.type]({ customElementsManifest, entrypoint: argv.entrypoint }); 32 | 33 | if (argv.write) { 34 | write(writePath, result); 35 | } else { 36 | console.log(result); 37 | } 38 | } 39 | 40 | function write(dir: string, files: { src: string, path: string }[]) { 41 | files.forEach(file => { 42 | ensureFileSync(path.resolve(dir, file.path)); 43 | writeFileSync(path.resolve(dir, file.path), file.src); 44 | }); 45 | } 46 | 47 | run(); 48 | -------------------------------------------------------------------------------- /src/jsx.ts: -------------------------------------------------------------------------------- 1 | import { generatedMessage, createElementMetadata } from './utils.js'; 2 | 3 | export function generate(config: { customElementsManifest: any, entrypoint: string }) { 4 | const elements = createElementMetadata(config.customElementsManifest, config.entrypoint); 5 | const src = ` 6 | /* 7 | * @experimental 8 | * 9 | * types.d.ts 10 | * ${generatedMessage} 11 | */ 12 | ${elements.map(e => e.importType).join('\n')} 13 | 14 | type CustomEvents = { [key in K] : (event: CustomEvent) => void }; 15 | type CustomElement = Partial>; 16 | 17 | export interface CustomElements { 18 | ${elements.map(e => ` ['${e.tagName}']: CustomElement<${e.name}${e.events.length ? `,${e.events.map(event => `'${event.name}'`).join(' | ')}` : ''}>`).join(';\n')} 19 | } 20 | `.trim(); 21 | 22 | return [{ src, path: 'types.d.ts' }]; 23 | } 24 | -------------------------------------------------------------------------------- /src/preact.ts: -------------------------------------------------------------------------------- 1 | import { generatedMessage, createElementMetadata } from './utils.js'; 2 | 3 | export function generate(config: { customElementsManifest: any, entrypoint: string }) { 4 | const elements = createElementMetadata(config.customElementsManifest, config.entrypoint); 5 | 6 | const src = ` 7 | /* 8 | * types.d.ts 9 | * ${generatedMessage} 10 | */ 11 | ${elements.map(e => e.import).join('\n')} 12 | 13 | type CustomEvents = { [key in K] : (event: CustomEvent) => void }; 14 | type CustomElement = Partial>; 15 | 16 | declare global { 17 | namespace preact.JSX { 18 | interface IntrinsicElements { 19 | ${elements.map(e => ` ['${e.tagName}']: CustomElement<${e.name}${e.events.length ? `,${e.events.map(event => `'${event.name}'`).join(' | ')}` : ''}>`).join(';\n')} 20 | } 21 | } 22 | }`.trim(); 23 | 24 | return [{ src, path: 'types.d.ts' }]; 25 | } 26 | 27 | -------------------------------------------------------------------------------- /src/react.ts: -------------------------------------------------------------------------------- 1 | import { generatedMessage, createElementMetadata } from './utils.js'; 2 | 3 | export function generate(config: { customElementsManifest: any, entrypoint: string }) { 4 | const elements = createElementMetadata(config.customElementsManifest, config.entrypoint); 5 | const src = ` 6 | /* 7 | * @experimental 8 | * 9 | * types.d.ts 10 | * ${generatedMessage} 11 | */ 12 | import { DOMAttributes } from 'react'; 13 | ${elements.map(e => e.import).join('\n')} 14 | 15 | type CustomEvents = { [key in K] : (event: CustomEvent) => void }; 16 | type CustomElement = Partial & { children: any } & CustomEvents<\`on\${K}\`>>; 17 | 18 | declare module "react" { 19 | namespace JSX { 20 | interface IntrinsicElements { 21 | ${elements.map(e => ` ['${e.tagName}']: CustomElement<${e.name}${e.events.length ? `,${e.events.map(event => `'${event.name}'`).join(' | ')}` : ''}>`).join(';\n')} 22 | } 23 | } 24 | }`.trim(); 25 | 26 | return [{ src, path: 'types.d.ts' }]; 27 | } 28 | 29 | -------------------------------------------------------------------------------- /src/reserved.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * This rule catches property overrides that conflicts with a key in the HTMLElement prototype 3 | * https://github.com/ionic-team/stencil-eslint/blob/main/src/rules/reserved-member-names.ts 4 | * https://github.com/ionic-team/stencil-eslint/blob/main/src/rules/reserved-event-names.ts 5 | */ 6 | 7 | const ariaProperties = [ 8 | 'ActiveDescendant', 9 | 'Atomic', 10 | 'AutoComplete', 11 | 'Busy', 12 | 'Checked', 13 | 'ColCount', 14 | 'ColIndex', 15 | 'ColSpan', 16 | 'Controls', 17 | 'Current', 18 | 'DescribedBy', 19 | 'Details', 20 | 'Disabled', 21 | 'ErrorMessage', 22 | 'Expanded', 23 | 'FlowTo', 24 | 'HasPopup', 25 | 'Hidden', 26 | 'Invalid', 27 | 'KeyShortcuts', 28 | 'Label', 29 | 'LabelledBy', 30 | 'Level', 31 | 'Live', 32 | 'Modal', 33 | 'MultiLine', 34 | 'MultiSelectable', 35 | 'Orientation', 36 | 'Owns', 37 | 'Placeholder', 38 | 'PosInSet', 39 | 'Pressed', 40 | 'ReadOnly', 41 | 'Relevant', 42 | 'Required', 43 | 'RoleDescription', 44 | 'RowCount', 45 | 'RowIndex', 46 | 'RowSpan', 47 | 'Selected', 48 | 'SetSize', 49 | 'Sort', 50 | 'ValueMax', 51 | 'ValueMin', 52 | 'ValueNow', 53 | 'ValueText', 54 | ].map(name => `aria${name}`); 55 | 56 | const htmlElementProperties = [ 57 | 'title', 58 | 'lang', 59 | 'translate', 60 | 'dir', 61 | 'dataset', 62 | 'hidden', 63 | 'tabIndex', 64 | 'accessKey', 65 | 'draggable', 66 | 'spellcheck', 67 | 'autocapitalize', 68 | 'contentEditable', 69 | 'isContentEditable', 70 | 'inputMode', 71 | 'offsetParent', 72 | 'offsetTop', 73 | 'offsetLeft', 74 | 'offsetWidth', 75 | 'offsetHeight', 76 | 'style', 77 | 'innerText', 78 | 'outerText', 79 | 'oncopy', 80 | 'oncut', 81 | 'onpaste', 82 | 'onabort', 83 | 'onblur', 84 | 'oncancel', 85 | 'oncanplay', 86 | 'oncanplaythrough', 87 | 'onchange', 88 | 'onclick', 89 | 'onclose', 90 | 'oncontextmenu', 91 | 'oncuechange', 92 | 'ondblclick', 93 | 'ondrag', 94 | 'ondragend', 95 | 'ondragenter', 96 | 'ondragleave', 97 | 'ondragover', 98 | 'ondragstart', 99 | 'ondrop', 100 | 'ondurationchange', 101 | 'onemptied', 102 | 'onended', 103 | 'onerror', 104 | 'onfocus', 105 | 'oninput', 106 | 'oninvalid', 107 | 'onkeydown', 108 | 'onkeypress', 109 | 'onkeyup', 110 | 'onload', 111 | 'onloadeddata', 112 | 'onloadedmetadata', 113 | 'onloadstart', 114 | 'onmousedown', 115 | 'onmouseenter', 116 | 'onmouseleave', 117 | 'onmousemove', 118 | 'onmouseout', 119 | 'onmouseover', 120 | 'onmouseup', 121 | 'onmousewheel', 122 | 'onpause', 123 | 'onplay', 124 | 'onplaying', 125 | 'onprogress', 126 | 'onratechange', 127 | 'onreset', 128 | 'onresize', 129 | 'onscroll', 130 | 'onseeked', 131 | 'onseeking', 132 | 'onselect', 133 | 'onstalled', 134 | 'onsubmit', 135 | 'onsuspend', 136 | 'ontimeupdate', 137 | 'ontoggle', 138 | 'onvolumechange', 139 | 'onwaiting', 140 | 'onwheel', 141 | 'onauxclick', 142 | 'ongotpointercapture', 143 | 'onlostpointercapture', 144 | 'onpointerdown', 145 | 'onpointermove', 146 | 'onpointerup', 147 | 'onpointercancel', 148 | 'onpointerover', 149 | 'onpointerout', 150 | 'onpointerenter', 151 | 'onpointerleave', 152 | 'onselectstart', 153 | 'onselectionchange', 154 | 'nonce', 155 | 'click', 156 | 'focus', 157 | 'blur', 158 | ]; 159 | 160 | const elementProperties = [ 161 | 'namespaceURI', 162 | 'prefix', 163 | 'localName', 164 | 'tagName', 165 | 'id', 166 | 'className', 167 | 'classList', 168 | 'slot', 169 | 'attributes', 170 | 'shadowRoot', 171 | 'assignedSlot', 172 | 'innerHTML', 173 | 'outerHTML', 174 | 'scrollTop', 175 | 'scrollLeft', 176 | 'scrollWidth', 177 | 'scrollHeight', 178 | 'clientTop', 179 | 'clientLeft', 180 | 'clientWidth', 181 | 'clientHeight', 182 | 'attributeStyleMap', 183 | 'onbeforecopy', 184 | 'onbeforecut', 185 | 'onbeforepaste', 186 | 'onsearch', 187 | 'previousElementSibling', 188 | 'nextElementSibling', 189 | 'children', 190 | 'firstElementChild', 191 | 'lastElementChild', 192 | 'childElementCount', 193 | 'onfullscreenchange', 194 | 'onfullscreenerror', 195 | 'onwebkitfullscreenchange', 196 | 'onwebkitfullscreenerror', 197 | 'setPointerCapture', 198 | 'releasePointerCapture', 199 | 'hasPointerCapture', 200 | 'hasAttributes', 201 | 'getAttributeNames', 202 | 'getAttribute', 203 | 'getAttributeNS', 204 | 'setAttribute', 205 | 'setAttributeNS', 206 | 'removeAttribute', 207 | 'removeAttributeNS', 208 | 'hasAttribute', 209 | 'hasAttributeNS', 210 | 'toggleAttribute', 211 | 'getAttributeNode', 212 | 'getAttributeNodeNS', 213 | 'setAttributeNode', 214 | 'setAttributeNodeNS', 215 | 'removeAttributeNode', 216 | 'closest', 217 | 'matches', 218 | 'webkitMatchesSelector', 219 | 'attachShadow', 220 | 'getElementsByTagName', 221 | 'getElementsByTagNameNS', 222 | 'getElementsByClassName', 223 | 'insertAdjacentElement', 224 | 'insertAdjacentText', 225 | 'insertAdjacentHTML', 226 | 'requestPointerLock', 227 | 'getClientRects', 228 | 'getBoundingClientRect', 229 | 'scrollIntoView', 230 | 'scroll', 231 | 'scrollTo', 232 | 'scrollBy', 233 | 'scrollIntoViewIfNeeded', 234 | 'animate', 235 | 'computedStyleMap', 236 | 'before', 237 | 'after', 238 | 'replaceWith', 239 | 'remove', 240 | 'prepend', 241 | 'append', 242 | 'querySelector', 243 | 'querySelectorAll', 244 | 'requestFullscreen', 245 | 'webkitRequestFullScreen', 246 | 'webkitRequestFullscreen', 247 | 'part', 248 | 'createShadowRoot', 249 | 'getDestinationInsertionPoints', 250 | 251 | // custom elements 252 | 'role', 253 | 'form', 254 | ]; 255 | 256 | const reservedPublicProperties = new Set( 257 | [...ariaProperties, ...htmlElementProperties, ...elementProperties].map(p => p.toLowerCase()) 258 | ); 259 | 260 | export function isReservedProperty(memberName) { 261 | memberName = memberName.toLowerCase(); 262 | return reservedPublicProperties.has(memberName); 263 | } 264 | 265 | const htmlElementEvents = [ 266 | 'abort', 267 | 'auxclick', 268 | 'blur', 269 | 'cancel', 270 | 'canplay', 271 | 'canplaythrough', 272 | 'change', 273 | 'click', 274 | 'close', 275 | 'contextmenu', 276 | 'copy', 277 | 'cuechange', 278 | 'cut', 279 | 'dblclick', 280 | 'drag', 281 | 'dragend', 282 | 'dragenter', 283 | 'dragleave', 284 | 'dragover', 285 | 'dragstart', 286 | 'drop', 287 | 'durationchange', 288 | 'emptied', 289 | 'ended', 290 | 'error', 291 | 'focus', 292 | 'gotpointercapture', 293 | 'input', 294 | 'invalid', 295 | 'keydown', 296 | 'keypress', 297 | 'keyup', 298 | 'load', 299 | 'loadeddata', 300 | 'loadedmetadata', 301 | 'loadstart', 302 | 'lostpointercapture', 303 | 'mousedown', 304 | 'mouseenter', 305 | 'mouseleave', 306 | 'mousemove', 307 | 'mouseout', 308 | 'mouseover', 309 | 'mouseup', 310 | 'mousewheel', 311 | 'paste', 312 | 'pause', 313 | 'play', 314 | 'playing', 315 | 'pointercancel', 316 | 'pointerdown', 317 | 'pointerenter', 318 | 'pointerleave', 319 | 'pointermove', 320 | 'pointerout', 321 | 'pointerover', 322 | 'pointerup', 323 | 'progress', 324 | 'ratechange', 325 | 'reset', 326 | 'resize', 327 | 'scroll', 328 | 'seeked', 329 | 'seeking', 330 | 'select', 331 | 'selectionchange', 332 | 'selectstart', 333 | 'stalled', 334 | 'submit', 335 | 'suspend', 336 | 'timeupdate', 337 | 'toggle', 338 | 'volumechange', 339 | 'waiting', 340 | 'wheel', 341 | ]; 342 | 343 | const reservedPublicEvents = new Set([...htmlElementEvents].map(p => p.toLowerCase())); 344 | 345 | export function isReservedEvent(memberName) { 346 | memberName = memberName.toLowerCase(); 347 | return reservedPublicEvents.has(memberName); 348 | } -------------------------------------------------------------------------------- /src/typescript.ts: -------------------------------------------------------------------------------- 1 | import { generatedMessage, createElementMetadata } from './utils.js'; 2 | 3 | export function generate(config: { customElementsManifest: any, entrypoint: string }) { 4 | const elements = createElementMetadata(config.customElementsManifest, config.entrypoint); 5 | const src = ` 6 | /* 7 | * types.d.ts 8 | * ${generatedMessage} 9 | */ 10 | ${elements.map(e => e.import).join('\n')} 11 | 12 | declare global { 13 | interface HTMLElementTagNameMap { 14 | ${elements.map(e => ` '${e.tagName}': ${e.name}`).join(';\n')} 15 | } 16 | }`.trim(); 17 | 18 | return [{ src, path: 'types.d.ts' }];; 19 | } 20 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | import { Package } from 'custom-elements-manifest/schema'; 2 | import { isReservedEvent, isReservedProperty } from './reserved.js'; 3 | 4 | export interface CustomElement { 5 | name: string; 6 | tagName: string; 7 | path: string; 8 | import: string; 9 | importType: string; 10 | description: string; 11 | propeties: { name: string; type: string; }[]; 12 | events: { name: string; }[]; 13 | cssProperties: any[]; 14 | slots: any[] 15 | } 16 | 17 | export interface CustomElementMetadata { 18 | entrypoint: string; 19 | elements: CustomElement[]; 20 | } 21 | 22 | export function createElementMetadata(customElementsManifest: Package, entrypoint): CustomElement[] { 23 | const modules = getCustomElementModules(customElementsManifest); 24 | 25 | const elements = modules.flatMap(m => { 26 | return m.declarations.filter(d => d.customElement && d.tagName).map(d => { 27 | 28 | const path = `${entrypoint ? `${entrypoint}` : './'}${replaceTsExtentions(m.path)}`; 29 | const element: CustomElement = { 30 | name: d.name, 31 | tagName: d.tagName, 32 | description: d.description ?? '', 33 | path, 34 | import: `import { ${d.name} } from '${path}';`, 35 | importType: `import type { ${d.name} } from '${path}';`, 36 | slots: d.slots ?? [], 37 | cssProperties: d.cssProperties ?? [], 38 | events: getCustomElementEvents(d) ?? [], 39 | propeties: getPublicProperties(d) 40 | }; 41 | 42 | return element; 43 | }); 44 | }); 45 | 46 | return elements; 47 | } 48 | 49 | function replaceTsExtentions(filePath: string) { 50 | return filePath.endsWith('.ts') ? changeExt(filePath, 'js') : filePath; 51 | } 52 | 53 | function changeExt(filePath: string, ext: string) { 54 | const pos = filePath.includes('.') ? filePath.lastIndexOf('.') : filePath.length; 55 | return `${filePath.substr(0, pos)}.${ext}`; 56 | } 57 | 58 | function getPublicProperties(element: any) { 59 | return (element.members?.filter(m => 60 | !m.readonly && 61 | !m.static && 62 | m.kind === 'field' && 63 | m.attribute !== undefined && 64 | m.privacy === undefined && 65 | m.privacy !== 'private' && 66 | m.privacy !== 'protected' && 67 | m.name !== 'accessor' && 68 | !isReservedProperty(m.name) 69 | ) ?? []).map(p => ({ name: p.name, type: p.type?.text })); 70 | } 71 | 72 | function getCustomElementModules(customElementsManifest: any) { 73 | return customElementsManifest.modules.filter(m => m.declarations?.length && m.declarations.find(d => d.customElement === true)); 74 | } 75 | 76 | function getCustomElementEvents(element): any[] { 77 | const memberEvents = element.members 78 | .filter(event => event.privacy === undefined) // public 79 | .filter(prop => prop.type && prop.type?.text && prop.type?.text.includes('EventEmitter') && !isReservedEvent(prop.name)) 80 | .map(event => ({ name: event.name })); 81 | const events = element.events ?? []; 82 | return Object.values(Object.values([...memberEvents, ...events].reduce((prev, next) => ({ ...prev, [next.name]: next }), {}))); 83 | } 84 | 85 | export const generatedMessage = `Generated with https://github.com/blueprintui/custom-element-types`; 86 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2019", 4 | "module": "esnext", 5 | "moduleResolution": "node", 6 | "lib": ["es2020", "dom"], 7 | "emitDecoratorMetadata": false, 8 | "experimentalDecorators": true, 9 | "allowSyntheticDefaultImports": true, 10 | "resolveJsonModule": true, 11 | "declaration": true, 12 | "alwaysStrict": true, 13 | "noImplicitAny": false, 14 | "noImplicitReturns": true, 15 | "noImplicitThis": true, 16 | "noUnusedLocals": false, 17 | "noUnusedParameters": false, 18 | "strictFunctionTypes": true, 19 | "noFallthroughCasesInSwitch": true, 20 | "strictNullChecks": false, 21 | "sourceMap": false, 22 | "inlineSourceMap": false, 23 | "importHelpers": true, 24 | "rootDir": "./src", 25 | "baseUrl": "./", 26 | "paths": { 27 | "web-test-runner-performance": ["./dist/lib"], 28 | "web-test-runner-performance/*": ["./dist/lib/*"] 29 | } 30 | }, 31 | "include": ["src/**/*.ts", "src/**/*.d.ts"], 32 | "exclude": ["node_modules"] 33 | } 34 | -------------------------------------------------------------------------------- /tsconfig.lib.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "noEmit": false, 5 | "outDir": "./dist/lib", 6 | }, 7 | "include": ["src/**/*.ts", "src/**/*.d.ts"], 8 | "exclude": ["dist", "node_modules", "src/**/*.spec.ts", "src/**/*.performance.ts"] 9 | } 10 | --------------------------------------------------------------------------------