├── .prettierrc ├── types └── @babel │ └── helper-plugin-utils.d.ts ├── codecov.yml ├── test ├── __node__ │ ├── self-reference │ │ ├── code.js │ │ └── output.js │ └── function-param-decorator │ │ ├── code.js │ │ └── output.js ├── __modules-8__ │ └── member-expression │ │ ├── code.js │ │ └── output.js ├── __modules__ │ └── member-expression │ │ ├── code.js │ │ └── output.js ├── __fixtures__ │ ├── generics │ │ ├── code.js │ │ └── output.js │ ├── nest-injection │ │ ├── code.js │ │ └── output.js │ ├── parameter-decorator-typed │ │ ├── code.js │ │ └── output.js │ └── type-serialization │ │ ├── code.js │ │ └── output.js ├── __helpers__ │ ├── babel-8 │ │ ├── package.json │ │ └── yarn.lock │ └── utils.ts ├── plugin.spec.ts ├── module.spec.ts ├── node.spec.ts └── serializeType.spec.ts ├── .vscode ├── settings.json └── launch.json ├── jest.config.js ├── babel.config.js ├── examples └── inversify │ ├── .babelrc │ ├── tsconfig.json │ ├── package.json │ └── src │ └── index.ts ├── tsconfig.json ├── .github └── workflows │ └── test.yml ├── LICENSE ├── .gitignore ├── src ├── plugin.ts ├── metadata │ ├── metadataVisitor.ts │ └── serializeType.ts └── parameter │ └── parameterVisitor.ts ├── package.json ├── README.md └── CHANGELOG.md /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "trailingCommas": "all", 3 | "singleQuote": true 4 | } 5 | -------------------------------------------------------------------------------- /types/@babel/helper-plugin-utils.d.ts: -------------------------------------------------------------------------------- 1 | export function declare(builder: any): any; 2 | -------------------------------------------------------------------------------- /codecov.yml: -------------------------------------------------------------------------------- 1 | ignore: 2 | - "lib" 3 | - "examples" 4 | - "types" 5 | - "test" 6 | - "node_modules" -------------------------------------------------------------------------------- /test/__node__/self-reference/code.js: -------------------------------------------------------------------------------- 1 | import { inject } from 'lib'; 2 | 3 | @injectable() 4 | class Self { 5 | @inject() 6 | child: Self; 7 | } 8 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "javascript.implicitProjectConfig.checkJs": false, 3 | "javascript.validate.enable": false, 4 | "typescript.surveys.enabled": false 5 | } 6 | -------------------------------------------------------------------------------- /test/__modules-8__/member-expression/code.js: -------------------------------------------------------------------------------- 1 | import AWS from 'aws-sdk'; 2 | 3 | @Injectable() 4 | export class SomeService { 5 | constructor( 6 | @Inject('aws.s3') private s3client: AWS.S3, 7 | ) {} 8 | } 9 | -------------------------------------------------------------------------------- /test/__modules__/member-expression/code.js: -------------------------------------------------------------------------------- 1 | import AWS from 'aws-sdk'; 2 | 3 | @Injectable() 4 | export class SomeService { 5 | constructor( 6 | @Inject('aws.s3') private s3client: AWS.S3, 7 | ) {} 8 | } 9 | -------------------------------------------------------------------------------- /test/__fixtures__/generics/code.js: -------------------------------------------------------------------------------- 1 | @Decorate 2 | class MyClass { 3 | constructor( 4 | private generic: Generic, 5 | generic2: Generic 6 | ) {} 7 | 8 | @Run 9 | method( 10 | generic: Inter, 11 | @Arg() generic2: InterGen 12 | ) {} 13 | } -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | collectCoverageFrom: [ 3 | '/src/**/*.{ts,js}?(x)', 4 | '!/test/**/*.{ts,js}?(x)' 5 | ], 6 | testPathIgnorePatterns: ['/lib/', '/node_modules/'], 7 | transform: { 8 | '^.+\\.tsx?$': 'babel-jest' 9 | } 10 | }; 11 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = api => { 2 | api.cache(true); 3 | 4 | return { 5 | presets: [ 6 | [ 7 | '@babel/preset-env', 8 | { 9 | targets: { 10 | node: 'current' 11 | } 12 | } 13 | ], 14 | '@babel/preset-typescript' 15 | ], 16 | plugins: [] 17 | }; 18 | }; 19 | -------------------------------------------------------------------------------- /examples/inversify/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": [ 3 | "../../lib/plugin.js", 4 | ["@babel/plugin-proposal-decorators", { "legacy": true }], 5 | ["@babel/plugin-proposal-class-properties", { "loose": true }] 6 | ], 7 | "presets": [ 8 | ["@babel/preset-env", { "targets": { "node": "current" } }], 9 | "@babel/preset-typescript" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /test/__fixtures__/nest-injection/code.js: -------------------------------------------------------------------------------- 1 | import { AppService } from './app.service'; 2 | 3 | @Controller() 4 | export class AppController { 5 | constructor(private appService: AppService) {} 6 | 7 | @Inject() 8 | appService: AppService; 9 | 10 | @Inject() 11 | private appService2: AppService; 12 | 13 | @Get() 14 | getHello(): string { 15 | return this.appService.getHello(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /examples/inversify/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "esnext", 4 | "module": "commonjs", 5 | "strict": true, 6 | "allowSyntheticDefaultImports": true, 7 | "esModuleInterop": true, 8 | 9 | "experimentalDecorators": true, 10 | "emitDecoratorMetadata": true, 11 | 12 | "outDir": "lib", 13 | "rootDir": "src", 14 | "baseUrl": "." 15 | }, 16 | "include": ["src/index.ts"] 17 | } 18 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Usare IntelliSense per informazioni sui possibili attributi. 3 | // Al passaggio del mouse vengono visualizzate le descrizioni degli attributi esistenti. 4 | // Per ulteriori informazioni, visitare: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "node", 9 | "request": "attach", 10 | "name": "Attach", 11 | "port": 9229 12 | } 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /test/__helpers__/babel-8/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "dependencies": { 4 | "@babel/core": "^8.0.0-beta.3", 5 | "@babel/plugin-proposal-decorators": "^8.0.0-beta.3", 6 | "@babel/plugin-transform-class-properties": "^8.0.0-beta.3", 7 | "@babel/plugin-transform-modules-commonjs": "^8.0.0-beta.3", 8 | "@babel/plugin-transform-object-rest-spread": "^8.0.0-beta.3", 9 | "@babel/preset-env": "^8.0.0-beta.3", 10 | "@babel/preset-typescript": "^8.0.0-beta.3" 11 | } 12 | } -------------------------------------------------------------------------------- /test/plugin.spec.ts: -------------------------------------------------------------------------------- 1 | import path from 'path'; 2 | import { define } from './__helpers__/utils'; 3 | 4 | define('emit metadata', { 5 | presets: [['@babel/preset-typescript', { ignoreExtensions: true }]], 6 | plugins: [ 7 | require('../src/plugin'), 8 | ['@babel/plugin-proposal-decorators', { version: 'legacy' }], 9 | ['@babel/plugin-transform-class-properties', { loose: true }], 10 | '@babel/plugin-transform-object-rest-spread' 11 | ] 12 | }, path.join(__dirname, '__fixtures__')); 13 | -------------------------------------------------------------------------------- /test/__node__/function-param-decorator/code.js: -------------------------------------------------------------------------------- 1 | import Based from 'based'; 2 | import DecoFn from 'decorator'; 3 | import { Some } from 'some'; 4 | import { Args, Context } from '@nestjs/graphql'; 5 | import { Xyz } from 'xyz'; 6 | 7 | @Based 8 | class Named { 9 | constructor( 10 | @DecoFn(Some) private param: Some, 11 | @DecoFn private param2: Some, 12 | ) {} 13 | 14 | @Based() 15 | methodName( 16 | @Args() args: Args, 17 | @Context() context: Context, 18 | @DecoFn(Xyz) xyz: any 19 | ) {} 20 | } -------------------------------------------------------------------------------- /test/module.spec.ts: -------------------------------------------------------------------------------- 1 | import path from 'path'; 2 | import { define } from './__helpers__/utils'; 3 | 4 | define('emit metadata', { 5 | presets: [['@babel/preset-typescript', { ignoreExtensions: true }]], 6 | plugins: [ 7 | require('../src/plugin'), 8 | ['@babel/plugin-proposal-decorators', { version: 'legacy' }], 9 | ['@babel/plugin-transform-class-properties', { loose: true }], 10 | '@babel/plugin-transform-modules-commonjs' 11 | ] 12 | }, path.join(__dirname, '__modules__'), path.join(__dirname, '__modules-8__')); 13 | -------------------------------------------------------------------------------- /test/node.spec.ts: -------------------------------------------------------------------------------- 1 | import path from 'path'; 2 | import { define } from './__helpers__/utils'; 3 | 4 | define('emit metadata with node env', { 5 | presets: [ 6 | ['@babel/preset-env', { useBuiltIns: false, targets: { node: true } }], 7 | ['@babel/preset-typescript', { ignoreExtensions: true }] 8 | ], 9 | plugins: [ 10 | require('../src/plugin'), 11 | ['@babel/plugin-proposal-decorators', { version: 'legacy' }], 12 | ['@babel/plugin-transform-class-properties', { loose: true }] 13 | ] 14 | }, path.join(__dirname, '__node__')); 15 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "declaration": true, 4 | "declarationMap": true, 5 | "sourceMap": true, 6 | 7 | "target": "esnext", 8 | "module": "commonjs", 9 | "jsx": "react", 10 | "strict": true, 11 | "allowSyntheticDefaultImports": true, 12 | "esModuleInterop": true, 13 | "resolveJsonModule": true, 14 | 15 | "experimentalDecorators": true, 16 | "emitDecoratorMetadata": true, 17 | 18 | "skipLibCheck": true, 19 | 20 | "outDir": "lib", 21 | "rootDir": "src", 22 | "baseUrl": ".", 23 | 24 | "paths": { 25 | "*": ["types/*"] 26 | } 27 | }, 28 | "include": ["src/**/*", "src/**/*.json"] 29 | } 30 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: [master] 6 | pull_request: 7 | branches: [master] 8 | 9 | jobs: 10 | build: 11 | name: Check TypeScript and Test (Node.js ${{ matrix.node-version }}) 12 | runs-on: ubuntu-latest 13 | strategy: 14 | matrix: 15 | node-version: [16, 22] 16 | steps: 17 | - uses: actions/checkout@v2 18 | - uses: actions/setup-node@v6 19 | with: 20 | node-version: ${{ matrix.node-version }} 21 | cache: 'yarn' 22 | - run: yarn install 23 | - run: yarn build 24 | - run: yarn check-types 25 | - run: yarn pretest 26 | if: matrix.node-version >= 22 27 | - run: yarn test:ci 28 | - uses: codecov/codecov-action@v2 29 | -------------------------------------------------------------------------------- /examples/inversify/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "inversify", 3 | "version": "0.0.1", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "private": true, 7 | "scripts": { 8 | "build": "babel src -d lib -x '.ts,.tsx'", 9 | "dev": "babel src -w -d lib -x '.ts,.tsx'", 10 | "start": "node lib/index.js" 11 | }, 12 | "devDependencies": { 13 | "@babel/cli": "^7.6.4", 14 | "@babel/core": "^7.6.4", 15 | "@babel/plugin-proposal-class-properties": "^7.5.5", 16 | "@babel/plugin-proposal-decorators": "^7.6.0", 17 | "@babel/preset-env": "^7.6.3", 18 | "@babel/preset-typescript": "^7.6.0", 19 | "typescript": "^3.6.4" 20 | }, 21 | "dependencies": { 22 | "inversify": "^5.0.1", 23 | "inversify-inject-decorators": "^3.1.0", 24 | "reflect-metadata": "^0.1.13" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /test/__fixtures__/parameter-decorator-typed/code.js: -------------------------------------------------------------------------------- 1 | class Injected {} 2 | 3 | class MyClass { 4 | constructor(@inject() parameter: Injected) {} 5 | } 6 | 7 | class MyOtherClass { 8 | constructor( 9 | @inject() private readonly parameter: Injected, 10 | @inject('KIND') otherParam: Injected 11 | ) {} 12 | 13 | methodUndecorated(@demo() param: string, otherParam) {} 14 | 15 | @decorate('named') 16 | method(@inject() param: Injected, @arg() schema: Schema) {} 17 | 18 | methodWithObjectSpread(@argObjectSpread() { name }: SchemaObjectSpread) {} 19 | } 20 | 21 | @Decorate 22 | class DecoratedClass { 23 | constructor( 24 | @inject() private readonly module: Injected, 25 | @inject() otherModule: Injected 26 | ) {} 27 | 28 | @decorate('example') 29 | method(@inject() param: string) {} 30 | } -------------------------------------------------------------------------------- /test/__modules-8__/member-expression/output.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.SomeService = void 0; 7 | var _awsSdk = _interopRequireDefault(require("aws-sdk")); 8 | var _dec, _dec2, _dec3, _dec4, _class; 9 | function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } 10 | let SomeService = exports.SomeService = (_dec = Injectable(), _dec2 = function (target, key) { 11 | return Inject('aws.s3')(target, undefined, 0); 12 | }, _dec3 = Reflect.metadata("design:type", Function), _dec4 = Reflect.metadata("design:paramtypes", [typeof _awsSdk.default.S3 === "undefined" ? Object : _awsSdk.default.S3]), _dec(_class = _dec2(_class = _dec3(_class = _dec4(_class = class SomeService { 13 | constructor(s3client) { 14 | this.s3client = s3client; 15 | } 16 | }) || _class) || _class) || _class) || _class); 17 | -------------------------------------------------------------------------------- /test/__modules__/member-expression/output.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | Object.defineProperty(exports, "__esModule", { 4 | value: true 5 | }); 6 | exports.SomeService = void 0; 7 | var _awsSdk = _interopRequireDefault(require("aws-sdk")); 8 | var _dec, _dec2, _dec3, _dec4, _class; 9 | function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } 10 | let SomeService = (_dec = Injectable(), _dec2 = function (target, key) { 11 | return Inject('aws.s3')(target, undefined, 0); 12 | }, _dec3 = Reflect.metadata("design:type", Function), _dec4 = Reflect.metadata("design:paramtypes", [typeof _awsSdk.default.S3 === "undefined" ? Object : _awsSdk.default.S3]), _dec(_class = _dec2(_class = _dec3(_class = _dec4(_class = class SomeService { 13 | constructor(s3client) { 14 | this.s3client = s3client; 15 | } 16 | }) || _class) || _class) || _class) || _class); 17 | exports.SomeService = SomeService; 18 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Leonardo Ascione 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 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Emit 9 | lib 10 | examples/**/lib 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | 24 | # nyc test coverage 25 | .nyc_output 26 | 27 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 28 | .grunt 29 | 30 | # Bower dependency directory (https://bower.io/) 31 | bower_components 32 | 33 | # node-waf configuration 34 | .lock-wscript 35 | 36 | # Compiled binary addons (https://nodejs.org/api/addons.html) 37 | build/Release 38 | 39 | # Dependency directories 40 | node_modules/ 41 | jspm_packages/ 42 | 43 | # TypeScript v1 declaration files 44 | typings/ 45 | 46 | # Optional npm cache directory 47 | .npm 48 | 49 | # Optional eslint cache 50 | .eslintcache 51 | 52 | # Optional REPL history 53 | .node_repl_history 54 | 55 | # Output of 'npm pack' 56 | *.tgz 57 | 58 | # Yarn Integrity file 59 | .yarn-integrity 60 | 61 | # dotenv environment variables file 62 | .env 63 | 64 | # next.js build output 65 | .next 66 | -------------------------------------------------------------------------------- /examples/inversify/src/index.ts: -------------------------------------------------------------------------------- 1 | import 'reflect-metadata'; 2 | 3 | import getDecorators from 'inversify-inject-decorators'; 4 | import { Container, injectable } from 'inversify'; 5 | 6 | @injectable() 7 | class PrintService { 8 | print(book: Book) { 9 | console.log(`Book "${book.summary}" by ${book.author}.`); 10 | } 11 | } 12 | 13 | let container = new Container(); 14 | container.bind('PrintService').to(PrintService); 15 | let { lazyInject } = getDecorators(container); 16 | 17 | /** 18 | * Additional function to make properties decorators compatible with babel. 19 | */ 20 | function fixPropertyDecorator(decorator: T): T { 21 | return ((...args: any[]) => ( 22 | target: any, 23 | propertyName: any, 24 | ...decoratorArgs: any[] 25 | ) => { 26 | decorator(...args)(target, propertyName, ...decoratorArgs); 27 | return Object.getOwnPropertyDescriptor(target, propertyName); 28 | }) as any; 29 | } 30 | 31 | const lazyInjectFix = fixPropertyDecorator(lazyInject); 32 | 33 | class Book { 34 | @lazyInjectFix('PrintService') 35 | private printService!: PrintService; 36 | 37 | public constructor(public author: string, public summary: string) {} 38 | 39 | public print() { 40 | this.printService.print(this); 41 | } 42 | } 43 | 44 | // Book instance is NOT created by InversifyJS 45 | let book = new Book('George Orwell', '1984'); 46 | book.print(); 47 | -------------------------------------------------------------------------------- /test/__fixtures__/type-serialization/code.js: -------------------------------------------------------------------------------- 1 | import { Decorate } from './Decorate'; 2 | 3 | const sym = Symbol(); 4 | 5 | @Decorate() 6 | class Sample { 7 | constructor( 8 | private p0: String, 9 | p1: Number, 10 | p2: 10, 11 | p3: 'ABC', 12 | p4: boolean, 13 | p5: string, 14 | p6: number, 15 | p7: Object, 16 | p8: () => any, 17 | p9: 'abc' | 'def', 18 | p10: String | Number, 19 | p11: Function, 20 | p12: null, 21 | p13: undefined, 22 | p14: any, 23 | p15: (abc: any) => void, 24 | p16: false, 25 | p17: true, 26 | p18: string = 'abc' 27 | ) {} 28 | 29 | @Decorate 30 | method( 31 | @Arg() p0: Symbol, 32 | p1: typeof sym, 33 | p2: string | null, 34 | p3: never, 35 | p4: string | never, 36 | p5: (string | null), 37 | p6: Maybe, 38 | p7: Object | string, 39 | p8: string & MyStringType, 40 | p9: string[], 41 | p10: [string, number], 42 | p11: void, 43 | p12: this is number, 44 | p13: null | undefined, 45 | p14: (string | (string | null)), 46 | p15: Object, 47 | p16: any, 48 | p17: bigint, 49 | ) {} 50 | 51 | /** 52 | * Member Expression 53 | */ 54 | @Decorate() 55 | method2( 56 | p0: Decorate.Name = 'abc', 57 | p1: Decorate.Name 58 | ) {} 59 | 60 | /** 61 | * Assignments 62 | */ 63 | @Decorate() 64 | assignments( 65 | p0: string = 'abc' 66 | ) {} 67 | } -------------------------------------------------------------------------------- /test/__fixtures__/generics/output.js: -------------------------------------------------------------------------------- 1 | var _dec, _dec2, _dec3, _dec4, _dec5, _class, _class2; 2 | function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, ("value" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; } 3 | let MyClass = (_dec = Reflect.metadata("design:type", Function), _dec2 = Reflect.metadata("design:paramtypes", [typeof Generic === "undefined" ? Object : Generic, typeof Generic === "undefined" ? Object : Generic]), _dec3 = function (target, key) { 4 | return Arg()(target, key, 1); 5 | }, _dec4 = Reflect.metadata("design:type", Function), _dec5 = Reflect.metadata("design:paramtypes", [typeof Inter === "undefined" ? Object : Inter, typeof InterGen === "undefined" ? Object : InterGen]), Decorate(_class = _dec(_class = _dec2(_class = (_class2 = class MyClass { 6 | constructor(generic, generic2) { 7 | this.generic = generic; 8 | } 9 | method(generic, generic2) {} 10 | }, _applyDecoratedDescriptor(_class2.prototype, "method", [Run, _dec3, _dec4, _dec5], Object.getOwnPropertyDescriptor(_class2.prototype, "method"), _class2.prototype), _class2)) || _class) || _class) || _class); 11 | -------------------------------------------------------------------------------- /test/__node__/self-reference/output.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | var _lib = require("lib"); 4 | var _dec, _dec2, _dec3, _class, _class2, _descriptor; 5 | function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); } 6 | function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, ("value" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; } 7 | function _initializerWarningHelper(r, e) { throw Error("Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform."); } 8 | let Self = (_dec = injectable(), _dec2 = (0, _lib.inject)(), _dec3 = Reflect.metadata("design:type", Object), _dec(_class = (_class2 = class Self { 9 | constructor() { 10 | _initializerDefineProperty(this, "child", _descriptor, this); 11 | } 12 | }, _descriptor = _applyDecoratedDescriptor(_class2.prototype, "child", [_dec2, _dec3], { 13 | configurable: true, 14 | enumerable: true, 15 | writable: true, 16 | initializer: null 17 | }), _class2)) || _class); 18 | -------------------------------------------------------------------------------- /test/serializeType.spec.ts: -------------------------------------------------------------------------------- 1 | import { isClassType, serializeType } from '../src/metadata/serializeType'; 2 | import { types as t } from '@babel/core'; 3 | import template from '@babel/template'; 4 | 5 | const VoidZero = t.unaryExpression('void', t.numericLiteral(0)); 6 | 7 | describe('serializeType', () => { 8 | test('should return void for empty node', () => { 9 | expect(serializeType(null as any, null)).toEqual(VoidZero); 10 | }); 11 | 12 | test('should return void zero for untyped nodes', () => { 13 | const node: t.FunctionExpression = template.expression 14 | .ast`function (param) {}` as any; 15 | expect(serializeType(null as any, node.params[0])).toEqual(VoidZero); 16 | }); 17 | 18 | test('should return void zero for unexepected nodes', () => { 19 | const node = template.expression.ast`function (param) {}`; 20 | expect(serializeType(null as any, node as any)).toEqual(VoidZero); 21 | }); 22 | 23 | describe('isClassType', () => { 24 | test('should recognize simple identifier', () => { 25 | expect(isClassType('ClassName', t.identifier('ClassName'))).toBe(true); 26 | expect(isClassType('ClassName', t.identifier('ClassN'))).toBe(false); 27 | }); 28 | 29 | test('should recognize member expressions', () => { 30 | expect( 31 | isClassType('ClassName', template.expression.ast`ClassName.My.Type`) 32 | ).toBe(true); 33 | expect( 34 | isClassType('ClassName', (template('ClassN.My')() as any).expression) 35 | ).toBe(false); 36 | }); 37 | 38 | test('should throw for wrong expressions', () => { 39 | expect(() => isClassType('ClassName', t.stringLiteral('abc'))).toThrow(); 40 | }); 41 | }); 42 | }); 43 | -------------------------------------------------------------------------------- /src/plugin.ts: -------------------------------------------------------------------------------- 1 | import { PluginObj } from '@babel/core'; 2 | import { declare } from '@babel/helper-plugin-utils'; 3 | import { parameterVisitor } from './parameter/parameterVisitor'; 4 | import { metadataVisitor } from './metadata/metadataVisitor'; 5 | 6 | export default declare( 7 | (api: any): PluginObj => { 8 | api.assertVersion("^7.0.0 || ^8.0.0-0"); 9 | 10 | return { 11 | visitor: { 12 | Program(programPath) { 13 | /** 14 | * We need to traverse the program right here since 15 | * `@babel/preset-typescript` removes imports at this level. 16 | * 17 | * Since we need to convert some typings into **bindings**, used in 18 | * `Reflect.metadata` calls, we need to process them **before** 19 | * the typescript preset. 20 | */ 21 | programPath.traverse({ 22 | ClassDeclaration(path) { 23 | for (const field of path.get('body').get('body')) { 24 | if ( 25 | field.type !== 'ClassMethod' && 26 | field.type !== 'ClassProperty' 27 | ) 28 | continue; 29 | 30 | parameterVisitor(path, field as any); 31 | metadataVisitor(path, field as any); 32 | } 33 | 34 | /** 35 | * We need to keep binding in order to let babel know where imports 36 | * are used as a Value (and not just as a type), so that 37 | * `babel-transform-typescript` do not strip the import. 38 | */ 39 | (path.parentPath.scope as any).crawl(); 40 | } 41 | }); 42 | } 43 | } 44 | }; 45 | } 46 | ); 47 | -------------------------------------------------------------------------------- /test/__helpers__/utils.ts: -------------------------------------------------------------------------------- 1 | import { create } from 'babel-test'; 2 | 3 | import { toMatchFile } from 'jest-file-snapshot'; 4 | expect.extend({ toMatchFile }); 5 | 6 | // We need to use the Node.js implementation of `require` to load Babel 8 7 | // packages, instead of Jest's sandboxed implementation, because Babel 8 is 8 | // written in ESM and Jest doesn't support it properly yet. 9 | import Module from 'module'; 10 | import {pathToFileURL} from 'url'; 11 | const createOriginalNodeRequire = Object.getPrototypeOf(Module).createRequire; 12 | const requireForBabel8 = createOriginalNodeRequire( 13 | pathToFileURL(require.resolve('./babel-8/package.json')), 14 | ); 15 | 16 | 17 | export function define( 18 | description: string, 19 | config: any, 20 | pathForBabel7: string, 21 | pathForBabel8: string = pathForBabel7 22 | ) { 23 | const babel7 = create((code, options) => 24 | require('@babel/core').transformAsync( 25 | code, 26 | { 27 | caller: { name: 'babel-test' }, 28 | babelrc: false, 29 | configFile: false, 30 | ...config, 31 | ...options 32 | }, 33 | )); 34 | 35 | function replaceWithBabel8Version(plugin: any) { 36 | if (Array.isArray(plugin) && typeof plugin[0] === 'string') { 37 | return [ 38 | requireForBabel8(plugin[0]), 39 | ...plugin.slice(1), 40 | ]; 41 | } else if (typeof plugin === 'string') { 42 | return requireForBabel8(plugin); 43 | } 44 | return plugin; 45 | } 46 | 47 | const babel8 = create((code, options): any => 48 | requireForBabel8('@babel/core').transformAsync( 49 | code, 50 | { 51 | caller: { name: 'babel-test' }, 52 | babelrc: false, 53 | configFile: false, 54 | ...config, 55 | plugins: config.plugins?.map(replaceWithBabel8Version), 56 | presets: config.presets?.map(replaceWithBabel8Version), 57 | ...options 58 | }, 59 | )); 60 | 61 | describe('babel 7', () => { 62 | babel7.fixtures(description, pathForBabel7); 63 | }); 64 | 65 | const isNodeGte22 = parseInt(process.versions.node) >= 22; 66 | 67 | (isNodeGte22 ? describe : describe.skip)('babel 8', () => { 68 | babel8.fixtures(description, pathForBabel8); 69 | }); 70 | }; 71 | -------------------------------------------------------------------------------- /src/metadata/metadataVisitor.ts: -------------------------------------------------------------------------------- 1 | import { types as t, NodePath } from '@babel/core'; 2 | import { serializeType } from './serializeType'; 3 | 4 | function createMetadataDesignDecorator( 5 | design: 'design:type' | 'design:paramtypes' | 'design:returntype' | 'design:typeinfo', 6 | typeArg: t.Expression | t.SpreadElement | t.JSXNamespacedName | t.ArgumentPlaceholder 7 | ): t.Decorator { 8 | return t.decorator( 9 | t.callExpression( 10 | t.memberExpression( 11 | t.identifier('Reflect'), 12 | t.identifier('metadata') 13 | ), 14 | [ 15 | t.stringLiteral(design), 16 | typeArg 17 | ] 18 | ) 19 | ) 20 | } 21 | 22 | export function metadataVisitor( 23 | classPath: NodePath, 24 | path: NodePath 25 | ) { 26 | const field = path.node; 27 | const classNode = classPath.node; 28 | 29 | switch (field.type) { 30 | case 'ClassMethod': 31 | const decorators = 32 | field.kind === 'constructor' ? classNode.decorators : field.decorators; 33 | 34 | if (!decorators || decorators.length === 0) return; 35 | 36 | decorators!.push( 37 | createMetadataDesignDecorator( 38 | 'design:type', 39 | t.identifier('Function') 40 | ) 41 | ); 42 | decorators!.push( 43 | createMetadataDesignDecorator( 44 | 'design:paramtypes', 45 | t.arrayExpression( 46 | field.params.map(param => serializeType(classPath, param)) 47 | ) 48 | ) 49 | ); 50 | // Hint: `design:returntype` could also be implemented here, although this seems 51 | // quite complicated to achieve without the TypeScript compiler. 52 | // See https://github.com/microsoft/TypeScript/blob/f807b57356a8c7e476fedc11ad98c9b02a9a0e81/src/compiler/transformers/ts.ts#L1315 53 | break; 54 | 55 | case 'ClassProperty': 56 | if (!field.decorators || field.decorators.length === 0) return; 57 | 58 | if ( 59 | !field.typeAnnotation || 60 | field.typeAnnotation.type !== 'TSTypeAnnotation' 61 | ) 62 | return; 63 | 64 | field.decorators!.push( 65 | createMetadataDesignDecorator( 66 | 'design:type', 67 | serializeType(classPath, field) 68 | ) 69 | ); 70 | break; 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /test/__node__/function-param-decorator/output.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | var _based = _interopRequireDefault(require("based")); 4 | var _decorator = _interopRequireDefault(require("decorator")); 5 | var _some = require("some"); 6 | var _graphql = require("@nestjs/graphql"); 7 | var _xyz = require("xyz"); 8 | var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec0, _class, _class2; 9 | function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } 10 | function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, ("value" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; } 11 | let Named = (_dec = function (target, key) { 12 | return (0, _decorator.default)(_some.Some)(target, undefined, 0); 13 | }, _dec2 = function (target, key) { 14 | return (0, _decorator.default)(target, undefined, 1); 15 | }, _dec3 = Reflect.metadata("design:type", Function), _dec4 = Reflect.metadata("design:paramtypes", [typeof _some.Some === "undefined" ? Object : _some.Some, typeof _some.Some === "undefined" ? Object : _some.Some]), _dec5 = (0, _based.default)(), _dec6 = function (target, key) { 16 | return (0, _graphql.Args)()(target, key, 0); 17 | }, _dec7 = function (target, key) { 18 | return (0, _graphql.Context)()(target, key, 1); 19 | }, _dec8 = function (target, key) { 20 | return (0, _decorator.default)(_xyz.Xyz)(target, key, 2); 21 | }, _dec9 = Reflect.metadata("design:type", Function), _dec0 = Reflect.metadata("design:paramtypes", [typeof _graphql.Args === "undefined" ? Object : _graphql.Args, typeof _graphql.Context === "undefined" ? Object : _graphql.Context, Object]), (0, _based.default)(_class = _dec(_class = _dec2(_class = _dec3(_class = _dec4(_class = (_class2 = class Named { 22 | constructor(param, param2) { 23 | this.param = param; 24 | this.param2 = param2; 25 | } 26 | methodName(args, context, xyz) {} 27 | }, _applyDecoratedDescriptor(_class2.prototype, "methodName", [_dec5, _dec6, _dec7, _dec8, _dec9, _dec0], Object.getOwnPropertyDescriptor(_class2.prototype, "methodName"), _class2.prototype), _class2)) || _class) || _class) || _class) || _class) || _class); 28 | -------------------------------------------------------------------------------- /test/__fixtures__/nest-injection/output.js: -------------------------------------------------------------------------------- 1 | var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec0, _class, _class2, _descriptor, _descriptor2; 2 | function _initializerDefineProperty(e, i, r, l) { r && Object.defineProperty(e, i, { enumerable: r.enumerable, configurable: r.configurable, writable: r.writable, value: r.initializer ? r.initializer.call(l) : void 0 }); } 3 | function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, ("value" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; } 4 | function _initializerWarningHelper(r, e) { throw Error("Decorating class property failed. Please ensure that transform-class-properties is enabled and runs after the decorators transform."); } 5 | import { AppService } from './app.service'; 6 | export let AppController = (_dec = Controller(), _dec2 = Reflect.metadata("design:type", Function), _dec3 = Reflect.metadata("design:paramtypes", [typeof AppService === "undefined" ? Object : AppService]), _dec4 = Inject(), _dec5 = Reflect.metadata("design:type", typeof AppService === "undefined" ? Object : AppService), _dec6 = Inject(), _dec7 = Reflect.metadata("design:type", typeof AppService === "undefined" ? Object : AppService), _dec8 = Get(), _dec9 = Reflect.metadata("design:type", Function), _dec0 = Reflect.metadata("design:paramtypes", []), _dec(_class = _dec2(_class = _dec3(_class = (_class2 = class AppController { 7 | constructor(appService) { 8 | this.appService = appService; 9 | _initializerDefineProperty(this, "appService", _descriptor, this); 10 | _initializerDefineProperty(this, "appService2", _descriptor2, this); 11 | } 12 | getHello() { 13 | return this.appService.getHello(); 14 | } 15 | }, _descriptor = _applyDecoratedDescriptor(_class2.prototype, "appService", [_dec4, _dec5], { 16 | configurable: true, 17 | enumerable: true, 18 | writable: true, 19 | initializer: null 20 | }), _descriptor2 = _applyDecoratedDescriptor(_class2.prototype, "appService2", [_dec6, _dec7], { 21 | configurable: true, 22 | enumerable: true, 23 | writable: true, 24 | initializer: null 25 | }), _applyDecoratedDescriptor(_class2.prototype, "getHello", [_dec8, _dec9, _dec0], Object.getOwnPropertyDescriptor(_class2.prototype, "getHello"), _class2.prototype), _class2)) || _class) || _class) || _class); 26 | -------------------------------------------------------------------------------- /test/__fixtures__/type-serialization/output.js: -------------------------------------------------------------------------------- 1 | var _dec, _dec2, _dec3, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec0, _dec1, _dec10, _class, _class2; 2 | function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, ("value" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; } 3 | import { Decorate } from './Decorate'; 4 | const sym = Symbol(); 5 | let Sample = (_dec = Decorate(), _dec2 = Reflect.metadata("design:type", Function), _dec3 = Reflect.metadata("design:paramtypes", [typeof String === "undefined" ? Object : String, typeof Number === "undefined" ? Object : Number, Number, String, Boolean, String, Number, typeof Object === "undefined" ? Object : Object, Function, String, Object, typeof Function === "undefined" ? Object : Function, void 0, void 0, Object, Function, Boolean, Boolean, String]), _dec4 = function (target, key) { 6 | return Arg()(target, key, 0); 7 | }, _dec5 = Reflect.metadata("design:type", Function), _dec6 = Reflect.metadata("design:paramtypes", [typeof Symbol === "undefined" ? Object : Symbol, Object, String, void 0, String, String, typeof Maybe === "undefined" ? Object : Maybe, Object, Object, Array, Array, void 0, Boolean, void 0, String, typeof Object === "undefined" ? Object : Object, Object, Number]), _dec7 = Decorate(), _dec8 = Reflect.metadata("design:type", Function), _dec9 = Reflect.metadata("design:paramtypes", [typeof Decorate.Name === "undefined" ? Object : Decorate.Name, typeof Decorate.Name === "undefined" ? Object : Decorate.Name]), _dec0 = Decorate(), _dec1 = Reflect.metadata("design:type", Function), _dec10 = Reflect.metadata("design:paramtypes", [String]), _dec(_class = _dec2(_class = _dec3(_class = (_class2 = class Sample { 8 | constructor(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18 = 'abc') { 9 | this.p0 = p0; 10 | } 11 | method(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17) {} 12 | 13 | /** 14 | * Member Expression 15 | */ 16 | method2(p0 = 'abc', p1) {} 17 | 18 | /** 19 | * Assignments 20 | */ 21 | assignments(p0 = 'abc') {} 22 | }, _applyDecoratedDescriptor(_class2.prototype, "method", [Decorate, _dec4, _dec5, _dec6], Object.getOwnPropertyDescriptor(_class2.prototype, "method"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "method2", [_dec7, _dec8, _dec9], Object.getOwnPropertyDescriptor(_class2.prototype, "method2"), _class2.prototype), _applyDecoratedDescriptor(_class2.prototype, "assignments", [_dec0, _dec1, _dec10], Object.getOwnPropertyDescriptor(_class2.prototype, "assignments"), _class2.prototype), _class2)) || _class) || _class) || _class); 23 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "babel-plugin-transform-typescript-metadata", 3 | "version": "0.4.0", 4 | "description": "Babel plugin to emit decorator metadata like typescript compiler", 5 | "main": "lib/plugin.js", 6 | "types": "lib/plugin.d.ts", 7 | "repository": "https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata.git", 8 | "author": "Leonardo Ascione ", 9 | "license": "MIT", 10 | "files": [ 11 | "lib/" 12 | ], 13 | "keywords": [ 14 | "babel", 15 | "babel-plugin", 16 | "babel-typescript", 17 | "decorators", 18 | "reflect-metadata" 19 | ], 20 | "scripts": { 21 | "dev": "babel src -w -d lib -x \".ts\"", 22 | "build": "yarn build:lib && yarn build:types", 23 | "prebuild:lib": "rimraf lib", 24 | "build:lib": "babel src -d lib -x \".ts\"", 25 | "build:types": "tsc --emitDeclarationOnly", 26 | "check-types": "tsc --noEmit", 27 | "release": "yarn test && yarn build && release-it", 28 | "pretest": "cd test/__helpers__/babel-8 && yarn", 29 | "test": "jest --forceExit", 30 | "test:dev": "jest --watch", 31 | "test:ci": "jest --ci --runInBand --coverage --forceExit" 32 | }, 33 | "husky": { 34 | "hooks": { 35 | "commit-msg": "emoji-commit-lint" 36 | } 37 | }, 38 | "release-it": { 39 | "git": { 40 | "tagName": "v${version}", 41 | "commitMessage": "🔖 v${version}" 42 | }, 43 | "github": { 44 | "release": true 45 | }, 46 | "plugins": { 47 | "@release-it/conventional-changelog": { 48 | "preset": "@favoloso/emoji", 49 | "infile": "CHANGELOG.md" 50 | } 51 | } 52 | }, 53 | "publishConfig": { 54 | "registry": "https://registry.npmjs.org/" 55 | }, 56 | "devDependencies": { 57 | "@babel/cli": "^7.6.4", 58 | "@babel/core": "^7.6.4", 59 | "@babel/plugin-proposal-decorators": "^7.6.0", 60 | "@babel/plugin-transform-class-properties": "^7.27.1", 61 | "@babel/plugin-transform-modules-commonjs": "^7.10.4", 62 | "@babel/plugin-transform-object-rest-spread": "^7.28.4", 63 | "@babel/preset-env": "^7.6.3", 64 | "@babel/preset-typescript": "^7.28.5", 65 | "@babel/template": "^7.6.0", 66 | "@babel/traverse": "^7.6.4", 67 | "@babel/types": "^7.6.3", 68 | "@favoloso/conventional-changelog-emoji": "^0.10.0", 69 | "@release-it/conventional-changelog": "^1.1.0", 70 | "@types/jest": "^27.4.1", 71 | "babel-test": "^0.2.3", 72 | "conventional-changelog-cli": "^2.0.25", 73 | "husky": "^4.2.3", 74 | "jest": "^27.5.1", 75 | "jest-file-snapshot": "^0.5.0", 76 | "release-it": "13.7.1", 77 | "rimraf": "^3.0.2", 78 | "typescript": "^3.6.4" 79 | }, 80 | "dependencies": { 81 | "@babel/helper-plugin-utils": "^7.0.0" 82 | }, 83 | "peerDependencies": { 84 | "@babel/core": "^7.0.0 || ^8.0.0-0" 85 | }, 86 | "peerDependenciesMeta": { 87 | "@babel/core": { 88 | "optional": false 89 | } 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /src/parameter/parameterVisitor.ts: -------------------------------------------------------------------------------- 1 | import { types as t, NodePath } from '@babel/core'; 2 | 3 | /** 4 | * Helper function to create a field/class decorator from a parameter decorator. 5 | * Field/class decorators get three arguments: the class, the name of the method 6 | * (or 'undefined' in the case of the constructor) and the position index of the 7 | * parameter in the argument list. 8 | * Some of this information, the index, is only available at transform time, and 9 | * has to be stored. The other arguments are part of the decorator signature and 10 | * will be passed to the decorator anyway. But the decorator has to be called 11 | * with all three arguments at runtime, so this creates a function wrapper, which 12 | * takes the target and the key, and adds the index to it. 13 | * 14 | * Inject() becomes function(target, key) { return Inject()(target, key, 0) } 15 | * 16 | * @param paramIndex the index of the parameter inside the function call 17 | * @param decoratorExpression the decorator expression, the return object of SomeParameterDecorator() 18 | * @param isConstructor indicates if the key should be set to 'undefined' 19 | */ 20 | function createParamDecorator( 21 | paramIndex: number, 22 | decoratorExpression: t.Expression, 23 | isConstructor: boolean = false 24 | ) { 25 | return t.decorator( 26 | t.functionExpression( 27 | null, // anonymous function 28 | [t.identifier('target'), t.identifier('key')], 29 | t.blockStatement([ 30 | t.returnStatement( 31 | t.callExpression(decoratorExpression, [ 32 | t.identifier('target'), 33 | t.identifier(isConstructor ? 'undefined' : 'key'), 34 | t.numericLiteral(paramIndex) 35 | ]) 36 | ) 37 | ]) 38 | ) 39 | ); 40 | } 41 | 42 | export function parameterVisitor( 43 | classPath: NodePath, 44 | path: NodePath | NodePath 45 | ) { 46 | if (path.type !== 'ClassMethod') return; 47 | if (path.node.type !== 'ClassMethod') return; 48 | if (path.node.key.type !== 'Identifier') return; 49 | 50 | const methodPath = path as NodePath; 51 | const params = methodPath.get('params') || []; 52 | 53 | params.slice().forEach(function(param) { 54 | let identifier = 55 | param.node.type === 'Identifier' || param.node.type === 'ObjectPattern' 56 | ? param.node 57 | : param.node.type === 'TSParameterProperty' && 58 | param.node.parameter.type === 'Identifier' 59 | ? param.node.parameter 60 | : null; 61 | 62 | if (identifier == null) return; 63 | 64 | let resultantDecorator: t.Decorator | undefined; 65 | 66 | ((param.node as t.Identifier).decorators || []) 67 | .slice() 68 | .forEach(function(decorator) { 69 | if (methodPath.node.kind === 'constructor') { 70 | resultantDecorator = createParamDecorator( 71 | param.key as number, 72 | decorator.expression, 73 | true 74 | ); 75 | if (!classPath.node.decorators) { 76 | classPath.node.decorators = []; 77 | } 78 | classPath.node.decorators.push(resultantDecorator); 79 | } else { 80 | resultantDecorator = createParamDecorator( 81 | param.key as number, 82 | decorator.expression, 83 | false 84 | ); 85 | if (!methodPath.node.decorators) { 86 | methodPath.node.decorators = []; 87 | } 88 | methodPath.node.decorators.push(resultantDecorator); 89 | } 90 | }); 91 | 92 | if (resultantDecorator) { 93 | (param.node as t.Identifier).decorators = null; 94 | } 95 | }); 96 | } 97 | -------------------------------------------------------------------------------- /test/__fixtures__/parameter-decorator-typed/output.js: -------------------------------------------------------------------------------- 1 | var _dec, _dec2, _dec3, _class, _dec4, _dec5, _dec6, _dec7, _dec8, _dec9, _dec0, _dec1, _dec10, _dec11, _dec12, _dec13, _dec14, _dec15, _dec16, _class2, _class3, _dec17, _dec18, _dec19, _dec20, _dec21, _dec22, _dec23, _dec24, _class4, _class5; 2 | function _applyDecoratedDescriptor(i, e, r, n, l) { var a = {}; return Object.keys(n).forEach(function (i) { a[i] = n[i]; }), a.enumerable = !!a.enumerable, a.configurable = !!a.configurable, ("value" in a || a.initializer) && (a.writable = !0), a = r.slice().reverse().reduce(function (r, n) { return n(i, e, r) || r; }, a), l && void 0 !== a.initializer && (a.value = a.initializer ? a.initializer.call(l) : void 0, a.initializer = void 0), void 0 === a.initializer ? (Object.defineProperty(i, e, a), null) : a; } 3 | class Injected {} 4 | let MyClass = (_dec = function (target, key) { 5 | return inject()(target, undefined, 0); 6 | }, _dec2 = Reflect.metadata("design:type", Function), _dec3 = Reflect.metadata("design:paramtypes", [typeof Injected === "undefined" ? Object : Injected]), _dec(_class = _dec2(_class = _dec3(_class = class MyClass { 7 | constructor(parameter) {} 8 | }) || _class) || _class) || _class); 9 | let MyOtherClass = (_dec4 = function (target, key) { 10 | return inject()(target, undefined, 0); 11 | }, _dec5 = function (target, key) { 12 | return inject('KIND')(target, undefined, 1); 13 | }, _dec6 = Reflect.metadata("design:type", Function), _dec7 = Reflect.metadata("design:paramtypes", [typeof Injected === "undefined" ? Object : Injected, typeof Injected === "undefined" ? Object : Injected]), _dec8 = function (target, key) { 14 | return demo()(target, key, 0); 15 | }, _dec9 = Reflect.metadata("design:type", Function), _dec0 = Reflect.metadata("design:paramtypes", [String, void 0]), _dec1 = decorate('named'), _dec10 = function (target, key) { 16 | return inject()(target, key, 0); 17 | }, _dec11 = function (target, key) { 18 | return arg()(target, key, 1); 19 | }, _dec12 = Reflect.metadata("design:type", Function), _dec13 = Reflect.metadata("design:paramtypes", [typeof Injected === "undefined" ? Object : Injected, typeof Schema === "undefined" ? Object : Schema]), _dec14 = function (target, key) { 20 | return argObjectSpread()(target, key, 0); 21 | }, _dec15 = Reflect.metadata("design:type", Function), _dec16 = Reflect.metadata("design:paramtypes", [typeof SchemaObjectSpread === "undefined" ? Object : SchemaObjectSpread]), _dec4(_class2 = _dec5(_class2 = _dec6(_class2 = _dec7(_class2 = (_class3 = class MyOtherClass { 22 | constructor(parameter, otherParam) { 23 | this.parameter = parameter; 24 | } 25 | methodUndecorated(param, otherParam) {} 26 | method(param, schema) {} 27 | methodWithObjectSpread({ 28 | name 29 | }) {} 30 | }, _applyDecoratedDescriptor(_class3.prototype, "methodUndecorated", [_dec8, _dec9, _dec0], Object.getOwnPropertyDescriptor(_class3.prototype, "methodUndecorated"), _class3.prototype), _applyDecoratedDescriptor(_class3.prototype, "method", [_dec1, _dec10, _dec11, _dec12, _dec13], Object.getOwnPropertyDescriptor(_class3.prototype, "method"), _class3.prototype), _applyDecoratedDescriptor(_class3.prototype, "methodWithObjectSpread", [_dec14, _dec15, _dec16], Object.getOwnPropertyDescriptor(_class3.prototype, "methodWithObjectSpread"), _class3.prototype), _class3)) || _class2) || _class2) || _class2) || _class2); 31 | let DecoratedClass = (_dec17 = function (target, key) { 32 | return inject()(target, undefined, 0); 33 | }, _dec18 = function (target, key) { 34 | return inject()(target, undefined, 1); 35 | }, _dec19 = Reflect.metadata("design:type", Function), _dec20 = Reflect.metadata("design:paramtypes", [typeof Injected === "undefined" ? Object : Injected, typeof Injected === "undefined" ? Object : Injected]), _dec21 = decorate('example'), _dec22 = function (target, key) { 36 | return inject()(target, key, 0); 37 | }, _dec23 = Reflect.metadata("design:type", Function), _dec24 = Reflect.metadata("design:paramtypes", [String]), Decorate(_class4 = _dec17(_class4 = _dec18(_class4 = _dec19(_class4 = _dec20(_class4 = (_class5 = class DecoratedClass { 38 | constructor(module, otherModule) { 39 | this.module = module; 40 | } 41 | method(param) {} 42 | }, _applyDecoratedDescriptor(_class5.prototype, "method", [_dec21, _dec22, _dec23, _dec24], Object.getOwnPropertyDescriptor(_class5.prototype, "method"), _class5.prototype), _class5)) || _class4) || _class4) || _class4) || _class4) || _class4); 43 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # babel-plugin-transform-typescript-metadata 2 | 3 | ![GitHub Workflow Build Status](https://img.shields.io/github/actions/workflow/status/leonardfactory/babel-plugin-transform-typescript-metadata/test.yml) 4 | [![Codecov](https://img.shields.io/codecov/c/github/leonardfactory/babel-plugin-transform-typescript-metadata.svg)](https://codecov.io/gh/leonardfactory/babel-plugin-transform-typescript-metadata) 5 | [![npm](https://img.shields.io/npm/v/babel-plugin-transform-typescript-metadata.svg?style=popout)](https://www.npmjs.com/package/babel-plugin-transform-typescript-metadata) 6 | 7 | Babel plugin to emit decorator metadata like typescript compiler 8 | 9 | ## Motivation 10 | 11 | TypeScript _Decorators_ allows advanced reflection patterns when combined 12 | with [`Reflect.metadata`](https://rbuckton.github.io/reflect-metadata/) output. 13 | 14 | Current `@babel/preset-typescript` implementation however just strips all types and 15 | _does not_ emit the relative Metadata in the output code. 16 | 17 | Since this kind of information is used extensively in libraries like 18 | [Nest](https://docs.nestjs.com/providers) and [TypeORM](https://typeorm.io/#/) 19 | to implement advanced features like **Dependency Injection**, I've thought it would 20 | be awesome to be able to provide the same functionality that [TypeScript 21 | compiler `experimentalDecorators` and `emitDecoratorMetadata` 22 | flags](https://www.typescriptlang.org/docs/handbook/decorators.html) provide. 23 | 24 | This means that code like: 25 | 26 | ```ts 27 | import { Injectable, Inject } from 'some-di-library'; // Just an example 28 | import { MyService } from './MyService'; 29 | import { Configuration } from './Configuration'; 30 | 31 | @Injectable() 32 | class AnotherService { 33 | @Inject() 34 | config: Configuration; 35 | 36 | constructor(private service: MyService) {} 37 | } 38 | ``` 39 | 40 | will be interpreted like: 41 | 42 | ```ts 43 | import { MyService } from './MyService'; 44 | import { Configuration } from './Configuration'; 45 | 46 | @Injectable() 47 | @Reflect.metadata('design:paramtypes', [MyService]) 48 | class AnotherService { 49 | @Inject() 50 | @Reflect.metadata('design:type', Configuration) 51 | config: Configuration; 52 | 53 | constructor(private service: MyService) {} 54 | } 55 | ``` 56 | 57 | ### Parameter decorators 58 | 59 | Since decorators in typescript supports also _Parameters_, this plugin 60 | also provides support for them, enabling the following syntax: 61 | 62 | ```ts 63 | @Injectable() 64 | class Some { 65 | constructor(@Inject() private: SomeService); 66 | } 67 | ``` 68 | 69 | This will be roughly translated to: 70 | 71 | ```js 72 | // ... 73 | Inject()(Some.prototype, undefined, 0); 74 | ``` 75 | 76 | ## Installation 77 | 78 | With npm: 79 | 80 | ```sh 81 | npm install --dev --save babel-plugin-transform-typescript-metadata 82 | ``` 83 | 84 | or with Yarn: 85 | 86 | ```sh 87 | yarn add --dev babel-plugin-transform-typescript-metadata 88 | ``` 89 | 90 | ## Usage 91 | 92 | With `.babelrc`: 93 | 94 | > **Note:** should be placed **before** `@babel/plugin-proposal-decorators`. 95 | 96 | ```js 97 | { 98 | "plugins": [ 99 | "babel-plugin-transform-typescript-metadata", 100 | ["@babel/plugin-proposal-decorators", { "legacy": true }], 101 | ["@babel/plugin-proposal-class-properties", { "loose": true }], 102 | ], 103 | "presets": [ 104 | "@babel/preset-typescript" 105 | ] 106 | } 107 | ``` 108 | 109 | ### Usage with [InversifyJS](http://inversify.io) 110 | 111 | If you are using normal dependency injection letting Inversify **create your instances**, you should be fine with all kind of decorators. 112 | 113 | Instead, if you are using **property injection**, when [the container does not 114 | create the instances](https://github.com/inversify/InversifyJS/blob/master/wiki/property_injection.md#when-we-cannot-use-inversifyjs-to-create-an-instance-of-a-class), 115 | you would likely encounter errors since babel 116 | decorators are not exactly the same as TypeScript. 117 | 118 | You can fix it by _enhancing property decorators_ with the following function: 119 | 120 | ```ts 121 | import getDecorators from 'inversify-inject-decorators'; 122 | // setup the container... 123 | let { lazyInject: originalLazyInject } = getDecorators(container); 124 | 125 | // Additional function to make properties decorators compatible with babel. 126 | function fixPropertyDecorator(decorator: T): T { 127 | return ((...args: any[]) => 128 | (target: any, propertyName: any, ...decoratorArgs: any[]) => { 129 | decorator(...args)(target, propertyName, ...decoratorArgs); 130 | return Object.getOwnPropertyDescriptor(target, propertyName); 131 | }) as any; 132 | } 133 | 134 | export const lazyInject = fixPropertyDecorator(originalLazyInject); 135 | ``` 136 | 137 | ## Current Pitfalls 138 | 139 | - If you are using webpack and it complains about missing exports due to types 140 | not being removed, you can switch from `import { MyType } from ...` to 141 | `import type { MyType } from ...`. See [#46](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/issues/46) for details and 142 | examples. 143 | 144 | - We cannot know if type annotations are just types (i.e. `IMyInterface`) or 145 | concrete values (like classes, etc.). In order to resolve this, we emit the 146 | following: `typeof Type === 'undefined' ? Object : Type`. The code has the 147 | advantage of not throwing. If you know a better way to do this, let me know! 148 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # [0.4.0](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/compare/v0.3.2...v0.4.0) (2025-10-29) 2 | 3 | 4 | ### ✨ Features 5 | 6 | * Support Babel 8 ([52c122b](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/commit/52c122b)) 7 | 8 | 9 | ### 🐛 Bug Fixes 10 | 11 | * : make [@babel](https://github.com/babel)/core optional ([9bf262c](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/commit/9bf262c)) 12 | 13 | 14 | ### 📚 Documentation 15 | 16 | * Added gh build status badge ([3a52ff7](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/commit/3a52ff7)) 17 | * Update readme badge ([1a78d42](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/commit/1a78d42)) 18 | 19 | 20 | ### 🏗 Chore 21 | 22 | * Switch from travis to gh actions ([4c98c57](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/commit/4c98c57)) 23 | 24 | ## [0.3.2](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/compare/v0.3.1...v0.3.2) (2021-03-19) 25 | 26 | 27 | ### 🛠 Improvements 28 | 29 | * Fixed up return type to include objectpattern type ([368eb09](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/commit/368eb09)) 30 | 31 | 32 | ### 📚 Documentation 33 | 34 | * Add documentation about webpack complains ([a397113](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/commit/a397113)) 35 | 36 | 37 | ### 🏗 Chore 38 | 39 | * Added test for object spread argument ([d6ec125](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/commit/d6ec125)) 40 | * Fixed missing call to ObjectSpread decorator ([ee28b83](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/commit/ee28b83)) 41 | 42 | ## [0.3.1](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/compare/v0.3.0...v0.3.1) (2020-10-12) 43 | 44 | 45 | ### 🐛 Bug Fixes 46 | 47 | * Use cloneDeep to keep reference linked ([869a913](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/commit/869a913)) 48 | 49 | # [0.3.0](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/compare/v0.2.2...v0.3.0) (2020-03-05) 50 | 51 | 52 | ### ✨ Features 53 | 54 | * Add support for TSBigIntKeyword ([358a689](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/commit/358a689)) 55 | * Move param dec to class ([1371f6b](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/commit/1371f6b)) 56 | 57 | 58 | ### 🐛 Bug Fixes 59 | 60 | * Restored [@babel](https://github.com/babel)/core types to allow TSC checking ([55ff485](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/commit/55ff485)) 61 | 62 | 63 | ### 🏗 Chore 64 | 65 | * Update release-it to v11+ ([e61386f](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/commit/e61386f)) 66 | 67 | ## [0.2.2](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/compare/v0.2.1...v0.2.2) (2019-03-27) 68 | 69 | 70 | ### 🐛 Bug Fixes 71 | 72 | * Add InversifyJS function to make decorators compatible with babel ([4535adb](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/commit/4535adb)) 73 | * Handle unsupported kind of parameters with void zero ([a35f733](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/commit/a35f733)) 74 | * Omit value when it's a reference to self (class name) ([f755bc2](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/commit/f755bc2)) 75 | 76 | 77 | ### 📚 Documentation 78 | 79 | * Add InversifyJS property injection doc ([b263fcd](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/commit/b263fcd)) 80 | * Make example DI code more realistic ([620182f](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/commit/620182f)) 81 | 82 | 83 | ### 🏗 Chore 84 | 85 | * Add example code to test InversifyJS property injector ([48bd0bb](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/commit/48bd0bb)), closes [#2](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/issues/2) 86 | 87 | 88 | ## [0.2.1](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/compare/v0.2.0...v0.2.1) (2019-03-24) 89 | 90 | 91 | ### 📚 Documentation 92 | 93 | * Add current pitfalls to README ([2f2b888](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/commit/2f2b888)) 94 | 95 | 96 | ### 🏗 Chore 97 | 98 | * Add package.json keywords ([97690ca](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/commit/97690ca)) 99 | 100 | 101 | # [0.2.0](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/compare/v0.1.1...v0.2.0) (2019-03-24) 102 | 103 | 104 | ### ✨ Features 105 | 106 | * Enhance type serialization following TSC [#1](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/issues/1) ([5a76db1](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/commit/5a76db1)) 107 | 108 | 109 | ### 🐛 Bug Fixes 110 | 111 | * Fix parameter assignments type serialization ([0eb91bb](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/commit/0eb91bb)) 112 | 113 | 114 | ### 📚 Documentation 115 | 116 | * Add motivation to README ([f59c802](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/commit/f59c802)) 117 | 118 | 119 | ## [0.1.1](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/compare/v0.1.0...v0.1.1) (2019-03-24) 120 | 121 | 122 | ### 📚 Documentation 123 | 124 | * Add CHANGELOG ([880b618](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/commit/880b618)) 125 | 126 | 127 | # 0.1.0 (2019-03-24) 128 | 129 | 130 | ### ✨ Features 131 | 132 | * Add decorators metadata support ([9cb1e8f](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/commit/9cb1e8f)) 133 | 134 | 135 | ### 📚 Documentation 136 | 137 | * Add installation and usage in README ([8d31825](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/commit/8d31825)) 138 | 139 | 140 | ### 🏗 Chore 141 | 142 | * Use babel-plugin-utils to assert babel version ([bbf626a](https://github.com/leonardfactory/babel-plugin-transform-typescript-metadata/commit/bbf626a)) 143 | 144 | 145 | -------------------------------------------------------------------------------- /src/metadata/serializeType.ts: -------------------------------------------------------------------------------- 1 | import { types as t, NodePath } from '@babel/core'; 2 | 3 | type InferArray = T extends Array ? A : never; 4 | 5 | type Parameter = InferArray | t.ClassProperty; 6 | 7 | function createVoidZero() { 8 | return t.unaryExpression('void', t.numericLiteral(0)); 9 | } 10 | 11 | /** 12 | * Given a paramater (or class property) node it returns the first identifier 13 | * containing the TS Type Annotation. 14 | * 15 | * @todo Array and Objects spread are not supported. 16 | * @todo Rest parameters are not supported. 17 | */ 18 | function getTypedNode(param: Parameter): t.Identifier | t.ClassProperty | t.ObjectPattern | null { 19 | if (param == null) return null; 20 | 21 | if (param.type === 'ClassProperty') return param; 22 | if (param.type === 'Identifier') return param; 23 | if (param.type === 'ObjectPattern') return param; 24 | 25 | if (param.type === 'AssignmentPattern' && param.left.type === 'Identifier') 26 | return param.left; 27 | 28 | if (param.type === 'TSParameterProperty') 29 | return getTypedNode(param.parameter); 30 | 31 | return null; 32 | } 33 | 34 | export function serializeType( 35 | classPath: NodePath, 36 | param: Parameter 37 | ) { 38 | const node = getTypedNode(param); 39 | if (node == null) return createVoidZero(); 40 | 41 | if (!node.typeAnnotation || node.typeAnnotation.type !== 'TSTypeAnnotation') 42 | return createVoidZero(); 43 | 44 | const annotation = node.typeAnnotation.typeAnnotation; 45 | const className = classPath.node.id ? classPath.node.id.name : ''; 46 | return serializeTypeNode(className, annotation); 47 | } 48 | 49 | function serializeTypeReferenceNode( 50 | className: string, 51 | node: t.TSTypeReference 52 | ) { 53 | /** 54 | * We need to save references to this type since it is going 55 | * to be used as a Value (and not just as a Type) here. 56 | * 57 | * This is resolved in main plugin method, calling 58 | * `path.scope.crawl()` which updates the bindings. 59 | */ 60 | const reference = serializeReference(node.typeName); 61 | 62 | /** 63 | * We should omit references to self (class) since it will throw a 64 | * ReferenceError at runtime due to babel transpile output. 65 | */ 66 | if (isClassType(className, reference)) { 67 | return t.identifier('Object'); 68 | } 69 | 70 | /** 71 | * We don't know if type is just a type (interface, etc.) or a concrete 72 | * value (class, etc.). 73 | * `typeof` operator allows us to use the expression even if it is not 74 | * defined, fallback is just `Object`. 75 | */ 76 | return t.conditionalExpression( 77 | t.binaryExpression( 78 | '===', 79 | t.unaryExpression('typeof', reference), 80 | t.stringLiteral('undefined') 81 | ), 82 | t.identifier('Object'), 83 | t.cloneDeep(reference) 84 | ); 85 | } 86 | 87 | /** 88 | * Checks if node (this should be the result of `serializeReference`) member 89 | * expression or identifier is a reference to self (class name). 90 | * In this case, we just emit `Object` in order to avoid ReferenceError. 91 | */ 92 | export function isClassType(className: string, node: t.Expression): boolean { 93 | switch (node.type) { 94 | case 'Identifier': 95 | return node.name === className; 96 | case 'MemberExpression': 97 | return isClassType(className, node.object); 98 | default: 99 | throw new Error( 100 | `The property expression at ${node.start} is not valid as a Type to be used in Reflect.metadata` 101 | ); 102 | } 103 | } 104 | 105 | function serializeReference( 106 | typeName: t.Identifier | t.TSQualifiedName 107 | ): t.Identifier | t.MemberExpression { 108 | if (typeName.type === 'Identifier') { 109 | return t.identifier(typeName.name); 110 | } 111 | return t.memberExpression(serializeReference(typeName.left), typeName.right); 112 | } 113 | 114 | type SerializedType = 115 | | t.Identifier 116 | | t.UnaryExpression 117 | | t.ConditionalExpression; 118 | 119 | /** 120 | * Actual serialization given the TS Type annotation. 121 | * Result tries to get the best match given the information available. 122 | * 123 | * Implementation is adapted from original TSC compiler source as 124 | * available here: 125 | * https://github.com/Microsoft/TypeScript/blob/2932421370df720f0ccfea63aaf628e32e881429/src/compiler/transformers/ts.ts 126 | */ 127 | function serializeTypeNode(className: string, node: t.TSType): SerializedType { 128 | if (node === undefined) { 129 | return t.identifier('Object'); 130 | } 131 | 132 | switch (node.type) { 133 | case 'TSVoidKeyword': 134 | case 'TSUndefinedKeyword': 135 | case 'TSNullKeyword': 136 | case 'TSNeverKeyword': 137 | return createVoidZero(); 138 | 139 | case 'TSParenthesizedType': 140 | return serializeTypeNode(className, node.typeAnnotation); 141 | 142 | case 'TSFunctionType': 143 | case 'TSConstructorType': 144 | return t.identifier('Function'); 145 | 146 | case 'TSArrayType': 147 | case 'TSTupleType': 148 | return t.identifier('Array'); 149 | 150 | case 'TSTypePredicate': 151 | case 'TSBooleanKeyword': 152 | return t.identifier('Boolean'); 153 | 154 | case 'TSStringKeyword': 155 | return t.identifier('String'); 156 | 157 | case 'TSObjectKeyword': 158 | return t.identifier('Object'); 159 | 160 | case 'TSLiteralType': 161 | switch (node.literal.type) { 162 | case 'StringLiteral': 163 | return t.identifier('String'); 164 | 165 | case 'NumericLiteral': 166 | return t.identifier('Number'); 167 | 168 | case 'BooleanLiteral': 169 | return t.identifier('Boolean'); 170 | 171 | default: 172 | /** 173 | * @todo Use `path` error building method. 174 | */ 175 | throw new Error('Bad type for decorator' + node.literal); 176 | } 177 | 178 | case 'TSNumberKeyword': 179 | case 'TSBigIntKeyword' as any: // Still not in ``@babel/core` typings 180 | return t.identifier('Number'); 181 | 182 | case 'TSSymbolKeyword': 183 | return t.identifier('Symbol'); 184 | 185 | case 'TSTypeReference': 186 | return serializeTypeReferenceNode(className, node); 187 | 188 | case 'TSIntersectionType': 189 | case 'TSUnionType': 190 | return serializeTypeList(className, node.types); 191 | 192 | case 'TSConditionalType': 193 | return serializeTypeList(className, [node.trueType, node.falseType]); 194 | 195 | case 'TSTypeQuery': 196 | case 'TSTypeOperator': 197 | case 'TSIndexedAccessType': 198 | case 'TSMappedType': 199 | case 'TSTypeLiteral': 200 | case 'TSAnyKeyword': 201 | case 'TSUnknownKeyword': 202 | case 'TSThisType': 203 | //case SyntaxKind.ImportType: 204 | break; 205 | 206 | default: 207 | throw new Error('Bad type for decorator'); 208 | } 209 | 210 | return t.identifier('Object'); 211 | } 212 | 213 | /** 214 | * Type lists need some refining. Even here, implementation is slightly 215 | * adapted from original TSC compiler: 216 | * 217 | * https://github.com/Microsoft/TypeScript/blob/2932421370df720f0ccfea63aaf628e32e881429/src/compiler/transformers/ts.ts 218 | */ 219 | function serializeTypeList( 220 | className: string, 221 | types: ReadonlyArray 222 | ): SerializedType { 223 | let serializedUnion: SerializedType | undefined; 224 | 225 | for (let typeNode of types) { 226 | while (typeNode.type === 'TSParenthesizedType') { 227 | typeNode = typeNode.typeAnnotation; // Skip parens if need be 228 | } 229 | if (typeNode.type === 'TSNeverKeyword') { 230 | continue; // Always elide `never` from the union/intersection if possible 231 | } 232 | if ( 233 | typeNode.type === 'TSNullKeyword' || 234 | typeNode.type === 'TSUndefinedKeyword' 235 | ) { 236 | continue; // Elide null and undefined from unions for metadata, just like what we did prior to the implementation of strict null checks 237 | } 238 | const serializedIndividual = serializeTypeNode(className, typeNode); 239 | 240 | if ( 241 | t.isIdentifier(serializedIndividual) && 242 | serializedIndividual.name === 'Object' 243 | ) { 244 | // One of the individual is global object, return immediately 245 | return serializedIndividual; 246 | } 247 | // If there exists union that is not void 0 expression, check if the the common type is identifier. 248 | // anything more complex and we will just default to Object 249 | else if (serializedUnion) { 250 | // Different types 251 | if ( 252 | !t.isIdentifier(serializedUnion) || 253 | !t.isIdentifier(serializedIndividual) || 254 | serializedUnion.name !== serializedIndividual.name 255 | ) { 256 | return t.identifier('Object'); 257 | } 258 | } else { 259 | // Initialize the union type 260 | serializedUnion = serializedIndividual; 261 | } 262 | } 263 | 264 | // If we were able to find common type, use it 265 | return serializedUnion || createVoidZero(); // Fallback is only hit if all union constituients are null/undefined/never 266 | } 267 | -------------------------------------------------------------------------------- /test/__helpers__/babel-8/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^8.0.0-beta.3": 6 | version "8.0.0-beta.3" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-8.0.0-beta.3.tgz#7a685d81d76d4e9f47a44e160f20c272b57e2a27" 8 | integrity sha512-bCQEw5OhcQSIsknZm3js7Nh7GchgeboNQsC+Frzu6xnOCMdRlc7Y8MgMcqeWcahgtDKRXECmamDH6KBk4bt5bA== 9 | dependencies: 10 | "@babel/helper-validator-identifier" "^8.0.0-beta.3" 11 | js-tokens "^8.0.0" 12 | picocolors "^1.1.1" 13 | 14 | "@babel/compat-data@^7.27.2": 15 | version "7.28.5" 16 | resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.28.5.tgz#a8a4962e1567121ac0b3b487f52107443b455c7f" 17 | integrity sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA== 18 | 19 | "@babel/compat-data@^8.0.0-beta.3": 20 | version "8.0.0-beta.3" 21 | resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-8.0.0-beta.3.tgz#d3e082ce97510d409a7ed96697bea36120ad39ce" 22 | integrity sha512-dYTMhWWw/nxXE9U2wXeBxfZm+cm7yDoUx2M7dYVcFmzWQvdtp0pbBZ0wovcB+LIRfC9xjUvNf18fHoguCQ6+IA== 23 | 24 | "@babel/core@^8.0.0-beta.3": 25 | version "8.0.0-beta.3" 26 | resolved "https://registry.yarnpkg.com/@babel/core/-/core-8.0.0-beta.3.tgz#1fb51e505f603dd30a2b70e8baa24b20684cff31" 27 | integrity sha512-WiCavSOahhRtH6yEQWz3xhzDc2loDiFmtVcqkLkPKD1Z3ykysP5oSf7OcRZeygqjJqPXjf+WMipwzJvZyTfL6A== 28 | dependencies: 29 | "@babel/code-frame" "^8.0.0-beta.3" 30 | "@babel/generator" "^8.0.0-beta.3" 31 | "@babel/helper-compilation-targets" "^8.0.0-beta.3" 32 | "@babel/helpers" "^8.0.0-beta.3" 33 | "@babel/parser" "^8.0.0-beta.3" 34 | "@babel/template" "^8.0.0-beta.3" 35 | "@babel/traverse" "^8.0.0-beta.3" 36 | "@babel/types" "^8.0.0-beta.3" 37 | "@jridgewell/remapping" "^2.3.5" 38 | "@types/gensync" "^1.0.0" 39 | convert-source-map "^2.0.0" 40 | debug "^4.1.0" 41 | gensync "^1.0.0-beta.2" 42 | json5 "^2.2.3" 43 | semver "^7.3.4" 44 | 45 | "@babel/generator@^8.0.0-beta.3": 46 | version "8.0.0-beta.3" 47 | resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-8.0.0-beta.3.tgz#7bd88dacf4d7c6fdb75135da5a5da2c859d03b58" 48 | integrity sha512-nwMbTx7lMjvbnMPeZLh9tOX+SYyvO1pLIk3lAZ9pkYvMEr36NakNarx4osFPmFXiSfKFkKxdJuxlHGIT5Xyjtw== 49 | dependencies: 50 | "@babel/parser" "^8.0.0-beta.3" 51 | "@babel/types" "^8.0.0-beta.3" 52 | "@jridgewell/gen-mapping" "^0.3.12" 53 | "@jridgewell/trace-mapping" "^0.3.28" 54 | "@types/jsesc" "^2.5.0" 55 | jsesc "^3.0.2" 56 | 57 | "@babel/helper-annotate-as-pure@^8.0.0-beta.3": 58 | version "8.0.0-beta.3" 59 | resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-8.0.0-beta.3.tgz#2e3a09a2c4f3b944fe237cfdd110f1f3c849eb3f" 60 | integrity sha512-Pzu1bmE7Ki55GouW0FzBUvbmhUqhLigm0UIafumU3b1qEvzWETR17tlkR04lZI21Ud2w4jNpVpZI62yVQJ4vYQ== 61 | dependencies: 62 | "@babel/types" "^8.0.0-beta.3" 63 | 64 | "@babel/helper-compilation-targets@^7.27.2": 65 | version "7.27.2" 66 | resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz#46a0f6efab808d51d29ce96858dd10ce8732733d" 67 | integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== 68 | dependencies: 69 | "@babel/compat-data" "^7.27.2" 70 | "@babel/helper-validator-option" "^7.27.1" 71 | browserslist "^4.24.0" 72 | lru-cache "^5.1.1" 73 | semver "^6.3.1" 74 | 75 | "@babel/helper-compilation-targets@^8.0.0-beta.3": 76 | version "8.0.0-beta.3" 77 | resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-8.0.0-beta.3.tgz#caa54b33474004e7b15cbc1d3f9d25b6a296d65a" 78 | integrity sha512-izyaOQ18BRlbBZuJZbj44lTMEZfuf0BVFAVwdnI7rNmDaGhQWaNMp5UGKZfHpBLFCqaEjUQZ9gVYIypwLOMvjw== 79 | dependencies: 80 | "@babel/compat-data" "^8.0.0-beta.3" 81 | "@babel/helper-validator-option" "^8.0.0-beta.3" 82 | browserslist "^4.24.0" 83 | lru-cache "^7.14.1" 84 | semver "^7.3.4" 85 | 86 | "@babel/helper-create-class-features-plugin@^8.0.0-beta.3": 87 | version "8.0.0-beta.3" 88 | resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-8.0.0-beta.3.tgz#c39d25e4c900b6b59a1a5ab387a75e95694ecec2" 89 | integrity sha512-FSRTjihtAstfHZvIE5oRZMdGM1UflulGT4RGsTH2GAhxDMvJVEfTqQQZqP3acnfgXMwMA14XVbPi3Tb9iefRKg== 90 | dependencies: 91 | "@babel/helper-annotate-as-pure" "^8.0.0-beta.3" 92 | "@babel/helper-member-expression-to-functions" "^8.0.0-beta.3" 93 | "@babel/helper-optimise-call-expression" "^8.0.0-beta.3" 94 | "@babel/helper-replace-supers" "^8.0.0-beta.3" 95 | "@babel/helper-skip-transparent-expression-wrappers" "^8.0.0-beta.3" 96 | "@babel/traverse" "^8.0.0-beta.3" 97 | semver "^7.3.4" 98 | 99 | "@babel/helper-create-regexp-features-plugin@^8.0.0-beta.3": 100 | version "8.0.0-beta.3" 101 | resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-8.0.0-beta.3.tgz#31889a8dd6297230935f6b6c7d7cd0be00bf8a7a" 102 | integrity sha512-kgJw3pTE8aNea7Wrqi/W80pJ1Iu4YO9vuYEL5fG3mxfxWkpD9WRR3Prk6QggfIcS3cMLkEpSUm1QHzHGlUkpjA== 103 | dependencies: 104 | "@babel/helper-annotate-as-pure" "^8.0.0-beta.3" 105 | regexpu-core "^6.3.1" 106 | semver "^7.3.4" 107 | 108 | "@babel/helper-define-polyfill-provider@^0.6.5": 109 | version "0.6.5" 110 | resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz#742ccf1cb003c07b48859fc9fa2c1bbe40e5f753" 111 | integrity sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg== 112 | dependencies: 113 | "@babel/helper-compilation-targets" "^7.27.2" 114 | "@babel/helper-plugin-utils" "^7.27.1" 115 | debug "^4.4.1" 116 | lodash.debounce "^4.0.8" 117 | resolve "^1.22.10" 118 | 119 | "@babel/helper-globals@^8.0.0-beta.3": 120 | version "8.0.0-beta.3" 121 | resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-8.0.0-beta.3.tgz#8480e5f82d2260db92ccd5df060f700f608a68a5" 122 | integrity sha512-dk4zM35aDJxpAp4o0RVO0bbQEHl5fUiXuoF6PxstWnZbuAu4PT1cKN838q+0WE6u+64mfNGaCm6uiWXQIwkn9Q== 123 | 124 | "@babel/helper-member-expression-to-functions@^8.0.0-beta.3": 125 | version "8.0.0-beta.3" 126 | resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-8.0.0-beta.3.tgz#1cef6a3c028ccbfae6c29e9bef7541e54fbea046" 127 | integrity sha512-5j1Oa66PbS+8IO36ALZW0Yvj3XS0F6tRgWfwSVqCqe9iQTWgbc5kgzxSIOgUbkoRe9Gc4Ca/5YqxAW8PMm5mfw== 128 | dependencies: 129 | "@babel/traverse" "^8.0.0-beta.3" 130 | "@babel/types" "^8.0.0-beta.3" 131 | 132 | "@babel/helper-module-imports@^8.0.0-beta.3": 133 | version "8.0.0-beta.3" 134 | resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-8.0.0-beta.3.tgz#f54a5a727f20f63058c05d354450783a42e4bdc5" 135 | integrity sha512-k/E56kDd5bXH2HDNG1DY/+XNfv+jnYKaTOq2lQ/XGM399JmVeYMcKCShZgPw8MuJJ+tSEKfUH8G/hBeZ7k7mfA== 136 | dependencies: 137 | "@babel/traverse" "^8.0.0-beta.3" 138 | "@babel/types" "^8.0.0-beta.3" 139 | 140 | "@babel/helper-module-transforms@^8.0.0-beta.3": 141 | version "8.0.0-beta.3" 142 | resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-8.0.0-beta.3.tgz#9d5aeae078afe9405b577ab2c5a64ef4e48dd9f3" 143 | integrity sha512-+mRHdTxk3+fxaRhrhnTSdCkzP/+nSRrxMBYrTggpWcIuOD6tq3rho757k2vobp4TM4A9d1QYOrudKJCvQKiywQ== 144 | dependencies: 145 | "@babel/helper-module-imports" "^8.0.0-beta.3" 146 | "@babel/helper-validator-identifier" "^8.0.0-beta.3" 147 | "@babel/traverse" "^8.0.0-beta.3" 148 | 149 | "@babel/helper-optimise-call-expression@^8.0.0-beta.3": 150 | version "8.0.0-beta.3" 151 | resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-8.0.0-beta.3.tgz#4266367a42a3fbea1696b4d17509d07a80943489" 152 | integrity sha512-bwmjWxLtdE5t3hQQlNPizT/2c2attbKJWZFhZ5iI++t6byWvHbn5FZy0FSnzFDN7LrlzfYP7eMPoWjQ7/elJTA== 153 | dependencies: 154 | "@babel/types" "^8.0.0-beta.3" 155 | 156 | "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.27.1": 157 | version "7.27.1" 158 | resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz#ddb2f876534ff8013e6c2b299bf4d39b3c51d44c" 159 | integrity sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== 160 | 161 | "@babel/helper-plugin-utils@^8.0.0-beta.3": 162 | version "8.0.0-beta.3" 163 | resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-8.0.0-beta.3.tgz#3f6e4768728c3879fe423ea414a5c195cff99a9b" 164 | integrity sha512-aq1nWma0v+51w59ANJOn0UX6tOGvJukXEQB3TWNGK8So8xEbttbwd56UMpa/nvArD/l6nt166QJAeYKEufCPWw== 165 | 166 | "@babel/helper-remap-async-to-generator@^8.0.0-beta.3": 167 | version "8.0.0-beta.3" 168 | resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-8.0.0-beta.3.tgz#ed80d31254efcab4770d1c5779cabdd71ddccb7c" 169 | integrity sha512-vK6gA0ZJvdWQn4pdb0YbE4aJrdhC7hwtHkkuCE6E+fhNyq2EYEdzAzLQamAnOG9rWaWODg99HvBFbiF1KQqTkA== 170 | dependencies: 171 | "@babel/helper-annotate-as-pure" "^8.0.0-beta.3" 172 | "@babel/helper-wrap-function" "^8.0.0-beta.3" 173 | "@babel/traverse" "^8.0.0-beta.3" 174 | 175 | "@babel/helper-replace-supers@^8.0.0-beta.3": 176 | version "8.0.0-beta.3" 177 | resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-8.0.0-beta.3.tgz#079e75a795826fc232e9233ffc82a509cf4e6c07" 178 | integrity sha512-YBAHLfbT+kG6ymRnC2O/RXe9rgezIGiLbg51ZNjpzd++mwJ1ncWhP5Oq6Lldo+bcuEVt24EO+0z93yxXvQVZpw== 179 | dependencies: 180 | "@babel/helper-member-expression-to-functions" "^8.0.0-beta.3" 181 | "@babel/helper-optimise-call-expression" "^8.0.0-beta.3" 182 | "@babel/traverse" "^8.0.0-beta.3" 183 | 184 | "@babel/helper-skip-transparent-expression-wrappers@^8.0.0-beta.3": 185 | version "8.0.0-beta.3" 186 | resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-8.0.0-beta.3.tgz#ac8fe4044c9fe5f3df65f19dc377a02e9e1c7f0d" 187 | integrity sha512-uRAYu5sBVgmsgJ4ivw9qNK1LZdKwu5M7IhIxin3KmxKygH2hQZLGkop90uHmqzoDOGn0OGcs48aZvgHXTNBfxQ== 188 | dependencies: 189 | "@babel/traverse" "^8.0.0-beta.3" 190 | "@babel/types" "^8.0.0-beta.3" 191 | 192 | "@babel/helper-string-parser@^7.27.1": 193 | version "7.27.1" 194 | resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" 195 | integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== 196 | 197 | "@babel/helper-string-parser@^8.0.0-beta.3": 198 | version "8.0.0-beta.3" 199 | resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-8.0.0-beta.3.tgz#f7d536551c3714be96d9ca5694bffba4c20b830e" 200 | integrity sha512-qfGhy2DxvtYvJ/D+xLTe8EZLoMe3AGgeFeqsi+y8yDEl19iqZa3FSqhD33exl8oqQY2UOSbKPwoKYJLcyUdPog== 201 | 202 | "@babel/helper-validator-identifier@^7.28.5": 203 | version "7.28.5" 204 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" 205 | integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== 206 | 207 | "@babel/helper-validator-identifier@^8.0.0-beta.3": 208 | version "8.0.0-beta.3" 209 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-8.0.0-beta.3.tgz#edcbf16165b8cb8de4efafb343fb98821f097316" 210 | integrity sha512-0uFJz8fwc1WRgepEs6L8b+f2n1cTZqAevxJgnIOWRvYiNfGGXrSWCLOPgR3zzNgjaA1O6qvkqKLbTXJ5dYJ89Q== 211 | 212 | "@babel/helper-validator-option@^7.27.1": 213 | version "7.27.1" 214 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" 215 | integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== 216 | 217 | "@babel/helper-validator-option@^8.0.0-beta.3": 218 | version "8.0.0-beta.3" 219 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-8.0.0-beta.3.tgz#82a5474a31bd8133f68b4fe83d9c8de23bf8cc09" 220 | integrity sha512-qYSrvmcULMWq9GOfU6Gnws53A5whLvAHnnRHaXcx/l5AjZ2AVEdIdhBHPcUC3FsQsz4A8QecApsjdguGBiwAIQ== 221 | 222 | "@babel/helper-wrap-function@^8.0.0-beta.3": 223 | version "8.0.0-beta.3" 224 | resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-8.0.0-beta.3.tgz#9882e146b6ee27677b4750826d1f137e6a6a16b5" 225 | integrity sha512-AnEN6OSENC0Ti2uSaTaYHybQbugfQEDnp3g1bXWhan8/N8Bqi+Iwb7+1cbWH+FiVEv6YxVxvCpUXWKyOlUaB1g== 226 | dependencies: 227 | "@babel/template" "^8.0.0-beta.3" 228 | "@babel/traverse" "^8.0.0-beta.3" 229 | "@babel/types" "^8.0.0-beta.3" 230 | 231 | "@babel/helpers@^8.0.0-beta.3": 232 | version "8.0.0-beta.3" 233 | resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-8.0.0-beta.3.tgz#f04bd0e89df9013b7fa9b4f6a2cfdb7f05982263" 234 | integrity sha512-8j8G0pg26FxbQeTS8NztMvkb/O4r96PwxNWr3fpopeLKJSp/dMiBtZtjNAIv/3t0d7eqtlskX4bsInGuDw3Puw== 235 | dependencies: 236 | "@babel/template" "^8.0.0-beta.3" 237 | "@babel/types" "^8.0.0-beta.3" 238 | 239 | "@babel/parser@^8.0.0-beta.3": 240 | version "8.0.0-beta.3" 241 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-8.0.0-beta.3.tgz#e93313d4a7a402e059cd037df179af5cf7ae6f00" 242 | integrity sha512-RPeTDOkzKPR9Laf0dTxx3SE2vRnAPYXCRx0xPICijbLZsuGTZGZ95Kf3EcPQdWdzLmEOLGpdh9xMtiWW56sreA== 243 | dependencies: 244 | "@babel/types" "^8.0.0-beta.3" 245 | 246 | "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^8.0.0-beta.3": 247 | version "8.0.0-beta.3" 248 | resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-8.0.0-beta.3.tgz#79fd715a2f45e285221af427773dc46f04f72ff4" 249 | integrity sha512-gTreCus6i5oxxIcuFLRLCuvRsfkY9FrLpBOY1hTFiMLhb5Y7bRhyMvvwPWOA4YxN9OyW+PP4QyJ0bBmN8QLnIw== 250 | dependencies: 251 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 252 | "@babel/traverse" "^8.0.0-beta.3" 253 | 254 | "@babel/plugin-bugfix-safari-class-field-initializer-scope@^8.0.0-beta.3": 255 | version "8.0.0-beta.3" 256 | resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-8.0.0-beta.3.tgz#cfba2dac2e90b36a5a25b275e4d7bd66e51bb35c" 257 | integrity sha512-8BFpulXbv20p2kkV1PT6JgC7PblSGAUAr/mxMWIs+zFI5guL7EeUbFAtSDs4SJfA1EC9J2UWdlTHBMtP/5BfDQ== 258 | dependencies: 259 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 260 | 261 | "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^8.0.0-beta.3": 262 | version "8.0.0-beta.3" 263 | resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-8.0.0-beta.3.tgz#efd0808d1cefac253061dc4da21cff895704fcee" 264 | integrity sha512-TcU8KdeVNbjyb+MHUC8ERMUe2hxnmix8BCQP1OZYKbapHa8hLa4tVnuNjjdzVvO4Sda84lfnTuUwj3cYJnCDAA== 265 | dependencies: 266 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 267 | 268 | "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^8.0.0-beta.3": 269 | version "8.0.0-beta.3" 270 | resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-8.0.0-beta.3.tgz#19f059e58aa02c8ece1449b681d1f2539ba7027f" 271 | integrity sha512-fwLt2O9nfMMP/vmSkpQAS+OIQZOjLqyiHqXWGgQ9dZ2P5qBxFamM1C+RlQ521jxd+nBkypiAwnH2zTDxqR56wA== 272 | dependencies: 273 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 274 | "@babel/helper-skip-transparent-expression-wrappers" "^8.0.0-beta.3" 275 | "@babel/plugin-transform-optional-chaining" "^8.0.0-beta.3" 276 | 277 | "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^8.0.0-beta.3": 278 | version "8.0.0-beta.3" 279 | resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-8.0.0-beta.3.tgz#3d8a22838ea6805da64fa234f70c7dfc279050d2" 280 | integrity sha512-XRwl8Dcp96fSwxZyiVJYa8p9UEqohvettsnoWt6Ah27Q4b7Tb8Q7L8O+9T0LArDd1hxPnVhIzXIdxLdophRsfQ== 281 | dependencies: 282 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 283 | 284 | "@babel/plugin-proposal-decorators@^8.0.0-beta.3": 285 | version "8.0.0-beta.3" 286 | resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-8.0.0-beta.3.tgz#dec30a7e096058a1849658f036fabab2430e39af" 287 | integrity sha512-0BsnGkgQW6d+THIHwt0tCwLGXNNJ0VpC8LfrXTqm43GOX3FD58RtT8wW19RqfmgCHQhedKvyntOnT5sW7xWozQ== 288 | dependencies: 289 | "@babel/helper-create-class-features-plugin" "^8.0.0-beta.3" 290 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 291 | "@babel/plugin-syntax-decorators" "^8.0.0-beta.3" 292 | 293 | "@babel/plugin-syntax-decorators@^8.0.0-beta.3": 294 | version "8.0.0-beta.3" 295 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-8.0.0-beta.3.tgz#fbba2d4b80c6c546e6075dedae0ccfe0d3300276" 296 | integrity sha512-xctxhLPgJP06+Ex5iUvUzfMqqYhZRT/wHZ3lSscic233/MuAgB1aHqOY8tF6R1KYAicJJYKng8dyJd8HZTHWLg== 297 | dependencies: 298 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 299 | 300 | "@babel/plugin-syntax-jsx@^8.0.0-beta.3": 301 | version "8.0.0-beta.3" 302 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-8.0.0-beta.3.tgz#07b24b29d5cda5a3dcc39c899dbc7ee67c8c6bd4" 303 | integrity sha512-aWPtIsp3sc+4xgqdZbdUHOhwiZfzTutSgEpyRUybomAhIzw6jur3489G2nrIaGpOxabsxZnXRLN2FFcmpQqkfA== 304 | dependencies: 305 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 306 | 307 | "@babel/plugin-syntax-typescript@^8.0.0-beta.3": 308 | version "8.0.0-beta.3" 309 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-8.0.0-beta.3.tgz#0cfbcd95f5ed03a743a31e8fbd02de9ae5d5c2cd" 310 | integrity sha512-2n+52f+FEaIqeIiOyysN62xNZY7sSkQfO0M9SGY4fXy1ldP1abHJbdSDNCyDdz38lY9fijgPvpPuJwLiZaMyxQ== 311 | dependencies: 312 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 313 | 314 | "@babel/plugin-transform-arrow-functions@^8.0.0-beta.3": 315 | version "8.0.0-beta.3" 316 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-8.0.0-beta.3.tgz#86a7dc7af43973e3d4275c7fc0481c81c6cde6bb" 317 | integrity sha512-HbS7IIuGRUJNsW06iwXdLxbWgsvS6tPai2boQFNItO9LfePv6DVhcVElTV0ZdMIsoxAhJumhMIlLPjk4AlE1bA== 318 | dependencies: 319 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 320 | 321 | "@babel/plugin-transform-async-generator-functions@^8.0.0-beta.3": 322 | version "8.0.0-beta.3" 323 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-8.0.0-beta.3.tgz#307a98f97a0e1f6dfd7b4a3bd811b2acb70a44bd" 324 | integrity sha512-US4Tyey6gnR7L8LGSKby4YHN8b7e/efDcuK6PpkbnADyIs11uERTo0hmNkRiFBXwqsF/bnfuxx4khHI8sKJ22g== 325 | dependencies: 326 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 327 | "@babel/helper-remap-async-to-generator" "^8.0.0-beta.3" 328 | "@babel/traverse" "^8.0.0-beta.3" 329 | 330 | "@babel/plugin-transform-async-to-generator@^8.0.0-beta.3": 331 | version "8.0.0-beta.3" 332 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-8.0.0-beta.3.tgz#84d2f64b2c6c819c1f49ccee8a367fbb50577e3c" 333 | integrity sha512-mEqFI+UppZhaiQkggTdcY66GdgoKB/qSYu70c05ttdMrUje347skIVS2e+esQPvkY/4EwSPLxBsfraKqhQZ/Xw== 334 | dependencies: 335 | "@babel/helper-module-imports" "^8.0.0-beta.3" 336 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 337 | "@babel/helper-remap-async-to-generator" "^8.0.0-beta.3" 338 | 339 | "@babel/plugin-transform-block-scoped-functions@^8.0.0-beta.3": 340 | version "8.0.0-beta.3" 341 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-8.0.0-beta.3.tgz#bf1d17015012c3b8a24b5fb11f08d04c9532a55f" 342 | integrity sha512-0pIEqxOiY4YCTHtElJyMuCo+U9jKGF1iuE96bdZZ5SJhtapl5ltydjUKsFdcQhoWj3bJ6TWmbcF3cxtummooTA== 343 | dependencies: 344 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 345 | 346 | "@babel/plugin-transform-block-scoping@^8.0.0-beta.3": 347 | version "8.0.0-beta.3" 348 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-8.0.0-beta.3.tgz#8e9e9ed5f9d52131d3bf9680c21bd10c201fbfc2" 349 | integrity sha512-wS0ss1VN1uEhIW+sAOiWjUu7/V1vJfFHJ9Pu2y7DpHmo+tbA9/NVVFzFpfMyPTfW33zTfwnT6wLETw8HTL6PXg== 350 | dependencies: 351 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 352 | 353 | "@babel/plugin-transform-class-properties@^8.0.0-beta.3": 354 | version "8.0.0-beta.3" 355 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-8.0.0-beta.3.tgz#4a4c4099b89861f52548d03d38427751636bb5cd" 356 | integrity sha512-GzQtf/kXrLiL9j30VU+7z2Xjq0hLQDi5C6rGCiq0W77JRCXq3EXqD9oDloCDbb6p4PULzJ2frUkQJWUT5uvdog== 357 | dependencies: 358 | "@babel/helper-create-class-features-plugin" "^8.0.0-beta.3" 359 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 360 | 361 | "@babel/plugin-transform-class-static-block@^8.0.0-beta.3": 362 | version "8.0.0-beta.3" 363 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-8.0.0-beta.3.tgz#59f8a7ff850ae8ae528d09bc50d543d996879080" 364 | integrity sha512-j51E8VJpFSNoY17IbkgE8KDCtufkoykYFFiUOtyeJmot543x1b+Nf6HTNjHwn3pDIQ7kZ4YYxczQTqxg4sbkrA== 365 | dependencies: 366 | "@babel/helper-create-class-features-plugin" "^8.0.0-beta.3" 367 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 368 | 369 | "@babel/plugin-transform-classes@^8.0.0-beta.3": 370 | version "8.0.0-beta.3" 371 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-8.0.0-beta.3.tgz#bee7c099f2987c18558f6b3c8fc64110a6080a24" 372 | integrity sha512-WaZ0knT2BGTUQHS4YGWR5sv/b+bdscT7CiHJuJkuML8i1GAW9rc1nGTCGaYT/o3hc26Iy0xH9Tkfr6LZiU9Btw== 373 | dependencies: 374 | "@babel/helper-annotate-as-pure" "^8.0.0-beta.3" 375 | "@babel/helper-compilation-targets" "^8.0.0-beta.3" 376 | "@babel/helper-globals" "^8.0.0-beta.3" 377 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 378 | "@babel/helper-replace-supers" "^8.0.0-beta.3" 379 | "@babel/traverse" "^8.0.0-beta.3" 380 | 381 | "@babel/plugin-transform-computed-properties@^8.0.0-beta.3": 382 | version "8.0.0-beta.3" 383 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-8.0.0-beta.3.tgz#e5f8cebbb7790007394e35db784688839c69dc7f" 384 | integrity sha512-iAVxdcR9GIrvQ+f0+nuSvqQWNm/512K/A4O/dmuHYIENVk5m/5HssqBISl63geeLeTKEgCPEDUJXylFriaaK9w== 385 | dependencies: 386 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 387 | "@babel/template" "^8.0.0-beta.3" 388 | 389 | "@babel/plugin-transform-destructuring@^8.0.0-beta.3": 390 | version "8.0.0-beta.3" 391 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-8.0.0-beta.3.tgz#f31790796ffc1c26919d3c00175600a3cd911f86" 392 | integrity sha512-NRpgq7ir6fAhhTjm7Rfyl6QaKCheFLi6pXT83lZF5GGQiLMczL/oCwjOdO9rcyjz1fxnnKJOk7ipZ1dMTj3+hw== 393 | dependencies: 394 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 395 | "@babel/traverse" "^8.0.0-beta.3" 396 | 397 | "@babel/plugin-transform-dotall-regex@^8.0.0-beta.3": 398 | version "8.0.0-beta.3" 399 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-8.0.0-beta.3.tgz#4746e9e88a222c0bb6cf285869400a094f8431f6" 400 | integrity sha512-mScdPuKY3PshfvlWqGg2ash8PtAZkpDf1E8VESi2lGYlYge/boDbJXtTA3gcrYhvFuf8YkeENZCYu7+pZ/F26w== 401 | dependencies: 402 | "@babel/helper-create-regexp-features-plugin" "^8.0.0-beta.3" 403 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 404 | 405 | "@babel/plugin-transform-duplicate-keys@^8.0.0-beta.3": 406 | version "8.0.0-beta.3" 407 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-8.0.0-beta.3.tgz#7ac094d20414dfbf6fe0cbb0a72e9e506dd37625" 408 | integrity sha512-fMjtMUNtpkPhI4WY5ZoVcFw6i3go9+ECHdl3AbSEX2cEJdPBhqiO/WJ4f7kbYyNUQmKYhH5RYq3fFcoMDvgQHQ== 409 | dependencies: 410 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 411 | 412 | "@babel/plugin-transform-duplicate-named-capturing-groups-regex@^8.0.0-beta.3": 413 | version "8.0.0-beta.3" 414 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-8.0.0-beta.3.tgz#6f481d107ec3b0df3e7c6dff271069b463913875" 415 | integrity sha512-fxqdbqUjKKTRGiMYRpo5tIzmrUt3ODOcVQb7lU5KQuFN1cUGT6sxJ7YMOnywB1VTest5Izznw672Fz4o0I/r6g== 416 | dependencies: 417 | "@babel/helper-create-regexp-features-plugin" "^8.0.0-beta.3" 418 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 419 | 420 | "@babel/plugin-transform-dynamic-import@^8.0.0-beta.3": 421 | version "8.0.0-beta.3" 422 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-8.0.0-beta.3.tgz#5a260f52bfc431e0f3133eb9fa06f558d2e8af35" 423 | integrity sha512-3v71k4AymYhduEShNIPtzVPd3lmVaOhO6E1RwtfpWefOT/OoZBJizWu552nfngl3vhtY8FeWI823thpBTpHyRQ== 424 | dependencies: 425 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 426 | 427 | "@babel/plugin-transform-explicit-resource-management@^8.0.0-beta.3": 428 | version "8.0.0-beta.3" 429 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-8.0.0-beta.3.tgz#da113b4350e8f7278b57566edd98e40747b44407" 430 | integrity sha512-kzR0ZIMqeOa9KOCBGmtJO7fy/nV4ZaWBkcPWmi3CTBR7OOovcuBkvynN5oJxthtAUw8fH3d1HB3JMBtyyAoDbA== 431 | dependencies: 432 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 433 | "@babel/plugin-transform-destructuring" "^8.0.0-beta.3" 434 | 435 | "@babel/plugin-transform-exponentiation-operator@^8.0.0-beta.3": 436 | version "8.0.0-beta.3" 437 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-8.0.0-beta.3.tgz#4c18307acefa4cd2720b3f79de9971f9d42de447" 438 | integrity sha512-T5XVdibk0+5zb1aTtUYls27ecF9crUaAdcvOFH0NVAFdgZjmgpQkS8MMUlY+xx5TUjJgLf5NyNvGKCmJfJkiaQ== 439 | dependencies: 440 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 441 | 442 | "@babel/plugin-transform-export-namespace-from@^8.0.0-beta.3": 443 | version "8.0.0-beta.3" 444 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-8.0.0-beta.3.tgz#66a1fc399a9a3c992fdeed9ce18817e324c7632e" 445 | integrity sha512-poTUx3C3QetMsiS3dnBIivRyS6qp5EV0AA0Q//rtAyFB4do4Eqw740ROBltIZrR6m1ahmsznVt90PTsvSxljmQ== 446 | dependencies: 447 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 448 | 449 | "@babel/plugin-transform-for-of@^8.0.0-beta.3": 450 | version "8.0.0-beta.3" 451 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-8.0.0-beta.3.tgz#6ff8232fe33973d5a99482e7a5440aa154eaaf1b" 452 | integrity sha512-NqwPxFpnMQS8zcr8Z0wyDpjHifpf/2imL2CeReRRY5XlsitOQpKYyd789IJQZtIsnWh2RZqZ9j87s7Tju8Hh1Q== 453 | dependencies: 454 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 455 | "@babel/helper-skip-transparent-expression-wrappers" "^8.0.0-beta.3" 456 | 457 | "@babel/plugin-transform-function-name@^8.0.0-beta.3": 458 | version "8.0.0-beta.3" 459 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-8.0.0-beta.3.tgz#cc0b6346cd5cb06973936fb3a995531a8f81d2fe" 460 | integrity sha512-H6HVFQUvHB7wSj1mctMLxIReCQQRfuRFhkK21xh6ByNWqXxQ/rrvbGyzHwY4tgrfMuUheuWkt1PB3pS9yFU4ag== 461 | dependencies: 462 | "@babel/helper-compilation-targets" "^8.0.0-beta.3" 463 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 464 | 465 | "@babel/plugin-transform-json-strings@^8.0.0-beta.3": 466 | version "8.0.0-beta.3" 467 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-8.0.0-beta.3.tgz#21de9e8664f385124760e91c95e0e03bb9db732b" 468 | integrity sha512-KKANzuCn0VLJ10HSp7wWDMwdlCo0eTddJUBTzNsnJXXmaf1+7mscoS3PfFFz3iPpen3L7U8ZfIy0EBECs9bOww== 469 | dependencies: 470 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 471 | 472 | "@babel/plugin-transform-literals@^8.0.0-beta.3": 473 | version "8.0.0-beta.3" 474 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-8.0.0-beta.3.tgz#5f7b9400c01b96b4598f0b4fd8441a2c4f6fa460" 475 | integrity sha512-PiBOnjnQ8rgyx5bH4AhrfEsCJbmKN/sbB3cg5PiOECwCjhavlmeA6yQNQO6l+xuCq5UgBi5PjNCIvkk57ZGKcg== 476 | dependencies: 477 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 478 | 479 | "@babel/plugin-transform-logical-assignment-operators@^8.0.0-beta.3": 480 | version "8.0.0-beta.3" 481 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-8.0.0-beta.3.tgz#67fde00584a5cb69fae92a08175505ce8598a431" 482 | integrity sha512-75JMAPVnaxpCQNNAt1Mn1mDJ5kiDSeY7DMIR5kLD1vVCOtzp2vRPKQjTT7pVeWbOD8VZDhgXoRZT0XyWd9GZyw== 483 | dependencies: 484 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 485 | 486 | "@babel/plugin-transform-member-expression-literals@^8.0.0-beta.3": 487 | version "8.0.0-beta.3" 488 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-8.0.0-beta.3.tgz#d772f0bbcebfb4e72150dc21cf21fa600ec60886" 489 | integrity sha512-NDwf4Tw8cX0Hats9mg+NLfb032rggzWrqq/riXfmmvpGlCPNRdibv6wWw5DiTiOoRQUPJdvVJr7hKN1dfT4BAw== 490 | dependencies: 491 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 492 | 493 | "@babel/plugin-transform-modules-amd@^8.0.0-beta.3": 494 | version "8.0.0-beta.3" 495 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-8.0.0-beta.3.tgz#4b82d4e351bf10663d3c2974ae136f473e1a0778" 496 | integrity sha512-Sf3tdAT0LEaAYQqwwQaR8f3UxzH/IfsVGar3lD6ccoB7xbHgYzPVKYW3BcmW8VsaQgtlUMvnQ5nO/fWOmuv1ew== 497 | dependencies: 498 | "@babel/helper-module-transforms" "^8.0.0-beta.3" 499 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 500 | 501 | "@babel/plugin-transform-modules-commonjs@^8.0.0-beta.3": 502 | version "8.0.0-beta.3" 503 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-8.0.0-beta.3.tgz#e86008d2f6091d5d5027407ee181c7f8f0a74de2" 504 | integrity sha512-roHujOknroBT5R8KNeOBAYNwkcx+hivke20D1ddTQSP5+808A3boR28iW1fkAA4yVhDb+YzQH/L1bFu2+QDkfg== 505 | dependencies: 506 | "@babel/helper-module-transforms" "^8.0.0-beta.3" 507 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 508 | 509 | "@babel/plugin-transform-modules-systemjs@^8.0.0-beta.3": 510 | version "8.0.0-beta.3" 511 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-8.0.0-beta.3.tgz#c9ed3ba0b4b2131561bb65c3736b931f13482df0" 512 | integrity sha512-ov+OzAgz3BtPuehIM2u13S5bHrJeOnnofyWtjTYvhWY/PveBl5kkoSPvWapr6f2PXcjR09hpG+SGL7m/2VEp8g== 513 | dependencies: 514 | "@babel/helper-module-transforms" "^8.0.0-beta.3" 515 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 516 | "@babel/helper-validator-identifier" "^8.0.0-beta.3" 517 | 518 | "@babel/plugin-transform-modules-umd@^8.0.0-beta.3": 519 | version "8.0.0-beta.3" 520 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-8.0.0-beta.3.tgz#8f8061b2bb0b383924760b4b0b62cb0ced5be239" 521 | integrity sha512-GJktSnNxE4UFV3X47V+pfCQoNHo8ffYp07LDAXMQoSVUMMtlYqTYai9JojEug8jdO02TisdsHTbXhWpRmtjmZA== 522 | dependencies: 523 | "@babel/helper-module-transforms" "^8.0.0-beta.3" 524 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 525 | 526 | "@babel/plugin-transform-named-capturing-groups-regex@^8.0.0-beta.3": 527 | version "8.0.0-beta.3" 528 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-8.0.0-beta.3.tgz#38ebb41cc9b916b793df7f50f7b707ddea3871e0" 529 | integrity sha512-rfZ69fZDObqep3rKtSeuRyry8d76nNOnYD9M0+GZ98y2461zsVRuA6+24cetufIiN3GUKYU+bKRWiBK/QWhD9g== 530 | dependencies: 531 | "@babel/helper-create-regexp-features-plugin" "^8.0.0-beta.3" 532 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 533 | 534 | "@babel/plugin-transform-new-target@^8.0.0-beta.3": 535 | version "8.0.0-beta.3" 536 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-8.0.0-beta.3.tgz#e8e1a4245a108886f9c17093af76d9324060979e" 537 | integrity sha512-qXqX34+Q1ex4VAST9wrtS1zceGi//hPhjv45dyIQFNwmgp8L1+Bh/DdB2ZvEiekCnC0WYG87w6gCKj5TF1V+pQ== 538 | dependencies: 539 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 540 | 541 | "@babel/plugin-transform-nullish-coalescing-operator@^8.0.0-beta.3": 542 | version "8.0.0-beta.3" 543 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-8.0.0-beta.3.tgz#08713f273af1a724c44ba3bd68aaa0c25b988be2" 544 | integrity sha512-MPXGBhB/YLAkLaU2vbZU/IJl7p3OQccAEYhbUKTZYaC4pqqhFiuvQHRNiBx3k65756sKgZDnu83k+/POOdOiTA== 545 | dependencies: 546 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 547 | 548 | "@babel/plugin-transform-numeric-separator@^8.0.0-beta.3": 549 | version "8.0.0-beta.3" 550 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-8.0.0-beta.3.tgz#ccc0df2db95e3c9d280b9840e5f98011572bfcc7" 551 | integrity sha512-FIWA78xgT/aariiKDD+mj6cYZNT0+2nO7JXVUfo1tmzUxxVo2GFlwtzc2PrTvZai5Kec5KKwp+qH1bY5ggOkRA== 552 | dependencies: 553 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 554 | 555 | "@babel/plugin-transform-object-rest-spread@^8.0.0-beta.3": 556 | version "8.0.0-beta.3" 557 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-8.0.0-beta.3.tgz#2aebafba99957e6aada89053cf88fb3f34c501ad" 558 | integrity sha512-tQInGn6yDOg22tFu/rth+ZoRTjV6p3L5RDRSJpRMDh/nIsAT6fMyTjnFOiJRkK72bIt3Yuh8HtOAw90CICNkNA== 559 | dependencies: 560 | "@babel/helper-compilation-targets" "^8.0.0-beta.3" 561 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 562 | "@babel/plugin-transform-destructuring" "^8.0.0-beta.3" 563 | "@babel/plugin-transform-parameters" "^8.0.0-beta.3" 564 | "@babel/traverse" "^8.0.0-beta.3" 565 | 566 | "@babel/plugin-transform-object-super@^8.0.0-beta.3": 567 | version "8.0.0-beta.3" 568 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-8.0.0-beta.3.tgz#e3f7594e5fcbe9d69520b48be447f628ef2a2268" 569 | integrity sha512-Mxs0RWt4+FHTdtQPisHlAcPoQD+XkhJB41UxbRmkMHphMFtvi6DKvjnVqbpLjAQG/Vo23CS39uejbTjoaP6kyg== 570 | dependencies: 571 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 572 | "@babel/helper-replace-supers" "^8.0.0-beta.3" 573 | 574 | "@babel/plugin-transform-optional-catch-binding@^8.0.0-beta.3": 575 | version "8.0.0-beta.3" 576 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-8.0.0-beta.3.tgz#11a18c2b475b2afc42e8d318cb4c794db9472eec" 577 | integrity sha512-EGbugGymPyfxm3bXTgNEV2L/0ZpMozF+XP6G2YYxOhH0CZV0OLkl8LegH1sCQtBz9mVsu6SDIZzZNJKp1rNAXg== 578 | dependencies: 579 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 580 | 581 | "@babel/plugin-transform-optional-chaining@^8.0.0-beta.3": 582 | version "8.0.0-beta.3" 583 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-8.0.0-beta.3.tgz#d0dbd14e7bc5fce962c546ceb48e7e669e43183e" 584 | integrity sha512-D1MB99+Iqqx/X6xNSCnZY3wMaiMk+nc1YQYsqvs7YZmXavY/5xrPDm1CfbqAJHCd0IjaSgJDcqKqOAFQr85hyw== 585 | dependencies: 586 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 587 | "@babel/helper-skip-transparent-expression-wrappers" "^8.0.0-beta.3" 588 | 589 | "@babel/plugin-transform-parameters@^8.0.0-beta.3": 590 | version "8.0.0-beta.3" 591 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-8.0.0-beta.3.tgz#c4119d514c3c8533fc637139f38e46424f8d588f" 592 | integrity sha512-HTUF27Bv6lwqDv/AeuHBV32S80r5QvkDg1B3yimLw9V7G+NbFwFX4M9o8WJ0DwI7NKJ9zyaW7BD8Z8gjTTC99g== 593 | dependencies: 594 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 595 | 596 | "@babel/plugin-transform-private-methods@^8.0.0-beta.3": 597 | version "8.0.0-beta.3" 598 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-8.0.0-beta.3.tgz#740cea974c341c5d989fdb1bdb3f1f210f660726" 599 | integrity sha512-NALmqBE2TucAkB31Efzwgl6F2dCyUoNN0N79kIAesKEhS2gbyfPw0UgeyseNIaRZnrDfcrFo4/Mq/G1STZRqbg== 600 | dependencies: 601 | "@babel/helper-create-class-features-plugin" "^8.0.0-beta.3" 602 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 603 | 604 | "@babel/plugin-transform-private-property-in-object@^8.0.0-beta.3": 605 | version "8.0.0-beta.3" 606 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-8.0.0-beta.3.tgz#b51d7e274c3ff6846a74e928c5a9909d42cea391" 607 | integrity sha512-usSfCm7Ui0tYPpimSjjao5RtgGJY55RGajuNuoJKQ540lKPgRpJ+ciyd6dbMvcjIXhjAQrkkuxHjgdsBO9tJ+g== 608 | dependencies: 609 | "@babel/helper-annotate-as-pure" "^8.0.0-beta.3" 610 | "@babel/helper-create-class-features-plugin" "^8.0.0-beta.3" 611 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 612 | 613 | "@babel/plugin-transform-property-literals@^8.0.0-beta.3": 614 | version "8.0.0-beta.3" 615 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-8.0.0-beta.3.tgz#c582f48911a1410934e77e7f8be05812e6a359ee" 616 | integrity sha512-FB5ELEjk7Q8bXQgqLMiGTQ7nWPDA1SwI5oaG2iZnqzv9/2h7rLsTKQU9qYJdV101yf9zFPPW+ofFgDlKQS/h+w== 617 | dependencies: 618 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 619 | 620 | "@babel/plugin-transform-regenerator@^8.0.0-beta.3": 621 | version "8.0.0-beta.3" 622 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-8.0.0-beta.3.tgz#33da9ebaf97aea593cd62d9f85def16d6e9a432b" 623 | integrity sha512-JSzO7fOh493D0PAo/kHDoIEwwllQryNAEQZaFMjL3kkbyFtvLnppQZWKxvsEVnIv5HT5xoQY3Lz9ap36yCx2xw== 624 | dependencies: 625 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 626 | 627 | "@babel/plugin-transform-regexp-modifiers@^8.0.0-beta.3": 628 | version "8.0.0-beta.3" 629 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-8.0.0-beta.3.tgz#c8f31fe0787a15ffc98bd4e679003cf24ed5f2ee" 630 | integrity sha512-hNRAx3yyNaAC3VDev9uiC457khAs1FAmpJb0m7yfcRtPCYr2pz5AD/EVZe3y807L0JYGnNXE6fnLtdF+x8MXtA== 631 | dependencies: 632 | "@babel/helper-create-regexp-features-plugin" "^8.0.0-beta.3" 633 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 634 | 635 | "@babel/plugin-transform-reserved-words@^8.0.0-beta.3": 636 | version "8.0.0-beta.3" 637 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-8.0.0-beta.3.tgz#04937a8f62dc25bcdfaa7e3a5acaeea404056397" 638 | integrity sha512-LlP/BAYi4iMbkSweq0so6wKzCxzwPfyQdjwlSSfv7DAB8QUCgksanagXpYE1u8Daqb9N6q8sPjewQ66l4+DEfg== 639 | dependencies: 640 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 641 | 642 | "@babel/plugin-transform-shorthand-properties@^8.0.0-beta.3": 643 | version "8.0.0-beta.3" 644 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-8.0.0-beta.3.tgz#e220af3527c4452aa9c950b426964c60bfc4f4d7" 645 | integrity sha512-7+AwivgZd79iUuwxU7epEjgepqc5s/ornf6QYFwpdQArEG7q04bl1lUsgUBlq78MNoBnzkJS3nKFBcXHrFooDQ== 646 | dependencies: 647 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 648 | 649 | "@babel/plugin-transform-spread@^8.0.0-beta.3": 650 | version "8.0.0-beta.3" 651 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-8.0.0-beta.3.tgz#2a50a92e5abfc1a979037b828999a39c43959761" 652 | integrity sha512-S+SNsNKfwbJiMdndO8kOlkqTXW4RsV5djHXcpLBD7WpPewPGJJPMxqGcoN/s2sgzufciCoCZZ2/+iOsmIW8fNw== 653 | dependencies: 654 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 655 | "@babel/helper-skip-transparent-expression-wrappers" "^8.0.0-beta.3" 656 | 657 | "@babel/plugin-transform-sticky-regex@^8.0.0-beta.3": 658 | version "8.0.0-beta.3" 659 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-8.0.0-beta.3.tgz#b2ac8c09587091441a79c4966a360bd8d5e066cd" 660 | integrity sha512-aALMYgxqQC5JHEFIgCtlW7hvzzIrXeRTcYZ5CvsUZxk5MiASIZHTwn3TFZtxM2qu6d6uvhTUkkgS73V4R+Gumw== 661 | dependencies: 662 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 663 | 664 | "@babel/plugin-transform-template-literals@^8.0.0-beta.3": 665 | version "8.0.0-beta.3" 666 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-8.0.0-beta.3.tgz#14c88813c44fc55c2e20fb28a43772c960818014" 667 | integrity sha512-pasvkRsuGf/fwNaOmnYQbduat3QC8emxVgt9lpjdDAj2c/lLJgrGWutc7ASA6R7D8WO+v8tBoHSKsurPB9m0GQ== 668 | dependencies: 669 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 670 | 671 | "@babel/plugin-transform-typeof-symbol@^8.0.0-beta.3": 672 | version "8.0.0-beta.3" 673 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-8.0.0-beta.3.tgz#07959f820da4acc5f75744118442e20d6f5149b8" 674 | integrity sha512-PO2VmD/fuPqakzSdGXrc1XXk5rT14rF02AIMgB7pJQQJVSzIMHxGvFIqYxkbWm+KznO6D0Q31Ao9ZbKk6G8P9Q== 675 | dependencies: 676 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 677 | 678 | "@babel/plugin-transform-typescript@^8.0.0-beta.3": 679 | version "8.0.0-beta.3" 680 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-8.0.0-beta.3.tgz#32d330f8cd63ee60e092f0618f0431a6e7cd980e" 681 | integrity sha512-Tnjvx7FLHSntPxfJHVvrQd9RqaccET+W8ZSQ+FkMrH/6ncLvTlrBTzJNCq1dwRn+XRt5xKsfTYVWmBhcmOpzFA== 682 | dependencies: 683 | "@babel/helper-annotate-as-pure" "^8.0.0-beta.3" 684 | "@babel/helper-create-class-features-plugin" "^8.0.0-beta.3" 685 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 686 | "@babel/helper-skip-transparent-expression-wrappers" "^8.0.0-beta.3" 687 | "@babel/plugin-syntax-typescript" "^8.0.0-beta.3" 688 | 689 | "@babel/plugin-transform-unicode-escapes@^8.0.0-beta.3": 690 | version "8.0.0-beta.3" 691 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-8.0.0-beta.3.tgz#f8de5dd7cebaeaccc24469613c5b4ae7ec15b00c" 692 | integrity sha512-HhJtLyJmcfVnBjulfbHtWVzdvW3RXl+N6SaHJ4mGLB+yMU/DuJLJ/tqaoTCli+7WnsZvcSVX48rRRcEesFoZvQ== 693 | dependencies: 694 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 695 | 696 | "@babel/plugin-transform-unicode-property-regex@^8.0.0-beta.3": 697 | version "8.0.0-beta.3" 698 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-8.0.0-beta.3.tgz#391bdeddb2533c104ebd02f95c729a35eb9df1d3" 699 | integrity sha512-wk8KU6gVekgZhI6PDyGkyspUNoRBy1+1fi661rbRyEqB+gzCgvxWpmrle2QfDHUC12J/1fC4huSU1j283JxTxA== 700 | dependencies: 701 | "@babel/helper-create-regexp-features-plugin" "^8.0.0-beta.3" 702 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 703 | 704 | "@babel/plugin-transform-unicode-regex@^8.0.0-beta.3": 705 | version "8.0.0-beta.3" 706 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-8.0.0-beta.3.tgz#a474240c72684b0ca3d376d25821cc05958a778a" 707 | integrity sha512-w9UIyU7NejTuwz68lmLxdOdBYLPoI0oO8GBiGtV1BECu9RXoa/wFO0qi85JbLzSryaB3n0eL8IYuHrMmJjNXaw== 708 | dependencies: 709 | "@babel/helper-create-regexp-features-plugin" "^8.0.0-beta.3" 710 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 711 | 712 | "@babel/plugin-transform-unicode-sets-regex@^8.0.0-beta.3": 713 | version "8.0.0-beta.3" 714 | resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-8.0.0-beta.3.tgz#f8feac1a1d2c817d34e4e6ff8545cbd85feb19c9" 715 | integrity sha512-MstyvMJMRAWDoIXiSA8IHHQmGQyxixAzr8Zjfpqh0a5eR/XMMzWlhQjE4UVKdtqNSHfkdX2dPXIzLvIHOdlpww== 716 | dependencies: 717 | "@babel/helper-create-regexp-features-plugin" "^8.0.0-beta.3" 718 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 719 | 720 | "@babel/preset-env@^8.0.0-beta.3": 721 | version "8.0.0-beta.3" 722 | resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-8.0.0-beta.3.tgz#a2127dcb5c8f156973acb70a0bb730d9dc9846e6" 723 | integrity sha512-+yVxQpbedb37nYq2DMYHbjsy6e4pv/SRqy/lm8Y9vlpjo8OiGICG7MSKdtv/WpLEjhf3EbT4STCnE4Tvsxxu4Q== 724 | dependencies: 725 | "@babel/compat-data" "^8.0.0-beta.3" 726 | "@babel/helper-compilation-targets" "^8.0.0-beta.3" 727 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 728 | "@babel/helper-validator-option" "^8.0.0-beta.3" 729 | "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^8.0.0-beta.3" 730 | "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^8.0.0-beta.3" 731 | "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^8.0.0-beta.3" 732 | "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^8.0.0-beta.3" 733 | "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^8.0.0-beta.3" 734 | "@babel/plugin-transform-arrow-functions" "^8.0.0-beta.3" 735 | "@babel/plugin-transform-async-generator-functions" "^8.0.0-beta.3" 736 | "@babel/plugin-transform-async-to-generator" "^8.0.0-beta.3" 737 | "@babel/plugin-transform-block-scoped-functions" "^8.0.0-beta.3" 738 | "@babel/plugin-transform-block-scoping" "^8.0.0-beta.3" 739 | "@babel/plugin-transform-class-properties" "^8.0.0-beta.3" 740 | "@babel/plugin-transform-class-static-block" "^8.0.0-beta.3" 741 | "@babel/plugin-transform-classes" "^8.0.0-beta.3" 742 | "@babel/plugin-transform-computed-properties" "^8.0.0-beta.3" 743 | "@babel/plugin-transform-destructuring" "^8.0.0-beta.3" 744 | "@babel/plugin-transform-dotall-regex" "^8.0.0-beta.3" 745 | "@babel/plugin-transform-duplicate-keys" "^8.0.0-beta.3" 746 | "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^8.0.0-beta.3" 747 | "@babel/plugin-transform-dynamic-import" "^8.0.0-beta.3" 748 | "@babel/plugin-transform-explicit-resource-management" "^8.0.0-beta.3" 749 | "@babel/plugin-transform-exponentiation-operator" "^8.0.0-beta.3" 750 | "@babel/plugin-transform-export-namespace-from" "^8.0.0-beta.3" 751 | "@babel/plugin-transform-for-of" "^8.0.0-beta.3" 752 | "@babel/plugin-transform-function-name" "^8.0.0-beta.3" 753 | "@babel/plugin-transform-json-strings" "^8.0.0-beta.3" 754 | "@babel/plugin-transform-literals" "^8.0.0-beta.3" 755 | "@babel/plugin-transform-logical-assignment-operators" "^8.0.0-beta.3" 756 | "@babel/plugin-transform-member-expression-literals" "^8.0.0-beta.3" 757 | "@babel/plugin-transform-modules-amd" "^8.0.0-beta.3" 758 | "@babel/plugin-transform-modules-commonjs" "^8.0.0-beta.3" 759 | "@babel/plugin-transform-modules-systemjs" "^8.0.0-beta.3" 760 | "@babel/plugin-transform-modules-umd" "^8.0.0-beta.3" 761 | "@babel/plugin-transform-named-capturing-groups-regex" "^8.0.0-beta.3" 762 | "@babel/plugin-transform-new-target" "^8.0.0-beta.3" 763 | "@babel/plugin-transform-nullish-coalescing-operator" "^8.0.0-beta.3" 764 | "@babel/plugin-transform-numeric-separator" "^8.0.0-beta.3" 765 | "@babel/plugin-transform-object-rest-spread" "^8.0.0-beta.3" 766 | "@babel/plugin-transform-object-super" "^8.0.0-beta.3" 767 | "@babel/plugin-transform-optional-catch-binding" "^8.0.0-beta.3" 768 | "@babel/plugin-transform-optional-chaining" "^8.0.0-beta.3" 769 | "@babel/plugin-transform-parameters" "^8.0.0-beta.3" 770 | "@babel/plugin-transform-private-methods" "^8.0.0-beta.3" 771 | "@babel/plugin-transform-private-property-in-object" "^8.0.0-beta.3" 772 | "@babel/plugin-transform-property-literals" "^8.0.0-beta.3" 773 | "@babel/plugin-transform-regenerator" "^8.0.0-beta.3" 774 | "@babel/plugin-transform-regexp-modifiers" "^8.0.0-beta.3" 775 | "@babel/plugin-transform-reserved-words" "^8.0.0-beta.3" 776 | "@babel/plugin-transform-shorthand-properties" "^8.0.0-beta.3" 777 | "@babel/plugin-transform-spread" "^8.0.0-beta.3" 778 | "@babel/plugin-transform-sticky-regex" "^8.0.0-beta.3" 779 | "@babel/plugin-transform-template-literals" "^8.0.0-beta.3" 780 | "@babel/plugin-transform-typeof-symbol" "^8.0.0-beta.3" 781 | "@babel/plugin-transform-unicode-escapes" "^8.0.0-beta.3" 782 | "@babel/plugin-transform-unicode-property-regex" "^8.0.0-beta.3" 783 | "@babel/plugin-transform-unicode-regex" "^8.0.0-beta.3" 784 | "@babel/plugin-transform-unicode-sets-regex" "^8.0.0-beta.3" 785 | "@babel/preset-modules" "0.1.6-no-external-plugins" 786 | babel-plugin-polyfill-corejs3 "^0.13.0" 787 | core-js-compat "^3.43.0" 788 | semver "^7.3.4" 789 | 790 | "@babel/preset-modules@0.1.6-no-external-plugins": 791 | version "0.1.6-no-external-plugins" 792 | resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" 793 | integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== 794 | dependencies: 795 | "@babel/helper-plugin-utils" "^7.0.0" 796 | "@babel/types" "^7.4.4" 797 | esutils "^2.0.2" 798 | 799 | "@babel/preset-typescript@^8.0.0-beta.3": 800 | version "8.0.0-beta.3" 801 | resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-8.0.0-beta.3.tgz#8abd8f2053c8eaf6322b48e0c1488c83b52da462" 802 | integrity sha512-b0K12cx9/M4ULmJPOEFRQz3AoBZ8oRmOrugTMxeUb5VxUI9DJqxikzGnVz6DaTcQ3XipVNS7Z4lyuu1xuep1SA== 803 | dependencies: 804 | "@babel/helper-plugin-utils" "^8.0.0-beta.3" 805 | "@babel/helper-validator-option" "^8.0.0-beta.3" 806 | "@babel/plugin-syntax-jsx" "^8.0.0-beta.3" 807 | "@babel/plugin-transform-modules-commonjs" "^8.0.0-beta.3" 808 | "@babel/plugin-transform-typescript" "^8.0.0-beta.3" 809 | 810 | "@babel/template@^8.0.0-beta.3": 811 | version "8.0.0-beta.3" 812 | resolved "https://registry.yarnpkg.com/@babel/template/-/template-8.0.0-beta.3.tgz#064e2446fd9c8dddfcf75b48786ea59492c69805" 813 | integrity sha512-81pXW7H54ULNZJjFKE5W/zjc2juIcWg+bIpZ1YiuYjFGF0xzoh7rSMrZ18AWJ6i+O84GMwW0kaFmnJCUYkyJTg== 814 | dependencies: 815 | "@babel/code-frame" "^8.0.0-beta.3" 816 | "@babel/parser" "^8.0.0-beta.3" 817 | "@babel/types" "^8.0.0-beta.3" 818 | 819 | "@babel/traverse@^8.0.0-beta.3": 820 | version "8.0.0-beta.3" 821 | resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-8.0.0-beta.3.tgz#28a70360f2380b7434c2e7581e976cffae9d74aa" 822 | integrity sha512-CHPsCP93tlyC8DuKsvITuLNQrktv2lSEWcCjWiMkehv+W34XfDxjWamIh/z2pDGYsUqZUQU9zknTi+8QxcAo8A== 823 | dependencies: 824 | "@babel/code-frame" "^8.0.0-beta.3" 825 | "@babel/generator" "^8.0.0-beta.3" 826 | "@babel/helper-globals" "^8.0.0-beta.3" 827 | "@babel/parser" "^8.0.0-beta.3" 828 | "@babel/template" "^8.0.0-beta.3" 829 | "@babel/types" "^8.0.0-beta.3" 830 | debug "^4.3.1" 831 | 832 | "@babel/types@^7.4.4": 833 | version "7.28.5" 834 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.5.tgz#10fc405f60897c35f07e85493c932c7b5ca0592b" 835 | integrity sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA== 836 | dependencies: 837 | "@babel/helper-string-parser" "^7.27.1" 838 | "@babel/helper-validator-identifier" "^7.28.5" 839 | 840 | "@babel/types@^8.0.0-beta.3": 841 | version "8.0.0-beta.3" 842 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-8.0.0-beta.3.tgz#416e850e7c9de84be79510bef0976aaeae8937c2" 843 | integrity sha512-ZGM+wROHjwHhVGpt7h3MumJk4rGi0LEYFuoCr4uX9FjdbPVFsU790NYFgVmUI5nZFCl0M6MJi9QKTpwXvg+pwA== 844 | dependencies: 845 | "@babel/helper-string-parser" "^8.0.0-beta.3" 846 | "@babel/helper-validator-identifier" "^8.0.0-beta.3" 847 | 848 | "@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": 849 | version "0.3.13" 850 | resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f" 851 | integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== 852 | dependencies: 853 | "@jridgewell/sourcemap-codec" "^1.5.0" 854 | "@jridgewell/trace-mapping" "^0.3.24" 855 | 856 | "@jridgewell/remapping@^2.3.5": 857 | version "2.3.5" 858 | resolved "https://registry.yarnpkg.com/@jridgewell/remapping/-/remapping-2.3.5.tgz#375c476d1972947851ba1e15ae8f123047445aa1" 859 | integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== 860 | dependencies: 861 | "@jridgewell/gen-mapping" "^0.3.5" 862 | "@jridgewell/trace-mapping" "^0.3.24" 863 | 864 | "@jridgewell/resolve-uri@^3.1.0": 865 | version "3.1.2" 866 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" 867 | integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== 868 | 869 | "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": 870 | version "1.5.5" 871 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" 872 | integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== 873 | 874 | "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28": 875 | version "0.3.31" 876 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0" 877 | integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== 878 | dependencies: 879 | "@jridgewell/resolve-uri" "^3.1.0" 880 | "@jridgewell/sourcemap-codec" "^1.4.14" 881 | 882 | "@types/gensync@^1.0.0": 883 | version "1.0.4" 884 | resolved "https://registry.yarnpkg.com/@types/gensync/-/gensync-1.0.4.tgz#7122d8f0cd3bf437f9725cc95b180197190cf50b" 885 | integrity sha512-C3YYeRQWp2fmq9OryX+FoDy8nXS6scQ7dPptD8LnFDAUNcKWJjXQKDNJD3HVm+kOUsXhTOkpi69vI4EuAr95bA== 886 | 887 | "@types/jsesc@^2.5.0": 888 | version "2.5.1" 889 | resolved "https://registry.yarnpkg.com/@types/jsesc/-/jsesc-2.5.1.tgz#c34defc608ec94b68dc6a12a581b440942c6d503" 890 | integrity sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw== 891 | 892 | babel-plugin-polyfill-corejs3@^0.13.0: 893 | version "0.13.0" 894 | resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz#bb7f6aeef7addff17f7602a08a6d19a128c30164" 895 | integrity sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A== 896 | dependencies: 897 | "@babel/helper-define-polyfill-provider" "^0.6.5" 898 | core-js-compat "^3.43.0" 899 | 900 | baseline-browser-mapping@^2.8.19: 901 | version "2.8.20" 902 | resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.8.20.tgz#6766cf270f3668d20b6712b9c54cc911b87da714" 903 | integrity sha512-JMWsdF+O8Orq3EMukbUN1QfbLK9mX2CkUmQBcW2T0s8OmdAUL5LLM/6wFwSrqXzlXB13yhyK9gTKS1rIizOduQ== 904 | 905 | browserslist@^4.24.0, browserslist@^4.26.3: 906 | version "4.27.0" 907 | resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.27.0.tgz#755654744feae978fbb123718b2f139bc0fa6697" 908 | integrity sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw== 909 | dependencies: 910 | baseline-browser-mapping "^2.8.19" 911 | caniuse-lite "^1.0.30001751" 912 | electron-to-chromium "^1.5.238" 913 | node-releases "^2.0.26" 914 | update-browserslist-db "^1.1.4" 915 | 916 | caniuse-lite@^1.0.30001751: 917 | version "1.0.30001751" 918 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz#dacd5d9f4baeea841641640139d2b2a4df4226ad" 919 | integrity sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw== 920 | 921 | convert-source-map@^2.0.0: 922 | version "2.0.0" 923 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" 924 | integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== 925 | 926 | core-js-compat@^3.43.0: 927 | version "3.46.0" 928 | resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.46.0.tgz#0c87126a19a1af00371e12b02a2b088a40f3c6f7" 929 | integrity sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law== 930 | dependencies: 931 | browserslist "^4.26.3" 932 | 933 | debug@^4.1.0, debug@^4.3.1, debug@^4.4.1: 934 | version "4.4.3" 935 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" 936 | integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== 937 | dependencies: 938 | ms "^2.1.3" 939 | 940 | electron-to-chromium@^1.5.238: 941 | version "1.5.240" 942 | resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.240.tgz#bfd946570a723aa3754370065d02e23e30824774" 943 | integrity sha512-OBwbZjWgrCOH+g6uJsA2/7Twpas2OlepS9uvByJjR2datRDuKGYeD+nP8lBBks2qnB7bGJNHDUx7c/YLaT3QMQ== 944 | 945 | escalade@^3.2.0: 946 | version "3.2.0" 947 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" 948 | integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== 949 | 950 | esutils@^2.0.2: 951 | version "2.0.3" 952 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 953 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 954 | 955 | function-bind@^1.1.2: 956 | version "1.1.2" 957 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" 958 | integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== 959 | 960 | gensync@^1.0.0-beta.2: 961 | version "1.0.0-beta.2" 962 | resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" 963 | integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== 964 | 965 | hasown@^2.0.2: 966 | version "2.0.2" 967 | resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" 968 | integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== 969 | dependencies: 970 | function-bind "^1.1.2" 971 | 972 | is-core-module@^2.16.1: 973 | version "2.16.1" 974 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" 975 | integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== 976 | dependencies: 977 | hasown "^2.0.2" 978 | 979 | js-tokens@^8.0.0: 980 | version "8.0.3" 981 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-8.0.3.tgz#1c407ec905643603b38b6be6977300406ec48775" 982 | integrity sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw== 983 | 984 | jsesc@^3.0.2, jsesc@~3.1.0: 985 | version "3.1.0" 986 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" 987 | integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== 988 | 989 | json5@^2.2.3: 990 | version "2.2.3" 991 | resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" 992 | integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== 993 | 994 | lodash.debounce@^4.0.8: 995 | version "4.0.8" 996 | resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" 997 | integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== 998 | 999 | lru-cache@^5.1.1: 1000 | version "5.1.1" 1001 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" 1002 | integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== 1003 | dependencies: 1004 | yallist "^3.0.2" 1005 | 1006 | lru-cache@^7.14.1: 1007 | version "7.18.3" 1008 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" 1009 | integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== 1010 | 1011 | ms@^2.1.3: 1012 | version "2.1.3" 1013 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 1014 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1015 | 1016 | node-releases@^2.0.26: 1017 | version "2.0.26" 1018 | resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.26.tgz#fdfa272f2718a1309489d18aef4ef5ba7f5dfb52" 1019 | integrity sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA== 1020 | 1021 | path-parse@^1.0.7: 1022 | version "1.0.7" 1023 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 1024 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 1025 | 1026 | picocolors@^1.1.1: 1027 | version "1.1.1" 1028 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" 1029 | integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== 1030 | 1031 | regenerate-unicode-properties@^10.2.2: 1032 | version "10.2.2" 1033 | resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz#aa113812ba899b630658c7623466be71e1f86f66" 1034 | integrity sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g== 1035 | dependencies: 1036 | regenerate "^1.4.2" 1037 | 1038 | regenerate@^1.4.2: 1039 | version "1.4.2" 1040 | resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" 1041 | integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== 1042 | 1043 | regexpu-core@^6.3.1: 1044 | version "6.4.0" 1045 | resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.4.0.tgz#3580ce0c4faedef599eccb146612436b62a176e5" 1046 | integrity sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA== 1047 | dependencies: 1048 | regenerate "^1.4.2" 1049 | regenerate-unicode-properties "^10.2.2" 1050 | regjsgen "^0.8.0" 1051 | regjsparser "^0.13.0" 1052 | unicode-match-property-ecmascript "^2.0.0" 1053 | unicode-match-property-value-ecmascript "^2.2.1" 1054 | 1055 | regjsgen@^0.8.0: 1056 | version "0.8.0" 1057 | resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab" 1058 | integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== 1059 | 1060 | regjsparser@^0.13.0: 1061 | version "0.13.0" 1062 | resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.13.0.tgz#01f8351335cf7898d43686bc74d2dd71c847ecc0" 1063 | integrity sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q== 1064 | dependencies: 1065 | jsesc "~3.1.0" 1066 | 1067 | resolve@^1.22.10: 1068 | version "1.22.11" 1069 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.11.tgz#aad857ce1ffb8bfa9b0b1ac29f1156383f68c262" 1070 | integrity sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ== 1071 | dependencies: 1072 | is-core-module "^2.16.1" 1073 | path-parse "^1.0.7" 1074 | supports-preserve-symlinks-flag "^1.0.0" 1075 | 1076 | semver@^6.3.1: 1077 | version "6.3.1" 1078 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" 1079 | integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== 1080 | 1081 | semver@^7.3.4: 1082 | version "7.7.3" 1083 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.3.tgz#4b5f4143d007633a8dc671cd0a6ef9147b8bb946" 1084 | integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== 1085 | 1086 | supports-preserve-symlinks-flag@^1.0.0: 1087 | version "1.0.0" 1088 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 1089 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 1090 | 1091 | unicode-canonical-property-names-ecmascript@^2.0.0: 1092 | version "2.0.1" 1093 | resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz#cb3173fe47ca743e228216e4a3ddc4c84d628cc2" 1094 | integrity sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg== 1095 | 1096 | unicode-match-property-ecmascript@^2.0.0: 1097 | version "2.0.0" 1098 | resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" 1099 | integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== 1100 | dependencies: 1101 | unicode-canonical-property-names-ecmascript "^2.0.0" 1102 | unicode-property-aliases-ecmascript "^2.0.0" 1103 | 1104 | unicode-match-property-value-ecmascript@^2.2.1: 1105 | version "2.2.1" 1106 | resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz#65a7adfad8574c219890e219285ce4c64ed67eaa" 1107 | integrity sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg== 1108 | 1109 | unicode-property-aliases-ecmascript@^2.0.0: 1110 | version "2.2.0" 1111 | resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz#301d4f8a43d2b75c97adfad87c9dd5350c9475d1" 1112 | integrity sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ== 1113 | 1114 | update-browserslist-db@^1.1.4: 1115 | version "1.1.4" 1116 | resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz#7802aa2ae91477f255b86e0e46dbc787a206ad4a" 1117 | integrity sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A== 1118 | dependencies: 1119 | escalade "^3.2.0" 1120 | picocolors "^1.1.1" 1121 | 1122 | yallist@^3.0.2: 1123 | version "3.1.1" 1124 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" 1125 | integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== 1126 | --------------------------------------------------------------------------------