├── .eslintrc.yml ├── .gitattributes ├── .github ├── CODEOWNERS └── workflows │ └── main.yml ├── .gitignore ├── README.md ├── index.js ├── jest.config.js ├── jest.setup.js ├── package-lock.json ├── package.json ├── src ├── Sync.d.ts ├── Sync.js ├── common.js ├── config.d.ts ├── config.js └── deindent.js ├── test ├── config.test.js ├── deindent.test.js ├── fixtures │ ├── dedent.md │ ├── docsync-config-full.yaml │ ├── docsync-config-min.yaml │ ├── empty-highlight.md │ ├── empty-select-path.md │ ├── empty-select.md │ ├── empty-test-local-files.md │ ├── expected-highlight.md │ ├── expected-select-path.md │ ├── expected-select.md │ ├── expected-test-local-files.md │ ├── index.md │ ├── index.txt │ ├── index_with_code.md │ ├── jsx-marker.mdx │ ├── mixed-markers.mdx │ ├── money_transfer_workflow.go │ ├── python.md │ └── regex_index.md └── sync.test.js └── yarn.lock /.eslintrc.yml: -------------------------------------------------------------------------------- 1 | env: 2 | browser: true 3 | es6: true 4 | mocha: true 5 | node: true 6 | parser: "babel-eslint" 7 | plugins: 8 | - jest 9 | extends: 10 | - "eslint:recommended" 11 | - "plugin:jest/recommended" 12 | parserOptions: 13 | env: 14 | es6: true 15 | sourceType: "module" 16 | rules: 17 | brace-style: 18 | - warn 19 | - 1tbs 20 | camelcase: off 21 | comma-dangle: 22 | - warn 23 | - always-multiline 24 | comma-style: 25 | - error 26 | - last 27 | complexity: error 28 | curly: warn 29 | eol-last: 30 | - error 31 | - always 32 | max-lines: off 33 | max-params: 34 | - error 35 | - 6 36 | no-duplicate-imports: error 37 | no-eq-null: error 38 | no-unused-vars: 39 | - off 40 | - argsIgnorePattern: "^_" 41 | no-eval: error 42 | no-implied-eval: error 43 | no-invalid-this: error 44 | no-shadow: error 45 | no-warning-comments: 46 | - warn 47 | - location: anywhere 48 | terms: 49 | - todo 50 | - fixme 51 | prefer-promise-reject-errors: error 52 | semi: error 53 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.js text eol=lf 2 | bin/* text eol=lf -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | # This repository is maintained by the Temporal Education team 2 | * @temporalio/education 3 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: ESLint 2 | on: push 3 | jobs: 4 | build: 5 | runs-on: ubuntu-latest 6 | steps: 7 | - uses: actions/checkout@v2 8 | - name: Install modules 9 | run: yarn 10 | - name: Run ESLint 11 | run: yarn eslint . --ext .js 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Dependencies 2 | node_modules 3 | 4 | # OS X temporary files 5 | .DS_Store 6 | .Trashes 7 | *.swp 8 | 9 | # Generated directory 10 | sync_repos 11 | 12 | # Test directories 13 | docs 14 | blog 15 | 16 | # Test operational config 17 | snipsync.config.yaml 18 | 19 | # Node stuff 20 | # 21 | # Logs 22 | log 23 | *.log 24 | npm-debug.log* 25 | 26 | # Test stuff 27 | test/.tmp 28 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Snipsync 2 | 3 | Snipsync makes sure your documented code snippets are always in sync with your Github repo source files. 4 | 5 | ## Prerequisites 6 | 7 | This tool requires [Node](https://nodejs.org/) v15.0.0 or above (recommended 15.2.1) and [Yarn](https://yarnpkg.com/). 8 | 9 | ## Install 10 | 11 | **Yarn**: 12 | 13 | ```bash 14 | yarn add snipsync 15 | ``` 16 | 17 | ## Configure 18 | 19 | Create a file called "snipsync.config.yaml" in the project root. 20 | This file specifies the following: 21 | 22 | - `origins`: The Github repositories or local files where the tool will look for source code snippets. 23 | - `targets`: The local directories that contain the files to be spliced with the code snippets. 24 | 25 | The `origins` property is a list of objects that have one of the following 2 formats: 26 | 27 | 1. `owner`, `repo`, and optionally `ref`: Pull snippets from a GitHub repo 28 | 2. `files`: a set of strings: 29 | - `pattern`: Relative path to load snippets from. Supports [glob](https://www.npmjs.com/package/glob) syntax. 30 | - `owner`: GitHub repo owner name, to be used in the source snippets links 31 | - `repo`: Name of the repo snipsync is being used in, to link to the source snippets 32 | - `ref`: (Optional, defaults to main) Used for writing source snippet links. 33 | 34 | If the `ref` key is left blank or not specified, then the most recent commit from the main branch will be used. 35 | If the `enable_source_link` key in `features` is not specified, then it will default to `true`. 36 | If the `enable_code_block` key in `features` is not specified, then it will default to `true`. 37 | 38 | The `allowed_target_extensions` key in `features` lets you set a list of extensions to scan. Specify extensions like `[.md,.txt]`. 39 | If the `allowed_target_extensions` key in `features` is not specified, then it defaults to an empty array (`[]`) and all files are scanned. 40 | 41 | The `enable_code_dedenting` key in `features` lets you remove leading spaces from indented code snippets. This is handy when you're including a snippet of code within a class or function and don't want to include the leading indentation. This is `false` by default. 42 | 43 | Example of a complete `snipsync.config.yaml`: 44 | 45 | ```yaml 46 | origins: 47 | - owner: temporalio 48 | repo: go-samples 49 | ref: 6880b0d09ddb6edf150e3095c90522602022578f 50 | - owner: temporalio 51 | repo: java-samples 52 | - files: 53 | pattern: ./sample-apps/typescript/*.ts 54 | owner: temporalio 55 | repo: documentation 56 | ref: main 57 | 58 | targets: 59 | - docs 60 | - blog 61 | 62 | features: 63 | enable_source_link: false 64 | enable_code_block: false 65 | allowed_target_extensions: [.md] 66 | enable_code_dedenting: false 67 | ``` 68 | 69 | Example of a bare minimum snipsync.config.yaml: 70 | 71 | ```yaml 72 | origins: 73 | - owner: temporalio 74 | repo: go-samples 75 | targets: 76 | - docs 77 | ``` 78 | 79 | ## Comment wrappers 80 | 81 | Use comments to identify code snippets and the locations where they should be merged. 82 | 83 | ### Source code 84 | 85 | In the source repo, wrap the code snippets in comments with a unique snippet identifier like this: 86 | 87 | ```go 88 | // @@@SNIPSTART hellouniverse 89 | func HelloUniverse() { 90 | fmt.Println("Hello Universe!") 91 | } 92 | // @@@SNIPEND 93 | ``` 94 | 95 | In the example above, "hellouniverse" is the unique identifier for the code snippet. 96 | 97 | Unique identifiers can contain letters, numbers, hyphens, and underscores. 98 | 99 | ### Target files 100 | 101 | In the target files wrap the location with comments that reference the identifier of the code snippet that will be placed there: 102 | 103 | ```md 104 | 105 | 106 | ``` 107 | 108 | In the example above, the "hellouniverse" code snippet will be spliced between the comments. 109 | Any text inside of the placeholders will be replaced by the code snippet when the tool runs. 110 | The tool will automatically specify the code type for markdown rendering. 111 | For example, if the source file ends in ".go" then the code section will be written like this: ` ```go ` 112 | 113 | #### Per-snip features 114 | 115 | To customize how a single snip is rendered, add a JSON feature configuration in the snip start line. 116 | 117 | ```md 118 | 119 | 120 | ``` 121 | 122 | **Selected lines** 123 | 124 | A single source code snippet may be used in multiple places. 125 | If so, you may wish to customize which lines are rendered. 126 | Add a "selected" configuration to the snip start line. 127 | 128 | ``` 129 | 130 | ``` 131 | 132 | The line numbers are **relative** to the snippet, not the source file. 133 | 134 | The feature supports multiple selections as either a single line or a range. 135 | 136 | **Highlighed lines** 137 | 138 | Some frameworks support highlighting code lines in code blocks. 139 | If so, you can add a "highlights" configuration to the snip start line. 140 | 141 | ``` 142 | 143 | ``` 144 | 145 | The line numbers are relative to the published snippet. 146 | That means that if selectedLines is used, the line numbers to highlight are relative to the pared down selection that is merged into the Markdown file. 147 | 148 | If you use Docusuarus, you just need to add some additional CSS: https://docusaurus.io/docs/markdown-features/code-blocks#line-highlighting 149 | 150 | **Regex snipping** 151 | 152 | Instead of specifying a set of line numbers to snip, you can use regular expression patterns to mark the start and end of a snip. 153 | Specify a `startPattern` and an `endPattern`: 154 | 155 | ``` 156 | 157 | ``` 158 | 159 | **Specifying a source file** 160 | 161 | If the named snippet you want to extract exists in multiple source repositories, provide the path to only that source file after the snippet name, followed by an `@`: 162 | 163 | ``` 164 | 165 | ``` 166 | 167 | ## Run 168 | 169 | From the root directory of your project run the following command: 170 | 171 | ```bash 172 | yarn snipsync 173 | ``` 174 | 175 | ### Remove snippets 176 | 177 | In some cases, you may want to remove the snippets from your target files. 178 | Use the `--clear` flag to do that: 179 | 180 | ``` 181 | yarn snipsync --clear 182 | ``` 183 | 184 | ## Development 185 | 186 | The snipsync tool is set up to run its own functionality during development. 187 | Git ignores the `snipsync.config.yaml` file and the `/docs` directory within the package itself. 188 | 189 | While developing, you can add files to `/docs` define the `snipsync.config.yaml` file, and 190 | run `yarn dev` to run snipsync from the root of the repo. 191 | 192 | To clear the snippets run `yarn dev --clear` 193 | 194 | ### Testing 195 | 196 | Run `yarn test` from the root of the repo to run the testing suites. -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | const logger = require('js-logger'); 3 | const { readConfig } = require('./src/config'); 4 | const { Sync } = require('./src/Sync'); 5 | 6 | logger.useDefaults(); 7 | const args = process.argv.slice(2); 8 | const cfg = readConfig(logger); 9 | const synctron = new Sync(cfg, logger); 10 | 11 | switch (args[0]) { 12 | case '--clear': 13 | synctron.clear(); 14 | break; 15 | default: 16 | synctron.run(); 17 | } 18 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | /* 2 | * For a detailed explanation regarding each configuration property, visit: 3 | * https://jestjs.io/docs/configuration 4 | */ 5 | 6 | module.exports = { 7 | // All imported modules in your tests should be mocked automatically 8 | // automock: false, 9 | 10 | // Stop running tests after `n` failures 11 | // bail: 0, 12 | 13 | // The directory where Jest should store its cached dependency information 14 | // cacheDirectory: "/private/var/folders/wk/27my2b0n4p9gcq5fcztf_5p00000gn/T/jest_dx", 15 | 16 | // Automatically clear mock calls, instances, contexts and results before every test 17 | clearMocks: true, 18 | 19 | // Indicates whether the coverage information should be collected while executing the test 20 | collectCoverage: false, 21 | 22 | // An array of glob patterns indicating a set of files for which coverage information should be collected 23 | // collectCoverageFrom: undefined, 24 | 25 | // The directory where Jest should output its coverage files 26 | coverageDirectory: "coverage", 27 | 28 | // An array of regexp pattern strings used to skip coverage collection 29 | // coveragePathIgnorePatterns: [ 30 | // "/node_modules/" 31 | // ], 32 | 33 | // Indicates which provider should be used to instrument code for coverage 34 | coverageProvider: "v8", 35 | 36 | // A list of reporter names that Jest uses when writing coverage reports 37 | // coverageReporters: [ 38 | // "json", 39 | // "text", 40 | // "lcov", 41 | // "clover" 42 | // ], 43 | 44 | // An object that configures minimum threshold enforcement for coverage results 45 | // coverageThreshold: undefined, 46 | 47 | // A path to a custom dependency extractor 48 | // dependencyExtractor: undefined, 49 | 50 | // Make calling deprecated APIs throw helpful error messages 51 | // errorOnDeprecated: false, 52 | 53 | // The default configuration for fake timers 54 | // fakeTimers: { 55 | // "enableGlobally": false 56 | // }, 57 | 58 | // Force coverage collection from ignored files using an array of glob patterns 59 | // forceCoverageMatch: [], 60 | 61 | // A path to a module which exports an async function that is triggered once before all test suites 62 | // globalSetup: undefined, 63 | 64 | // A path to a module which exports an async function that is triggered once after all test suites 65 | // globalTeardown: undefined, 66 | 67 | // A set of global variables that need to be available in all test environments 68 | // globals: {}, 69 | 70 | // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. 71 | // maxWorkers: "50%", 72 | 73 | // An array of directory names to be searched recursively up from the requiring module's location 74 | // moduleDirectories: [ 75 | // "node_modules" 76 | // ], 77 | 78 | // An array of file extensions your modules use 79 | // moduleFileExtensions: [ 80 | // "js", 81 | // "mjs", 82 | // "cjs", 83 | // "jsx", 84 | // "ts", 85 | // "tsx", 86 | // "json", 87 | // "node" 88 | // ], 89 | 90 | // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module 91 | // moduleNameMapper: {}, 92 | 93 | // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader 94 | // modulePathIgnorePatterns: [], 95 | 96 | // Activates notifications for test results 97 | // notify: false, 98 | 99 | // An enum that specifies notification mode. Requires { notify: true } 100 | // notifyMode: "failure-change", 101 | 102 | // A preset that is used as a base for Jest's configuration 103 | // preset: undefined, 104 | 105 | // Run tests from one or more projects 106 | // projects: undefined, 107 | 108 | // Use this configuration option to add custom reporters to Jest 109 | // reporters: undefined, 110 | 111 | // Automatically reset mock state before every test 112 | // resetMocks: false, 113 | 114 | // Reset the module registry before running each individual test 115 | // resetModules: false, 116 | 117 | // A path to a custom resolver 118 | // resolver: undefined, 119 | 120 | // Automatically restore mock state and implementation before every test 121 | // restoreMocks: false, 122 | 123 | // The root directory that Jest should scan for tests and modules within 124 | // rootDir: undefined, 125 | 126 | // A list of paths to directories that Jest should use to search for files in 127 | // roots: [ 128 | // "" 129 | // ], 130 | 131 | // Allows you to use a custom runner instead of Jest's default test runner 132 | // runner: "jest-runner", 133 | 134 | // The paths to modules that run some code to configure or set up the testing environment before each test 135 | // setupFiles: [], 136 | 137 | // A list of paths to modules that run some code to configure or set up the testing framework before each test 138 | setupFilesAfterEnv: ['/jest.setup.js'], 139 | 140 | // The number of seconds after which a test is considered as slow and reported as such in the results. 141 | // slowTestThreshold: 5, 142 | 143 | // A list of paths to snapshot serializer modules Jest should use for snapshot testing 144 | // snapshotSerializers: [], 145 | 146 | // The test environment that will be used for testing 147 | // testEnvironment: "jest-environment-node", 148 | 149 | // Options that will be passed to the testEnvironment 150 | // testEnvironmentOptions: {}, 151 | 152 | // Adds a location field to test results 153 | // testLocationInResults: false, 154 | 155 | // The glob patterns Jest uses to detect test files 156 | // testMatch: [ 157 | // "**/__tests__/**/*.[jt]s?(x)", 158 | // "**/?(*.)+(spec|test).[tj]s?(x)" 159 | // ], 160 | 161 | // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped 162 | // testPathIgnorePatterns: [ 163 | // "/node_modules/" 164 | // ], 165 | 166 | // The regexp pattern or array of patterns that Jest uses to detect test files 167 | // testRegex: [], 168 | 169 | // This option allows the use of a custom results processor 170 | // testResultsProcessor: undefined, 171 | 172 | // This option allows use of a custom test runner 173 | // testRunner: "jest-circus/runner", 174 | 175 | // A map from regular expressions to paths to transformers 176 | // transform: undefined, 177 | 178 | // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation 179 | // transformIgnorePatterns: [ 180 | // "/node_modules/", 181 | // "\\.pnp\\.[^\\/]+$" 182 | // ], 183 | 184 | // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them 185 | // unmockedModulePathPatterns: undefined, 186 | 187 | // Indicates whether each individual test should be reported during the run 188 | verbose: true, 189 | 190 | // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode 191 | // watchPathIgnorePatterns: [], 192 | 193 | // Whether to use watchman for file crawling 194 | // watchman: true, 195 | }; 196 | -------------------------------------------------------------------------------- /jest.setup.js: -------------------------------------------------------------------------------- 1 | jest.setTimeout(10000); // 10 seconds 2 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "snipsync", 3 | "version": "1.12.0", 4 | "description": "Sync docs with github repo code snippets", 5 | "main": "index.js", 6 | "repository": "git@github.com:temporalio/snipsync.git", 7 | "author": "Alex Garnett ", 8 | "license": "MIT", 9 | "private": false, 10 | "scripts": { 11 | "test": "jest", 12 | "dev": "node index.js", 13 | "lint": "eslint . --ext .js" 14 | }, 15 | "dependencies": { 16 | "@octokit/rest": "^18.12.0", 17 | "anzip": "^0.2.0", 18 | "arraybuffer-to-buffer": "^0.0.7", 19 | "cli-progress": "^3.8.2", 20 | "dedent": "^1.5.3", 21 | "glob": "^7.1.6", 22 | "js-logger": "^1.6.1", 23 | "line-reader": "^0.4.0", 24 | "node-read-yaml": "^1.0.1", 25 | "path": "^0.12.7", 26 | "readdirp": "^3.4.0", 27 | "rimraf": "^3.0.2" 28 | }, 29 | "files": [ 30 | "index.js", 31 | "src" 32 | ], 33 | "bin": { 34 | "snipsync": "index.js" 35 | }, 36 | "devDependencies": { 37 | "babel-eslint": "8.2.1", 38 | "eslint": "^8.20.0", 39 | "eslint-plugin-jest": "^26.6.0", 40 | "jest": "^28.1.3" 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/Sync.d.ts: -------------------------------------------------------------------------------- 1 | export declare class Sync { 2 | constructor(cfg: any, logger: any); 3 | run(): Promise; 4 | } 5 | -------------------------------------------------------------------------------- /src/Sync.js: -------------------------------------------------------------------------------- 1 | const { join, basename, dirname } = require("path"); 2 | const { Octokit } = require("@octokit/rest"); 3 | const { promisify } = require("util"); 4 | const { eachLine } = require("line-reader"); 5 | const { 6 | fmtStartCodeBlock, 7 | markdownCodeTicks, 8 | extractionDir, 9 | fmtProgressBar, 10 | readStart, 11 | readEnd, 12 | rootDir, 13 | writeMarkerStyles 14 | } = require("./common"); 15 | const { writeFile, unlink } = require("fs"); 16 | const path = require("path"); 17 | const arrayBuffToBuff = require("arraybuffer-to-buffer"); 18 | const anzip = require("anzip"); 19 | const readdirp = require("readdirp"); 20 | const rimraf = require("rimraf"); 21 | const progress = require("cli-progress"); 22 | const glob = require("glob"); 23 | const { type } = require("os"); 24 | 25 | // Deindenting dependencies 26 | const { deindentByCommonPrefix, SENSITIVE_INDENT_EXTS } = require("./deindent"); 27 | 28 | // Convert dependency functions to return promises 29 | const writeAsync = promisify(writeFile); 30 | const unlinkAsync = promisify(unlink); 31 | const eachLineAsync = promisify(eachLine); 32 | const rimrafAsync = promisify(rimraf); 33 | let disable_ellipsis = false; 34 | // Snippet class contains info and methods used for passing and formatting code snippets 35 | class Snippet { 36 | constructor(id, ext, owner, repo, ref, filePath) { 37 | this.id = id; 38 | this.ext = ext; 39 | this.owner = owner; 40 | this.repo = repo; 41 | this.ref = ref; 42 | this.filePath = filePath; 43 | this.lines = []; 44 | } 45 | // fmt creates an array of file lines from the Snippet variables 46 | fmt(config) { 47 | const lines = []; 48 | if (config.enable_source_link) { 49 | lines.push(this.fmtSourceLink()); 50 | } 51 | if (config.enable_code_block) { 52 | let textline = fmtStartCodeBlock(this.ext); 53 | if (config.highlights !== undefined) { 54 | textline = `${textline} {${config.highlights}}`; 55 | } 56 | lines.push(textline); 57 | } 58 | if (config.select !== undefined) { 59 | let snippetLines = selectLines(config.select, this.lines, this.ext); 60 | 61 | if (config.enable_code_dedenting && !SENSITIVE_INDENT_EXTS.has(this.ext) && snippetLines.length) { 62 | snippetLines = deindentByCommonPrefix(snippetLines); 63 | } 64 | 65 | lines.push(...snippetLines); 66 | } else if(!config.startPattern && !config.endPattern ) { 67 | let snippetLines = [...this.lines]; 68 | 69 | if (config.enable_code_dedenting && !SENSITIVE_INDENT_EXTS.has(this.ext) && snippetLines.length) { 70 | snippetLines = deindentByCommonPrefix(snippetLines); 71 | } 72 | 73 | lines.push(...snippetLines); 74 | } else { 75 | // use the patterns to grab the content specified. 76 | 77 | const pattern = new RegExp(`(${config.startPattern}[\\s\\S]+${config.endPattern})`); 78 | const match = this.lines.join("\n").match(pattern); 79 | 80 | if (match !== null) { 81 | let snippetLines = match[1].split("\n"); 82 | 83 | if (config.enable_code_dedenting && !SENSITIVE_INDENT_EXTS.has(this.ext) && snippetLines.length) { 84 | snippetLines = deindentByCommonPrefix(snippetLines); 85 | } 86 | 87 | lines.push(...snippetLines); 88 | } 89 | } 90 | 91 | if (config.enable_code_block) { 92 | lines.push(markdownCodeTicks); 93 | } 94 | if (config.disable_ellipsis) { 95 | disable_ellipsis = true; 96 | } 97 | return lines; 98 | } 99 | 100 | // fmtSourceLink creates a markdown link to the source of the snippet 101 | fmtSourceLink() { 102 | const url = this.buildURL(); 103 | const buildPath = this.buildPath(); 104 | const link = `[${buildPath}](${url})`; 105 | return link; 106 | } 107 | // buildPath creates a string that represents the relative path to the snippet 108 | buildPath() { 109 | const sourceURLParts = this.filePath.directory.split("/"); 110 | const buildPath = [ 111 | ...sourceURLParts.slice(1, sourceURLParts.length), 112 | this.filePath.name, 113 | ].join("/"); 114 | return buildPath; 115 | } 116 | // buildURL creates a url to the snippet source location 117 | buildURL() { 118 | const sourceURLParts = this.filePath.directory.split("/"); 119 | let ref = ""; 120 | if (this.ref !== "" && this.ref !== undefined) { 121 | ref = this.ref; 122 | } else { 123 | ref = "main"; 124 | } 125 | const url = [ 126 | "https://github.com", 127 | this.owner, 128 | this.repo, 129 | "blob", 130 | ref, 131 | ...sourceURLParts.slice(1, sourceURLParts.length), 132 | this.filePath.name, 133 | ].join("/"); 134 | return url; 135 | } 136 | } 137 | // Repo is the class that maps repo configuration to local filepaths 138 | class Repo { 139 | constructor(rtype, owner, repo, ref) { 140 | this.rtype = rtype; 141 | this.owner = owner; 142 | this.repo = repo; 143 | this.ref = ref; 144 | this.filePaths = []; 145 | } 146 | } 147 | // File is the class that contains a filename and lines of the file 148 | class File { 149 | constructor(filename, fullpath) { 150 | this.filename = filename; 151 | this.fullpath = fullpath; 152 | this.lines = []; 153 | } 154 | // fileString converts the array of lines into a string 155 | fileString() { 156 | let lines = `${this.lines.join("\n")}\n`; 157 | return lines; 158 | } 159 | } 160 | class ProgressBar { 161 | constructor() { 162 | this.bar = new progress.Bar( 163 | { 164 | format: `✂️ | {bar} | {percentage}% | {value}/{total} chunks | operation: {operation}`, 165 | }, 166 | progress.Presets.shades_classic 167 | ); 168 | this.startValue = 0; 169 | this.totalValue = 0; 170 | } 171 | // start sets the initial text display 172 | start(operation) { 173 | this.bar.start(this.totalValue, this.startValue, { 174 | operation: `${operation}`, 175 | }); 176 | } 177 | // adds to the total chunks 178 | updateTotal(valueAdd) { 179 | this.totalValue = this.totalValue + valueAdd; 180 | this.bar.setTotal(this.totalValue); 181 | } 182 | // increments completed chunks by 1 183 | increment() { 184 | this.bar.increment(); 185 | } 186 | // updates the text display 187 | updateOperation(operation) { 188 | this.bar.update({ operation: `${operation}` }); 189 | } 190 | // stops the progress bar 191 | stop() { 192 | this.bar.stop(); 193 | } 194 | } 195 | // Sync is the class of methods that can be used to do the following: 196 | // Download repos, extract code snippets, merge snippets, and clear snippets from target files 197 | class Sync { 198 | constructor(cfg, logger) { 199 | this.config = cfg; 200 | this.origins = cfg.origins; 201 | this.logger = logger; 202 | const octokit = new Octokit(); 203 | this.github = octokit; 204 | this.progress = new ProgressBar(); 205 | } 206 | // run is the main method of the Sync class that downloads, extracts, and merges snippets 207 | async run() { 208 | this.progress.start("starting snipsync operations"); 209 | // Download repo as zip file. 210 | // Extract to sync_repos directory. 211 | // Get repository details and file paths. 212 | const repositories = await this.getRepos(); 213 | // Search each origin file and scrape the snippets 214 | let snippets = []; 215 | try { 216 | snippets = await this.extractSnippets(repositories, snippets); 217 | } catch (e) { 218 | console.error(e); 219 | await this.cleanUp(); 220 | process.exit(1); 221 | } 222 | // Get the infos (name, path) of all the files in the target directories 223 | let targetFiles = await this.getTargetFilesInfos(); 224 | // Add the lines of each file 225 | targetFiles = await this.getTargetFilesLines(targetFiles); 226 | // Splice the snippets in the file objects 227 | const splicedFiles = await this.spliceSnippets(snippets, targetFiles); 228 | // Overwrite the files to the target directories 229 | await this.writeFiles(splicedFiles); 230 | // Delete the sync_repos directory 231 | await this.cleanUp(); 232 | this.progress.updateOperation("done"); 233 | this.progress.stop(); 234 | this.logger.info("snipsync operation complete"); 235 | return; 236 | } 237 | // clear is the method that will remove snippets from target merge files 238 | async clear() { 239 | this.progress.start("clearing snippets from files"); 240 | const filePaths = await this.getTargetFilesInfos(); 241 | const files = await this.getTargetFilesLines(filePaths); 242 | const filesToWrite = await this.clearSnippets(files); 243 | await this.writeFiles(filesToWrite); 244 | this.progress.updateOperation("done"); 245 | this.progress.stop(); 246 | this.logger.info("snippets have been cleared."); 247 | } 248 | // getRepos is the method that downloads all of the Github repos 249 | async getRepos() { 250 | const repositories = []; 251 | this.progress.updateOperation("retrieving source files"); 252 | this.progress.updateTotal(this.origins.length); 253 | await Promise.all( 254 | this.origins.map(async (origin) => { 255 | if ('files' in origin) { 256 | const pattern = origin.files.pattern; 257 | const filePaths = glob.sync(pattern).map((f) => ({ 258 | name: basename(f), directory: dirname(f), 259 | })); 260 | repositories.push({ 261 | rtype: 'local', 262 | owner: origin.files.owner, 263 | repo: origin.files.repo, 264 | ref: origin.files.ref, 265 | filePaths: filePaths, 266 | }); 267 | return; 268 | } 269 | if (!("owner" in origin && "repo" in origin)) { 270 | throw new Error(`Invalid origin: ${JSON.stringify(origin)}`); 271 | } 272 | const { owner, repo, ref } = origin; 273 | const repository = new Repo('remote', owner, repo, ref); 274 | try { 275 | await retryWithExponentialBackoff(async () => { 276 | const byteArray = await this.getArchive(owner, repo, ref); 277 | const fileName = `${repo}.zip`; 278 | const buffer = arrayBuffToBuff(byteArray); 279 | await writeAsync(fileName, buffer); 280 | repository.filePaths = await this.unzip(fileName); 281 | repositories.push(repository); 282 | this.progress.increment(); 283 | }, 5, 1000); 284 | } catch (e) { 285 | console.error(`\n\nFailed downloading ${owner}/${repo}/${ref}`); 286 | process.exit(1); 287 | } 288 | }) 289 | ); 290 | return repositories; 291 | } 292 | // unzip unzips the Github repo archive 293 | async unzip(filename) { 294 | const zipPath = join(rootDir, filename); 295 | const unzipPath = join(rootDir, extractionDir); 296 | const { files } = await anzip(zipPath, { outputPath: unzipPath }); 297 | await unlinkAsync(zipPath); 298 | return files; 299 | } 300 | // getArchive gets the Github repo archive from Github 301 | async getArchive(owner, repo, ref) { 302 | const result = await this.github.repos.downloadZipballArchive({ 303 | owner, 304 | repo, 305 | ref, 306 | }); 307 | return result.data; 308 | } 309 | // extractSnippets returns an array of code snippets that are found in the repositories 310 | async extractSnippets(repositories, snippets) { 311 | this.progress.updateOperation("extracting snippets"); 312 | await Promise.all( 313 | repositories.map(async ({ rtype, owner, repo, ref, filePaths }) => { 314 | this.progress.updateTotal(filePaths.length); 315 | const extractRootPath = join(rootDir, extractionDir); 316 | for (const item of filePaths) { 317 | const ext = determineExtension(item.name); 318 | let itemPath = join(item.directory, item.name); 319 | if (rtype == "remote") { 320 | itemPath = join(extractRootPath, itemPath); 321 | } 322 | let capture = false; 323 | let fileSnipsCount = 0; 324 | const fileSnips = []; 325 | await eachLineAsync(itemPath, (line) => { 326 | if (line.includes(readEnd)) { 327 | capture = false; 328 | fileSnipsCount++; 329 | } 330 | if (capture) { 331 | fileSnips[fileSnipsCount].lines.push(line); 332 | } 333 | if (line.includes(readStart)) { 334 | capture = true; 335 | const id = extractReadID(line); 336 | const snip = new Snippet(id, ext, owner, repo, ref, item); 337 | fileSnips.push(snip); 338 | } 339 | }); 340 | snippets.push(...fileSnips); 341 | this.progress.increment(); 342 | } 343 | }) 344 | ); 345 | return snippets; 346 | } 347 | // getTargetFilesInfos identifies the paths to the target write files 348 | async getTargetFilesInfos() { 349 | this.progress.updateOperation("gathering information of target files"); 350 | this.progress.updateTotal(this.config.targets.length); 351 | const targetFiles = []; 352 | const allowed_extensions = this.config.features.allowed_target_extensions; 353 | for (const target of this.config.targets) { 354 | const targetDirPath = join(rootDir, target); 355 | for await (const entry of readdirp(targetDirPath)) { 356 | // include everything if the allowed exetnsions list is empty. 357 | if ( 358 | allowed_extensions.length === 0 || 359 | allowed_extensions.includes(path.extname(entry.basename)) 360 | ) { 361 | const file = new File(entry.basename, entry.fullPath); 362 | targetFiles.push(file); 363 | } 364 | } 365 | this.progress.increment(); 366 | } 367 | return targetFiles; 368 | } 369 | // getTargetFilesLines loops through the files and calls readLines on each one 370 | async getTargetFilesLines(targetFiles) { 371 | this.progress.updateOperation("reading target files"); 372 | this.progress.updateTotal(targetFiles.length); 373 | const updatedFiles = []; 374 | for (const targetFile of targetFiles) { 375 | updatedFiles.push(await this.readLines(targetFile)); 376 | this.progress.increment(); 377 | } 378 | return updatedFiles; 379 | } 380 | // readLines reads each line of the file 381 | async readLines(targetFile) { 382 | const fileLines = []; 383 | await eachLineAsync(targetFile.fullpath, (line) => { 384 | fileLines.push(line); 385 | }); 386 | targetFile.lines = fileLines; 387 | return targetFile; 388 | } 389 | // spliceSnippets merges the snippet into the target location of a file 390 | async spliceSnippets(snippets, files) { 391 | this.progress.updateOperation("splicing snippets with targets"); 392 | this.progress.updateTotal(snippets.length); 393 | for (const snippet of snippets) { 394 | for (let file of files) { 395 | file = await this.getSplicedFile(snippet, file); 396 | } 397 | this.progress.increment(); 398 | } 399 | return files; 400 | } 401 | // getSplicedFile returns the the spliced file 402 | async getSplicedFile(snippet, file) { 403 | const staticFile = file; 404 | let dynamicFile = file; 405 | let fileLineNumber = 1; 406 | let lookForStop = false; 407 | let spliceStart = 0; 408 | let config; 409 | let currentStyleIdx; // track style of the opener we matched 410 | 411 | for (let [idx, _] of staticFile.lines.entries()) { 412 | const line = file.lines[idx]; 413 | 414 | if (!lookForStop) { 415 | const parsed = parseWriteStartAny(line); 416 | if (parsed && parsed.id === snippet.id) { 417 | if (parsed.source) { 418 | const snippetPath = (snippet.filePath.directory.split('/').slice(1).join('/') + snippet.filePath.name); 419 | const repoPath = ("https://github.com/" + snippet.owner + "/" + snippet.repo + "/" + snippetPath); 420 | if (parsed.source.slice(1) !== repoPath) { 421 | fileLineNumber++; 422 | continue; 423 | } 424 | } 425 | config = overwriteConfig(this.config.features, parsed.config); 426 | spliceStart = fileLineNumber; 427 | lookForStop = true; 428 | currentStyleIdx = parsed.styleIdx; 429 | } 430 | } else { 431 | // We are inside a candidate region — look for ANY end token on this line 432 | const seenEndIdx = endStyleIdx(line); 433 | if (seenEndIdx !== -1) { 434 | if (seenEndIdx !== currentStyleIdx) { 435 | // Mismatched end → warn & bail (do NOT splice, reset state) 436 | this.logger.warn( 437 | `snipsync: mismatched end marker at line ${fileLineNumber} in ${file.fullpath} (opened as style ${currentStyleIdx}, saw end style ${seenEndIdx}). Skipping splice for snippet "${snippet.id}".` 438 | ); 439 | lookForStop = false; 440 | currentStyleIdx = undefined; 441 | // fall through; keep scanning (a new, correct start may appear later) 442 | } else { 443 | // Proper close → do the splice 444 | dynamicFile = await this.spliceFile( 445 | spliceStart, 446 | fileLineNumber, 447 | snippet, 448 | dynamicFile, 449 | config 450 | ); 451 | lookForStop = false; 452 | currentStyleIdx = undefined; 453 | } 454 | } 455 | } 456 | 457 | fileLineNumber++; 458 | } 459 | 460 | if (lookForStop) { 461 | // EOF with no matching end — bail noisily, no changes applied 462 | this.logger.warn( 463 | `snipsync: unterminated snippet region for "${snippet.id}" in ${file.fullpath} (opened style ${currentStyleIdx}, no matching end before EOF).` 464 | ); 465 | } 466 | 467 | return dynamicFile; 468 | } 469 | 470 | // spliceFile merges an individual snippet into the file 471 | async spliceFile(start, end, snippet, file, config) { 472 | const rmlines = end - start; 473 | file.lines.splice(start, rmlines - 1, ...snippet.fmt(config)); 474 | return file; 475 | } 476 | // clearSnippets loops through target files to remove snippets 477 | async clearSnippets(files) { 478 | this.progress.updateOperation("removing splices"); 479 | this.progress.updateTotal(files.length); 480 | for (let file of files) { 481 | file = await this.getClearedFile(file); 482 | this.progress.increment(); 483 | } 484 | return files; 485 | } 486 | // getClearedFile removes snippet lines from a specific file 487 | async getClearedFile(file) { 488 | let omitting = false; 489 | let openedStyleIdx; 490 | const out = []; 491 | 492 | // Buffer all lines inside a candidate region so we can restore them on mismatch 493 | let startLine = null; // we keep the START marker itself (per your current behavior) 494 | let buffer = []; // lines between start and end (snippet content) 495 | 496 | const flushBufferKeepAll = (lineIfAny) => { 497 | if (startLine !== null) out.push(startLine); 498 | for (const l of buffer) out.push(l); 499 | if (lineIfAny) out.push(lineIfAny); // e.g., mismatched end line treated as normal content 500 | startLine = null; 501 | buffer = []; 502 | }; 503 | 504 | for (const line of file.lines) { 505 | if (!omitting) { 506 | const parsed = parseWriteStartAny(line); 507 | if (parsed) { 508 | // Begin candidate region; keep the start marker 509 | omitting = true; 510 | openedStyleIdx = parsed.styleIdx; 511 | startLine = line; 512 | buffer = []; 513 | continue; 514 | } 515 | out.push(line); 516 | } else { 517 | // We are inside a candidate region (candidate to clear) 518 | const seenEndIdx = endStyleIdx(line); 519 | if (seenEndIdx !== -1) { 520 | if (seenEndIdx !== openedStyleIdx) { 521 | // Mismatched end: warn and bail — restore everything seen so far and treat this line as normal content 522 | this.logger.warn( 523 | `snipsync: mismatched end marker while clearing ${file.fullpath} (opened as style ${openedStyleIdx}, saw end style ${seenEndIdx}). Region preserved.` 524 | ); 525 | flushBufferKeepAll(line); 526 | omitting = false; 527 | openedStyleIdx = undefined; 528 | } else { 529 | // Proper close: drop the buffered snippet content, keep the end marker 530 | if (startLine !== null) out.push(startLine); // keep start 531 | // (intentionally NOT pushing buffer) 532 | out.push(line); // keep end 533 | startLine = null; 534 | buffer = []; 535 | omitting = false; 536 | openedStyleIdx = undefined; 537 | } 538 | } else { 539 | // Not an end marker; just buffer the line for now 540 | buffer.push(line); 541 | } 542 | } 543 | } 544 | 545 | // EOF while still omitting → unterminated region: restore everything 546 | if (omitting) { 547 | this.logger.warn( 548 | `snipsync: unterminated snippet region while clearing ${file.fullpath} (opened style ${openedStyleIdx}, no matching end before EOF). Region preserved.` 549 | ); 550 | flushBufferKeepAll(null); 551 | omitting = false; 552 | openedStyleIdx = undefined; 553 | } 554 | 555 | file.lines = out; 556 | return file; 557 | } 558 | 559 | // writeFiles writes file lines to target files 560 | async writeFiles(files) { 561 | this.progress.updateOperation("writing updated files"); 562 | this.progress.updateTotal(files.length); 563 | for (const file of files) { 564 | await writeAsync( 565 | file.fullpath, 566 | file.fileString() 567 | ); 568 | this.progress.increment(); 569 | } 570 | return; 571 | } 572 | // cleanUp deletes temporary files and folders 573 | async cleanUp() { 574 | this.progress.updateOperation("cleaning up"); 575 | this.progress.updateTotal(1); 576 | const filePath = join(rootDir, extractionDir); 577 | rimrafAsync(filePath); 578 | this.progress.increment(); 579 | return; 580 | } 581 | } 582 | // determineExtension returns the file extension 583 | function determineExtension(filePath) { 584 | const parts = filePath.split("."); 585 | return parts[parts.length - 1]; 586 | } 587 | 588 | // See: https://stackoverflow.com/questions/3446170/escape-string-for-use-in-javascript-regex 589 | function escapeStringRegexp(string) { 590 | return string.replace(/[|\\{}()[\]^$+*?.]/g, "\\$&").replace(/-/g, "\\x2d"); 591 | } 592 | 593 | const readMatchRegexp = new RegExp( 594 | escapeStringRegexp(readStart) + /\s+(\S+)/.source 595 | ); 596 | 597 | 598 | // Build an opening marker regex for a given style. 599 | function buildWriteStartRegexp(style) { 600 | // Matches: 601 | // [@https://github.com/...optional-source] [] 602 | const middle = /\s+(\S+)\s*(@https:\/\/(?:www)?github\.com[/A-Za-z0-9-_.]+)?\s*(?:\s+(.+))?\s*/.source; 603 | return new RegExp( 604 | escapeStringRegexp(style.openStart) + middle + escapeStringRegexp(style.openClose) 605 | ); 606 | } 607 | 608 | // Try every style; if one matches, return parsed fields + style index. 609 | function parseWriteStartAny(line) { 610 | for (let i = 0; i < writeMarkerStyles.length; i++) { 611 | const re = buildWriteStartRegexp(writeMarkerStyles[i]); 612 | const m = line.match(re); 613 | if (m) { 614 | let config = undefined; 615 | try { 616 | config = m[3] ? JSON.parse(m[3]) : undefined; 617 | } catch { 618 | console.error(`Unable to parse JSON in options for ${m[1]} - ignoring options`); 619 | } 620 | return { id: m[1], source: m[2], config, styleIdx: i }; 621 | } 622 | } 623 | return null; 624 | } 625 | 626 | // Is this line a matching END marker for the given style? 627 | function isWriteEndForStyle(line, styleIdx) { 628 | const token = writeMarkerStyles[styleIdx].end; 629 | return line.includes(token); 630 | } 631 | 632 | function endStyleIdx(line) { 633 | // returns the styleIdx of the end token if this line contains one; else -1 634 | for (let i = 0; i < writeMarkerStyles.length; i++) { 635 | if (line.includes(writeMarkerStyles[i].end)) return i; 636 | } 637 | return -1; 638 | } 639 | 640 | 641 | // extractReadID uses regex to exract the id from a string 642 | function extractReadID(line) { 643 | const matches = line.match(readMatchRegexp); 644 | return matches[1]; 645 | } 646 | 647 | // overwriteConfig uses values if provided in the snippet placeholder 648 | function overwriteConfig(current, extracted) { 649 | let config = {}; 650 | 651 | // use snippet override if present, otherwise use global default 652 | if (extracted && 'enable_source_link' in extracted) { 653 | config.enable_source_link = extracted.enable_source_link; 654 | } else { 655 | config.enable_source_link = current.enable_source_link; 656 | } 657 | 658 | if (extracted && 'enable_code_block' in extracted) { 659 | config.enable_code_block = extracted.enable_code_block; 660 | } else { 661 | config.enable_code_block = current.enable_code_block; 662 | } 663 | 664 | if (extracted && 'enable_code_dedenting' in extracted) { 665 | config.enable_code_dedenting = extracted.enable_code_dedenting; 666 | } else { 667 | config.enable_code_dedenting = current.enable_code_dedenting || false; 668 | } 669 | 670 | if (extracted?.highlightedLines ?? undefined) { 671 | config.highlights = extracted.highlightedLines; 672 | } 673 | 674 | if (extracted?.selectedLines) { 675 | config.select = extracted.selectedLines; 676 | } 677 | 678 | config.startPattern = (extracted?.startPattern ?? false) ? extracted.startPattern : false; 679 | config.endPattern = (extracted?.endPattern ?? false) ? extracted.endPattern : false; 680 | 681 | return config; 682 | } 683 | 684 | function selectLines(selectNumbers, lines, fileExtension) { 685 | let newLines = []; 686 | const commentList = { 687 | py: "# ...", 688 | rb: "# ...", 689 | yaml: "# ...", 690 | css: "/* ... */", 691 | html: "", 692 | xml: "", 693 | bash: "# ...", 694 | }; 695 | const ellipsisComment = commentList[fileExtension] || "// ..."; 696 | for (const sn of selectNumbers) { 697 | let skip = false; 698 | let nums = []; 699 | if (sn.includes("-")) { 700 | const strs = sn.split("-"); 701 | nums = [parseInt(strs[0]) - 1, parseInt(strs[1])]; 702 | } else { 703 | const num = parseInt(sn); 704 | nums = [num - 1, num]; 705 | } 706 | 707 | if (nums[0] != 0 && !disable_ellipsis) { 708 | newLines.push(`${ellipsisComment}`); 709 | } 710 | const capture = lines.slice(nums[0], nums[1]); 711 | newLines.push(...capture); 712 | } 713 | return newLines; 714 | } 715 | 716 | async function sleep(ms) { 717 | return new Promise(resolve => setTimeout(resolve, ms)); 718 | } 719 | 720 | async function retryWithExponentialBackoff(fn, retries = 5, delay = 1000) { 721 | for (let i = 0; i < retries; i++) { 722 | try { 723 | return await fn(); 724 | } catch (e) { 725 | if (i < retries - 1) { 726 | const waitTime = delay * Math.pow(2, i); // Exponential backoff 727 | console.log(` - Operation failed - Retrying in ${waitTime} ms...`); 728 | await sleep(waitTime); 729 | } else { 730 | throw e; 731 | } 732 | } 733 | } 734 | } 735 | 736 | module.exports = { Sync }; 737 | -------------------------------------------------------------------------------- /src/common.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | rootDir: process.cwd(), 3 | cfgFile: 'snipsync.config.yaml', 4 | extractionDir: 'sync_repos', 5 | markdownCodeTicks: '```', 6 | fmtStartCodeBlock: (ext) => '```' + ext, 7 | readStart: '@@@SNIPSTART', 8 | readEnd: '@@@SNIPEND', 9 | writeMarkerStyles: [ 10 | { openStart: '', end: ' 4 | 5 | 6 | For example, this paragraph starts at flush-left. 7 | 8 | - However, certain items should not be dedented 9 | - For example, this list item on another level 10 | - Another list item -------------------------------------------------------------------------------- /test/fixtures/docsync-config-full.yaml: -------------------------------------------------------------------------------- 1 | origins: 2 | - owner: temporalio 3 | repo: samples-typescript 4 | 5 | targets: 6 | - test/workspace 7 | 8 | features: 9 | enable_source_link: true 10 | enable_code_block: true 11 | allowed_target_extensions: [.md] 12 | enable_code_dedenting: true 13 | -------------------------------------------------------------------------------- /test/fixtures/docsync-config-min.yaml: -------------------------------------------------------------------------------- 1 | origins: 2 | - owner: temporalio 3 | repo: samples-typescript 4 | 5 | targets: 6 | - test/workspace 7 | -------------------------------------------------------------------------------- /test/fixtures/empty-highlight.md: -------------------------------------------------------------------------------- 1 | Text above snippet 2 | 3 | 4 | 5 | 6 | Text below snippet 7 | -------------------------------------------------------------------------------- /test/fixtures/empty-select-path.md: -------------------------------------------------------------------------------- 1 | Text above snippet 2 | 3 | 4 | 5 | 6 | Text below snippet 7 | -------------------------------------------------------------------------------- /test/fixtures/empty-select.md: -------------------------------------------------------------------------------- 1 | Text above snippet 2 | 3 | 4 | 5 | 6 | Text below snippet 7 | -------------------------------------------------------------------------------- /test/fixtures/empty-test-local-files.md: -------------------------------------------------------------------------------- 1 | Text above snippet 2 | 3 | 4 | 5 | 6 | Text below snippet 7 | -------------------------------------------------------------------------------- /test/fixtures/expected-highlight.md: -------------------------------------------------------------------------------- 1 | Text above snippet 2 | 3 | 4 | [workflow.go](https://github.com/temporalio/money-transfer-project-template-go/blob/main/workflow.go) 5 | ```go {1,3} 6 | func MoneyTransfer(ctx workflow.Context, input PaymentDetails) (string, error) { 7 | 8 | // RetryPolicy specifies how to automatically handle retries if an Activity fails. 9 | retrypolicy := &temporal.RetryPolicy{ 10 | InitialInterval: time.Second, 11 | BackoffCoefficient: 2.0, 12 | MaximumInterval: 100 * time.Second, 13 | MaximumAttempts: 500, // 0 is unlimited retries 14 | NonRetryableErrorTypes: []string{"InvalidAccountError", "InsufficientFundsError"}, 15 | } 16 | 17 | options := workflow.ActivityOptions{ 18 | // Timeout options specify when to automatically timeout Activity functions. 19 | StartToCloseTimeout: time.Minute, 20 | // Optionally provide a customized RetryPolicy. 21 | // Temporal retries failed Activities by default. 22 | RetryPolicy: retrypolicy, 23 | } 24 | 25 | // Apply the options. 26 | ctx = workflow.WithActivityOptions(ctx, options) 27 | 28 | // Withdraw money. 29 | var withdrawOutput string 30 | 31 | withdrawErr := workflow.ExecuteActivity(ctx, Withdraw, input).Get(ctx, &withdrawOutput) 32 | 33 | if withdrawErr != nil { 34 | return "", withdrawErr 35 | } 36 | 37 | // Deposit money. 38 | var depositOutput string 39 | 40 | depositErr := workflow.ExecuteActivity(ctx, Deposit, input).Get(ctx, &depositOutput) 41 | 42 | if depositErr != nil { 43 | // The deposit failed; put money back in original account. 44 | 45 | var result string 46 | 47 | refundErr := workflow.ExecuteActivity(ctx, Refund, input).Get(ctx, &result) 48 | 49 | if refundErr != nil { 50 | return "", 51 | fmt.Errorf("Deposit: failed to deposit money into %v: %v. Money could not be returned to %v: %w", 52 | input.TargetAccount, depositErr, input.SourceAccount, refundErr) 53 | } 54 | 55 | return "", fmt.Errorf("Deposit: failed to deposit money into %v: Money returned to %v: %w", 56 | input.TargetAccount, input.SourceAccount, depositErr) 57 | } 58 | 59 | result := fmt.Sprintf("Transfer complete (transaction IDs: %s, %s)", withdrawOutput, depositOutput) 60 | return result, nil 61 | } 62 | 63 | ``` 64 | 65 | 66 | Text below snippet 67 | -------------------------------------------------------------------------------- /test/fixtures/expected-select-path.md: -------------------------------------------------------------------------------- 1 | Text above snippet 2 | 3 | 4 | [workflow.go](https://github.com/temporalio/money-transfer-project-template-go/blob/main/workflow.go) 5 | ```go 6 | func MoneyTransfer(ctx workflow.Context, input PaymentDetails) (string, error) { 7 | // ... 8 | // RetryPolicy specifies how to automatically handle retries if an Activity fails. 9 | retrypolicy := &temporal.RetryPolicy{ 10 | InitialInterval: time.Second, 11 | ``` 12 | 13 | 14 | Text below snippet 15 | -------------------------------------------------------------------------------- /test/fixtures/expected-select.md: -------------------------------------------------------------------------------- 1 | Text above snippet 2 | 3 | 4 | [workflow.go](https://github.com/temporalio/money-transfer-project-template-go/blob/main/workflow.go) 5 | ```go 6 | func MoneyTransfer(ctx workflow.Context, input PaymentDetails) (string, error) { 7 | // ... 8 | // RetryPolicy specifies how to automatically handle retries if an Activity fails. 9 | retrypolicy := &temporal.RetryPolicy{ 10 | InitialInterval: time.Second, 11 | ``` 12 | 13 | 14 | Text below snippet 15 | -------------------------------------------------------------------------------- /test/fixtures/expected-test-local-files.md: -------------------------------------------------------------------------------- 1 | Text above snippet 2 | 3 | 4 | [test/fixtures/money_transfer_workflow.go](https://github.com/temporalio/snipsync/blob/main/test/fixtures/money_transfer_workflow.go) 5 | ```go 6 | func MoneyTransfer(ctx workflow.Context, input PaymentDetails) (string, error) { 7 | 8 | // RetryPolicy specifies how to automatically handle retries if an Activity fails. 9 | retrypolicy := &temporal.RetryPolicy{ 10 | InitialInterval: time.Second, 11 | BackoffCoefficient: 2.0, 12 | MaximumInterval: 100 * time.Second, 13 | MaximumAttempts: 0, // unlimited retries 14 | NonRetryableErrorTypes: []string{"InvalidAccountError", "InsufficientFundsError"}, 15 | } 16 | 17 | options := workflow.ActivityOptions{ 18 | // Timeout options specify when to automatically timeout Activity functions. 19 | StartToCloseTimeout: time.Minute, 20 | // Optionally provide a customized RetryPolicy. 21 | // Temporal retries failed Activities by default. 22 | RetryPolicy: retrypolicy, 23 | } 24 | 25 | // Apply the options. 26 | ctx = workflow.WithActivityOptions(ctx, options) 27 | 28 | // Withdraw money. 29 | var withdrawOutput string 30 | 31 | withdrawErr := workflow.ExecuteActivity(ctx, Withdraw, input).Get(ctx, &withdrawOutput) 32 | 33 | if withdrawErr != nil { 34 | return "", withdrawErr 35 | } 36 | 37 | // Deposit money. 38 | var depositOutput string 39 | 40 | depositErr := workflow.ExecuteActivity(ctx, Deposit, input).Get(ctx, &depositOutput) 41 | 42 | if depositErr != nil { 43 | // The deposit failed; put money back in original account. 44 | 45 | var result string 46 | 47 | refundErr := workflow.ExecuteActivity(ctx, Refund, input).Get(ctx, &result) 48 | 49 | if refundErr != nil { 50 | return "", 51 | fmt.Errorf("Deposit: failed to deposit money into %v: %v. Money could not be returned to %v: %w", 52 | input.TargetAccount, depositErr, input.SourceAccount, refundErr) 53 | } 54 | 55 | return "", fmt.Errorf("Deposit: failed to deposit money into %v: Money returned to %v: %w", 56 | input.TargetAccount, input.SourceAccount, depositErr) 57 | } 58 | 59 | result := fmt.Sprintf("Transfer complete (transaction IDs: %s, %s)", withdrawOutput, depositOutput) 60 | return result, nil 61 | } 62 | 63 | ``` 64 | 65 | 66 | Text below snippet 67 | -------------------------------------------------------------------------------- /test/fixtures/index.md: -------------------------------------------------------------------------------- 1 | Text above snippet 2 | 3 | 4 | 5 | 6 | Text below snippet 7 | -------------------------------------------------------------------------------- /test/fixtures/index.txt: -------------------------------------------------------------------------------- 1 | Text above snippet 2 | 3 | 4 | 5 | 6 | Text below snippet 7 | -------------------------------------------------------------------------------- /test/fixtures/index_with_code.md: -------------------------------------------------------------------------------- 1 | Text above snippet 2 | 3 | 4 | [hello-world/src/activities.ts](https://github.com/temporalio/samples-typescript/blob/main/hello-world/src/activities.ts) 5 | ```ts 6 | export async function greet(name: string): Promise { 7 | return `Hello, ${name}!`; 8 | } 9 | ``` 10 | 11 | 12 | Text below snippet 13 | -------------------------------------------------------------------------------- /test/fixtures/jsx-marker.mdx: -------------------------------------------------------------------------------- 1 | Text above snippet 2 | 3 | {/*SNIPSTART typescript-hello-activity*/} 4 | {/*SNIPEND*/} 5 | 6 | Text below snippet 7 | -------------------------------------------------------------------------------- /test/fixtures/mixed-markers.mdx: -------------------------------------------------------------------------------- 1 | Test before snippet 2 | 3 | {/* SNIPSTART a */} 4 | 5 | 6 | {/* SNIPEND */} 7 | 8 | 9 | Text after snippet -------------------------------------------------------------------------------- /test/fixtures/money_transfer_workflow.go: -------------------------------------------------------------------------------- 1 | package app 2 | 3 | import ( 4 | "fmt" 5 | "time" 6 | 7 | "go.temporal.io/sdk/temporal" 8 | "go.temporal.io/sdk/workflow" 9 | ) 10 | 11 | // @@@SNIPSTART test-local-files-workflow 12 | func MoneyTransfer(ctx workflow.Context, input PaymentDetails) (string, error) { 13 | 14 | // RetryPolicy specifies how to automatically handle retries if an Activity fails. 15 | retrypolicy := &temporal.RetryPolicy{ 16 | InitialInterval: time.Second, 17 | BackoffCoefficient: 2.0, 18 | MaximumInterval: 100 * time.Second, 19 | MaximumAttempts: 0, // unlimited retries 20 | NonRetryableErrorTypes: []string{"InvalidAccountError", "InsufficientFundsError"}, 21 | } 22 | 23 | options := workflow.ActivityOptions{ 24 | // Timeout options specify when to automatically timeout Activity functions. 25 | StartToCloseTimeout: time.Minute, 26 | // Optionally provide a customized RetryPolicy. 27 | // Temporal retries failed Activities by default. 28 | RetryPolicy: retrypolicy, 29 | } 30 | 31 | // Apply the options. 32 | ctx = workflow.WithActivityOptions(ctx, options) 33 | 34 | // Withdraw money. 35 | var withdrawOutput string 36 | 37 | withdrawErr := workflow.ExecuteActivity(ctx, Withdraw, input).Get(ctx, &withdrawOutput) 38 | 39 | if withdrawErr != nil { 40 | return "", withdrawErr 41 | } 42 | 43 | // Deposit money. 44 | var depositOutput string 45 | 46 | depositErr := workflow.ExecuteActivity(ctx, Deposit, input).Get(ctx, &depositOutput) 47 | 48 | if depositErr != nil { 49 | // The deposit failed; put money back in original account. 50 | 51 | var result string 52 | 53 | refundErr := workflow.ExecuteActivity(ctx, Refund, input).Get(ctx, &result) 54 | 55 | if refundErr != nil { 56 | return "", 57 | fmt.Errorf("Deposit: failed to deposit money into %v: %v. Money could not be returned to %v: %w", 58 | input.TargetAccount, depositErr, input.SourceAccount, refundErr) 59 | } 60 | 61 | return "", fmt.Errorf("Deposit: failed to deposit money into %v: Money returned to %v: %w", 62 | input.TargetAccount, input.SourceAccount, depositErr) 63 | } 64 | 65 | result := fmt.Sprintf("Transfer complete (transaction IDs: %s, %s)", withdrawOutput, depositOutput) 66 | return result, nil 67 | } 68 | 69 | // @@@SNIPEND 70 | -------------------------------------------------------------------------------- /test/fixtures/python.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /test/fixtures/regex_index.md: -------------------------------------------------------------------------------- 1 | Text above snippet 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Text below snippet 10 | -------------------------------------------------------------------------------- /test/sync.test.js: -------------------------------------------------------------------------------- 1 | const logger = require('js-logger'); 2 | const { Sync } = require('../src/Sync'); 3 | const fs = require('fs'); 4 | 5 | const fixturesPath = 'test/fixtures'; 6 | const testEnvPath = 'test/.tmp'; 7 | 8 | let cfg = {}; 9 | 10 | logger.setLevel(logger.WARN); 11 | 12 | beforeEach(() => { 13 | // Default config with all options filled in. 14 | // Redefine keys as needed for tests. 15 | cfg = { 16 | origins: [ 17 | { owner: 'temporalio', repo: 'samples-typescript' }, 18 | { owner: 'temporalio', repo: 'email-subscription-project-python'}, 19 | { owner: 'temporalio', repo: 'money-transfer-project-template-go'}, 20 | ], 21 | targets: [ testEnvPath ], 22 | features: { 23 | enable_source_link: true, 24 | enable_code_block: true, 25 | allowed_target_extensions: [], 26 | }, 27 | }; 28 | 29 | fs.mkdirSync(testEnvPath, { recursive: true }); 30 | fs.copyFileSync(`${fixturesPath}/index.md`,`${testEnvPath}/index.md`); 31 | fs.copyFileSync(`${fixturesPath}/index.txt`,`${testEnvPath}/index.txt`); 32 | }); 33 | 34 | 35 | afterEach(() => { 36 | fs.rmSync(testEnvPath, { recursive: true }); 37 | }); 38 | 39 | test('Pulls snippet text into a file', async() => { 40 | 41 | const synctron = new Sync(cfg, logger); 42 | await synctron.run(); 43 | const data = fs.readFileSync(`${testEnvPath}/index.md`, 'utf8'); 44 | 45 | expect(data).toMatch(/export async function greet/); 46 | 47 | }); 48 | 49 | test('Does not render code fences when option for code block is false', async() => { 50 | 51 | cfg.features.enable_code_block = false; 52 | const synctron = new Sync(cfg, logger); 53 | await synctron.run(); 54 | const data = fs.readFileSync(`${testEnvPath}/index.md`, 'utf8'); 55 | 56 | expect(data).not.toMatch(/```ts/); 57 | 58 | }); 59 | 60 | test('Puts source link in the code', async() => { 61 | 62 | const synctron = new Sync(cfg, logger); 63 | await synctron.run(); 64 | const data = fs.readFileSync(`${testEnvPath}/index.md`, 'utf8'); 65 | 66 | expect(data).toMatch(/\[hello-world\/src\/activities.ts\]/); 67 | 68 | }); 69 | 70 | test('Does not put source link in the code when option is false', async() => { 71 | cfg.features.enable_source_link = false; 72 | 73 | const synctron = new Sync(cfg, logger); 74 | await synctron.run(); 75 | const data = fs.readFileSync(`${testEnvPath}/index.md`, 'utf8'); 76 | 77 | expect(data).not.toMatch(/\[hello-world\/src\/activities.ts\]/); 78 | 79 | }); 80 | 81 | test('Changes all files when allowed_target_extensions is not set', async() => { 82 | 83 | const synctron = new Sync(cfg, logger); 84 | await synctron.run(); 85 | 86 | let data = fs.readFileSync(`${testEnvPath}/index.md`, 'utf8'); 87 | expect(data).toMatch(/export async function greet/); 88 | 89 | data = fs.readFileSync(`${testEnvPath}/index.txt`, 'utf8'); 90 | expect(data).toMatch(/export async function greet/); 91 | }); 92 | 93 | test('Changes only markdown files when allowed_target_extensions is set to .md', async() => { 94 | cfg.features.allowed_target_extensions = ['.md']; 95 | 96 | const synctron = new Sync(cfg, logger); 97 | await synctron.run(); 98 | 99 | let data = fs.readFileSync(`${testEnvPath}/index.md`, 'utf8'); 100 | expect(data).toMatch(/export async function greet/); 101 | 102 | data = fs.readFileSync(`${testEnvPath}/index.txt`, 'utf8'); 103 | expect(data).not.toMatch(/export async function greet/); 104 | 105 | }); 106 | 107 | test('Cleans snippets from files that were not cleaned up previously', async() => { 108 | fs.copyFileSync(`${fixturesPath}/index_with_code.md`,`${testEnvPath}/index_with_code.md`); 109 | 110 | let data = fs.readFileSync(`${testEnvPath}/index_with_code.md`, 'utf8'); 111 | expect(data).toMatch(/export async function greet/); 112 | 113 | const synctron = new Sync(cfg, logger); 114 | await synctron.clear(); 115 | 116 | data = fs.readFileSync(`${testEnvPath}/index_with_code.md`, 'utf8'); 117 | expect(data).not.toMatch(/export async function greet/); 118 | }); 119 | 120 | test('Cleans snippets from all files', async() => { 121 | 122 | const synctron = new Sync(cfg, logger); 123 | await synctron.run(); 124 | await synctron.clear(); 125 | 126 | fs.copyFileSync(`${fixturesPath}/index.txt`,`${testEnvPath}/index.txt`); 127 | 128 | let data = fs.readFileSync(`${testEnvPath}/index.md`, 'utf8'); 129 | expect(data).not.toMatch(/export async function greet/); 130 | 131 | data = fs.readFileSync(`${testEnvPath}/index.txt`, 'utf8'); 132 | expect(data).not.toMatch(/export async function greet/); 133 | }); 134 | 135 | test('uses regex patterns to pare down snippet inserted into a file', async() => { 136 | 137 | cfg.origins = [ 138 | { owner: 'temporalio', repo: 'money-transfer-project-template-go' }, 139 | { owner: 'temporalio', repo: 'samples-typescript' }, 140 | ], 141 | 142 | fs.copyFileSync(`${fixturesPath}/regex_index.md`,`${testEnvPath}/regex_index.md`); 143 | 144 | const synctron = new Sync(cfg, logger); 145 | await synctron.run(); 146 | const data = fs.readFileSync(`${testEnvPath}/regex_index.md`, 'utf8'); 147 | 148 | // check go snippet 149 | expect(data).not.toMatch(/func MoneyTransfer/); 150 | expect(data).toMatch(/retrypolicy := &temporal\.RetryPolicy\{/); 151 | expect(data).not.toMatch(/options := workflow.ActivityOptions/); 152 | 153 | 154 | // check js snippet 155 | expect(data).not.toMatch(/import type \* as activities/); 156 | expect(data).toMatch(/const \{ greet/); 157 | expect(data).not.toMatch(/export async function example/); 158 | 159 | }); 160 | 161 | test('Dedent keeps relative indentation inside the snippet', async () => { 162 | fs.copyFileSync(`${fixturesPath}/dedent.md`, `${testEnvPath}/dedent.md`); 163 | 164 | cfg.origins = [{ owner: 'temporalio', repo: 'samples-typescript' }]; 165 | cfg.features.enable_code_dedenting = true; 166 | 167 | const synctron = new Sync(cfg, logger); 168 | await synctron.run(); 169 | 170 | const text = fs.readFileSync(`${testEnvPath}/dedent.md`, 'utf8'); 171 | 172 | // Grab the first fenced code block contents 173 | const m = text.match(/```[^\n]*\n([\s\S]*?)\n```/); 174 | expect(m).toBeTruthy(); 175 | 176 | const bodyLines = m[1].split('\n').filter(l => l.length > 0); 177 | const indents = bodyLines.map(l => (l.match(/^[ \t]*/)?.[0].length ?? 0)); 178 | const minIndent = Math.min(...indents); 179 | 180 | // With dedent enabled, the common left padding is removed: 181 | expect(minIndent).toBe(0); 182 | 183 | // But relative indentation remains for inner lines (at least one line still indented): 184 | expect(bodyLines.some(l => /^[ \t]+\S/.test(l))).toBe(true); 185 | }); 186 | 187 | test('Regex-selected regions are dedented after start/end pattern slicing', async () => { 188 | fs.copyFileSync(`${fixturesPath}/regex_index.md`, `${testEnvPath}/regex_index.md`); 189 | 190 | cfg.origins = [ 191 | { owner: 'temporalio', repo: 'money-transfer-project-template-go' }, 192 | { owner: 'temporalio', repo: 'samples-typescript' }, 193 | ]; 194 | cfg.features.enable_code_dedenting = true; 195 | 196 | const synctron = new Sync(cfg, logger); 197 | await synctron.run(); 198 | 199 | const text = fs.readFileSync(`${testEnvPath}/regex_index.md`, 'utf8'); 200 | 201 | // First fenced block (per your fixture) 202 | const m = text.match(/```[^\n]*\n([\s\S]*?)\n```/); 203 | expect(m).toBeTruthy(); 204 | const bodyLines = m[1].split('\n').filter(l => l.length > 0); 205 | const indents = bodyLines.map(l => (l.match(/^[ \t]*/)?.[0].length ?? 0)); 206 | const minIndent = Math.min(...indents); 207 | 208 | // After slicing by start/end patterns, we still dedent the selected region: 209 | expect(minIndent).toBe(0); 210 | 211 | // Keep original regex expectations for content sanity 212 | expect(text).not.toMatch(/import type \* as activities/); 213 | expect(text).toMatch(/const \{ greet/); 214 | expect(text).not.toMatch(/export async function example/); 215 | }); 216 | 217 | test('No dedent when option is false (snippet stays indented; other content unchanged)', async () => { 218 | fs.copyFileSync(`${fixturesPath}/dedent.md`, `${testEnvPath}/dedent.md`); 219 | 220 | cfg.origins = [{ owner: 'temporalio', repo: 'samples-typescript' }]; 221 | cfg.features.enable_code_dedenting = false; 222 | 223 | const synctron = new Sync(cfg, logger); 224 | await synctron.run(); 225 | 226 | const text = fs.readFileSync(`${testEnvPath}/dedent.md`, 'utf8'); 227 | 228 | // Grab the first code block’s first line 229 | const m = text.match(/```[^\n]*\n([\s\S]*?)\n```/); 230 | expect(m).toBeTruthy(); 231 | const firstCodeLine = m[1].split('\n')[0]; 232 | 233 | // With dedent OFF, snippet should still start with two spaces 234 | expect(firstCodeLine).toMatch(/^\s{2}\S/); 235 | 236 | // Prose paragraph stays flush-left 237 | expect(text).toMatch(/\nFor example, this paragraph starts at flush-left\./); 238 | 239 | // Nested list item keeps its two leading spaces 240 | expect(text).toMatch(/\n\s{2}- For example, this list item on another level/); 241 | }); 242 | 243 | test('Dedent when option is true (should only affect snippet; OTHER CONTENT UNCHANGED)', async () => { 244 | fs.copyFileSync(`${fixturesPath}/dedent.md`, `${testEnvPath}/dedent.md`); 245 | 246 | cfg.origins = [{ owner: 'temporalio', repo: 'samples-typescript' }]; 247 | cfg.features.enable_code_dedenting = true; 248 | 249 | const synctron = new Sync(cfg, logger); 250 | await synctron.run(); 251 | 252 | const text = fs.readFileSync(`${testEnvPath}/dedent.md`, 'utf8'); 253 | 254 | const m = text.match(/```[^\n]*\n([\s\S]*?)\n```/); 255 | expect(m).toBeTruthy(); 256 | const firstCodeLine = m[1].split('\n')[0]; 257 | 258 | // EXPECTED (desired behavior): snippet becomes flush-left 259 | expect(firstCodeLine).toMatch(/^\S/); 260 | 261 | // EXPECTED (desired behavior): prose unchanged 262 | expect(text).toMatch(/\nFor example, this paragraph starts at flush-left\./); 263 | 264 | // EXPECTED (desired behavior): nested list item should remain indented 265 | // This is what will FAIL with the current file-level dedent implementation, 266 | // since it also strips indentation from list lines. 267 | expect(text).toMatch(/\n\s{2}- For example, this list item on another level/); 268 | }); 269 | 270 | test('Dedent works without fences (enable_code_block=false)', async () => { 271 | fs.copyFileSync(`${fixturesPath}/dedent.md`, `${testEnvPath}/dedent.md`); 272 | 273 | cfg.origins = [{ owner: 'temporalio', repo: 'samples-typescript' }]; 274 | cfg.features.enable_code_block = false; // no ``` 275 | cfg.features.enable_code_dedenting = true; // dedent ON 276 | 277 | const synctron = new Sync(cfg, logger); 278 | await synctron.run(); 279 | 280 | const text = fs.readFileSync(`${testEnvPath}/dedent.md`, 'utf8'); 281 | 282 | // Extract snippet region between markers (simple, inline) 283 | const m = text.match(/\n([\s\S]*?)\n/); 284 | expect(m).toBeTruthy(); 285 | const bodyLines = m[1].split('\n').filter(l => l.length > 0); 286 | 287 | // Same invariants: min indent is 0; at least one line still indented 288 | const indents = bodyLines.map(l => (l.match(/^[ \t]*/)?.[0].length ?? 0)); 289 | expect(Math.min(...indents)).toBe(0); 290 | expect(bodyLines.some(l => /^[ \t]+\S/.test(l))).toBe(true); 291 | }); 292 | 293 | 294 | test('Per snippet selectedLines configuration', async() => { 295 | 296 | cfg.origins = [ 297 | { owner: 'temporalio', repo: 'money-transfer-project-template-go' }, 298 | ], 299 | 300 | fs.copyFileSync(`${fixturesPath}/empty-select.md`,`${testEnvPath}/empty-select.md`); 301 | 302 | const synctron = new Sync(cfg, logger); 303 | await synctron.run(); 304 | const data = fs.readFileSync(`${testEnvPath}/empty-select.md`, 'utf8'); 305 | const expected = fs.readFileSync(`test/fixtures/expected-select.md`, 'utf8'); 306 | expect(data).toMatch(expected); 307 | 308 | }); 309 | 310 | test('Per snippet file path configuration', async () => { 311 | 312 | cfg.origins = [ 313 | { owner: 'temporalio', repo: 'money-transfer-project-template-go' }, 314 | ], 315 | 316 | fs.copyFileSync(`${fixturesPath}/empty-select-path.md`, `${testEnvPath}/empty-select-path.md`); 317 | 318 | const synctron = new Sync(cfg, logger); 319 | await synctron.run(); 320 | const data = fs.readFileSync(`${testEnvPath}/empty-select-path.md`, 'utf8'); 321 | const expected = fs.readFileSync(`test/fixtures/expected-select-path.md`, 'utf8'); 322 | expect(data).toMatch(expected); 323 | 324 | }); 325 | 326 | test('Per snippet highlightedLines configuration', async() => { 327 | 328 | cfg.origins = [ 329 | { owner: 'temporalio', repo: 'money-transfer-project-template-go' }, 330 | ], 331 | 332 | fs.copyFileSync(`${fixturesPath}/empty-highlight.md`,`${testEnvPath}/empty-highlight.md`); 333 | 334 | const synctron = new Sync(cfg, logger); 335 | await synctron.run(); 336 | const data = fs.readFileSync(`${testEnvPath}/empty-highlight.md`, 'utf8'); 337 | const expected = fs.readFileSync(`test/fixtures/expected-highlight.md`, 'utf8'); 338 | expect(data).toMatch(expected); 339 | 340 | }); 341 | 342 | test('Local file ingestion', async() => { 343 | cfg.origins = [ 344 | { 345 | files: { 346 | pattern: "./test/fixtures/*.go", 347 | owner: "temporalio", 348 | repo: "snipsync", 349 | ref: "main", 350 | }, 351 | }, 352 | ], 353 | fs.copyFileSync(`${fixturesPath}/empty-test-local-files.md`,`${testEnvPath}/empty-test-local-files.md`); 354 | const synctron = new Sync(cfg, logger); 355 | await synctron.run(); 356 | const data = fs.readFileSync(`${testEnvPath}/empty-test-local-files.md`, 'utf8'); 357 | const expected = fs.readFileSync(`test/fixtures/expected-test-local-files.md`, 'utf8'); 358 | expect(data).toMatch(expected); 359 | }); 360 | 361 | 362 | test('MDX/JSX markers are recognized and paired correctly', async () => { 363 | // Write a local source file with a simple snippet 364 | const srcPath = `${testEnvPath}/src.ts`; 365 | fs.writeFileSync(srcPath, `// @@@SNIPSTART demo-jsx 366 | export const n = 1; 367 | // @@@SNIPEND 368 | `); 369 | 370 | // MDX target uses JSX-style markers 371 | const mdxPath = `${testEnvPath}/jsx_markers.mdx`; 372 | fs.writeFileSync(mdxPath, `{/* SNIPSTART demo-jsx */} 373 | {/* SNIPEND */} 374 | `); 375 | 376 | // Configure Snipsync to read from the local source file and only touch .mdx 377 | cfg.origins = [ 378 | { 379 | files: { 380 | pattern: srcPath, 381 | owner: "temporalio", 382 | repo: "snipsync", 383 | ref: "main", 384 | }, 385 | }, 386 | ]; 387 | cfg.features.allowed_target_extensions = ['.mdx']; 388 | cfg.features.enable_code_block = true; // ensure fences are emitted 389 | cfg.features.enable_code_dedenting = true; // any dedent behavior applies to the snippet body only 390 | 391 | const synctron = new Sync(cfg, logger); 392 | await synctron.run(); 393 | 394 | const out = fs.readFileSync(mdxPath, 'utf8'); 395 | 396 | // Assert: snippet content was injected between JSX markers with a TS fence 397 | expect(out).toMatch(/\{\/\*\s*SNIPSTART demo-jsx\s*\*\/\}/); 398 | expect(out).toMatch(/\{\/\*\s*SNIPEND\s*\*\/\}/); 399 | }); 400 | 401 | test('No cross-pairing: HTML start must close with HTML end; JSX with JSX', async () => { 402 | // Local source with two snippets: one "good" and one for the mispaired case 403 | const srcPath = `${testEnvPath}/src2.ts`; 404 | fs.writeFileSync(srcPath, `// @@@SNIPSTART good-pair 405 | const ok = 1; 406 | // @@@SNIPEND 407 | 408 | // @@@SNIPSTART mispaired 409 | const nope = 2; 410 | // @@@SNIPEND 411 | `); 412 | 413 | // MDX target: 414 | // - first region uses HTML markers (properly paired) → should splice 415 | // - second region uses HTML start + JSX end (cross) → should NOT splice 416 | const mdxPath = `${testEnvPath}/mixed_markers.mdx`; 417 | fs.writeFileSync(mdxPath, ` 418 | 419 | 420 | 421 | {/* SNIPEND */} 422 | `); 423 | 424 | cfg.origins = [ 425 | { 426 | files: { 427 | pattern: srcPath, 428 | owner: "temporalio", 429 | repo: "snipsync", 430 | ref: "main", 431 | }, 432 | }, 433 | ]; 434 | cfg.features.allowed_target_extensions = ['.mdx']; 435 | cfg.features.enable_code_block = true; 436 | cfg.features.enable_code_dedenting = true; 437 | 438 | const synctron = new Sync(cfg, logger); 439 | await synctron.run(); 440 | 441 | const out = fs.readFileSync(mdxPath, 'utf8'); 442 | 443 | // Helper: extract content between an HTML start/end pair 444 | const htmlRegion = out.match(/\n([\s\S]*?)\n/); 445 | expect(htmlRegion).toBeTruthy(); 446 | const htmlBody = htmlRegion[1]; 447 | 448 | // Properly paired HTML markers should have received the snippet (with a fence and the code) 449 | expect(htmlBody).toMatch(/```ts[\s\S]*const ok = 1;[\s\S]*```/); 450 | 451 | // Cross-paired region: HTML start + JSX end should NOT close/splice 452 | // The safest assertion: between those two lines there should NOT be a code fence nor the snippet text. 453 | const crossStartIdx = out.indexOf(''); 454 | const crossEndIdx = out.indexOf('{/* SNIPEND */}'); 455 | expect(crossStartIdx).toBeGreaterThan(-1); 456 | expect(crossEndIdx).toBeGreaterThan(-1); 457 | const crossBody = out.slice( 458 | crossStartIdx + ''.length, 459 | crossEndIdx 460 | ); 461 | 462 | // Should not contain a code fence nor the snippet line "const nope = 2;" 463 | expect(crossBody).not.toMatch(/```/); 464 | expect(crossBody).not.toMatch(/const nope = 2;/); 465 | 466 | // (Optional) now clear and ensure only the properly paired region is cleared 467 | const synctron2 = new Sync(cfg, logger); 468 | await synctron2.clear(); 469 | const cleared = fs.readFileSync(mdxPath, 'utf8'); 470 | 471 | // After clear(): the good HTML-paired region should be empty between its markers 472 | const htmlRegionAfter = cleared.match(/\s*([\s\S]*?)\s*/); 473 | expect(htmlRegionAfter).toBeTruthy(); 474 | expect(htmlRegionAfter[1].trim()).toBe(''); // snippet content removed 475 | 476 | // The mispaired region should remain unchanged (still no fence or snippet) 477 | const crossStartIdx2 = cleared.indexOf(''); 478 | const crossEndIdx2 = cleared.indexOf('{/* SNIPEND */}'); 479 | const crossBody2 = cleared.slice( 480 | crossStartIdx2 + ''.length, 481 | crossEndIdx2 482 | ); 483 | expect(crossBody2).not.toMatch(/```/); 484 | expect(crossBody2).not.toMatch(/const nope = 2;/); 485 | }); 486 | 487 | test('Clear preserves content on mismatched end (warn & bail)', async () => { 488 | const srcPath = `${testEnvPath}/src3.ts`; 489 | fs.writeFileSync(srcPath, `// @@@SNIPSTART foo\nconst x = 1;\n// @@@SNIPEND\n`); 490 | 491 | const mdxPath = `${testEnvPath}/mismatch_clear.mdx`; 492 | fs.writeFileSync(mdxPath, `\nsome text\n{/* SNIPEND */}\n`); 493 | 494 | cfg.origins = [{ files: { pattern: srcPath, owner: 'temporalio', repo: 'snipsync', ref: 'main' } }]; 495 | cfg.features.allowed_target_extensions = ['.mdx']; 496 | cfg.features.enable_code_block = true; 497 | 498 | const synctron = new Sync(cfg, logger); 499 | await synctron.clear(); 500 | 501 | const out = fs.readFileSync(mdxPath, 'utf8'); 502 | 503 | // Region preserved (markers + inner content) 504 | expect(out).toMatch(//); 505 | expect(out).toMatch(/some text/); 506 | expect(out).toMatch(/\{\/\*\s*SNIPEND\s*\*\/\}/); 507 | }); 508 | 509 | test('Splice warns and does not modify on mismatched end', async () => { 510 | // Arrange: source file with a snippet 511 | const srcPath = `${testEnvPath}/src-mismatch.ts`; 512 | fs.writeFileSync( 513 | srcPath, 514 | `// @@@SNIPSTART foo\nexport const val = 42;\n// @@@SNIPEND\n` 515 | ); 516 | 517 | // Target doc with HTML start but JSX end (mismatched styles) 518 | const targetPath = `${testEnvPath}/mismatch_splice.mdx`; 519 | fs.writeFileSync( 520 | targetPath, 521 | `\nPLACEHOLDER\n{/* SNIPEND */}\n` 522 | ); 523 | 524 | cfg.origins = [ 525 | { 526 | files: { 527 | pattern: srcPath, 528 | owner: 'temporalio', 529 | repo: 'snipsync', 530 | ref: 'main', 531 | }, 532 | }, 533 | ]; 534 | cfg.targets = [testEnvPath]; 535 | cfg.features.enable_code_block = true; 536 | 537 | // Spy on logger.warn 538 | const warnSpy = jest.spyOn(logger, 'warn').mockImplementation(() => {}); 539 | 540 | // Act 541 | const synctron = new Sync(cfg, logger); 542 | await synctron.run(); 543 | 544 | // Assert: the mismatched region remains unchanged (no code spliced in) 545 | const out = fs.readFileSync(targetPath, 'utf8'); 546 | expect(out).toContain(''); 547 | expect(out).toContain('PLACEHOLDER'); 548 | expect(out).toContain('{/* SNIPEND */}'); 549 | 550 | // And we should have logged a warning about the mismatch 551 | expect(warnSpy).toHaveBeenCalled(); 552 | 553 | // Cleanup spy 554 | warnSpy.mockRestore(); 555 | }); 556 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@ampproject/remapping@^2.1.0": 6 | version "2.2.0" 7 | resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" 8 | integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== 9 | dependencies: 10 | "@jridgewell/gen-mapping" "^0.1.0" 11 | "@jridgewell/trace-mapping" "^0.3.9" 12 | 13 | "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.24.7": 14 | version "7.24.7" 15 | resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz" 16 | integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== 17 | dependencies: 18 | "@babel/highlight" "^7.24.7" 19 | picocolors "^1.0.0" 20 | 21 | "@babel/code-frame@7.0.0-beta.36": 22 | version "7.0.0-beta.36" 23 | resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0-beta.36.tgz" 24 | integrity sha512-sW77BFwJ48YvQp3Gzz5xtAUiXuYOL2aMJKDwiaY3OcvdqBFurtYfOpSa4QrNyDxmOGRFSYzUpabU2m9QrlWE7w== 25 | dependencies: 26 | chalk "^2.0.0" 27 | esutils "^2.0.2" 28 | js-tokens "^3.0.0" 29 | 30 | "@babel/compat-data@^7.20.0": 31 | version "7.20.1" 32 | resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.1.tgz" 33 | integrity sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ== 34 | 35 | "@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.8.0": 36 | version "7.20.2" 37 | resolved "https://registry.npmjs.org/@babel/core/-/core-7.20.2.tgz" 38 | integrity sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g== 39 | dependencies: 40 | "@ampproject/remapping" "^2.1.0" 41 | "@babel/code-frame" "^7.18.6" 42 | "@babel/generator" "^7.20.2" 43 | "@babel/helper-compilation-targets" "^7.20.0" 44 | "@babel/helper-module-transforms" "^7.20.2" 45 | "@babel/helpers" "^7.20.1" 46 | "@babel/parser" "^7.20.2" 47 | "@babel/template" "^7.18.10" 48 | "@babel/traverse" "^7.20.1" 49 | "@babel/types" "^7.20.2" 50 | convert-source-map "^1.7.0" 51 | debug "^4.1.0" 52 | gensync "^1.0.0-beta.2" 53 | json5 "^2.2.1" 54 | semver "^6.3.0" 55 | 56 | "@babel/generator@^7.20.2", "@babel/generator@^7.25.4", "@babel/generator@^7.7.2": 57 | version "7.25.4" 58 | resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.25.4.tgz" 59 | integrity sha512-NFtZmZsyzDPJnk9Zg3BbTfKKc9UlHYzD0E//p2Z3B9nCwwtJW9T0gVbCz8+fBngnn4zf1Dr3IK8PHQQHq0lDQw== 60 | dependencies: 61 | "@babel/types" "^7.25.4" 62 | "@jridgewell/gen-mapping" "^0.3.5" 63 | "@jridgewell/trace-mapping" "^0.3.25" 64 | jsesc "^2.5.1" 65 | 66 | "@babel/helper-compilation-targets@^7.20.0": 67 | version "7.20.0" 68 | resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz" 69 | integrity sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ== 70 | dependencies: 71 | "@babel/compat-data" "^7.20.0" 72 | "@babel/helper-validator-option" "^7.18.6" 73 | browserslist "^4.21.3" 74 | semver "^6.3.0" 75 | 76 | "@babel/helper-environment-visitor@^7.18.9": 77 | version "7.18.9" 78 | resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz" 79 | integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== 80 | 81 | "@babel/helper-function-name@7.0.0-beta.36": 82 | version "7.0.0-beta.36" 83 | resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.36.tgz" 84 | integrity sha512-/SGPOyifPf20iTrMN+WdlY2MbKa7/o4j7B/4IAsdOusASp2icT+Wcdjf4tjJHaXNX8Pe9bpgVxLNxhRvcf8E5w== 85 | dependencies: 86 | "@babel/helper-get-function-arity" "7.0.0-beta.36" 87 | "@babel/template" "7.0.0-beta.36" 88 | "@babel/types" "7.0.0-beta.36" 89 | 90 | "@babel/helper-get-function-arity@7.0.0-beta.36": 91 | version "7.0.0-beta.36" 92 | resolved "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.36.tgz" 93 | integrity sha512-vPPcx2vsSoDbcyWr9S3nd0FM3B4hEXnt0p1oKpwa08GwK0fSRxa98MyaRGf8suk8frdQlG1P3mDrz5p/Rr3pbA== 94 | dependencies: 95 | "@babel/types" "7.0.0-beta.36" 96 | 97 | "@babel/helper-module-imports@^7.18.6": 98 | version "7.18.6" 99 | resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz" 100 | integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== 101 | dependencies: 102 | "@babel/types" "^7.18.6" 103 | 104 | "@babel/helper-module-transforms@^7.20.2": 105 | version "7.20.2" 106 | resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz" 107 | integrity sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA== 108 | dependencies: 109 | "@babel/helper-environment-visitor" "^7.18.9" 110 | "@babel/helper-module-imports" "^7.18.6" 111 | "@babel/helper-simple-access" "^7.20.2" 112 | "@babel/helper-split-export-declaration" "^7.18.6" 113 | "@babel/helper-validator-identifier" "^7.19.1" 114 | "@babel/template" "^7.18.10" 115 | "@babel/traverse" "^7.20.1" 116 | "@babel/types" "^7.20.2" 117 | 118 | "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.8.0": 119 | version "7.20.2" 120 | resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz" 121 | integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== 122 | 123 | "@babel/helper-simple-access@^7.20.2": 124 | version "7.20.2" 125 | resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz" 126 | integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== 127 | dependencies: 128 | "@babel/types" "^7.20.2" 129 | 130 | "@babel/helper-split-export-declaration@^7.18.6": 131 | version "7.18.6" 132 | resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz" 133 | integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== 134 | dependencies: 135 | "@babel/types" "^7.18.6" 136 | 137 | "@babel/helper-string-parser@^7.19.4", "@babel/helper-string-parser@^7.24.8": 138 | version "7.24.8" 139 | resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz" 140 | integrity sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ== 141 | 142 | "@babel/helper-validator-identifier@^7.19.1", "@babel/helper-validator-identifier@^7.24.7": 143 | version "7.24.7" 144 | resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz" 145 | integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== 146 | 147 | "@babel/helper-validator-option@^7.18.6": 148 | version "7.18.6" 149 | resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz" 150 | integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== 151 | 152 | "@babel/helpers@^7.20.1": 153 | version "7.20.1" 154 | resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.1.tgz" 155 | integrity sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg== 156 | dependencies: 157 | "@babel/template" "^7.18.10" 158 | "@babel/traverse" "^7.20.1" 159 | "@babel/types" "^7.20.0" 160 | 161 | "@babel/highlight@^7.24.7": 162 | version "7.24.7" 163 | resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz" 164 | integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== 165 | dependencies: 166 | "@babel/helper-validator-identifier" "^7.24.7" 167 | chalk "^2.4.2" 168 | js-tokens "^4.0.0" 169 | picocolors "^1.0.0" 170 | 171 | "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.20.2", "@babel/parser@^7.25.0", "@babel/parser@^7.25.4": 172 | version "7.25.4" 173 | resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.25.4.tgz" 174 | integrity sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA== 175 | dependencies: 176 | "@babel/types" "^7.25.4" 177 | 178 | "@babel/plugin-syntax-async-generators@^7.8.4": 179 | version "7.8.4" 180 | resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" 181 | integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== 182 | dependencies: 183 | "@babel/helper-plugin-utils" "^7.8.0" 184 | 185 | "@babel/plugin-syntax-bigint@^7.8.3": 186 | version "7.8.3" 187 | resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" 188 | integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== 189 | dependencies: 190 | "@babel/helper-plugin-utils" "^7.8.0" 191 | 192 | "@babel/plugin-syntax-class-properties@^7.8.3": 193 | version "7.12.13" 194 | resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" 195 | integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== 196 | dependencies: 197 | "@babel/helper-plugin-utils" "^7.12.13" 198 | 199 | "@babel/plugin-syntax-import-meta@^7.8.3": 200 | version "7.10.4" 201 | resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" 202 | integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== 203 | dependencies: 204 | "@babel/helper-plugin-utils" "^7.10.4" 205 | 206 | "@babel/plugin-syntax-json-strings@^7.8.3": 207 | version "7.8.3" 208 | resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" 209 | integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== 210 | dependencies: 211 | "@babel/helper-plugin-utils" "^7.8.0" 212 | 213 | "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": 214 | version "7.10.4" 215 | resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" 216 | integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== 217 | dependencies: 218 | "@babel/helper-plugin-utils" "^7.10.4" 219 | 220 | "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": 221 | version "7.8.3" 222 | resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" 223 | integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== 224 | dependencies: 225 | "@babel/helper-plugin-utils" "^7.8.0" 226 | 227 | "@babel/plugin-syntax-numeric-separator@^7.8.3": 228 | version "7.10.4" 229 | resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" 230 | integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== 231 | dependencies: 232 | "@babel/helper-plugin-utils" "^7.10.4" 233 | 234 | "@babel/plugin-syntax-object-rest-spread@^7.8.3": 235 | version "7.8.3" 236 | resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" 237 | integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== 238 | dependencies: 239 | "@babel/helper-plugin-utils" "^7.8.0" 240 | 241 | "@babel/plugin-syntax-optional-catch-binding@^7.8.3": 242 | version "7.8.3" 243 | resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" 244 | integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== 245 | dependencies: 246 | "@babel/helper-plugin-utils" "^7.8.0" 247 | 248 | "@babel/plugin-syntax-optional-chaining@^7.8.3": 249 | version "7.8.3" 250 | resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" 251 | integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== 252 | dependencies: 253 | "@babel/helper-plugin-utils" "^7.8.0" 254 | 255 | "@babel/plugin-syntax-top-level-await@^7.8.3": 256 | version "7.14.5" 257 | resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" 258 | integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== 259 | dependencies: 260 | "@babel/helper-plugin-utils" "^7.14.5" 261 | 262 | "@babel/plugin-syntax-typescript@^7.7.2": 263 | version "7.20.0" 264 | resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz" 265 | integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== 266 | dependencies: 267 | "@babel/helper-plugin-utils" "^7.19.0" 268 | 269 | "@babel/template@^7.18.10", "@babel/template@^7.25.0": 270 | version "7.25.0" 271 | resolved "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz" 272 | integrity sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q== 273 | dependencies: 274 | "@babel/code-frame" "^7.24.7" 275 | "@babel/parser" "^7.25.0" 276 | "@babel/types" "^7.25.0" 277 | 278 | "@babel/template@^7.3.3": 279 | version "7.18.10" 280 | resolved "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz" 281 | integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== 282 | dependencies: 283 | "@babel/code-frame" "^7.18.6" 284 | "@babel/parser" "^7.18.10" 285 | "@babel/types" "^7.18.10" 286 | 287 | "@babel/template@7.0.0-beta.36": 288 | version "7.0.0-beta.36" 289 | resolved "https://registry.npmjs.org/@babel/template/-/template-7.0.0-beta.36.tgz" 290 | integrity sha512-mUBi90WRyZ9iVvlWLEdeo8gn/tROyJdjKNC4W5xJTSZL+9MS89rTJSqiaJKXIkxk/YRDL/g/8snrG/O0xl33uA== 291 | dependencies: 292 | "@babel/code-frame" "7.0.0-beta.36" 293 | "@babel/types" "7.0.0-beta.36" 294 | babylon "7.0.0-beta.36" 295 | lodash "^4.2.0" 296 | 297 | "@babel/traverse@^7.20.1": 298 | version "7.25.4" 299 | resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.4.tgz" 300 | integrity sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg== 301 | dependencies: 302 | "@babel/code-frame" "^7.24.7" 303 | "@babel/generator" "^7.25.4" 304 | "@babel/parser" "^7.25.4" 305 | "@babel/template" "^7.25.0" 306 | "@babel/types" "^7.25.4" 307 | debug "^4.3.1" 308 | globals "^11.1.0" 309 | 310 | "@babel/traverse@^7.7.2": 311 | version "7.25.4" 312 | resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.4.tgz" 313 | integrity sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg== 314 | dependencies: 315 | "@babel/code-frame" "^7.24.7" 316 | "@babel/generator" "^7.25.4" 317 | "@babel/parser" "^7.25.4" 318 | "@babel/template" "^7.25.0" 319 | "@babel/types" "^7.25.4" 320 | debug "^4.3.1" 321 | globals "^11.1.0" 322 | 323 | "@babel/traverse@7.0.0-beta.36": 324 | version "7.0.0-beta.36" 325 | resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.0.0-beta.36.tgz" 326 | integrity sha512-OTUb6iSKVR/98dGThRJ1BiyfwbuX10BVnkz89IpaerjTPRhDfMBfLsqmzxz5MiywUOW4M0Clta0o7rSxkfcuzw== 327 | dependencies: 328 | "@babel/code-frame" "7.0.0-beta.36" 329 | "@babel/helper-function-name" "7.0.0-beta.36" 330 | "@babel/types" "7.0.0-beta.36" 331 | babylon "7.0.0-beta.36" 332 | debug "^3.0.1" 333 | globals "^11.1.0" 334 | invariant "^2.2.0" 335 | lodash "^4.2.0" 336 | 337 | "@babel/types@^7.0.0": 338 | version "7.20.2" 339 | resolved "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz" 340 | integrity sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog== 341 | dependencies: 342 | "@babel/helper-string-parser" "^7.19.4" 343 | "@babel/helper-validator-identifier" "^7.19.1" 344 | to-fast-properties "^2.0.0" 345 | 346 | "@babel/types@^7.18.10", "@babel/types@^7.3.3": 347 | version "7.20.2" 348 | resolved "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz" 349 | integrity sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog== 350 | dependencies: 351 | "@babel/helper-string-parser" "^7.19.4" 352 | "@babel/helper-validator-identifier" "^7.19.1" 353 | to-fast-properties "^2.0.0" 354 | 355 | "@babel/types@^7.18.6": 356 | version "7.20.2" 357 | resolved "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz" 358 | integrity sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog== 359 | dependencies: 360 | "@babel/helper-string-parser" "^7.19.4" 361 | "@babel/helper-validator-identifier" "^7.19.1" 362 | to-fast-properties "^2.0.0" 363 | 364 | "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.25.0", "@babel/types@^7.25.4": 365 | version "7.25.4" 366 | resolved "https://registry.npmjs.org/@babel/types/-/types-7.25.4.tgz" 367 | integrity sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ== 368 | dependencies: 369 | "@babel/helper-string-parser" "^7.24.8" 370 | "@babel/helper-validator-identifier" "^7.24.7" 371 | to-fast-properties "^2.0.0" 372 | 373 | "@babel/types@^7.3.0": 374 | version "7.20.2" 375 | resolved "https://registry.npmjs.org/@babel/types/-/types-7.20.2.tgz" 376 | integrity sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog== 377 | dependencies: 378 | "@babel/helper-string-parser" "^7.19.4" 379 | "@babel/helper-validator-identifier" "^7.19.1" 380 | to-fast-properties "^2.0.0" 381 | 382 | "@babel/types@7.0.0-beta.36": 383 | version "7.0.0-beta.36" 384 | resolved "https://registry.npmjs.org/@babel/types/-/types-7.0.0-beta.36.tgz" 385 | integrity sha512-PyAORDO9um9tfnrddXgmWN9e6Sq9qxraQIt5ynqBOSXKA5qvK1kUr+Q3nSzKFdzorsiK+oqcUnAFvEoKxv9D+Q== 386 | dependencies: 387 | esutils "^2.0.2" 388 | lodash "^4.2.0" 389 | to-fast-properties "^2.0.0" 390 | 391 | "@bcoe/v8-coverage@^0.2.3": 392 | version "0.2.3" 393 | resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" 394 | integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== 395 | 396 | "@eslint-community/eslint-utils@^4.2.0": 397 | version "4.4.0" 398 | resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" 399 | integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== 400 | dependencies: 401 | eslint-visitor-keys "^3.3.0" 402 | 403 | "@eslint/eslintrc@^1.3.3": 404 | version "1.3.3" 405 | resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz" 406 | integrity sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg== 407 | dependencies: 408 | ajv "^6.12.4" 409 | debug "^4.3.2" 410 | espree "^9.4.0" 411 | globals "^13.15.0" 412 | ignore "^5.2.0" 413 | import-fresh "^3.2.1" 414 | js-yaml "^4.1.0" 415 | minimatch "^3.1.2" 416 | strip-json-comments "^3.1.1" 417 | 418 | "@humanwhocodes/config-array@^0.11.6": 419 | version "0.11.7" 420 | resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz" 421 | integrity sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw== 422 | dependencies: 423 | "@humanwhocodes/object-schema" "^1.2.1" 424 | debug "^4.1.1" 425 | minimatch "^3.0.5" 426 | 427 | "@humanwhocodes/module-importer@^1.0.1": 428 | version "1.0.1" 429 | resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" 430 | integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== 431 | 432 | "@humanwhocodes/object-schema@^1.2.1": 433 | version "1.2.1" 434 | resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" 435 | integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== 436 | 437 | "@istanbuljs/load-nyc-config@^1.0.0": 438 | version "1.1.0" 439 | resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" 440 | integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== 441 | dependencies: 442 | camelcase "^5.3.1" 443 | find-up "^4.1.0" 444 | get-package-type "^0.1.0" 445 | js-yaml "^3.13.1" 446 | resolve-from "^5.0.0" 447 | 448 | "@istanbuljs/schema@^0.1.2": 449 | version "0.1.3" 450 | resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" 451 | integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== 452 | 453 | "@jest/console@^28.1.3": 454 | version "28.1.3" 455 | resolved "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz" 456 | integrity sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw== 457 | dependencies: 458 | "@jest/types" "^28.1.3" 459 | "@types/node" "*" 460 | chalk "^4.0.0" 461 | jest-message-util "^28.1.3" 462 | jest-util "^28.1.3" 463 | slash "^3.0.0" 464 | 465 | "@jest/core@^28.1.3": 466 | version "28.1.3" 467 | resolved "https://registry.npmjs.org/@jest/core/-/core-28.1.3.tgz" 468 | integrity sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA== 469 | dependencies: 470 | "@jest/console" "^28.1.3" 471 | "@jest/reporters" "^28.1.3" 472 | "@jest/test-result" "^28.1.3" 473 | "@jest/transform" "^28.1.3" 474 | "@jest/types" "^28.1.3" 475 | "@types/node" "*" 476 | ansi-escapes "^4.2.1" 477 | chalk "^4.0.0" 478 | ci-info "^3.2.0" 479 | exit "^0.1.2" 480 | graceful-fs "^4.2.9" 481 | jest-changed-files "^28.1.3" 482 | jest-config "^28.1.3" 483 | jest-haste-map "^28.1.3" 484 | jest-message-util "^28.1.3" 485 | jest-regex-util "^28.0.2" 486 | jest-resolve "^28.1.3" 487 | jest-resolve-dependencies "^28.1.3" 488 | jest-runner "^28.1.3" 489 | jest-runtime "^28.1.3" 490 | jest-snapshot "^28.1.3" 491 | jest-util "^28.1.3" 492 | jest-validate "^28.1.3" 493 | jest-watcher "^28.1.3" 494 | micromatch "^4.0.4" 495 | pretty-format "^28.1.3" 496 | rimraf "^3.0.0" 497 | slash "^3.0.0" 498 | strip-ansi "^6.0.0" 499 | 500 | "@jest/environment@^28.1.3": 501 | version "28.1.3" 502 | resolved "https://registry.npmjs.org/@jest/environment/-/environment-28.1.3.tgz" 503 | integrity sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA== 504 | dependencies: 505 | "@jest/fake-timers" "^28.1.3" 506 | "@jest/types" "^28.1.3" 507 | "@types/node" "*" 508 | jest-mock "^28.1.3" 509 | 510 | "@jest/expect-utils@^28.1.3": 511 | version "28.1.3" 512 | resolved "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz" 513 | integrity sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA== 514 | dependencies: 515 | jest-get-type "^28.0.2" 516 | 517 | "@jest/expect@^28.1.3": 518 | version "28.1.3" 519 | resolved "https://registry.npmjs.org/@jest/expect/-/expect-28.1.3.tgz" 520 | integrity sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw== 521 | dependencies: 522 | expect "^28.1.3" 523 | jest-snapshot "^28.1.3" 524 | 525 | "@jest/fake-timers@^28.1.3": 526 | version "28.1.3" 527 | resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-28.1.3.tgz" 528 | integrity sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw== 529 | dependencies: 530 | "@jest/types" "^28.1.3" 531 | "@sinonjs/fake-timers" "^9.1.2" 532 | "@types/node" "*" 533 | jest-message-util "^28.1.3" 534 | jest-mock "^28.1.3" 535 | jest-util "^28.1.3" 536 | 537 | "@jest/globals@^28.1.3": 538 | version "28.1.3" 539 | resolved "https://registry.npmjs.org/@jest/globals/-/globals-28.1.3.tgz" 540 | integrity sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA== 541 | dependencies: 542 | "@jest/environment" "^28.1.3" 543 | "@jest/expect" "^28.1.3" 544 | "@jest/types" "^28.1.3" 545 | 546 | "@jest/reporters@^28.1.3": 547 | version "28.1.3" 548 | resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-28.1.3.tgz" 549 | integrity sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg== 550 | dependencies: 551 | "@bcoe/v8-coverage" "^0.2.3" 552 | "@jest/console" "^28.1.3" 553 | "@jest/test-result" "^28.1.3" 554 | "@jest/transform" "^28.1.3" 555 | "@jest/types" "^28.1.3" 556 | "@jridgewell/trace-mapping" "^0.3.13" 557 | "@types/node" "*" 558 | chalk "^4.0.0" 559 | collect-v8-coverage "^1.0.0" 560 | exit "^0.1.2" 561 | glob "^7.1.3" 562 | graceful-fs "^4.2.9" 563 | istanbul-lib-coverage "^3.0.0" 564 | istanbul-lib-instrument "^5.1.0" 565 | istanbul-lib-report "^3.0.0" 566 | istanbul-lib-source-maps "^4.0.0" 567 | istanbul-reports "^3.1.3" 568 | jest-message-util "^28.1.3" 569 | jest-util "^28.1.3" 570 | jest-worker "^28.1.3" 571 | slash "^3.0.0" 572 | string-length "^4.0.1" 573 | strip-ansi "^6.0.0" 574 | terminal-link "^2.0.0" 575 | v8-to-istanbul "^9.0.1" 576 | 577 | "@jest/schemas@^28.1.3": 578 | version "28.1.3" 579 | resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz" 580 | integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== 581 | dependencies: 582 | "@sinclair/typebox" "^0.24.1" 583 | 584 | "@jest/source-map@^28.1.2": 585 | version "28.1.2" 586 | resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-28.1.2.tgz" 587 | integrity sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww== 588 | dependencies: 589 | "@jridgewell/trace-mapping" "^0.3.13" 590 | callsites "^3.0.0" 591 | graceful-fs "^4.2.9" 592 | 593 | "@jest/test-result@^28.1.3": 594 | version "28.1.3" 595 | resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz" 596 | integrity sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg== 597 | dependencies: 598 | "@jest/console" "^28.1.3" 599 | "@jest/types" "^28.1.3" 600 | "@types/istanbul-lib-coverage" "^2.0.0" 601 | collect-v8-coverage "^1.0.0" 602 | 603 | "@jest/test-sequencer@^28.1.3": 604 | version "28.1.3" 605 | resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz" 606 | integrity sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw== 607 | dependencies: 608 | "@jest/test-result" "^28.1.3" 609 | graceful-fs "^4.2.9" 610 | jest-haste-map "^28.1.3" 611 | slash "^3.0.0" 612 | 613 | "@jest/transform@^28.1.3": 614 | version "28.1.3" 615 | resolved "https://registry.npmjs.org/@jest/transform/-/transform-28.1.3.tgz" 616 | integrity sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA== 617 | dependencies: 618 | "@babel/core" "^7.11.6" 619 | "@jest/types" "^28.1.3" 620 | "@jridgewell/trace-mapping" "^0.3.13" 621 | babel-plugin-istanbul "^6.1.1" 622 | chalk "^4.0.0" 623 | convert-source-map "^1.4.0" 624 | fast-json-stable-stringify "^2.0.0" 625 | graceful-fs "^4.2.9" 626 | jest-haste-map "^28.1.3" 627 | jest-regex-util "^28.0.2" 628 | jest-util "^28.1.3" 629 | micromatch "^4.0.4" 630 | pirates "^4.0.4" 631 | slash "^3.0.0" 632 | write-file-atomic "^4.0.1" 633 | 634 | "@jest/types@^28.1.3": 635 | version "28.1.3" 636 | resolved "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz" 637 | integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== 638 | dependencies: 639 | "@jest/schemas" "^28.1.3" 640 | "@types/istanbul-lib-coverage" "^2.0.0" 641 | "@types/istanbul-reports" "^3.0.0" 642 | "@types/node" "*" 643 | "@types/yargs" "^17.0.8" 644 | chalk "^4.0.0" 645 | 646 | "@jridgewell/gen-mapping@^0.1.0": 647 | version "0.1.1" 648 | resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz" 649 | integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== 650 | dependencies: 651 | "@jridgewell/set-array" "^1.0.0" 652 | "@jridgewell/sourcemap-codec" "^1.4.10" 653 | 654 | "@jridgewell/gen-mapping@^0.3.5": 655 | version "0.3.5" 656 | resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz" 657 | integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== 658 | dependencies: 659 | "@jridgewell/set-array" "^1.2.1" 660 | "@jridgewell/sourcemap-codec" "^1.4.10" 661 | "@jridgewell/trace-mapping" "^0.3.24" 662 | 663 | "@jridgewell/resolve-uri@^3.1.0": 664 | version "3.1.0" 665 | resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" 666 | integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== 667 | 668 | "@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.2.1": 669 | version "1.2.1" 670 | resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" 671 | integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== 672 | 673 | "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": 674 | version "1.4.14" 675 | resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" 676 | integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== 677 | 678 | "@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.13", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25", "@jridgewell/trace-mapping@^0.3.9": 679 | version "0.3.25" 680 | resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" 681 | integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== 682 | dependencies: 683 | "@jridgewell/resolve-uri" "^3.1.0" 684 | "@jridgewell/sourcemap-codec" "^1.4.14" 685 | 686 | "@nodelib/fs.scandir@2.1.5": 687 | version "2.1.5" 688 | resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" 689 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 690 | dependencies: 691 | "@nodelib/fs.stat" "2.0.5" 692 | run-parallel "^1.1.9" 693 | 694 | "@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": 695 | version "2.0.5" 696 | resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" 697 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 698 | 699 | "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": 700 | version "1.2.8" 701 | resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" 702 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 703 | dependencies: 704 | "@nodelib/fs.scandir" "2.1.5" 705 | fastq "^1.6.0" 706 | 707 | "@octokit/auth-token@^2.4.4": 708 | version "2.5.0" 709 | resolved "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz" 710 | integrity sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g== 711 | dependencies: 712 | "@octokit/types" "^6.0.3" 713 | 714 | "@octokit/core@^3.5.1", "@octokit/core@>=2", "@octokit/core@>=3": 715 | version "3.6.0" 716 | resolved "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz" 717 | integrity sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q== 718 | dependencies: 719 | "@octokit/auth-token" "^2.4.4" 720 | "@octokit/graphql" "^4.5.8" 721 | "@octokit/request" "^5.6.3" 722 | "@octokit/request-error" "^2.0.5" 723 | "@octokit/types" "^6.0.3" 724 | before-after-hook "^2.2.0" 725 | universal-user-agent "^6.0.0" 726 | 727 | "@octokit/endpoint@^6.0.1": 728 | version "6.0.12" 729 | resolved "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz" 730 | integrity sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA== 731 | dependencies: 732 | "@octokit/types" "^6.0.3" 733 | is-plain-object "^5.0.0" 734 | universal-user-agent "^6.0.0" 735 | 736 | "@octokit/graphql@^4.5.8": 737 | version "4.8.0" 738 | resolved "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz" 739 | integrity sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg== 740 | dependencies: 741 | "@octokit/request" "^5.6.0" 742 | "@octokit/types" "^6.0.3" 743 | universal-user-agent "^6.0.0" 744 | 745 | "@octokit/openapi-types@^12.11.0": 746 | version "12.11.0" 747 | resolved "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz" 748 | integrity sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ== 749 | 750 | "@octokit/plugin-paginate-rest@^2.16.8": 751 | version "2.21.3" 752 | resolved "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz" 753 | integrity sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw== 754 | dependencies: 755 | "@octokit/types" "^6.40.0" 756 | 757 | "@octokit/plugin-request-log@^1.0.4": 758 | version "1.0.4" 759 | resolved "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz" 760 | integrity sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA== 761 | 762 | "@octokit/plugin-rest-endpoint-methods@^5.12.0": 763 | version "5.16.2" 764 | resolved "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz" 765 | integrity sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw== 766 | dependencies: 767 | "@octokit/types" "^6.39.0" 768 | deprecation "^2.3.1" 769 | 770 | "@octokit/request-error@^2.0.5", "@octokit/request-error@^2.1.0": 771 | version "2.1.0" 772 | resolved "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz" 773 | integrity sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg== 774 | dependencies: 775 | "@octokit/types" "^6.0.3" 776 | deprecation "^2.0.0" 777 | once "^1.4.0" 778 | 779 | "@octokit/request@^5.6.0", "@octokit/request@^5.6.3": 780 | version "5.6.3" 781 | resolved "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz" 782 | integrity sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A== 783 | dependencies: 784 | "@octokit/endpoint" "^6.0.1" 785 | "@octokit/request-error" "^2.1.0" 786 | "@octokit/types" "^6.16.1" 787 | is-plain-object "^5.0.0" 788 | node-fetch "^2.6.7" 789 | universal-user-agent "^6.0.0" 790 | 791 | "@octokit/rest@^18.12.0": 792 | version "18.12.0" 793 | resolved "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz" 794 | integrity sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q== 795 | dependencies: 796 | "@octokit/core" "^3.5.1" 797 | "@octokit/plugin-paginate-rest" "^2.16.8" 798 | "@octokit/plugin-request-log" "^1.0.4" 799 | "@octokit/plugin-rest-endpoint-methods" "^5.12.0" 800 | 801 | "@octokit/types@^6.0.3", "@octokit/types@^6.16.1", "@octokit/types@^6.39.0", "@octokit/types@^6.40.0": 802 | version "6.41.0" 803 | resolved "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz" 804 | integrity sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg== 805 | dependencies: 806 | "@octokit/openapi-types" "^12.11.0" 807 | 808 | "@sinclair/typebox@^0.24.1": 809 | version "0.24.51" 810 | resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz" 811 | integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== 812 | 813 | "@sinonjs/commons@^1.7.0": 814 | version "1.8.5" 815 | resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.5.tgz" 816 | integrity sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA== 817 | dependencies: 818 | type-detect "4.0.8" 819 | 820 | "@sinonjs/fake-timers@^9.1.2": 821 | version "9.1.2" 822 | resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz" 823 | integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== 824 | dependencies: 825 | "@sinonjs/commons" "^1.7.0" 826 | 827 | "@types/babel__core@^7.1.14": 828 | version "7.1.20" 829 | resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz" 830 | integrity sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ== 831 | dependencies: 832 | "@babel/parser" "^7.1.0" 833 | "@babel/types" "^7.0.0" 834 | "@types/babel__generator" "*" 835 | "@types/babel__template" "*" 836 | "@types/babel__traverse" "*" 837 | 838 | "@types/babel__generator@*": 839 | version "7.6.4" 840 | resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz" 841 | integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== 842 | dependencies: 843 | "@babel/types" "^7.0.0" 844 | 845 | "@types/babel__template@*": 846 | version "7.4.1" 847 | resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz" 848 | integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== 849 | dependencies: 850 | "@babel/parser" "^7.1.0" 851 | "@babel/types" "^7.0.0" 852 | 853 | "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": 854 | version "7.18.2" 855 | resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.2.tgz" 856 | integrity sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg== 857 | dependencies: 858 | "@babel/types" "^7.3.0" 859 | 860 | "@types/graceful-fs@^4.1.3": 861 | version "4.1.5" 862 | resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz" 863 | integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== 864 | dependencies: 865 | "@types/node" "*" 866 | 867 | "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": 868 | version "2.0.4" 869 | resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" 870 | integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== 871 | 872 | "@types/istanbul-lib-report@*": 873 | version "3.0.0" 874 | resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" 875 | integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== 876 | dependencies: 877 | "@types/istanbul-lib-coverage" "*" 878 | 879 | "@types/istanbul-reports@^3.0.0": 880 | version "3.0.1" 881 | resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" 882 | integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== 883 | dependencies: 884 | "@types/istanbul-lib-report" "*" 885 | 886 | "@types/json-schema@^7.0.9": 887 | version "7.0.11" 888 | resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" 889 | integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== 890 | 891 | "@types/node@*": 892 | version "18.11.9" 893 | resolved "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz" 894 | integrity sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg== 895 | 896 | "@types/prettier@^2.1.5": 897 | version "2.7.1" 898 | resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz" 899 | integrity sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow== 900 | 901 | "@types/semver@^7.3.12": 902 | version "7.3.13" 903 | resolved "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz" 904 | integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== 905 | 906 | "@types/stack-utils@^2.0.0": 907 | version "2.0.1" 908 | resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" 909 | integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== 910 | 911 | "@types/yargs-parser@*": 912 | version "21.0.0" 913 | resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" 914 | integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== 915 | 916 | "@types/yargs@^17.0.8": 917 | version "17.0.13" 918 | resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.13.tgz" 919 | integrity sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg== 920 | dependencies: 921 | "@types/yargs-parser" "*" 922 | 923 | "@typescript-eslint/scope-manager@5.62.0": 924 | version "5.62.0" 925 | resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz" 926 | integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== 927 | dependencies: 928 | "@typescript-eslint/types" "5.62.0" 929 | "@typescript-eslint/visitor-keys" "5.62.0" 930 | 931 | "@typescript-eslint/types@5.62.0": 932 | version "5.62.0" 933 | resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz" 934 | integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== 935 | 936 | "@typescript-eslint/typescript-estree@5.62.0": 937 | version "5.62.0" 938 | resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz" 939 | integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== 940 | dependencies: 941 | "@typescript-eslint/types" "5.62.0" 942 | "@typescript-eslint/visitor-keys" "5.62.0" 943 | debug "^4.3.4" 944 | globby "^11.1.0" 945 | is-glob "^4.0.3" 946 | semver "^7.3.7" 947 | tsutils "^3.21.0" 948 | 949 | "@typescript-eslint/utils@^5.10.0": 950 | version "5.62.0" 951 | resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz" 952 | integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== 953 | dependencies: 954 | "@eslint-community/eslint-utils" "^4.2.0" 955 | "@types/json-schema" "^7.0.9" 956 | "@types/semver" "^7.3.12" 957 | "@typescript-eslint/scope-manager" "5.62.0" 958 | "@typescript-eslint/types" "5.62.0" 959 | "@typescript-eslint/typescript-estree" "5.62.0" 960 | eslint-scope "^5.1.1" 961 | semver "^7.3.7" 962 | 963 | "@typescript-eslint/visitor-keys@5.62.0": 964 | version "5.62.0" 965 | resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz" 966 | integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== 967 | dependencies: 968 | "@typescript-eslint/types" "5.62.0" 969 | eslint-visitor-keys "^3.3.0" 970 | 971 | acorn-jsx@^5.3.2: 972 | version "5.3.2" 973 | resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" 974 | integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== 975 | 976 | "acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.8.0: 977 | version "8.8.1" 978 | resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz" 979 | integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== 980 | 981 | ajv@^6.10.0, ajv@^6.12.4: 982 | version "6.12.6" 983 | resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" 984 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 985 | dependencies: 986 | fast-deep-equal "^3.1.1" 987 | fast-json-stable-stringify "^2.0.0" 988 | json-schema-traverse "^0.4.1" 989 | uri-js "^4.2.2" 990 | 991 | ansi-escapes@^4.2.1: 992 | version "4.3.2" 993 | resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" 994 | integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== 995 | dependencies: 996 | type-fest "^0.21.3" 997 | 998 | ansi-regex@^5.0.0, ansi-regex@^5.0.1: 999 | version "5.0.1" 1000 | resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" 1001 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 1002 | 1003 | ansi-styles@^3.2.1: 1004 | version "3.2.1" 1005 | resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" 1006 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 1007 | dependencies: 1008 | color-convert "^1.9.0" 1009 | 1010 | ansi-styles@^4.0.0: 1011 | version "4.3.0" 1012 | resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" 1013 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 1014 | dependencies: 1015 | color-convert "^2.0.1" 1016 | 1017 | ansi-styles@^4.1.0: 1018 | version "4.3.0" 1019 | resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" 1020 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 1021 | dependencies: 1022 | color-convert "^2.0.1" 1023 | 1024 | ansi-styles@^5.0.0: 1025 | version "5.2.0" 1026 | resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" 1027 | integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== 1028 | 1029 | anymatch@^3.0.3: 1030 | version "3.1.2" 1031 | resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" 1032 | integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== 1033 | dependencies: 1034 | normalize-path "^3.0.0" 1035 | picomatch "^2.0.4" 1036 | 1037 | anzip@^0.2.0: 1038 | version "0.2.0" 1039 | resolved "https://registry.npmjs.org/anzip/-/anzip-0.2.0.tgz" 1040 | integrity sha512-NS4U6nsesdxZg+kRksuzK0PIhW1mMzdW9LFiVecciZJURdKXma2OWr0w77/pvGN94GSdGDHIHmohwRwCQLaqWw== 1041 | dependencies: 1042 | yauzl "^2.10.0" 1043 | 1044 | argparse@^1.0.7: 1045 | version "1.0.10" 1046 | resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" 1047 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 1048 | dependencies: 1049 | sprintf-js "~1.0.2" 1050 | 1051 | argparse@^2.0.1: 1052 | version "2.0.1" 1053 | resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" 1054 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 1055 | 1056 | array-union@^2.1.0: 1057 | version "2.1.0" 1058 | resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" 1059 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 1060 | 1061 | arraybuffer-to-buffer@^0.0.7: 1062 | version "0.0.7" 1063 | resolved "https://registry.npmjs.org/arraybuffer-to-buffer/-/arraybuffer-to-buffer-0.0.7.tgz" 1064 | integrity sha512-WAIA2Mq+KLJ7Ua40KD6zMshvSsJbnXRuVG0/MNEIPhIMEWRkcmLMcQvx0OkAeMIZi2jHJOXxK9ZqVJ+A+Z6knw== 1065 | 1066 | babel-eslint@8.2.1: 1067 | version "8.2.1" 1068 | resolved "https://registry.npmjs.org/babel-eslint/-/babel-eslint-8.2.1.tgz" 1069 | integrity sha512-RzdVOyWKQRUnLXhwLk+eKb4oyW+BykZSkpYwFhM4tnfzAG5OWfvG0w/uyzMp5XKEU0jN82+JefHr39bG2+KhRQ== 1070 | dependencies: 1071 | "@babel/code-frame" "7.0.0-beta.36" 1072 | "@babel/traverse" "7.0.0-beta.36" 1073 | "@babel/types" "7.0.0-beta.36" 1074 | babylon "7.0.0-beta.36" 1075 | eslint-scope "~3.7.1" 1076 | eslint-visitor-keys "^1.0.0" 1077 | 1078 | babel-jest@^28.1.3: 1079 | version "28.1.3" 1080 | resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-28.1.3.tgz" 1081 | integrity sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q== 1082 | dependencies: 1083 | "@jest/transform" "^28.1.3" 1084 | "@types/babel__core" "^7.1.14" 1085 | babel-plugin-istanbul "^6.1.1" 1086 | babel-preset-jest "^28.1.3" 1087 | chalk "^4.0.0" 1088 | graceful-fs "^4.2.9" 1089 | slash "^3.0.0" 1090 | 1091 | babel-plugin-istanbul@^6.1.1: 1092 | version "6.1.1" 1093 | resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz" 1094 | integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== 1095 | dependencies: 1096 | "@babel/helper-plugin-utils" "^7.0.0" 1097 | "@istanbuljs/load-nyc-config" "^1.0.0" 1098 | "@istanbuljs/schema" "^0.1.2" 1099 | istanbul-lib-instrument "^5.0.4" 1100 | test-exclude "^6.0.0" 1101 | 1102 | babel-plugin-jest-hoist@^28.1.3: 1103 | version "28.1.3" 1104 | resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz" 1105 | integrity sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q== 1106 | dependencies: 1107 | "@babel/template" "^7.3.3" 1108 | "@babel/types" "^7.3.3" 1109 | "@types/babel__core" "^7.1.14" 1110 | "@types/babel__traverse" "^7.0.6" 1111 | 1112 | babel-preset-current-node-syntax@^1.0.0: 1113 | version "1.0.1" 1114 | resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz" 1115 | integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== 1116 | dependencies: 1117 | "@babel/plugin-syntax-async-generators" "^7.8.4" 1118 | "@babel/plugin-syntax-bigint" "^7.8.3" 1119 | "@babel/plugin-syntax-class-properties" "^7.8.3" 1120 | "@babel/plugin-syntax-import-meta" "^7.8.3" 1121 | "@babel/plugin-syntax-json-strings" "^7.8.3" 1122 | "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" 1123 | "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" 1124 | "@babel/plugin-syntax-numeric-separator" "^7.8.3" 1125 | "@babel/plugin-syntax-object-rest-spread" "^7.8.3" 1126 | "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" 1127 | "@babel/plugin-syntax-optional-chaining" "^7.8.3" 1128 | "@babel/plugin-syntax-top-level-await" "^7.8.3" 1129 | 1130 | babel-preset-jest@^28.1.3: 1131 | version "28.1.3" 1132 | resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz" 1133 | integrity sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A== 1134 | dependencies: 1135 | babel-plugin-jest-hoist "^28.1.3" 1136 | babel-preset-current-node-syntax "^1.0.0" 1137 | 1138 | babylon@7.0.0-beta.36: 1139 | version "7.0.0-beta.36" 1140 | resolved "https://registry.npmjs.org/babylon/-/babylon-7.0.0-beta.36.tgz" 1141 | integrity sha512-rw4YdadGwajAMMRl6a5swhQ0JCOOFyaYCfJ0AsmNBD8uBD/r4J8mux7wBaqavvFKqUKQYWOzA1Speams4YDzsQ== 1142 | 1143 | balanced-match@^1.0.0: 1144 | version "1.0.0" 1145 | resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz" 1146 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 1147 | 1148 | before-after-hook@^2.2.0: 1149 | version "2.2.3" 1150 | resolved "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz" 1151 | integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== 1152 | 1153 | brace-expansion@^1.1.7: 1154 | version "1.1.11" 1155 | resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" 1156 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 1157 | dependencies: 1158 | balanced-match "^1.0.0" 1159 | concat-map "0.0.1" 1160 | 1161 | braces@^3.0.3: 1162 | version "3.0.3" 1163 | resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" 1164 | integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== 1165 | dependencies: 1166 | fill-range "^7.1.1" 1167 | 1168 | browserslist@^4.21.3, "browserslist@>= 4.21.0": 1169 | version "4.21.4" 1170 | resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz" 1171 | integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== 1172 | dependencies: 1173 | caniuse-lite "^1.0.30001400" 1174 | electron-to-chromium "^1.4.251" 1175 | node-releases "^2.0.6" 1176 | update-browserslist-db "^1.0.9" 1177 | 1178 | bser@2.1.1: 1179 | version "2.1.1" 1180 | resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" 1181 | integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== 1182 | dependencies: 1183 | node-int64 "^0.4.0" 1184 | 1185 | buffer-crc32@~0.2.3: 1186 | version "0.2.13" 1187 | resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz" 1188 | integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= 1189 | 1190 | buffer-from@^1.0.0: 1191 | version "1.1.2" 1192 | resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" 1193 | integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== 1194 | 1195 | callsites@^3.0.0: 1196 | version "3.1.0" 1197 | resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" 1198 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 1199 | 1200 | camelcase@^5.3.1: 1201 | version "5.3.1" 1202 | resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" 1203 | integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== 1204 | 1205 | camelcase@^6.2.0: 1206 | version "6.3.0" 1207 | resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" 1208 | integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== 1209 | 1210 | caniuse-lite@^1.0.30001400: 1211 | version "1.0.30001431" 1212 | resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz" 1213 | integrity sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ== 1214 | 1215 | chalk@^2.0.0: 1216 | version "2.4.2" 1217 | resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" 1218 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 1219 | dependencies: 1220 | ansi-styles "^3.2.1" 1221 | escape-string-regexp "^1.0.5" 1222 | supports-color "^5.3.0" 1223 | 1224 | chalk@^2.4.2: 1225 | version "2.4.2" 1226 | resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" 1227 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 1228 | dependencies: 1229 | ansi-styles "^3.2.1" 1230 | escape-string-regexp "^1.0.5" 1231 | supports-color "^5.3.0" 1232 | 1233 | chalk@^4.0.0: 1234 | version "4.1.2" 1235 | resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" 1236 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 1237 | dependencies: 1238 | ansi-styles "^4.1.0" 1239 | supports-color "^7.1.0" 1240 | 1241 | char-regex@^1.0.2: 1242 | version "1.0.2" 1243 | resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" 1244 | integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== 1245 | 1246 | ci-info@^3.2.0: 1247 | version "3.5.0" 1248 | resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.5.0.tgz" 1249 | integrity sha512-yH4RezKOGlOhxkmhbeNuC4eYZKAUsEaGtBuBzDDP1eFUKiccDWzBABxBfOx31IDwDIXMTxWuwAxUGModvkbuVw== 1250 | 1251 | cjs-module-lexer@^1.0.0: 1252 | version "1.2.2" 1253 | resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz" 1254 | integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== 1255 | 1256 | cli-progress@^3.8.2: 1257 | version "3.8.2" 1258 | resolved "https://registry.npmjs.org/cli-progress/-/cli-progress-3.8.2.tgz" 1259 | integrity sha512-qRwBxLldMSfxB+YGFgNRaj5vyyHe1yMpVeDL79c+7puGujdKJHQHydgqXDcrkvQgJ5U/d3lpf6vffSoVVUftVQ== 1260 | dependencies: 1261 | colors "^1.1.2" 1262 | string-width "^4.2.0" 1263 | 1264 | cliui@^8.0.1: 1265 | version "8.0.1" 1266 | resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" 1267 | integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== 1268 | dependencies: 1269 | string-width "^4.2.0" 1270 | strip-ansi "^6.0.1" 1271 | wrap-ansi "^7.0.0" 1272 | 1273 | co@^4.6.0: 1274 | version "4.6.0" 1275 | resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" 1276 | integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== 1277 | 1278 | collect-v8-coverage@^1.0.0: 1279 | version "1.0.1" 1280 | resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz" 1281 | integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== 1282 | 1283 | color-convert@^1.9.0: 1284 | version "1.9.3" 1285 | resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" 1286 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 1287 | dependencies: 1288 | color-name "1.1.3" 1289 | 1290 | color-convert@^2.0.1: 1291 | version "2.0.1" 1292 | resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" 1293 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 1294 | dependencies: 1295 | color-name "~1.1.4" 1296 | 1297 | color-name@~1.1.4: 1298 | version "1.1.4" 1299 | resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" 1300 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 1301 | 1302 | color-name@1.1.3: 1303 | version "1.1.3" 1304 | resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" 1305 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 1306 | 1307 | colors@^1.1.2: 1308 | version "1.4.0" 1309 | resolved "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz" 1310 | integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== 1311 | 1312 | concat-map@0.0.1: 1313 | version "0.0.1" 1314 | resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" 1315 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 1316 | 1317 | convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: 1318 | version "1.9.0" 1319 | resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" 1320 | integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== 1321 | 1322 | cross-spawn@^7.0.2, cross-spawn@^7.0.3: 1323 | version "7.0.3" 1324 | resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" 1325 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 1326 | dependencies: 1327 | path-key "^3.1.0" 1328 | shebang-command "^2.0.0" 1329 | which "^2.0.1" 1330 | 1331 | debug@^3.0.1: 1332 | version "3.2.7" 1333 | resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" 1334 | integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== 1335 | dependencies: 1336 | ms "^2.1.1" 1337 | 1338 | debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: 1339 | version "4.3.4" 1340 | resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" 1341 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 1342 | dependencies: 1343 | ms "2.1.2" 1344 | 1345 | dedent@^0.7.0: 1346 | version "0.7.0" 1347 | resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" 1348 | integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== 1349 | 1350 | dedent@^1.5.3: 1351 | version "1.5.3" 1352 | resolved "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz" 1353 | integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== 1354 | 1355 | deep-is@^0.1.3: 1356 | version "0.1.4" 1357 | resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" 1358 | integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== 1359 | 1360 | deepmerge@^4.2.2: 1361 | version "4.2.2" 1362 | resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz" 1363 | integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== 1364 | 1365 | deprecation@^2.0.0, deprecation@^2.3.1: 1366 | version "2.3.1" 1367 | resolved "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz" 1368 | integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== 1369 | 1370 | detect-newline@^3.0.0: 1371 | version "3.1.0" 1372 | resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" 1373 | integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== 1374 | 1375 | diff-sequences@^28.1.1: 1376 | version "28.1.1" 1377 | resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz" 1378 | integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== 1379 | 1380 | dir-glob@^3.0.1: 1381 | version "3.0.1" 1382 | resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" 1383 | integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== 1384 | dependencies: 1385 | path-type "^4.0.0" 1386 | 1387 | doctrine@^3.0.0: 1388 | version "3.0.0" 1389 | resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" 1390 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 1391 | dependencies: 1392 | esutils "^2.0.2" 1393 | 1394 | electron-to-chromium@^1.4.251: 1395 | version "1.4.284" 1396 | resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz" 1397 | integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== 1398 | 1399 | emittery@^0.10.2: 1400 | version "0.10.2" 1401 | resolved "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz" 1402 | integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== 1403 | 1404 | emoji-regex@^8.0.0: 1405 | version "8.0.0" 1406 | resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" 1407 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 1408 | 1409 | error-ex@^1.3.1: 1410 | version "1.3.2" 1411 | resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" 1412 | integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== 1413 | dependencies: 1414 | is-arrayish "^0.2.1" 1415 | 1416 | escalade@^3.1.1: 1417 | version "3.1.1" 1418 | resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" 1419 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 1420 | 1421 | escape-string-regexp@^1.0.5: 1422 | version "1.0.5" 1423 | resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" 1424 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 1425 | 1426 | escape-string-regexp@^2.0.0: 1427 | version "2.0.0" 1428 | resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" 1429 | integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== 1430 | 1431 | escape-string-regexp@^4.0.0: 1432 | version "4.0.0" 1433 | resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" 1434 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 1435 | 1436 | eslint-plugin-jest@^26.6.0: 1437 | version "26.9.0" 1438 | resolved "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-26.9.0.tgz" 1439 | integrity sha512-TWJxWGp1J628gxh2KhaH1H1paEdgE2J61BBF1I59c6xWeL5+D1BzMxGDN/nXAfX+aSkR5u80K+XhskK6Gwq9ng== 1440 | dependencies: 1441 | "@typescript-eslint/utils" "^5.10.0" 1442 | 1443 | eslint-scope@^5.1.1: 1444 | version "5.1.1" 1445 | resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" 1446 | integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== 1447 | dependencies: 1448 | esrecurse "^4.3.0" 1449 | estraverse "^4.1.1" 1450 | 1451 | eslint-scope@^7.1.1: 1452 | version "7.1.1" 1453 | resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz" 1454 | integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== 1455 | dependencies: 1456 | esrecurse "^4.3.0" 1457 | estraverse "^5.2.0" 1458 | 1459 | eslint-scope@~3.7.1: 1460 | version "3.7.3" 1461 | resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz" 1462 | integrity sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA== 1463 | dependencies: 1464 | esrecurse "^4.1.0" 1465 | estraverse "^4.1.1" 1466 | 1467 | eslint-utils@^3.0.0: 1468 | version "3.0.0" 1469 | resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz" 1470 | integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== 1471 | dependencies: 1472 | eslint-visitor-keys "^2.0.0" 1473 | 1474 | eslint-visitor-keys@^1.0.0: 1475 | version "1.3.0" 1476 | resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz" 1477 | integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== 1478 | 1479 | eslint-visitor-keys@^2.0.0: 1480 | version "2.1.0" 1481 | resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" 1482 | integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== 1483 | 1484 | eslint-visitor-keys@^3.3.0: 1485 | version "3.3.0" 1486 | resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz" 1487 | integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== 1488 | 1489 | "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", eslint@^8.20.0, eslint@>=5: 1490 | version "8.27.0" 1491 | resolved "https://registry.npmjs.org/eslint/-/eslint-8.27.0.tgz" 1492 | integrity sha512-0y1bfG2ho7mty+SiILVf9PfuRA49ek4Nc60Wmmu62QlobNR+CeXa4xXIJgcuwSQgZiWaPH+5BDsctpIW0PR/wQ== 1493 | dependencies: 1494 | "@eslint/eslintrc" "^1.3.3" 1495 | "@humanwhocodes/config-array" "^0.11.6" 1496 | "@humanwhocodes/module-importer" "^1.0.1" 1497 | "@nodelib/fs.walk" "^1.2.8" 1498 | ajv "^6.10.0" 1499 | chalk "^4.0.0" 1500 | cross-spawn "^7.0.2" 1501 | debug "^4.3.2" 1502 | doctrine "^3.0.0" 1503 | escape-string-regexp "^4.0.0" 1504 | eslint-scope "^7.1.1" 1505 | eslint-utils "^3.0.0" 1506 | eslint-visitor-keys "^3.3.0" 1507 | espree "^9.4.0" 1508 | esquery "^1.4.0" 1509 | esutils "^2.0.2" 1510 | fast-deep-equal "^3.1.3" 1511 | file-entry-cache "^6.0.1" 1512 | find-up "^5.0.0" 1513 | glob-parent "^6.0.2" 1514 | globals "^13.15.0" 1515 | grapheme-splitter "^1.0.4" 1516 | ignore "^5.2.0" 1517 | import-fresh "^3.0.0" 1518 | imurmurhash "^0.1.4" 1519 | is-glob "^4.0.0" 1520 | is-path-inside "^3.0.3" 1521 | js-sdsl "^4.1.4" 1522 | js-yaml "^4.1.0" 1523 | json-stable-stringify-without-jsonify "^1.0.1" 1524 | levn "^0.4.1" 1525 | lodash.merge "^4.6.2" 1526 | minimatch "^3.1.2" 1527 | natural-compare "^1.4.0" 1528 | optionator "^0.9.1" 1529 | regexpp "^3.2.0" 1530 | strip-ansi "^6.0.1" 1531 | strip-json-comments "^3.1.0" 1532 | text-table "^0.2.0" 1533 | 1534 | espree@^9.4.0: 1535 | version "9.4.1" 1536 | resolved "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz" 1537 | integrity sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg== 1538 | dependencies: 1539 | acorn "^8.8.0" 1540 | acorn-jsx "^5.3.2" 1541 | eslint-visitor-keys "^3.3.0" 1542 | 1543 | esprima@^4.0.0: 1544 | version "4.0.1" 1545 | resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" 1546 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 1547 | 1548 | esquery@^1.4.0: 1549 | version "1.4.0" 1550 | resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz" 1551 | integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== 1552 | dependencies: 1553 | estraverse "^5.1.0" 1554 | 1555 | esrecurse@^4.1.0, esrecurse@^4.3.0: 1556 | version "4.3.0" 1557 | resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" 1558 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 1559 | dependencies: 1560 | estraverse "^5.2.0" 1561 | 1562 | estraverse@^4.1.1: 1563 | version "4.3.0" 1564 | resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" 1565 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 1566 | 1567 | estraverse@^5.1.0: 1568 | version "5.3.0" 1569 | resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" 1570 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 1571 | 1572 | estraverse@^5.2.0: 1573 | version "5.3.0" 1574 | resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" 1575 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 1576 | 1577 | esutils@^2.0.2: 1578 | version "2.0.3" 1579 | resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" 1580 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 1581 | 1582 | execa@^5.0.0: 1583 | version "5.1.1" 1584 | resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" 1585 | integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== 1586 | dependencies: 1587 | cross-spawn "^7.0.3" 1588 | get-stream "^6.0.0" 1589 | human-signals "^2.1.0" 1590 | is-stream "^2.0.0" 1591 | merge-stream "^2.0.0" 1592 | npm-run-path "^4.0.1" 1593 | onetime "^5.1.2" 1594 | signal-exit "^3.0.3" 1595 | strip-final-newline "^2.0.0" 1596 | 1597 | exit@^0.1.2: 1598 | version "0.1.2" 1599 | resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" 1600 | integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== 1601 | 1602 | expect@^28.1.3: 1603 | version "28.1.3" 1604 | resolved "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz" 1605 | integrity sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g== 1606 | dependencies: 1607 | "@jest/expect-utils" "^28.1.3" 1608 | jest-get-type "^28.0.2" 1609 | jest-matcher-utils "^28.1.3" 1610 | jest-message-util "^28.1.3" 1611 | jest-util "^28.1.3" 1612 | 1613 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 1614 | version "3.1.3" 1615 | resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" 1616 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 1617 | 1618 | fast-glob@^3.2.9: 1619 | version "3.3.2" 1620 | resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" 1621 | integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== 1622 | dependencies: 1623 | "@nodelib/fs.stat" "^2.0.2" 1624 | "@nodelib/fs.walk" "^1.2.3" 1625 | glob-parent "^5.1.2" 1626 | merge2 "^1.3.0" 1627 | micromatch "^4.0.4" 1628 | 1629 | fast-json-stable-stringify@^2.0.0: 1630 | version "2.1.0" 1631 | resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" 1632 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 1633 | 1634 | fast-levenshtein@^2.0.6: 1635 | version "2.0.6" 1636 | resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" 1637 | integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== 1638 | 1639 | fastq@^1.6.0: 1640 | version "1.13.0" 1641 | resolved "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" 1642 | integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== 1643 | dependencies: 1644 | reusify "^1.0.4" 1645 | 1646 | fb-watchman@^2.0.0: 1647 | version "2.0.2" 1648 | resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz" 1649 | integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== 1650 | dependencies: 1651 | bser "2.1.1" 1652 | 1653 | fd-slicer@~1.1.0: 1654 | version "1.1.0" 1655 | resolved "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz" 1656 | integrity sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4= 1657 | dependencies: 1658 | pend "~1.2.0" 1659 | 1660 | file-entry-cache@^6.0.1: 1661 | version "6.0.1" 1662 | resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" 1663 | integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== 1664 | dependencies: 1665 | flat-cache "^3.0.4" 1666 | 1667 | fill-range@^7.1.1: 1668 | version "7.1.1" 1669 | resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" 1670 | integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== 1671 | dependencies: 1672 | to-regex-range "^5.0.1" 1673 | 1674 | find-up@^4.0.0: 1675 | version "4.1.0" 1676 | resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" 1677 | integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== 1678 | dependencies: 1679 | locate-path "^5.0.0" 1680 | path-exists "^4.0.0" 1681 | 1682 | find-up@^4.1.0: 1683 | version "4.1.0" 1684 | resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" 1685 | integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== 1686 | dependencies: 1687 | locate-path "^5.0.0" 1688 | path-exists "^4.0.0" 1689 | 1690 | find-up@^5.0.0: 1691 | version "5.0.0" 1692 | resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" 1693 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 1694 | dependencies: 1695 | locate-path "^6.0.0" 1696 | path-exists "^4.0.0" 1697 | 1698 | flat-cache@^3.0.4: 1699 | version "3.0.4" 1700 | resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" 1701 | integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== 1702 | dependencies: 1703 | flatted "^3.1.0" 1704 | rimraf "^3.0.2" 1705 | 1706 | flatted@^3.1.0: 1707 | version "3.2.7" 1708 | resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" 1709 | integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== 1710 | 1711 | fs-extra@^8.1.0: 1712 | version "8.1.0" 1713 | resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz" 1714 | integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== 1715 | dependencies: 1716 | graceful-fs "^4.2.0" 1717 | jsonfile "^4.0.0" 1718 | universalify "^0.1.0" 1719 | 1720 | fs.realpath@^1.0.0: 1721 | version "1.0.0" 1722 | resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" 1723 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 1724 | 1725 | fsevents@^2.3.2: 1726 | version "2.3.2" 1727 | resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" 1728 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 1729 | 1730 | function-bind@^1.1.1: 1731 | version "1.1.1" 1732 | resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" 1733 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 1734 | 1735 | gensync@^1.0.0-beta.2: 1736 | version "1.0.0-beta.2" 1737 | resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" 1738 | integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== 1739 | 1740 | get-caller-file@^2.0.5: 1741 | version "2.0.5" 1742 | resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" 1743 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 1744 | 1745 | get-package-type@^0.1.0: 1746 | version "0.1.0" 1747 | resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" 1748 | integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== 1749 | 1750 | get-stream@^6.0.0: 1751 | version "6.0.1" 1752 | resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" 1753 | integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== 1754 | 1755 | glob-parent@^5.1.2: 1756 | version "5.1.2" 1757 | resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" 1758 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 1759 | dependencies: 1760 | is-glob "^4.0.1" 1761 | 1762 | glob-parent@^6.0.2: 1763 | version "6.0.2" 1764 | resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" 1765 | integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== 1766 | dependencies: 1767 | is-glob "^4.0.3" 1768 | 1769 | glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: 1770 | version "7.1.6" 1771 | resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" 1772 | integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== 1773 | dependencies: 1774 | fs.realpath "^1.0.0" 1775 | inflight "^1.0.4" 1776 | inherits "2" 1777 | minimatch "^3.0.4" 1778 | once "^1.3.0" 1779 | path-is-absolute "^1.0.0" 1780 | 1781 | globals@^11.1.0: 1782 | version "11.12.0" 1783 | resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" 1784 | integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== 1785 | 1786 | globals@^13.15.0: 1787 | version "13.17.0" 1788 | resolved "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz" 1789 | integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== 1790 | dependencies: 1791 | type-fest "^0.20.2" 1792 | 1793 | globby@^11.1.0: 1794 | version "11.1.0" 1795 | resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" 1796 | integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== 1797 | dependencies: 1798 | array-union "^2.1.0" 1799 | dir-glob "^3.0.1" 1800 | fast-glob "^3.2.9" 1801 | ignore "^5.2.0" 1802 | merge2 "^1.4.1" 1803 | slash "^3.0.0" 1804 | 1805 | graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.9: 1806 | version "4.2.11" 1807 | resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" 1808 | integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== 1809 | 1810 | grapheme-splitter@^1.0.4: 1811 | version "1.0.4" 1812 | resolved "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz" 1813 | integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== 1814 | 1815 | has-flag@^3.0.0: 1816 | version "3.0.0" 1817 | resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" 1818 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 1819 | 1820 | has-flag@^4.0.0: 1821 | version "4.0.0" 1822 | resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" 1823 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 1824 | 1825 | has@^1.0.3: 1826 | version "1.0.3" 1827 | resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" 1828 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 1829 | dependencies: 1830 | function-bind "^1.1.1" 1831 | 1832 | html-escaper@^2.0.0: 1833 | version "2.0.2" 1834 | resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" 1835 | integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== 1836 | 1837 | human-signals@^2.1.0: 1838 | version "2.1.0" 1839 | resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" 1840 | integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== 1841 | 1842 | ignore@^5.2.0: 1843 | version "5.2.0" 1844 | resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" 1845 | integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== 1846 | 1847 | import-fresh@^3.0.0, import-fresh@^3.2.1: 1848 | version "3.3.0" 1849 | resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" 1850 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 1851 | dependencies: 1852 | parent-module "^1.0.0" 1853 | resolve-from "^4.0.0" 1854 | 1855 | import-local@^3.0.2: 1856 | version "3.1.0" 1857 | resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" 1858 | integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== 1859 | dependencies: 1860 | pkg-dir "^4.2.0" 1861 | resolve-cwd "^3.0.0" 1862 | 1863 | imurmurhash@^0.1.4: 1864 | version "0.1.4" 1865 | resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" 1866 | integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== 1867 | 1868 | inflight@^1.0.4: 1869 | version "1.0.6" 1870 | resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" 1871 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 1872 | dependencies: 1873 | once "^1.3.0" 1874 | wrappy "1" 1875 | 1876 | inherits@2: 1877 | version "2.0.4" 1878 | resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" 1879 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1880 | 1881 | inherits@2.0.3: 1882 | version "2.0.3" 1883 | resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" 1884 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 1885 | 1886 | invariant@^2.2.0: 1887 | version "2.2.4" 1888 | resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" 1889 | integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== 1890 | dependencies: 1891 | loose-envify "^1.0.0" 1892 | 1893 | is-arrayish@^0.2.1: 1894 | version "0.2.1" 1895 | resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" 1896 | integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== 1897 | 1898 | is-core-module@^2.9.0: 1899 | version "2.11.0" 1900 | resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz" 1901 | integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== 1902 | dependencies: 1903 | has "^1.0.3" 1904 | 1905 | is-extglob@^2.1.1: 1906 | version "2.1.1" 1907 | resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" 1908 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 1909 | 1910 | is-fullwidth-code-point@^3.0.0: 1911 | version "3.0.0" 1912 | resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" 1913 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 1914 | 1915 | is-generator-fn@^2.0.0: 1916 | version "2.1.0" 1917 | resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" 1918 | integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== 1919 | 1920 | is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: 1921 | version "4.0.3" 1922 | resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" 1923 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 1924 | dependencies: 1925 | is-extglob "^2.1.1" 1926 | 1927 | is-number@^7.0.0: 1928 | version "7.0.0" 1929 | resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" 1930 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1931 | 1932 | is-path-inside@^3.0.3: 1933 | version "3.0.3" 1934 | resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" 1935 | integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== 1936 | 1937 | is-plain-object@^5.0.0: 1938 | version "5.0.0" 1939 | resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz" 1940 | integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== 1941 | 1942 | is-stream@^2.0.0: 1943 | version "2.0.1" 1944 | resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" 1945 | integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== 1946 | 1947 | isexe@^2.0.0: 1948 | version "2.0.0" 1949 | resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" 1950 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 1951 | 1952 | istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: 1953 | version "3.2.0" 1954 | resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz" 1955 | integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== 1956 | 1957 | istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: 1958 | version "5.2.1" 1959 | resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz" 1960 | integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== 1961 | dependencies: 1962 | "@babel/core" "^7.12.3" 1963 | "@babel/parser" "^7.14.7" 1964 | "@istanbuljs/schema" "^0.1.2" 1965 | istanbul-lib-coverage "^3.2.0" 1966 | semver "^6.3.0" 1967 | 1968 | istanbul-lib-report@^3.0.0: 1969 | version "3.0.0" 1970 | resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" 1971 | integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== 1972 | dependencies: 1973 | istanbul-lib-coverage "^3.0.0" 1974 | make-dir "^3.0.0" 1975 | supports-color "^7.1.0" 1976 | 1977 | istanbul-lib-source-maps@^4.0.0: 1978 | version "4.0.1" 1979 | resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" 1980 | integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== 1981 | dependencies: 1982 | debug "^4.1.1" 1983 | istanbul-lib-coverage "^3.0.0" 1984 | source-map "^0.6.1" 1985 | 1986 | istanbul-reports@^3.1.3: 1987 | version "3.1.5" 1988 | resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz" 1989 | integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== 1990 | dependencies: 1991 | html-escaper "^2.0.0" 1992 | istanbul-lib-report "^3.0.0" 1993 | 1994 | jest-changed-files@^28.1.3: 1995 | version "28.1.3" 1996 | resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-28.1.3.tgz" 1997 | integrity sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA== 1998 | dependencies: 1999 | execa "^5.0.0" 2000 | p-limit "^3.1.0" 2001 | 2002 | jest-circus@^28.1.3: 2003 | version "28.1.3" 2004 | resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-28.1.3.tgz" 2005 | integrity sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow== 2006 | dependencies: 2007 | "@jest/environment" "^28.1.3" 2008 | "@jest/expect" "^28.1.3" 2009 | "@jest/test-result" "^28.1.3" 2010 | "@jest/types" "^28.1.3" 2011 | "@types/node" "*" 2012 | chalk "^4.0.0" 2013 | co "^4.6.0" 2014 | dedent "^0.7.0" 2015 | is-generator-fn "^2.0.0" 2016 | jest-each "^28.1.3" 2017 | jest-matcher-utils "^28.1.3" 2018 | jest-message-util "^28.1.3" 2019 | jest-runtime "^28.1.3" 2020 | jest-snapshot "^28.1.3" 2021 | jest-util "^28.1.3" 2022 | p-limit "^3.1.0" 2023 | pretty-format "^28.1.3" 2024 | slash "^3.0.0" 2025 | stack-utils "^2.0.3" 2026 | 2027 | jest-cli@^28.1.3: 2028 | version "28.1.3" 2029 | resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-28.1.3.tgz" 2030 | integrity sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ== 2031 | dependencies: 2032 | "@jest/core" "^28.1.3" 2033 | "@jest/test-result" "^28.1.3" 2034 | "@jest/types" "^28.1.3" 2035 | chalk "^4.0.0" 2036 | exit "^0.1.2" 2037 | graceful-fs "^4.2.9" 2038 | import-local "^3.0.2" 2039 | jest-config "^28.1.3" 2040 | jest-util "^28.1.3" 2041 | jest-validate "^28.1.3" 2042 | prompts "^2.0.1" 2043 | yargs "^17.3.1" 2044 | 2045 | jest-config@^28.1.3: 2046 | version "28.1.3" 2047 | resolved "https://registry.npmjs.org/jest-config/-/jest-config-28.1.3.tgz" 2048 | integrity sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ== 2049 | dependencies: 2050 | "@babel/core" "^7.11.6" 2051 | "@jest/test-sequencer" "^28.1.3" 2052 | "@jest/types" "^28.1.3" 2053 | babel-jest "^28.1.3" 2054 | chalk "^4.0.0" 2055 | ci-info "^3.2.0" 2056 | deepmerge "^4.2.2" 2057 | glob "^7.1.3" 2058 | graceful-fs "^4.2.9" 2059 | jest-circus "^28.1.3" 2060 | jest-environment-node "^28.1.3" 2061 | jest-get-type "^28.0.2" 2062 | jest-regex-util "^28.0.2" 2063 | jest-resolve "^28.1.3" 2064 | jest-runner "^28.1.3" 2065 | jest-util "^28.1.3" 2066 | jest-validate "^28.1.3" 2067 | micromatch "^4.0.4" 2068 | parse-json "^5.2.0" 2069 | pretty-format "^28.1.3" 2070 | slash "^3.0.0" 2071 | strip-json-comments "^3.1.1" 2072 | 2073 | jest-diff@^28.1.3: 2074 | version "28.1.3" 2075 | resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz" 2076 | integrity sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw== 2077 | dependencies: 2078 | chalk "^4.0.0" 2079 | diff-sequences "^28.1.1" 2080 | jest-get-type "^28.0.2" 2081 | pretty-format "^28.1.3" 2082 | 2083 | jest-docblock@^28.1.1: 2084 | version "28.1.1" 2085 | resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-28.1.1.tgz" 2086 | integrity sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA== 2087 | dependencies: 2088 | detect-newline "^3.0.0" 2089 | 2090 | jest-each@^28.1.3: 2091 | version "28.1.3" 2092 | resolved "https://registry.npmjs.org/jest-each/-/jest-each-28.1.3.tgz" 2093 | integrity sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g== 2094 | dependencies: 2095 | "@jest/types" "^28.1.3" 2096 | chalk "^4.0.0" 2097 | jest-get-type "^28.0.2" 2098 | jest-util "^28.1.3" 2099 | pretty-format "^28.1.3" 2100 | 2101 | jest-environment-node@^28.1.3: 2102 | version "28.1.3" 2103 | resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-28.1.3.tgz" 2104 | integrity sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A== 2105 | dependencies: 2106 | "@jest/environment" "^28.1.3" 2107 | "@jest/fake-timers" "^28.1.3" 2108 | "@jest/types" "^28.1.3" 2109 | "@types/node" "*" 2110 | jest-mock "^28.1.3" 2111 | jest-util "^28.1.3" 2112 | 2113 | jest-get-type@^28.0.2: 2114 | version "28.0.2" 2115 | resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz" 2116 | integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== 2117 | 2118 | jest-haste-map@^28.1.3: 2119 | version "28.1.3" 2120 | resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-28.1.3.tgz" 2121 | integrity sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA== 2122 | dependencies: 2123 | "@jest/types" "^28.1.3" 2124 | "@types/graceful-fs" "^4.1.3" 2125 | "@types/node" "*" 2126 | anymatch "^3.0.3" 2127 | fb-watchman "^2.0.0" 2128 | graceful-fs "^4.2.9" 2129 | jest-regex-util "^28.0.2" 2130 | jest-util "^28.1.3" 2131 | jest-worker "^28.1.3" 2132 | micromatch "^4.0.4" 2133 | walker "^1.0.8" 2134 | optionalDependencies: 2135 | fsevents "^2.3.2" 2136 | 2137 | jest-leak-detector@^28.1.3: 2138 | version "28.1.3" 2139 | resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz" 2140 | integrity sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA== 2141 | dependencies: 2142 | jest-get-type "^28.0.2" 2143 | pretty-format "^28.1.3" 2144 | 2145 | jest-matcher-utils@^28.1.3: 2146 | version "28.1.3" 2147 | resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz" 2148 | integrity sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw== 2149 | dependencies: 2150 | chalk "^4.0.0" 2151 | jest-diff "^28.1.3" 2152 | jest-get-type "^28.0.2" 2153 | pretty-format "^28.1.3" 2154 | 2155 | jest-message-util@^28.1.3: 2156 | version "28.1.3" 2157 | resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz" 2158 | integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g== 2159 | dependencies: 2160 | "@babel/code-frame" "^7.12.13" 2161 | "@jest/types" "^28.1.3" 2162 | "@types/stack-utils" "^2.0.0" 2163 | chalk "^4.0.0" 2164 | graceful-fs "^4.2.9" 2165 | micromatch "^4.0.4" 2166 | pretty-format "^28.1.3" 2167 | slash "^3.0.0" 2168 | stack-utils "^2.0.3" 2169 | 2170 | jest-mock@^28.1.3: 2171 | version "28.1.3" 2172 | resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-28.1.3.tgz" 2173 | integrity sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA== 2174 | dependencies: 2175 | "@jest/types" "^28.1.3" 2176 | "@types/node" "*" 2177 | 2178 | jest-pnp-resolver@^1.2.2: 2179 | version "1.2.2" 2180 | resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz" 2181 | integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== 2182 | 2183 | jest-regex-util@^28.0.2: 2184 | version "28.0.2" 2185 | resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz" 2186 | integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== 2187 | 2188 | jest-resolve-dependencies@^28.1.3: 2189 | version "28.1.3" 2190 | resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz" 2191 | integrity sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA== 2192 | dependencies: 2193 | jest-regex-util "^28.0.2" 2194 | jest-snapshot "^28.1.3" 2195 | 2196 | jest-resolve@*, jest-resolve@^28.1.3: 2197 | version "28.1.3" 2198 | resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-28.1.3.tgz" 2199 | integrity sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ== 2200 | dependencies: 2201 | chalk "^4.0.0" 2202 | graceful-fs "^4.2.9" 2203 | jest-haste-map "^28.1.3" 2204 | jest-pnp-resolver "^1.2.2" 2205 | jest-util "^28.1.3" 2206 | jest-validate "^28.1.3" 2207 | resolve "^1.20.0" 2208 | resolve.exports "^1.1.0" 2209 | slash "^3.0.0" 2210 | 2211 | jest-runner@^28.1.3: 2212 | version "28.1.3" 2213 | resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-28.1.3.tgz" 2214 | integrity sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA== 2215 | dependencies: 2216 | "@jest/console" "^28.1.3" 2217 | "@jest/environment" "^28.1.3" 2218 | "@jest/test-result" "^28.1.3" 2219 | "@jest/transform" "^28.1.3" 2220 | "@jest/types" "^28.1.3" 2221 | "@types/node" "*" 2222 | chalk "^4.0.0" 2223 | emittery "^0.10.2" 2224 | graceful-fs "^4.2.9" 2225 | jest-docblock "^28.1.1" 2226 | jest-environment-node "^28.1.3" 2227 | jest-haste-map "^28.1.3" 2228 | jest-leak-detector "^28.1.3" 2229 | jest-message-util "^28.1.3" 2230 | jest-resolve "^28.1.3" 2231 | jest-runtime "^28.1.3" 2232 | jest-util "^28.1.3" 2233 | jest-watcher "^28.1.3" 2234 | jest-worker "^28.1.3" 2235 | p-limit "^3.1.0" 2236 | source-map-support "0.5.13" 2237 | 2238 | jest-runtime@^28.1.3: 2239 | version "28.1.3" 2240 | resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-28.1.3.tgz" 2241 | integrity sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw== 2242 | dependencies: 2243 | "@jest/environment" "^28.1.3" 2244 | "@jest/fake-timers" "^28.1.3" 2245 | "@jest/globals" "^28.1.3" 2246 | "@jest/source-map" "^28.1.2" 2247 | "@jest/test-result" "^28.1.3" 2248 | "@jest/transform" "^28.1.3" 2249 | "@jest/types" "^28.1.3" 2250 | chalk "^4.0.0" 2251 | cjs-module-lexer "^1.0.0" 2252 | collect-v8-coverage "^1.0.0" 2253 | execa "^5.0.0" 2254 | glob "^7.1.3" 2255 | graceful-fs "^4.2.9" 2256 | jest-haste-map "^28.1.3" 2257 | jest-message-util "^28.1.3" 2258 | jest-mock "^28.1.3" 2259 | jest-regex-util "^28.0.2" 2260 | jest-resolve "^28.1.3" 2261 | jest-snapshot "^28.1.3" 2262 | jest-util "^28.1.3" 2263 | slash "^3.0.0" 2264 | strip-bom "^4.0.0" 2265 | 2266 | jest-snapshot@^28.1.3: 2267 | version "28.1.3" 2268 | resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-28.1.3.tgz" 2269 | integrity sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg== 2270 | dependencies: 2271 | "@babel/core" "^7.11.6" 2272 | "@babel/generator" "^7.7.2" 2273 | "@babel/plugin-syntax-typescript" "^7.7.2" 2274 | "@babel/traverse" "^7.7.2" 2275 | "@babel/types" "^7.3.3" 2276 | "@jest/expect-utils" "^28.1.3" 2277 | "@jest/transform" "^28.1.3" 2278 | "@jest/types" "^28.1.3" 2279 | "@types/babel__traverse" "^7.0.6" 2280 | "@types/prettier" "^2.1.5" 2281 | babel-preset-current-node-syntax "^1.0.0" 2282 | chalk "^4.0.0" 2283 | expect "^28.1.3" 2284 | graceful-fs "^4.2.9" 2285 | jest-diff "^28.1.3" 2286 | jest-get-type "^28.0.2" 2287 | jest-haste-map "^28.1.3" 2288 | jest-matcher-utils "^28.1.3" 2289 | jest-message-util "^28.1.3" 2290 | jest-util "^28.1.3" 2291 | natural-compare "^1.4.0" 2292 | pretty-format "^28.1.3" 2293 | semver "^7.3.5" 2294 | 2295 | jest-util@^28.1.3: 2296 | version "28.1.3" 2297 | resolved "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz" 2298 | integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== 2299 | dependencies: 2300 | "@jest/types" "^28.1.3" 2301 | "@types/node" "*" 2302 | chalk "^4.0.0" 2303 | ci-info "^3.2.0" 2304 | graceful-fs "^4.2.9" 2305 | picomatch "^2.2.3" 2306 | 2307 | jest-validate@^28.1.3: 2308 | version "28.1.3" 2309 | resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-28.1.3.tgz" 2310 | integrity sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA== 2311 | dependencies: 2312 | "@jest/types" "^28.1.3" 2313 | camelcase "^6.2.0" 2314 | chalk "^4.0.0" 2315 | jest-get-type "^28.0.2" 2316 | leven "^3.1.0" 2317 | pretty-format "^28.1.3" 2318 | 2319 | jest-watcher@^28.1.3: 2320 | version "28.1.3" 2321 | resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz" 2322 | integrity sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g== 2323 | dependencies: 2324 | "@jest/test-result" "^28.1.3" 2325 | "@jest/types" "^28.1.3" 2326 | "@types/node" "*" 2327 | ansi-escapes "^4.2.1" 2328 | chalk "^4.0.0" 2329 | emittery "^0.10.2" 2330 | jest-util "^28.1.3" 2331 | string-length "^4.0.1" 2332 | 2333 | jest-worker@^28.1.3: 2334 | version "28.1.3" 2335 | resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz" 2336 | integrity sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g== 2337 | dependencies: 2338 | "@types/node" "*" 2339 | merge-stream "^2.0.0" 2340 | supports-color "^8.0.0" 2341 | 2342 | jest@^28.1.3: 2343 | version "28.1.3" 2344 | resolved "https://registry.npmjs.org/jest/-/jest-28.1.3.tgz" 2345 | integrity sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA== 2346 | dependencies: 2347 | "@jest/core" "^28.1.3" 2348 | "@jest/types" "^28.1.3" 2349 | import-local "^3.0.2" 2350 | jest-cli "^28.1.3" 2351 | 2352 | js-logger@^1.6.1: 2353 | version "1.6.1" 2354 | resolved "https://registry.npmjs.org/js-logger/-/js-logger-1.6.1.tgz" 2355 | integrity sha512-yTgMCPXVjhmg28CuUH8CKjU+cIKL/G+zTu4Fn4lQxs8mRFH/03QTNvEFngcxfg/gRDiQAOoyCKmMTOm9ayOzXA== 2356 | 2357 | js-sdsl@^4.1.4: 2358 | version "4.1.5" 2359 | resolved "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz" 2360 | integrity sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q== 2361 | 2362 | "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: 2363 | version "4.0.0" 2364 | resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" 2365 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 2366 | 2367 | js-tokens@^3.0.0: 2368 | version "3.0.2" 2369 | resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz" 2370 | integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= 2371 | 2372 | js-yaml@^3.13.1: 2373 | version "3.14.1" 2374 | resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" 2375 | integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== 2376 | dependencies: 2377 | argparse "^1.0.7" 2378 | esprima "^4.0.0" 2379 | 2380 | js-yaml@^4.1.0: 2381 | version "4.1.0" 2382 | resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" 2383 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 2384 | dependencies: 2385 | argparse "^2.0.1" 2386 | 2387 | jsesc@^2.5.1: 2388 | version "2.5.2" 2389 | resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" 2390 | integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== 2391 | 2392 | json-parse-even-better-errors@^2.3.0: 2393 | version "2.3.1" 2394 | resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" 2395 | integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== 2396 | 2397 | json-schema-traverse@^0.4.1: 2398 | version "0.4.1" 2399 | resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" 2400 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 2401 | 2402 | json-stable-stringify-without-jsonify@^1.0.1: 2403 | version "1.0.1" 2404 | resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" 2405 | integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== 2406 | 2407 | json5@^2.2.1: 2408 | version "2.2.3" 2409 | resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" 2410 | integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== 2411 | 2412 | jsonfile@^4.0.0: 2413 | version "4.0.0" 2414 | resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz" 2415 | integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= 2416 | optionalDependencies: 2417 | graceful-fs "^4.1.6" 2418 | 2419 | kleur@^3.0.3: 2420 | version "3.0.3" 2421 | resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" 2422 | integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== 2423 | 2424 | leven@^3.1.0: 2425 | version "3.1.0" 2426 | resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" 2427 | integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== 2428 | 2429 | levn@^0.4.1: 2430 | version "0.4.1" 2431 | resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" 2432 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 2433 | dependencies: 2434 | prelude-ls "^1.2.1" 2435 | type-check "~0.4.0" 2436 | 2437 | line-reader@^0.4.0: 2438 | version "0.4.0" 2439 | resolved "https://registry.npmjs.org/line-reader/-/line-reader-0.4.0.tgz" 2440 | integrity sha1-F+RIGNoKwzVnW6MAlU+U72cOZv0= 2441 | 2442 | lines-and-columns@^1.1.6: 2443 | version "1.2.4" 2444 | resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" 2445 | integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== 2446 | 2447 | locate-path@^5.0.0: 2448 | version "5.0.0" 2449 | resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" 2450 | integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== 2451 | dependencies: 2452 | p-locate "^4.1.0" 2453 | 2454 | locate-path@^6.0.0: 2455 | version "6.0.0" 2456 | resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" 2457 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 2458 | dependencies: 2459 | p-locate "^5.0.0" 2460 | 2461 | lodash.merge@^4.6.2: 2462 | version "4.6.2" 2463 | resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" 2464 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== 2465 | 2466 | lodash@^4.2.0: 2467 | version "4.17.21" 2468 | resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" 2469 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 2470 | 2471 | loose-envify@^1.0.0: 2472 | version "1.4.0" 2473 | resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" 2474 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== 2475 | dependencies: 2476 | js-tokens "^3.0.0 || ^4.0.0" 2477 | 2478 | make-dir@^3.0.0: 2479 | version "3.1.0" 2480 | resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" 2481 | integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== 2482 | dependencies: 2483 | semver "^6.0.0" 2484 | 2485 | makeerror@1.0.12: 2486 | version "1.0.12" 2487 | resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" 2488 | integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== 2489 | dependencies: 2490 | tmpl "1.0.5" 2491 | 2492 | merge-stream@^2.0.0: 2493 | version "2.0.0" 2494 | resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" 2495 | integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== 2496 | 2497 | merge2@^1.3.0, merge2@^1.4.1: 2498 | version "1.4.1" 2499 | resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" 2500 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 2501 | 2502 | micromatch@^4.0.4: 2503 | version "4.0.7" 2504 | resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz" 2505 | integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== 2506 | dependencies: 2507 | braces "^3.0.3" 2508 | picomatch "^2.3.1" 2509 | 2510 | mimic-fn@^2.1.0: 2511 | version "2.1.0" 2512 | resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" 2513 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 2514 | 2515 | minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.2: 2516 | version "3.1.2" 2517 | resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" 2518 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 2519 | dependencies: 2520 | brace-expansion "^1.1.7" 2521 | 2522 | ms@^2.1.1, ms@2.1.2: 2523 | version "2.1.2" 2524 | resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" 2525 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 2526 | 2527 | natural-compare@^1.4.0: 2528 | version "1.4.0" 2529 | resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" 2530 | integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== 2531 | 2532 | node-fetch@^2.6.7: 2533 | version "2.6.7" 2534 | resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" 2535 | integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== 2536 | dependencies: 2537 | whatwg-url "^5.0.0" 2538 | 2539 | node-int64@^0.4.0: 2540 | version "0.4.0" 2541 | resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" 2542 | integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== 2543 | 2544 | node-read-yaml@^1.0.1: 2545 | version "1.0.1" 2546 | resolved "https://registry.npmjs.org/node-read-yaml/-/node-read-yaml-1.0.1.tgz" 2547 | integrity sha512-l4MWSwvUhdCETXNNdu4wH0YVuI+yFOQ4APIv7vSqVff5nj19bqmK+FbsWvzurvHLrb5JIZ4Gmn4FWepS+JiA+g== 2548 | dependencies: 2549 | fs-extra "^8.1.0" 2550 | js-yaml "^3.13.1" 2551 | 2552 | node-releases@^2.0.6: 2553 | version "2.0.6" 2554 | resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz" 2555 | integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== 2556 | 2557 | normalize-path@^3.0.0: 2558 | version "3.0.0" 2559 | resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" 2560 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 2561 | 2562 | npm-run-path@^4.0.1: 2563 | version "4.0.1" 2564 | resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" 2565 | integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== 2566 | dependencies: 2567 | path-key "^3.0.0" 2568 | 2569 | once@^1.3.0, once@^1.4.0: 2570 | version "1.4.0" 2571 | resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" 2572 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 2573 | dependencies: 2574 | wrappy "1" 2575 | 2576 | onetime@^5.1.2: 2577 | version "5.1.2" 2578 | resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" 2579 | integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== 2580 | dependencies: 2581 | mimic-fn "^2.1.0" 2582 | 2583 | optionator@^0.9.1: 2584 | version "0.9.1" 2585 | resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz" 2586 | integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== 2587 | dependencies: 2588 | deep-is "^0.1.3" 2589 | fast-levenshtein "^2.0.6" 2590 | levn "^0.4.1" 2591 | prelude-ls "^1.2.1" 2592 | type-check "^0.4.0" 2593 | word-wrap "^1.2.3" 2594 | 2595 | p-limit@^2.2.0: 2596 | version "2.3.0" 2597 | resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" 2598 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== 2599 | dependencies: 2600 | p-try "^2.0.0" 2601 | 2602 | p-limit@^3.0.2, p-limit@^3.1.0: 2603 | version "3.1.0" 2604 | resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" 2605 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 2606 | dependencies: 2607 | yocto-queue "^0.1.0" 2608 | 2609 | p-locate@^4.1.0: 2610 | version "4.1.0" 2611 | resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" 2612 | integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== 2613 | dependencies: 2614 | p-limit "^2.2.0" 2615 | 2616 | p-locate@^5.0.0: 2617 | version "5.0.0" 2618 | resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" 2619 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 2620 | dependencies: 2621 | p-limit "^3.0.2" 2622 | 2623 | p-try@^2.0.0: 2624 | version "2.2.0" 2625 | resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" 2626 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 2627 | 2628 | parent-module@^1.0.0: 2629 | version "1.0.1" 2630 | resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" 2631 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 2632 | dependencies: 2633 | callsites "^3.0.0" 2634 | 2635 | parse-json@^5.2.0: 2636 | version "5.2.0" 2637 | resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" 2638 | integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== 2639 | dependencies: 2640 | "@babel/code-frame" "^7.0.0" 2641 | error-ex "^1.3.1" 2642 | json-parse-even-better-errors "^2.3.0" 2643 | lines-and-columns "^1.1.6" 2644 | 2645 | path-exists@^4.0.0: 2646 | version "4.0.0" 2647 | resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" 2648 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 2649 | 2650 | path-is-absolute@^1.0.0: 2651 | version "1.0.1" 2652 | resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" 2653 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 2654 | 2655 | path-key@^3.0.0, path-key@^3.1.0: 2656 | version "3.1.1" 2657 | resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" 2658 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 2659 | 2660 | path-parse@^1.0.7: 2661 | version "1.0.7" 2662 | resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" 2663 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 2664 | 2665 | path-type@^4.0.0: 2666 | version "4.0.0" 2667 | resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" 2668 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== 2669 | 2670 | path@^0.12.7: 2671 | version "0.12.7" 2672 | resolved "https://registry.npmjs.org/path/-/path-0.12.7.tgz" 2673 | integrity sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8= 2674 | dependencies: 2675 | process "^0.11.1" 2676 | util "^0.10.3" 2677 | 2678 | pend@~1.2.0: 2679 | version "1.2.0" 2680 | resolved "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz" 2681 | integrity sha1-elfrVQpng/kRUzH89GY9XI4AelA= 2682 | 2683 | picocolors@^1.0.0: 2684 | version "1.0.0" 2685 | resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" 2686 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 2687 | 2688 | picomatch@^2.0.4, picomatch@^2.2.1: 2689 | version "2.2.2" 2690 | resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz" 2691 | integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== 2692 | 2693 | picomatch@^2.2.3: 2694 | version "2.3.1" 2695 | resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" 2696 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 2697 | 2698 | picomatch@^2.3.1: 2699 | version "2.3.1" 2700 | resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" 2701 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 2702 | 2703 | pirates@^4.0.4: 2704 | version "4.0.5" 2705 | resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz" 2706 | integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== 2707 | 2708 | pkg-dir@^4.2.0: 2709 | version "4.2.0" 2710 | resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" 2711 | integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== 2712 | dependencies: 2713 | find-up "^4.0.0" 2714 | 2715 | prelude-ls@^1.2.1: 2716 | version "1.2.1" 2717 | resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" 2718 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 2719 | 2720 | pretty-format@^28.1.3: 2721 | version "28.1.3" 2722 | resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz" 2723 | integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== 2724 | dependencies: 2725 | "@jest/schemas" "^28.1.3" 2726 | ansi-regex "^5.0.1" 2727 | ansi-styles "^5.0.0" 2728 | react-is "^18.0.0" 2729 | 2730 | process@^0.11.1: 2731 | version "0.11.10" 2732 | resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" 2733 | integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= 2734 | 2735 | prompts@^2.0.1: 2736 | version "2.4.2" 2737 | resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" 2738 | integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== 2739 | dependencies: 2740 | kleur "^3.0.3" 2741 | sisteransi "^1.0.5" 2742 | 2743 | punycode@^2.1.0: 2744 | version "2.1.1" 2745 | resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" 2746 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 2747 | 2748 | queue-microtask@^1.2.2: 2749 | version "1.2.3" 2750 | resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" 2751 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 2752 | 2753 | react-is@^18.0.0: 2754 | version "18.2.0" 2755 | resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" 2756 | integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== 2757 | 2758 | readdirp@^3.4.0: 2759 | version "3.5.0" 2760 | resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz" 2761 | integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ== 2762 | dependencies: 2763 | picomatch "^2.2.1" 2764 | 2765 | regexpp@^3.2.0: 2766 | version "3.2.0" 2767 | resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz" 2768 | integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== 2769 | 2770 | require-directory@^2.1.1: 2771 | version "2.1.1" 2772 | resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" 2773 | integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== 2774 | 2775 | resolve-cwd@^3.0.0: 2776 | version "3.0.0" 2777 | resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" 2778 | integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== 2779 | dependencies: 2780 | resolve-from "^5.0.0" 2781 | 2782 | resolve-from@^4.0.0: 2783 | version "4.0.0" 2784 | resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" 2785 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 2786 | 2787 | resolve-from@^5.0.0: 2788 | version "5.0.0" 2789 | resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" 2790 | integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== 2791 | 2792 | resolve.exports@^1.1.0: 2793 | version "1.1.0" 2794 | resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz" 2795 | integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== 2796 | 2797 | resolve@^1.20.0: 2798 | version "1.22.1" 2799 | resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" 2800 | integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== 2801 | dependencies: 2802 | is-core-module "^2.9.0" 2803 | path-parse "^1.0.7" 2804 | supports-preserve-symlinks-flag "^1.0.0" 2805 | 2806 | reusify@^1.0.4: 2807 | version "1.0.4" 2808 | resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" 2809 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 2810 | 2811 | rimraf@^3.0.0, rimraf@^3.0.2: 2812 | version "3.0.2" 2813 | resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" 2814 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 2815 | dependencies: 2816 | glob "^7.1.3" 2817 | 2818 | run-parallel@^1.1.9: 2819 | version "1.2.0" 2820 | resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" 2821 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 2822 | dependencies: 2823 | queue-microtask "^1.2.2" 2824 | 2825 | semver@^6.0.0: 2826 | version "6.3.1" 2827 | resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" 2828 | integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== 2829 | 2830 | semver@^6.3.0: 2831 | version "6.3.1" 2832 | resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" 2833 | integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== 2834 | 2835 | semver@^7.3.5, semver@^7.3.7: 2836 | version "7.6.3" 2837 | resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz" 2838 | integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== 2839 | 2840 | shebang-command@^2.0.0: 2841 | version "2.0.0" 2842 | resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" 2843 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 2844 | dependencies: 2845 | shebang-regex "^3.0.0" 2846 | 2847 | shebang-regex@^3.0.0: 2848 | version "3.0.0" 2849 | resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" 2850 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 2851 | 2852 | signal-exit@^3.0.3, signal-exit@^3.0.7: 2853 | version "3.0.7" 2854 | resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" 2855 | integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== 2856 | 2857 | sisteransi@^1.0.5: 2858 | version "1.0.5" 2859 | resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" 2860 | integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== 2861 | 2862 | slash@^3.0.0: 2863 | version "3.0.0" 2864 | resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" 2865 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 2866 | 2867 | source-map-support@0.5.13: 2868 | version "0.5.13" 2869 | resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" 2870 | integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== 2871 | dependencies: 2872 | buffer-from "^1.0.0" 2873 | source-map "^0.6.0" 2874 | 2875 | source-map@^0.6.0, source-map@^0.6.1: 2876 | version "0.6.1" 2877 | resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" 2878 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 2879 | 2880 | sprintf-js@~1.0.2: 2881 | version "1.0.3" 2882 | resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" 2883 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 2884 | 2885 | stack-utils@^2.0.3: 2886 | version "2.0.6" 2887 | resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz" 2888 | integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== 2889 | dependencies: 2890 | escape-string-regexp "^2.0.0" 2891 | 2892 | string-length@^4.0.1: 2893 | version "4.0.2" 2894 | resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" 2895 | integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== 2896 | dependencies: 2897 | char-regex "^1.0.2" 2898 | strip-ansi "^6.0.0" 2899 | 2900 | string-width@^4.1.0, string-width@^4.2.0: 2901 | version "4.2.0" 2902 | resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz" 2903 | integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== 2904 | dependencies: 2905 | emoji-regex "^8.0.0" 2906 | is-fullwidth-code-point "^3.0.0" 2907 | strip-ansi "^6.0.0" 2908 | 2909 | string-width@^4.2.3: 2910 | version "4.2.3" 2911 | resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" 2912 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 2913 | dependencies: 2914 | emoji-regex "^8.0.0" 2915 | is-fullwidth-code-point "^3.0.0" 2916 | strip-ansi "^6.0.1" 2917 | 2918 | strip-ansi@^6.0.0: 2919 | version "6.0.0" 2920 | resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz" 2921 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== 2922 | dependencies: 2923 | ansi-regex "^5.0.0" 2924 | 2925 | strip-ansi@^6.0.1: 2926 | version "6.0.1" 2927 | resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" 2928 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 2929 | dependencies: 2930 | ansi-regex "^5.0.1" 2931 | 2932 | strip-bom@^4.0.0: 2933 | version "4.0.0" 2934 | resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" 2935 | integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== 2936 | 2937 | strip-final-newline@^2.0.0: 2938 | version "2.0.0" 2939 | resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" 2940 | integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== 2941 | 2942 | strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: 2943 | version "3.1.1" 2944 | resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" 2945 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 2946 | 2947 | supports-color@^5.3.0: 2948 | version "5.5.0" 2949 | resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" 2950 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 2951 | dependencies: 2952 | has-flag "^3.0.0" 2953 | 2954 | supports-color@^7.0.0: 2955 | version "7.2.0" 2956 | resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" 2957 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 2958 | dependencies: 2959 | has-flag "^4.0.0" 2960 | 2961 | supports-color@^7.1.0: 2962 | version "7.2.0" 2963 | resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" 2964 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 2965 | dependencies: 2966 | has-flag "^4.0.0" 2967 | 2968 | supports-color@^8.0.0: 2969 | version "8.1.1" 2970 | resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" 2971 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== 2972 | dependencies: 2973 | has-flag "^4.0.0" 2974 | 2975 | supports-hyperlinks@^2.0.0: 2976 | version "2.3.0" 2977 | resolved "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz" 2978 | integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== 2979 | dependencies: 2980 | has-flag "^4.0.0" 2981 | supports-color "^7.0.0" 2982 | 2983 | supports-preserve-symlinks-flag@^1.0.0: 2984 | version "1.0.0" 2985 | resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" 2986 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 2987 | 2988 | terminal-link@^2.0.0: 2989 | version "2.1.1" 2990 | resolved "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz" 2991 | integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== 2992 | dependencies: 2993 | ansi-escapes "^4.2.1" 2994 | supports-hyperlinks "^2.0.0" 2995 | 2996 | test-exclude@^6.0.0: 2997 | version "6.0.0" 2998 | resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" 2999 | integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== 3000 | dependencies: 3001 | "@istanbuljs/schema" "^0.1.2" 3002 | glob "^7.1.4" 3003 | minimatch "^3.0.4" 3004 | 3005 | text-table@^0.2.0: 3006 | version "0.2.0" 3007 | resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" 3008 | integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== 3009 | 3010 | tmpl@1.0.5: 3011 | version "1.0.5" 3012 | resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" 3013 | integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== 3014 | 3015 | to-fast-properties@^2.0.0: 3016 | version "2.0.0" 3017 | resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" 3018 | integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= 3019 | 3020 | to-regex-range@^5.0.1: 3021 | version "5.0.1" 3022 | resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" 3023 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 3024 | dependencies: 3025 | is-number "^7.0.0" 3026 | 3027 | tr46@~0.0.3: 3028 | version "0.0.3" 3029 | resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" 3030 | integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== 3031 | 3032 | tslib@^1.8.1: 3033 | version "1.14.1" 3034 | resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" 3035 | integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== 3036 | 3037 | tsutils@^3.21.0: 3038 | version "3.21.0" 3039 | resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" 3040 | integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== 3041 | dependencies: 3042 | tslib "^1.8.1" 3043 | 3044 | type-check@^0.4.0, type-check@~0.4.0: 3045 | version "0.4.0" 3046 | resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" 3047 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 3048 | dependencies: 3049 | prelude-ls "^1.2.1" 3050 | 3051 | type-detect@4.0.8: 3052 | version "4.0.8" 3053 | resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" 3054 | integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== 3055 | 3056 | type-fest@^0.20.2: 3057 | version "0.20.2" 3058 | resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" 3059 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 3060 | 3061 | type-fest@^0.21.3: 3062 | version "0.21.3" 3063 | resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" 3064 | integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== 3065 | 3066 | "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta": 3067 | version "5.5.4" 3068 | resolved "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz" 3069 | integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== 3070 | 3071 | universal-user-agent@^6.0.0: 3072 | version "6.0.0" 3073 | resolved "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz" 3074 | integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== 3075 | 3076 | universalify@^0.1.0: 3077 | version "0.1.2" 3078 | resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" 3079 | integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== 3080 | 3081 | update-browserslist-db@^1.0.9: 3082 | version "1.0.10" 3083 | resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz" 3084 | integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== 3085 | dependencies: 3086 | escalade "^3.1.1" 3087 | picocolors "^1.0.0" 3088 | 3089 | uri-js@^4.2.2: 3090 | version "4.4.1" 3091 | resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" 3092 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 3093 | dependencies: 3094 | punycode "^2.1.0" 3095 | 3096 | util@^0.10.3: 3097 | version "0.10.4" 3098 | resolved "https://registry.npmjs.org/util/-/util-0.10.4.tgz" 3099 | integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== 3100 | dependencies: 3101 | inherits "2.0.3" 3102 | 3103 | v8-to-istanbul@^9.0.1: 3104 | version "9.0.1" 3105 | resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz" 3106 | integrity sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w== 3107 | dependencies: 3108 | "@jridgewell/trace-mapping" "^0.3.12" 3109 | "@types/istanbul-lib-coverage" "^2.0.1" 3110 | convert-source-map "^1.6.0" 3111 | 3112 | walker@^1.0.8: 3113 | version "1.0.8" 3114 | resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" 3115 | integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== 3116 | dependencies: 3117 | makeerror "1.0.12" 3118 | 3119 | webidl-conversions@^3.0.0: 3120 | version "3.0.1" 3121 | resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" 3122 | integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== 3123 | 3124 | whatwg-url@^5.0.0: 3125 | version "5.0.0" 3126 | resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" 3127 | integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== 3128 | dependencies: 3129 | tr46 "~0.0.3" 3130 | webidl-conversions "^3.0.0" 3131 | 3132 | which@^2.0.1: 3133 | version "2.0.2" 3134 | resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" 3135 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 3136 | dependencies: 3137 | isexe "^2.0.0" 3138 | 3139 | word-wrap@^1.2.3: 3140 | version "1.2.5" 3141 | resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" 3142 | integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== 3143 | 3144 | wrap-ansi@^7.0.0: 3145 | version "7.0.0" 3146 | resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" 3147 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 3148 | dependencies: 3149 | ansi-styles "^4.0.0" 3150 | string-width "^4.1.0" 3151 | strip-ansi "^6.0.0" 3152 | 3153 | wrappy@1: 3154 | version "1.0.2" 3155 | resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" 3156 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 3157 | 3158 | write-file-atomic@^4.0.1: 3159 | version "4.0.2" 3160 | resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz" 3161 | integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== 3162 | dependencies: 3163 | imurmurhash "^0.1.4" 3164 | signal-exit "^3.0.7" 3165 | 3166 | y18n@^5.0.5: 3167 | version "5.0.8" 3168 | resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" 3169 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 3170 | 3171 | yargs-parser@^21.1.1: 3172 | version "21.1.1" 3173 | resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" 3174 | integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== 3175 | 3176 | yargs@^17.3.1: 3177 | version "17.6.2" 3178 | resolved "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz" 3179 | integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw== 3180 | dependencies: 3181 | cliui "^8.0.1" 3182 | escalade "^3.1.1" 3183 | get-caller-file "^2.0.5" 3184 | require-directory "^2.1.1" 3185 | string-width "^4.2.3" 3186 | y18n "^5.0.5" 3187 | yargs-parser "^21.1.1" 3188 | 3189 | yauzl@^2.10.0: 3190 | version "2.10.0" 3191 | resolved "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz" 3192 | integrity sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk= 3193 | dependencies: 3194 | buffer-crc32 "~0.2.3" 3195 | fd-slicer "~1.1.0" 3196 | 3197 | yocto-queue@^0.1.0: 3198 | version "0.1.0" 3199 | resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" 3200 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 3201 | --------------------------------------------------------------------------------