├── .editorconfig ├── .eslintrc.js ├── .gitattributes ├── .gitignore ├── .verb.md ├── README.md ├── examples ├── Intl.Segmenter │ ├── iterator.ts │ └── segment.ts ├── Segmenter │ ├── array-from.ts │ ├── getSegments-static.ts │ ├── getSegments.ts │ ├── iterator-long-string.ts │ ├── iterator.ts │ └── segment.ts └── example.ts ├── index.ts ├── package.json ├── pnpm-lock.yaml ├── prettier.config.js ├── src └── Segmenter.ts ├── test └── Segmenter.test.ts ├── tsconfig.json └── tsup.config.ts /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | end_of_line = lf 6 | charset = utf-8 7 | indent_size = 2 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @type {import('@types/eslint').Linter.BaseConfig} 3 | */ 4 | module.exports = { 5 | root: true, 6 | 7 | extends: [ 8 | 'eslint:recommended' 9 | ], 10 | 11 | env: { 12 | commonjs: true, 13 | es2023: true, 14 | mocha: true, 15 | node: true 16 | }, 17 | 18 | plugins: ['@typescript-eslint'], 19 | parser: '@typescript-eslint/parser', 20 | parserOptions: { 21 | ecmaVersion: 'latest', 22 | sourceType: 'module', 23 | requireConfigFile: false 24 | }, 25 | 26 | rules: { 27 | 'accessor-pairs': 2, 28 | 'array-bracket-newline': [1, 'consistent'], 29 | 'array-bracket-spacing': [1, 'never'], 30 | 'array-callback-return': 1, 31 | 'array-element-newline': [1, 'consistent'], 32 | 'arrow-body-style': 0, 33 | 'arrow-parens': [1, 'as-needed'], 34 | 'arrow-spacing': [1, { before: true, after: true }], 35 | 'block-scoped-var': 1, 36 | 'block-spacing': [1, 'always'], 37 | 'brace-style': [1, '1tbs', { allowSingleLine: true }], 38 | 'callback-return': 0, 39 | 'camelcase': [0, { allow: [] }], 40 | 'capitalized-comments': 0, 41 | 'class-methods-use-this': 0, 42 | 'comma-dangle': [1, 'never'], 43 | 'comma-spacing': [1, { before: false, after: true }], 44 | 'comma-style': [1, 'last'], 45 | 'complexity': 1, 46 | 'computed-property-spacing': 1, 47 | 'consistent-return': 0, 48 | 'consistent-this': 1, 49 | 'constructor-super': 2, 50 | 'curly': [1, 'multi-line', 'consistent'], 51 | 'default-case': 1, 52 | 'dot-location': [1, 'property'], 53 | 'dot-notation': 1, 54 | 'eol-last': 1, 55 | 'eqeqeq': [1, 'allow-null'], 56 | 'for-direction': 1, 57 | 'func-call-spacing': 2, 58 | 'generator-star-spacing': [1, { before: true, after: true }], 59 | 'handle-callback-err': [2, '^(err|error)$'], 60 | 'indent': [1, 2, { SwitchCase: 1 }], 61 | 'key-spacing': [1, { beforeColon: false, afterColon: true }], 62 | 'keyword-spacing': [1, { before: true, after: true }], 63 | 'linebreak-style': [1, 'unix'], 64 | 'new-cap': [1, { newIsCap: true, capIsNew: false }], 65 | 'new-parens': 2, 66 | 'no-alert': 1, 67 | 'no-array-constructor': 1, 68 | 'no-async-promise-executor': 1, 69 | 'no-await-in-loop': 0, 70 | 'no-caller': 2, 71 | 'no-case-declarations': 1, 72 | 'no-class-assign': 2, 73 | 'no-cond-assign': 2, 74 | 'no-console': 0, 75 | 'no-const-assign': 2, 76 | 'no-constant-condition': [1, { checkLoops: false }], 77 | 'no-control-regex': 2, 78 | 'no-debugger': 2, 79 | 'no-delete-var': 2, 80 | 'no-dupe-args': 2, 81 | 'no-dupe-class-members': 2, 82 | 'no-dupe-keys': 2, 83 | 'no-duplicate-case': 2, 84 | 'no-duplicate-imports': 0, 85 | 'no-else-return': 0, 86 | 'no-empty-character-class': 2, 87 | 'no-empty-function': 0, 88 | 'no-empty-pattern': 0, 89 | 'no-empty': [1, { allowEmptyCatch: true }], 90 | 'no-eval': 0, 91 | 'no-ex-assign': 2, 92 | 'no-extend-native': 2, 93 | 'no-extra-bind': 1, 94 | 'no-extra-boolean-cast': 1, 95 | 'no-extra-label': 1, 96 | 'no-extra-parens': [1, 'all', { conditionalAssign: false, returnAssign: false, nestedBinaryExpressions: false, ignoreJSX: 'multi-line', enforceForArrowConditionals: false }], 97 | 'no-extra-semi': 1, 98 | 'no-fallthrough': 2, 99 | 'no-floating-decimal': 2, 100 | 'no-func-assign': 2, 101 | 'no-global-assign': 2, 102 | 'no-implicit-coercion': 2, 103 | 'no-implicit-globals': 1, 104 | 'no-implied-eval': 2, 105 | 'no-inner-declarations': [1, 'functions'], 106 | 'no-invalid-regexp': 2, 107 | 'no-invalid-this': 1, 108 | 'no-irregular-whitespace': 2, 109 | 'no-iterator': 2, 110 | 'no-label-var': 2, 111 | 'no-labels': 2, 112 | 'no-lone-blocks': 2, 113 | 'no-lonely-if': 2, 114 | 'no-loop-func': 1, 115 | 'no-mixed-requires': 1, 116 | 'no-mixed-spaces-and-tabs': 2, 117 | 'no-multi-assign': 0, 118 | 'no-multi-spaces': 1, 119 | 'no-multi-str': 2, 120 | 'no-multiple-empty-lines': [1, { max: 1 }], 121 | 'no-native-reassign': 2, 122 | 'no-negated-condition': 0, 123 | 'no-negated-in-lhs': 2, 124 | 'no-new-func': 2, 125 | 'no-new-object': 2, 126 | 'no-new-require': 2, 127 | 'no-new-symbol': 1, 128 | 'no-new-wrappers': 2, 129 | 'no-new': 1, 130 | 'no-obj-calls': 2, 131 | 'no-octal-escape': 2, 132 | 'no-octal': 2, 133 | 'no-path-concat': 1, 134 | 'no-proto': 2, 135 | 'no-prototype-builtins': 0, 136 | 'no-redeclare': 2, 137 | 'no-regex-spaces': 2, 138 | 'no-restricted-globals': 2, 139 | 'no-return-assign': 1, 140 | 'no-return-await': 2, 141 | 'no-script-url': 1, 142 | 'no-self-assign': 1, 143 | 'no-self-compare': 1, 144 | 'no-sequences': 2, 145 | 'no-shadow-restricted-names': 2, 146 | 'no-shadow': 0, 147 | 'no-spaced-func': 2, 148 | 'no-sparse-arrays': 2, 149 | 'no-template-curly-in-string': 0, 150 | 'no-this-before-super': 2, 151 | 'no-throw-literal': 2, 152 | 'no-trailing-spaces': 1, 153 | 'no-undef-init': 2, 154 | 'no-undef': 2, 155 | 'no-unexpected-multiline': 2, 156 | 'no-unneeded-ternary': [1, { defaultAssignment: false }], 157 | 'no-unreachable-loop': 1, 158 | 'no-unreachable': 2, 159 | 'no-unsafe-assignment': 0, 160 | 'no-unsafe-call': 0, 161 | 'no-unsafe-finally': 2, 162 | 'no-unsafe-member-access': 0, 163 | 'no-unsafe-negation': 2, 164 | 'no-unsafe-optional-chaining': 0, 165 | 'no-unsafe-return': 0, 166 | 'no-unused-expressions': 2, 167 | 'no-unused-vars': [1, { vars: 'all', args: 'after-used' }], 168 | 'no-use-before-define': 0, 169 | 'no-useless-call': 2, 170 | 'no-useless-catch': 0, 171 | 'no-useless-escape': 0, 172 | 'no-useless-rename': 1, 173 | 'no-useless-return': 1, 174 | 'no-var': 1, 175 | 'no-void': 1, 176 | 'no-warning-comments': 0, 177 | 'no-with': 2, 178 | 'object-curly-spacing': [1, 'always', { objectsInObjects: true }], 179 | 'object-shorthand': 1, 180 | 'one-var': [1, { initialized: 'never' }], 181 | 'operator-linebreak': [0, 'after', { overrides: { '?': 'before', ':': 'before' } }], 182 | 'padded-blocks': [1, { switches: 'never' }], 183 | 'prefer-const': [1, { destructuring: 'all', ignoreReadBeforeAssign: false }], 184 | 'prefer-promise-reject-errors': 1, 185 | 'quotes': [1, 'single', 'avoid-escape'], 186 | 'radix': 2, 187 | 'rest-spread-spacing': 1, 188 | 'semi-spacing': [1, { before: false, after: true }], 189 | 'semi-style': 1, 190 | 'semi': [1, 'always'], 191 | 'space-before-blocks': [1, 'always'], 192 | 'space-before-function-paren': [1, { anonymous: 'never', named: 'never', asyncArrow: 'always' }], 193 | 'space-in-parens': [1, 'never'], 194 | 'space-infix-ops': 1, 195 | 'space-unary-ops': [1, { words: true, nonwords: false }], 196 | 'spaced-comment': [0, 'always', { markers: ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ','] }], 197 | 'strict': 2, 198 | 'switch-colon-spacing': 1, 199 | 'symbol-description': 1, 200 | 'template-curly-spacing': [2, 'never'], 201 | 'template-tag-spacing': [2, 'never'], 202 | 'unicode-bom': 1, 203 | 'use-isnan': 2, 204 | 'valid-jsdoc': 1, 205 | 'valid-typeof': 2, 206 | 'wrap-iife': [1, 'any'], 207 | 'yoda': [1, 'never'], 208 | 209 | // TypeScript 210 | '@typescript-eslint/consistent-type-imports': 1, 211 | '@typescript-eslint/no-unused-vars': [1, { vars: 'all', args: 'after-used', argsIgnorePattern: '^_' }] 212 | }, 213 | 214 | ignorePatterns: [ 215 | '.cache', 216 | '.chat', 217 | '.config', 218 | '.vscode', 219 | '.git', 220 | 'node_modules', 221 | 'vendor', 222 | 'build', 223 | 'dist', 224 | 'tmp', 225 | 'temp' 226 | ] 227 | }; 228 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Enforce Unix newlines 2 | * text eol=lf 3 | 4 | # binaries 5 | *.ai binary 6 | *.psd binary 7 | *.jpg binary 8 | *.gif binary 9 | *.png binary 10 | *.jpeg binary 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # always ignore files 2 | *.sublime-* 3 | *.code-* 4 | *.log 5 | .DS_Store 6 | .env 7 | .env.* 8 | 9 | # always ignore dirs 10 | temp 11 | tmp 12 | vendor 13 | 14 | # test related, or directories generated by tests 15 | test/actual 16 | actual 17 | coverage 18 | .nyc* 19 | 20 | # package managers 21 | node_modules 22 | package-lock.json 23 | yarn.lock 24 | 25 | # misc 26 | _gh_pages 27 | _draft 28 | _drafts 29 | bower_components 30 | vendor 31 | temp 32 | tmp 33 | 34 | # AI 35 | 36 | *.generated.* 37 | *.updated.* 38 | .chat 39 | .smith 40 | dist -------------------------------------------------------------------------------- /.verb.md: -------------------------------------------------------------------------------- 1 | 2 | Install with [pnpm](https://pnpm.io): 3 | 4 | ```sh 5 | $ pnpm install intl-segmenter 6 | ``` 7 | 8 | ## Overview 9 | 10 | If you do any text processing, parsing, or formatting, especially for the terminal, you know the challenges of handling special characters, emojis, and extended Unicode characters. 11 | 12 | The `Intl.Segmenter` object was introduced to simplify text segmentation and correctly handle these special characters. However, it has notable limitations and potential risks: 13 | 14 | - Predictable "Maximum call stack exceeded" exceptions occur when strings exceed 40-50k characters. 15 | - Performance degrades geometrically as the number of non-ASCII/extended Unicode characters increases. 16 | 17 | For context: 18 | 19 | - Blog posts average 2k-10k chars 20 | - Novels 450k-500k chars 21 | - This README ~7k chars 22 | 23 | This library wraps `Intl.Segmenter` to address these issues: 24 | 25 | - Handles strings up to millions of characters in length (tested to ~24m chars on M2 Macbook Pro). 26 | - Improves performance by 50-500x compared to direct `Intl.Segmenter` usage. 27 | - Prevents "Maximum call stack exceeded" exceptions that predictably occur with long strings over a certain length. 28 | 29 | Use this as a drop-in replacement for `Intl.Segmenter` when accurate text segmentation is needed, particularly for strings with non-ASCII/extended Unicode characters. 30 | 31 | ## Usage 32 | 33 | ```js 34 | // Use Segmenter instead of Intl.Segmenter 35 | import { Segmenter } from '{%= name %}'; 36 | 37 | const segmenter = new Segmenter('en', { granularity: 'grapheme' }); 38 | const segments = []; 39 | 40 | // The segmenter.segment method is a generator 41 | for (const segment of segmenter.segment('Your input string here.')) { 42 | segments.push(segment); 43 | } 44 | 45 | // You can also use Array.from, but read the "Heads up" section first 46 | console.log(Array.from(segmenter.segment('Your input string here.'))); 47 | ``` 48 | 49 | ### Heads up! 50 | 51 | I recommend using manual iteration (traditional loops) if there's any chance the string will exceed a few hundred characters. 52 | 53 | **Note on Array.from's Iterator Handling** 54 | 55 | When `Array.from` processes an iterator/generator, it retains the entire iteration state in memory. Unlike a `for...of` loop, it can't process and discard items one by one. Instead, it: 56 | 57 | - Keeps the full generator state alive 58 | - Maintains the entire call stack for iteration 59 | - Holds all intermediate values 60 | - Builds up the final array 61 | 62 | This creates a deeper call stack and increased memory usage compared to manual iteration, where each step can be completed and garbage collected. 63 | 64 | ## API 65 | 66 | ### Segmenter 67 | 68 | **Params** 69 | 70 | - `language` **{String}**: A [BCP 47 language tag][tag], or an [Intl.Locale][locale] instance. 71 | - `options` **{Object}**: Supports all [Intl.Segmenter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter/Segmenter#parameters) options, with an additional `maxChunkLength` that defaults to `100`. 72 | 73 | **Example** 74 | 75 | ```js 76 | const segmenter = new Segmenter('en', { maxChunkLength: 100 }); 77 | ``` 78 | 79 | ### .segment 80 | 81 | Segments the provided string into an iterable sequence of `Intl.Segment` objects, optimized for performance and memory management. 82 | 83 | **Params** 84 | 85 | - `input` **{String}**: The string to be segmented. 86 | 87 | **Returns** 88 | 89 | - **{Generator}**: Yields `Intl.Segment` objects. 90 | 91 | **Example** 92 | 93 | ```js 94 | const segmenter = new Segmenter('en', { localeMatcher: 'lookup' }); 95 | 96 | for (const segment of segmenter.segment('This is a test')) { 97 | console.log(segment); 98 | } 99 | ``` 100 | 101 | ### .findSafeBreakPoint 102 | 103 | Mostly an internal method, but documented here in case you need to use it directly, or override it in a subclass. 104 | 105 | This method determines a safe position to break the string into chunks for efficient processing without splitting essential non-ASCII/extended Unicode character groups. 106 | 107 | **Params** 108 | 109 | - `input` **{String}**: The string to analyze. 110 | 111 | **Returns** 112 | 113 | - **{Number}**: Position index to use for safely breaking the string. 114 | 115 | **Example** 116 | 117 | ```js 118 | const segmenter = new Segmenter(); 119 | const breakPoint = segmenter.findSafeBreakPoint('This is a test'); 120 | console.log(breakPoint); // e.g., 4 121 | ``` 122 | 123 | ### .getSegments 124 | 125 | Returns all segments of the input string as an array, using the efficient generator from `.segment()`. 126 | 127 | **Params** 128 | 129 | - `input` **{String}**: The string to be segmented. 130 | 131 | **Returns** 132 | 133 | - **{Array}**: An array of `Intl.Segment` objects. 134 | 135 | **Example** 136 | 137 | ```js 138 | const segmenter = new Segmenter(); 139 | const segments = segmenter.getSegments('This is a test'); 140 | console.log(segments); 141 | // Returns: 142 | // [ 143 | // { segment: 'T', index: 0, input: 'This is a test' }, 144 | // { segment: 'h', index: 1, input: 'This is a test' }, 145 | // { segment: 'i', index: 2, input: 'This is a test' }, 146 | // { segment: 's', index: 3, input: 'This is a test' }, 147 | // { segment: ' ', index: 4, input: 'This is a test' }, 148 | // { segment: 'i', index: 5, input: 'This is a test' }, 149 | // { segment: 's', index: 6, input: 'This is a test' }, 150 | // { segment: ' ', index: 7, input: 'This is a test' }, 151 | // { segment: 'a', index: 8, input: 'This is a test' }, 152 | // { segment: ' ', index: 9, input: 'This is a test' }, 153 | // { segment: 't', index: 10, input: 'This is a test' }, 154 | // { segment: 'e', index: 11, input: 'This is a test' }, 155 | // { segment: 's', index: 12, input: 'This is a test' }, 156 | // { segment: 't', index: 13, input: 'This is a test' } 157 | // ] 158 | ``` 159 | 160 | ### Segmenter.getSegments 161 | 162 | Static method for segmenting a string. Creates a `Segmenter` instance and returns the segments as an array. 163 | 164 | **Params** 165 | 166 | - `input` **{String}**: The string to be segmented. 167 | - `language` **{String}**: A [BCP 47 language tag][tag], or an [Intl.Locale][locale] instance. 168 | - `options` **{Object}**: _(optional)_ Intl.Segmenter options. 169 | 170 | **Returns** 171 | 172 | - **{Array}**: An array of `Intl.Segment` objects. 173 | 174 | **Example** 175 | 176 | ```js 177 | const segments = Segmenter.getSegments('This is a test', 'en'); 178 | console.log(segments); 179 | ``` 180 | 181 | ## FAQ 182 | 183 | In a nutshell, this library prevents maximum call stack exceeded exceptions caused by memory management issues in `Intl.Segmenter`, and improves performance by 50-500x over using `Intl.Segmenter` directly. 184 | 185 | **What does this do?** 186 | 187 | This library wraps `Intl.Segmenter` and serves as a drop-in replacement that not only improves performance by 50-500x over `Intl.Segmenter` directly, but prevents maximum call stack exceeded exceptions that predictably occur with long strings. 188 | 189 | Without this library, exceptions reliably occur with strings exceeding 20-50k in length, depending on the number of non-ASCII/extended Unicode characters. These characters significantly affect performance and trigger exceptions sooner. 190 | 191 | Simply import the library and use `Segmenter` instead of `Intl.Segmenter`. 192 | 193 | **Why use this?** 194 | 195 | If you use `Intl.Segmenter`, your application is at risk of being terminated due to maximum call stack exceed exceptions. To prevent the exception from happening, you need to either prevent input strings from exceeding a certain length, say 10k characters, or wrap `segment` method to iterate over longer strings. 196 | 197 | However, _this is not as trivial as it sounds_. If you limit the length of the input string, in theory this would still allow users to break their input into chunks, then programmatically loop over those chunks. But now you've created the potential to split on a non-ASCII/extended unicode character, completely negating the entire point of using `Intl.Segmenter` in the first place. 198 | 199 | Alternatively, you can use this library, since it solves those problems for you and ensures that `Intl.Segmenter` handles all characters correctly. This library not only improves performance by 50-500x over `Intl.Segmenter` directly, but it prevents maximum call stack exceeded exceptions that _consistently occur when long strings are passed_. 200 | 201 | **What is Intl.Segmenter?** 202 | 203 | The newly introduced (2024) built-in [Intl.Segmenter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter) object enables locale-sensitive text segmentation, enabling you to get meaningful items (graphemes, words or sentences) from a string. 204 | 205 | **What causes the exception?** 206 | 207 | As of Nov. 17, 2024, a maximum call stack exceeded exception occurs when using `Intl.Segmenter` on strings that exceed 40-60k characters. The avg. blog post is around 2,500-10,000 characters, so you'll only encounter the call stack error when working with longer strings. However, even on shorter strings you might notice performance issues. 208 | 209 | Notably, performance in `Intl.Segmenter` degrades geometrically as the number of non-ASCII/extended unicode characters present in string increases, same goes for when _when the exception occurs_. 210 | 211 | _(On a related note, stack traces from exceptions indicate that the issue is related to the way Node.js interacts with V8 and how memory management is occurring at the application level via Node.js. We're still looking into this.)_ 212 | 213 | **Will the exception be fixed?** 214 | 215 | I'm not sure yet if this is a bug, or a limitation in `Intl.Segmenter`. But there has been an open [issue](https://issues.chromium.org/issues/326176949) about this for almost a year, and it doesn't seem to be a priority. 216 | 217 | Please [create an issue](../../issues) on this library if you have information or updates related to this issue. 218 | 219 | ## Comparison to Intl.Segmenter 220 | 221 | In this example, we compare the performance of `Segmenter` to `Intl.Segmenter` when processing a string with a length of 1200 characters. 222 | 223 | ```ts 224 | const text = ' 👨‍👩‍👧‍👦 🌍✨He👨‍👩‍👧‍👦llo 👨‍👩‍👧‍👦 world! 🌍✨'.repeat(1200); 225 | 226 | // With Intl.Segmenter 227 | const intlSegmenter = new Intl.Segmenter('en', { granularity: 'grapheme', localeMatcher: 'best fit' }); 228 | console.time('total time'); 229 | Array.from(intlSegmenter.segment(text)); 230 | console.timeEnd('total time'); 231 | // total time: 3.040s 232 | 233 | // With Segmenter 234 | const segmenter = new Segmenter('en', { granularity: 'grapheme', localeMatcher: 'best fit' }); 235 | console.time('total time'); 236 | Array.from(segmenter.segment(text)); 237 | console.timeEnd('total time'); 238 | // total time: 18.102ms 239 | ``` 240 | 241 | Segmenter is ~167x faster than `Intl.Segmenter`. The performance difference would be even more pronounced with longer strings, but the call stack exceeded exception would prevent you from testing that. 242 | 243 | 244 | [tag]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter/Segmenter#parameters 245 | [locale]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale 246 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # intl-segmenter [![NPM version](https://img.shields.io/npm/v/intl-segmenter.svg?style=flat)](https://www.npmjs.com/package/intl-segmenter) [![NPM monthly downloads](https://img.shields.io/npm/dm/intl-segmenter.svg?style=flat)](https://npmjs.org/package/intl-segmenter) [![NPM total downloads](https://img.shields.io/npm/dt/intl-segmenter.svg?style=flat)](https://npmjs.org/package/intl-segmenter) 2 | 3 | > A high-performance wrapper around `Intl.Segmenter` for efficient text segmentation. This class resolves memory handling issues seen with large strings and can enhance performance by 50-500x. Only ~60 loc and no dependencies. 4 | 5 | Please consider following this project's author, [Jon Schlinkert](https://github.com/jonschlinkert), and consider starring the project to show your :heart: and support. 6 | 7 | ## Install 8 | 9 | Install with [npm](https://www.npmjs.com/): 10 | 11 | ```sh 12 | $ npm install --save intl-segmenter 13 | ``` 14 | 15 | Install with [pnpm](https://pnpm.io): 16 | 17 | ```sh 18 | $ pnpm install intl-segmenter 19 | ``` 20 | 21 | ## Overview 22 | 23 | If you do any text processing, parsing, or formatting, especially for the terminal, you know the challenges of handling special characters, emojis, and extended Unicode characters. 24 | 25 | The [`Intl.Segmenter`](https://www.raymondcamden.com/2024/11/20/counting-words-with-intlsegmenter) object was introduced to simplify text segmentation and correctly handle these special characters. However, it has notable limitations and potential risks: 26 | 27 | * Predictable "Maximum call stack exceeded" exceptions occur when strings exceed 40-50k characters. 28 | * Performance degrades geometrically as the number of non-ASCII/extended Unicode characters increases. 29 | 30 | For context: 31 | 32 | * Blog posts average 2k-10k chars 33 | * Novels 450k-500k chars 34 | * This README ~7k chars 35 | 36 | This library wraps `Intl.Segmenter` to address these issues: 37 | 38 | * Handles strings up to millions of characters in length (tested to ~24m chars on M2 Macbook Pro). 39 | * Improves performance by 50-500x compared to direct `Intl.Segmenter` usage. 40 | * Prevents "Maximum call stack exceeded" exceptions that predictably occur with long strings over a certain length. 41 | 42 | Use this as a drop-in replacement for `Intl.Segmenter` when accurate text segmentation is needed, particularly for strings with non-ASCII/extended Unicode characters. 43 | 44 | ## Usage 45 | 46 | ```js 47 | // Use Segmenter instead of Intl.Segmenter 48 | import { Segmenter } from 'intl-segmenter'; 49 | 50 | const segmenter = new Segmenter('en', { granularity: 'grapheme' }); 51 | const segments = []; 52 | 53 | // The segmenter.segment method is a generator 54 | for (const segment of segmenter.segment('Your input string here.')) { 55 | segments.push(segment); 56 | } 57 | 58 | // You can also use Array.from, but read the "Heads up" section first 59 | console.log(Array.from(segmenter.segment('Your input string here.'))); 60 | ``` 61 | 62 | ### Heads up! 63 | 64 | I recommend using manual iteration (traditional loops) if there's any chance the string will exceed a few hundred characters. 65 | 66 | **Note on Array.from's Iterator Handling** 67 | 68 | When `Array.from` processes an iterator/generator, it retains the entire iteration state in memory. Unlike a `for...of` loop, it can't process and discard items one by one. Instead, it: 69 | 70 | * Keeps the full generator state alive 71 | * Maintains the entire call stack for iteration 72 | * Holds all intermediate values 73 | * Builds up the final array 74 | 75 | This creates a deeper call stack and increased memory usage compared to manual iteration, where each step can be completed and garbage collected. 76 | 77 | ## API 78 | 79 | ### Segmenter 80 | 81 | **Params** 82 | 83 | * `language` **{String}**: A [BCP 47 language tag](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter/Segmenter#parameters), or an [Intl.Locale](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale) instance. 84 | * `options` **{Object}**: Supports all [Intl.Segmenter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter/Segmenter#parameters) options, with an additional `maxChunkLength` that defaults to `100`. 85 | 86 | **Example** 87 | 88 | ```js 89 | const segmenter = new Segmenter('en', { maxChunkLength: 100 }); 90 | ``` 91 | 92 | ### .segment 93 | 94 | Segments the provided string into an iterable sequence of `Intl.Segment` objects, optimized for performance and memory management. 95 | 96 | **Params** 97 | 98 | * `input` **{String}**: The string to be segmented. 99 | 100 | **Returns** 101 | 102 | * **{Generator}**: Yields `Intl.Segment` objects. 103 | 104 | **Example** 105 | 106 | ```js 107 | const segmenter = new Segmenter('en', { localeMatcher: 'lookup' }); 108 | 109 | for (const segment of segmenter.segment('This is a test')) { 110 | console.log(segment); 111 | } 112 | ``` 113 | 114 | ### .findSafeBreakPoint 115 | 116 | Mostly an internal method, but documented here in case you need to use it directly, or override it in a subclass. 117 | 118 | This method determines a safe position to break the string into chunks for efficient processing without splitting essential non-ASCII/extended Unicode character groups. 119 | 120 | **Params** 121 | 122 | * `input` **{String}**: The string to analyze. 123 | 124 | **Returns** 125 | 126 | * **{Number}**: Position index to use for safely breaking the string. 127 | 128 | **Example** 129 | 130 | ```js 131 | const segmenter = new Segmenter(); 132 | const breakPoint = segmenter.findSafeBreakPoint('This is a test'); 133 | console.log(breakPoint); // e.g., 4 134 | ``` 135 | 136 | ### .getSegments 137 | 138 | Returns all segments of the input string as an array, using the efficient generator from `.segment()`. 139 | 140 | **Params** 141 | 142 | * `input` **{String}**: The string to be segmented. 143 | 144 | **Returns** 145 | 146 | * **{Array}**: An array of `Intl.Segment` objects. 147 | 148 | **Example** 149 | 150 | ```js 151 | const segmenter = new Segmenter(); 152 | const segments = segmenter.getSegments('This is a test'); 153 | console.log(segments); 154 | // Returns: 155 | // [ 156 | // { segment: 'T', index: 0, input: 'This is a test' }, 157 | // { segment: 'h', index: 1, input: 'This is a test' }, 158 | // { segment: 'i', index: 2, input: 'This is a test' }, 159 | // { segment: 's', index: 3, input: 'This is a test' }, 160 | // { segment: ' ', index: 4, input: 'This is a test' }, 161 | // { segment: 'i', index: 5, input: 'This is a test' }, 162 | // { segment: 's', index: 6, input: 'This is a test' }, 163 | // { segment: ' ', index: 7, input: 'This is a test' }, 164 | // { segment: 'a', index: 8, input: 'This is a test' }, 165 | // { segment: ' ', index: 9, input: 'This is a test' }, 166 | // { segment: 't', index: 10, input: 'This is a test' }, 167 | // { segment: 'e', index: 11, input: 'This is a test' }, 168 | // { segment: 's', index: 12, input: 'This is a test' }, 169 | // { segment: 't', index: 13, input: 'This is a test' } 170 | // ] 171 | ``` 172 | 173 | ### Segmenter.getSegments 174 | 175 | Static method for segmenting a string. Creates a `Segmenter` instance and returns the segments as an array. 176 | 177 | **Params** 178 | 179 | * `input` **{String}**: The string to be segmented. 180 | * `language` **{String}**: A [BCP 47 language tag](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter/Segmenter#parameters), or an [Intl.Locale](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale) instance. 181 | * `options` **{Object}**: _(optional)_ Intl.Segmenter options. 182 | 183 | **Returns** 184 | 185 | * **{Array}**: An array of `Intl.Segment` objects. 186 | 187 | **Example** 188 | 189 | ```js 190 | const segments = Segmenter.getSegments('This is a test', 'en'); 191 | console.log(segments); 192 | ``` 193 | 194 | ## FAQ 195 | 196 | In a nutshell, this library prevents maximum call stack exceeded exceptions caused by memory management issues in `Intl.Segmenter`, and improves performance by 50-500x over using `Intl.Segmenter` directly. 197 | 198 | **What does this do?** 199 | 200 | This library wraps `Intl.Segmenter` and serves as a drop-in replacement that not only improves performance by 50-500x over `Intl.Segmenter` directly, but prevents maximum call stack exceeded exceptions that predictably occur with long strings. 201 | 202 | Without this library, exceptions reliably occur with strings exceeding 20-50k in length, depending on the number of non-ASCII/extended Unicode characters. These characters significantly affect performance and trigger exceptions sooner. 203 | 204 | Simply import the library and use `Segmenter` instead of `Intl.Segmenter`. 205 | 206 | **Why use this?** 207 | 208 | If you use `Intl.Segmenter`, your application is at risk of being terminated due to maximum call stack exceed exceptions. To prevent the exception from happening, you need to either prevent input strings from exceeding a certain length, say 10k characters, or wrap `segment` method to iterate over longer strings. 209 | 210 | However, _this is not as trivial as it sounds_. If you limit the length of the input string, in theory this would still allow users to break their input into chunks, then programmatically loop over those chunks. But now you've created the potential to split on a non-ASCII/extended unicode character, completely negating the entire point of using `Intl.Segmenter` in the first place. 211 | 212 | Alternatively, you can use this library, since it solves those problems for you and ensures that `Intl.Segmenter` handles all characters correctly. This library not only improves performance by 50-500x over `Intl.Segmenter` directly, but it prevents maximum call stack exceeded exceptions that _consistently occur when long strings are passed_. 213 | 214 | **What is Intl.Segmenter?** 215 | 216 | The newly introduced (2024) built-in [Intl.Segmenter](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Segmenter) object enables locale-sensitive text segmentation, enabling you to get meaningful items (graphemes, words or sentences) from a string. 217 | 218 | **What causes the exception?** 219 | 220 | As of Nov. 17, 2024, a maximum call stack exceeded exception occurs when using `Intl.Segmenter` on strings that exceed 40-60k characters. The avg. blog post is around 2,500-10,000 characters, so you'll only encounter the call stack error when working with longer strings. However, even on shorter strings you might notice performance issues. 221 | 222 | Notably, performance in `Intl.Segmenter` degrades geometrically as the number of non-ASCII/extended unicode characters present in string increases, same goes for when _when the exception occurs_. 223 | 224 | _(On a related note, stack traces from exceptions indicate that the issue is related to the way Node.js interacts with V8 and how memory management is occurring at the application level via Node.js. We're still looking into this.)_ 225 | 226 | **Will the exception be fixed?** 227 | 228 | I'm not sure yet if this is a bug, or a limitation in `Intl.Segmenter`. But there has been an open [issue](https://issues.chromium.org/issues/326176949) about this for almost a year, and it doesn't seem to be a priority. 229 | 230 | Please [create an issue](../../issues) on this library if you have information or updates related to this issue. 231 | 232 | ## Comparison to Intl.Segmenter 233 | 234 | In this example, we compare the performance of `Segmenter` to `Intl.Segmenter` when processing a string with a length of 1200 characters. 235 | 236 | ```ts 237 | const text = ' 👨‍👩‍👧‍👦 🌍✨He👨‍👩‍👧‍👦llo 👨‍👩‍👧‍👦 world! 🌍✨'.repeat(1200); 238 | 239 | // With Intl.Segmenter 240 | const intlSegmenter = new Intl.Segmenter('en', { granularity: 'grapheme', localeMatcher: 'best fit' }); 241 | console.time('total time'); 242 | Array.from(intlSegmenter.segment(text)); 243 | console.timeEnd('total time'); 244 | // total time: 3.040s 245 | 246 | // With Segmenter 247 | const segmenter = new Segmenter('en', { granularity: 'grapheme', localeMatcher: 'best fit' }); 248 | console.time('total time'); 249 | Array.from(segmenter.segment(text)); 250 | console.timeEnd('total time'); 251 | // total time: 18.102ms 252 | ``` 253 | 254 | Segmenter is ~167x faster than `Intl.Segmenter`. The performance difference would be even more pronounced with longer strings, but the call stack exceeded exception would prevent you from testing that. 255 | 256 | ## About 257 | 258 |
259 | Contributing 260 | 261 | Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). 262 | 263 |
264 | 265 |
266 | Running Tests 267 | 268 | Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: 269 | 270 | ```sh 271 | $ npm install && npm test 272 | ``` 273 | 274 |
275 | 276 |
277 | Building docs 278 | 279 | _(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ 280 | 281 | To generate the readme, run the following command: 282 | 283 | ```sh 284 | $ npm install -g verbose/verb#dev verb-generate-readme && verb 285 | ``` 286 | 287 |
288 | 289 | ### Author 290 | 291 | **Jon Schlinkert** 292 | 293 | * [GitHub Profile](https://github.com/jonschlinkert) 294 | * [Twitter Profile](https://twitter.com/jonschlinkert) 295 | * [LinkedIn Profile](https://linkedin.com/in/jonschlinkert) 296 | 297 | ### License 298 | 299 | Copyright © 2025, [Jon Schlinkert](https://github.com/jonschlinkert). 300 | Released under the MIT License. 301 | 302 | *** 303 | 304 | _This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.8.0, on January 26, 2025._ 305 | -------------------------------------------------------------------------------- /examples/Intl.Segmenter/iterator.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * HEADS UP!!!! 3 | * 4 | * This will cause a maximum call stack exceeded error if you change 5 | * the `repeat` value higher. This is due to limitations in 6 | * in `Intl.Segmenter`. 7 | */ 8 | 9 | const getSegments = (text: string): string[] => { 10 | const segmenter = new Intl.Segmenter(); 11 | const segments = []; 12 | 13 | for (const segment of segmenter.segment(text)) { 14 | segments.push(segment); 15 | } 16 | 17 | return segments; 18 | }; 19 | 20 | console.time('total time'); 21 | const text = 'Hello 👨‍👩‍👧‍👦 world! 🌍✨ a'.repeat(1700); 22 | const segments = getSegments(text); 23 | console.timeEnd('total time'); 24 | 25 | // M2 MacBook Pro: 26 | // total time: 1.964s 27 | // 32,300 segments 28 | 29 | console.log(segments.length.toLocaleString(), 'segments'); 30 | 31 | -------------------------------------------------------------------------------- /examples/Intl.Segmenter/segment.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * HEADS UP!!!! 3 | * 4 | * This will cause a maximum call stack exceeded error if you change 5 | * the `repeat` value higher than ~1,270 or so. This is due to limitations 6 | * in in `Intl.Segmenter`. 7 | */ 8 | 9 | const repeat = 1_200; 10 | const text = ' 👨‍👩‍👧‍👦 🌍✨He👨‍👩‍👧‍👦llo 👨‍👩‍👧‍👦 world! 🌍✨'.repeat(repeat); 11 | console.log(text.length.toLocaleString(), 'length'); 12 | 13 | const segmenter = new Intl.Segmenter('en', { granularity: 'grapheme', localeMatcher: 'best fit' }); 14 | console.time('total time'); 15 | const segments = Array.from(segmenter.segment(text)); 16 | console.timeEnd('total time'); 17 | console.log(segments.length.toLocaleString(), 'segments'); 18 | // M2 MacBook Pro: 19 | // total time: 3.019s 20 | // 27,600 segments 21 | -------------------------------------------------------------------------------- /examples/Segmenter/array-from.ts: -------------------------------------------------------------------------------- 1 | import { Segmenter } from '~/Segmenter'; 2 | 3 | const segmenter = new Segmenter('en', { granularity: 'grapheme' }); 4 | const segments = Array.from(segmenter.segment('Your input string here.')); 5 | const graphemes = segments.map(segment => segment.segment); 6 | console.log(graphemes); 7 | -------------------------------------------------------------------------------- /examples/Segmenter/getSegments-static.ts: -------------------------------------------------------------------------------- 1 | import { Segmenter } from '~/Segmenter'; 2 | 3 | const text = 'Hello 👨‍👩‍👧‍👦 world! 🌍✨ a'.repeat(10_000); 4 | const segments = Segmenter.getSegments(text, 'en', { 5 | granularity: 'word', 6 | localeMatcher: 'best fit' 7 | }); 8 | 9 | console.log(segments.map(segment => segment.segment)); 10 | -------------------------------------------------------------------------------- /examples/Segmenter/getSegments.ts: -------------------------------------------------------------------------------- 1 | import { Segmenter } from '~/Segmenter'; 2 | 3 | const segmenter = new Segmenter('en', { granularity: 'word' }); 4 | const text = 'Hello 👨‍👩‍👧‍👦 world! 🌍✨ a'.repeat(100_000); 5 | 6 | console.time('total time'); 7 | const segments = segmenter.getSegments(text); 8 | console.timeEnd('total time'); 9 | // M2 MacBook Pro: 10 | // total time: 1.359s 11 | // 1,900,000 segments 12 | 13 | console.log(segments.length.toLocaleString(), 'segments'); 14 | -------------------------------------------------------------------------------- /examples/Segmenter/iterator-long-string.ts: -------------------------------------------------------------------------------- 1 | import { Segmenter } from '~/Segmenter'; 2 | 3 | const segmenter = new Segmenter('en', { granularity: 'grapheme' }); 4 | const text = 'Hello 👨‍👩‍👧‍👦 world! 🌍✨ a'.repeat(800_700); 5 | console.log(text.length.toLocaleString(), 'length'); 6 | 7 | console.time('total time'); 8 | const segments = []; 9 | for (const segment of segmenter.segment(text)) { 10 | segments.push(segment); 11 | } 12 | 13 | console.timeEnd('total time'); 14 | // M2 MacBook Pro: 15 | // 3,021,000 length 16 | // total time: 1.351s 17 | // 1,913,300 segments 18 | 19 | console.log(segments.length.toLocaleString(), 'segments'); 20 | -------------------------------------------------------------------------------- /examples/Segmenter/iterator.ts: -------------------------------------------------------------------------------- 1 | import { Segmenter } from '~/Segmenter'; 2 | 3 | const segmenter = new Segmenter('fr', { granularity: 'grapheme' }); 4 | console.log(segmenter.resolvedOptions()); 5 | 6 | const text = 'Hello 👨‍👩‍👧‍👦 world! 🌍✨ a'.repeat(1_700); 7 | console.log(text.length.toLocaleString(), 'length'); 8 | 9 | console.time('total time'); 10 | const segments = []; 11 | for (const segment of segmenter.segment(text)) { 12 | segments.push(segment); 13 | } 14 | 15 | console.timeEnd('total time'); 16 | // M2 MacBook Pro: 17 | // total time: 28.986ms (~68x faster than Intl.Segmenter) 18 | // 32,300 segments 19 | 20 | console.log(segments.length.toLocaleString(), 'segments'); 21 | -------------------------------------------------------------------------------- /examples/Segmenter/segment.ts: -------------------------------------------------------------------------------- 1 | import { Segmenter } from '~/Segmenter'; 2 | 3 | const text = 'Hello 👨‍👩‍👧‍👦 world! 🌍✨ a'.repeat(1200); 4 | console.log(text.length.toLocaleString(), 'length'); 5 | const segmenter = new Segmenter('en', { granularity: 'grapheme', localeMatcher: 'best fit' }); 6 | console.time('total time'); 7 | const segments = Array.from(segmenter.segment(text)); 8 | console.timeEnd('total time'); 9 | console.log(segments.length.toLocaleString(), 'segments'); 10 | // M2 MacBook Pro: 11 | // total time: 22.604ms (~130x faster than Intl.Segmenter) 12 | // 22,800 segments 13 | -------------------------------------------------------------------------------- /examples/example.ts: -------------------------------------------------------------------------------- 1 | import { Segmenter } from '~/Segmenter'; 2 | 3 | const segmenter = new Segmenter('en', { granularity: 'grapheme' }); 4 | 5 | for (const segment of segmenter.segment('Your input string here.')) { 6 | console.log(segment); 7 | } 8 | -------------------------------------------------------------------------------- /index.ts: -------------------------------------------------------------------------------- 1 | export * from './src/Segmenter'; 2 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "intl-segmenter", 3 | "version": "1.0.0", 4 | "description": "A high-performance wrapper around `Intl.Segmenter` for efficient text segmentation. This class resolves memory handling issues seen with large strings and can enhance performance by 50-500x. Only ~70 loc (with comments) and no dependencies.", 5 | "license": "MIT", 6 | "author": { 7 | "name": "Jon Schlinkert", 8 | "email": "jon.schlinkert@sellside.com", 9 | "url": "https://github.com/jonschlinkert" 10 | }, 11 | "repository": "jonschlinkert/intl-segmenter", 12 | "homepage": "https://github.com/jonschlinkert/intl-segmenter", 13 | "bugs": { 14 | "url": "https://github.com/jonschlinkert/intl-segmenter/issues" 15 | }, 16 | "scripts": { 17 | "eslint": "npx eslint --ext .ts .", 18 | "test": "ts-mocha -r esbuild-register 'test/**/*.ts'", 19 | "tsup": "npx tsup" 20 | }, 21 | "main": "dist/index.js", 22 | "module": "dist/index.mjs", 23 | "files": [ 24 | "dist" 25 | ], 26 | "exports": { 27 | ".": { 28 | "import": "./dist/index.mjs", 29 | "require": "./dist/index.js" 30 | }, 31 | "./*": { 32 | "import": "./dist/*.mjs", 33 | "require": "./dist/*.js" 34 | } 35 | }, 36 | "devDependencies": { 37 | "@types/node": "^22.10.10", 38 | "@typescript-eslint/eslint-plugin": "^8.14.0", 39 | "@typescript-eslint/parser": "^8.14.0", 40 | "esbuild-register": "^3.5.0", 41 | "eslint": "^8.57.0", 42 | "gulp-format-md": "^2.0.0", 43 | "prettier": "^3.3.3", 44 | "ts-mocha": "^10.0.0", 45 | "ts-node": "^10.9.2", 46 | "tsconfig-paths": "^4.2.0", 47 | "tsup": "^8.0.2", 48 | "typescript": "^5.4.5" 49 | }, 50 | "keywords": [ 51 | "ansi", 52 | "ascii", 53 | "character", 54 | "characters", 55 | "chunk", 56 | "chunks", 57 | "emoji", 58 | "emojis", 59 | "graphemes", 60 | "intl", 61 | "segment", 62 | "segmentation", 63 | "segmenter", 64 | "sentences", 65 | "split", 66 | "string", 67 | "strings", 68 | "terminal", 69 | "text", 70 | "tokenization", 71 | "tokenize", 72 | "unicode", 73 | "utf-8", 74 | "utf16", 75 | "utf32", 76 | "utf8", 77 | "words" 78 | ], 79 | "verb": { 80 | "toc": false, 81 | "layout": "default", 82 | "tasks": [ 83 | "readme" 84 | ], 85 | "plugins": [ 86 | "gulp-format-md" 87 | ], 88 | "reflinks": [ 89 | "verb" 90 | ], 91 | "lint": { 92 | "reflinks": true 93 | } 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | '@types/node': 12 | specifier: ^22.10.10 13 | version: 22.10.10 14 | '@typescript-eslint/eslint-plugin': 15 | specifier: ^8.14.0 16 | version: 8.14.0(@typescript-eslint/parser@8.14.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3) 17 | '@typescript-eslint/parser': 18 | specifier: ^8.14.0 19 | version: 8.14.0(eslint@8.57.1)(typescript@5.6.3) 20 | esbuild-register: 21 | specifier: ^3.5.0 22 | version: 3.6.0(esbuild@0.24.0) 23 | eslint: 24 | specifier: ^8.57.0 25 | version: 8.57.1 26 | gulp-format-md: 27 | specifier: ^2.0.0 28 | version: 2.0.0 29 | prettier: 30 | specifier: ^3.3.3 31 | version: 3.3.3 32 | ts-mocha: 33 | specifier: ^10.0.0 34 | version: 10.0.0(mocha@10.8.2) 35 | ts-node: 36 | specifier: ^10.9.2 37 | version: 10.9.2(@types/node@22.10.10)(typescript@5.6.3) 38 | tsconfig-paths: 39 | specifier: ^4.2.0 40 | version: 4.2.0 41 | tsup: 42 | specifier: ^8.0.2 43 | version: 8.3.5(typescript@5.6.3) 44 | typescript: 45 | specifier: ^5.4.5 46 | version: 5.6.3 47 | 48 | packages: 49 | 50 | '@cspotcode/source-map-support@0.8.1': 51 | resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} 52 | engines: {node: '>=12'} 53 | 54 | '@esbuild/aix-ppc64@0.24.0': 55 | resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} 56 | engines: {node: '>=18'} 57 | cpu: [ppc64] 58 | os: [aix] 59 | 60 | '@esbuild/android-arm64@0.24.0': 61 | resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} 62 | engines: {node: '>=18'} 63 | cpu: [arm64] 64 | os: [android] 65 | 66 | '@esbuild/android-arm@0.24.0': 67 | resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} 68 | engines: {node: '>=18'} 69 | cpu: [arm] 70 | os: [android] 71 | 72 | '@esbuild/android-x64@0.24.0': 73 | resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} 74 | engines: {node: '>=18'} 75 | cpu: [x64] 76 | os: [android] 77 | 78 | '@esbuild/darwin-arm64@0.24.0': 79 | resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} 80 | engines: {node: '>=18'} 81 | cpu: [arm64] 82 | os: [darwin] 83 | 84 | '@esbuild/darwin-x64@0.24.0': 85 | resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} 86 | engines: {node: '>=18'} 87 | cpu: [x64] 88 | os: [darwin] 89 | 90 | '@esbuild/freebsd-arm64@0.24.0': 91 | resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} 92 | engines: {node: '>=18'} 93 | cpu: [arm64] 94 | os: [freebsd] 95 | 96 | '@esbuild/freebsd-x64@0.24.0': 97 | resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} 98 | engines: {node: '>=18'} 99 | cpu: [x64] 100 | os: [freebsd] 101 | 102 | '@esbuild/linux-arm64@0.24.0': 103 | resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} 104 | engines: {node: '>=18'} 105 | cpu: [arm64] 106 | os: [linux] 107 | 108 | '@esbuild/linux-arm@0.24.0': 109 | resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} 110 | engines: {node: '>=18'} 111 | cpu: [arm] 112 | os: [linux] 113 | 114 | '@esbuild/linux-ia32@0.24.0': 115 | resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} 116 | engines: {node: '>=18'} 117 | cpu: [ia32] 118 | os: [linux] 119 | 120 | '@esbuild/linux-loong64@0.24.0': 121 | resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} 122 | engines: {node: '>=18'} 123 | cpu: [loong64] 124 | os: [linux] 125 | 126 | '@esbuild/linux-mips64el@0.24.0': 127 | resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} 128 | engines: {node: '>=18'} 129 | cpu: [mips64el] 130 | os: [linux] 131 | 132 | '@esbuild/linux-ppc64@0.24.0': 133 | resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} 134 | engines: {node: '>=18'} 135 | cpu: [ppc64] 136 | os: [linux] 137 | 138 | '@esbuild/linux-riscv64@0.24.0': 139 | resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} 140 | engines: {node: '>=18'} 141 | cpu: [riscv64] 142 | os: [linux] 143 | 144 | '@esbuild/linux-s390x@0.24.0': 145 | resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} 146 | engines: {node: '>=18'} 147 | cpu: [s390x] 148 | os: [linux] 149 | 150 | '@esbuild/linux-x64@0.24.0': 151 | resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} 152 | engines: {node: '>=18'} 153 | cpu: [x64] 154 | os: [linux] 155 | 156 | '@esbuild/netbsd-x64@0.24.0': 157 | resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} 158 | engines: {node: '>=18'} 159 | cpu: [x64] 160 | os: [netbsd] 161 | 162 | '@esbuild/openbsd-arm64@0.24.0': 163 | resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} 164 | engines: {node: '>=18'} 165 | cpu: [arm64] 166 | os: [openbsd] 167 | 168 | '@esbuild/openbsd-x64@0.24.0': 169 | resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} 170 | engines: {node: '>=18'} 171 | cpu: [x64] 172 | os: [openbsd] 173 | 174 | '@esbuild/sunos-x64@0.24.0': 175 | resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} 176 | engines: {node: '>=18'} 177 | cpu: [x64] 178 | os: [sunos] 179 | 180 | '@esbuild/win32-arm64@0.24.0': 181 | resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} 182 | engines: {node: '>=18'} 183 | cpu: [arm64] 184 | os: [win32] 185 | 186 | '@esbuild/win32-ia32@0.24.0': 187 | resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} 188 | engines: {node: '>=18'} 189 | cpu: [ia32] 190 | os: [win32] 191 | 192 | '@esbuild/win32-x64@0.24.0': 193 | resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} 194 | engines: {node: '>=18'} 195 | cpu: [x64] 196 | os: [win32] 197 | 198 | '@eslint-community/eslint-utils@4.4.1': 199 | resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} 200 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 201 | peerDependencies: 202 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 203 | 204 | '@eslint-community/regexpp@4.12.1': 205 | resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} 206 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 207 | 208 | '@eslint/eslintrc@2.1.4': 209 | resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} 210 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 211 | 212 | '@eslint/js@8.57.1': 213 | resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} 214 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 215 | 216 | '@humanwhocodes/config-array@0.13.0': 217 | resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} 218 | engines: {node: '>=10.10.0'} 219 | deprecated: Use @eslint/config-array instead 220 | 221 | '@humanwhocodes/module-importer@1.0.1': 222 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 223 | engines: {node: '>=12.22'} 224 | 225 | '@humanwhocodes/object-schema@2.0.3': 226 | resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} 227 | deprecated: Use @eslint/object-schema instead 228 | 229 | '@isaacs/cliui@8.0.2': 230 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 231 | engines: {node: '>=12'} 232 | 233 | '@jridgewell/gen-mapping@0.3.5': 234 | resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} 235 | engines: {node: '>=6.0.0'} 236 | 237 | '@jridgewell/resolve-uri@3.1.2': 238 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 239 | engines: {node: '>=6.0.0'} 240 | 241 | '@jridgewell/set-array@1.2.1': 242 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 243 | engines: {node: '>=6.0.0'} 244 | 245 | '@jridgewell/sourcemap-codec@1.5.0': 246 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 247 | 248 | '@jridgewell/trace-mapping@0.3.25': 249 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 250 | 251 | '@jridgewell/trace-mapping@0.3.9': 252 | resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} 253 | 254 | '@nodelib/fs.scandir@2.1.5': 255 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 256 | engines: {node: '>= 8'} 257 | 258 | '@nodelib/fs.stat@2.0.5': 259 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 260 | engines: {node: '>= 8'} 261 | 262 | '@nodelib/fs.walk@1.2.8': 263 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 264 | engines: {node: '>= 8'} 265 | 266 | '@pkgjs/parseargs@0.11.0': 267 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 268 | engines: {node: '>=14'} 269 | 270 | '@rollup/rollup-android-arm-eabi@4.27.2': 271 | resolution: {integrity: sha512-Tj+j7Pyzd15wAdSJswvs5CJzJNV+qqSUcr/aCD+jpQSBtXvGnV0pnrjoc8zFTe9fcKCatkpFpOO7yAzpO998HA==} 272 | cpu: [arm] 273 | os: [android] 274 | 275 | '@rollup/rollup-android-arm64@4.27.2': 276 | resolution: {integrity: sha512-xsPeJgh2ThBpUqlLgRfiVYBEf/P1nWlWvReG+aBWfNv3XEBpa6ZCmxSVnxJgLgkNz4IbxpLy64h2gCmAAQLneQ==} 277 | cpu: [arm64] 278 | os: [android] 279 | 280 | '@rollup/rollup-darwin-arm64@4.27.2': 281 | resolution: {integrity: sha512-KnXU4m9MywuZFedL35Z3PuwiTSn/yqRIhrEA9j+7OSkji39NzVkgxuxTYg5F8ryGysq4iFADaU5osSizMXhU2A==} 282 | cpu: [arm64] 283 | os: [darwin] 284 | 285 | '@rollup/rollup-darwin-x64@4.27.2': 286 | resolution: {integrity: sha512-Hj77A3yTvUeCIx/Vi+4d4IbYhyTwtHj07lVzUgpUq9YpJSEiGJj4vXMKwzJ3w5zp5v3PFvpJNgc/J31smZey6g==} 287 | cpu: [x64] 288 | os: [darwin] 289 | 290 | '@rollup/rollup-freebsd-arm64@4.27.2': 291 | resolution: {integrity: sha512-RjgKf5C3xbn8gxvCm5VgKZ4nn0pRAIe90J0/fdHUsgztd3+Zesb2lm2+r6uX4prV2eUByuxJNdt647/1KPRq5g==} 292 | cpu: [arm64] 293 | os: [freebsd] 294 | 295 | '@rollup/rollup-freebsd-x64@4.27.2': 296 | resolution: {integrity: sha512-duq21FoXwQtuws+V9H6UZ+eCBc7fxSpMK1GQINKn3fAyd9DFYKPJNcUhdIKOrMFjLEJgQskoMoiuizMt+dl20g==} 297 | cpu: [x64] 298 | os: [freebsd] 299 | 300 | '@rollup/rollup-linux-arm-gnueabihf@4.27.2': 301 | resolution: {integrity: sha512-6npqOKEPRZkLrMcvyC/32OzJ2srdPzCylJjiTJT2c0bwwSGm7nz2F9mNQ1WrAqCBZROcQn91Fno+khFhVijmFA==} 302 | cpu: [arm] 303 | os: [linux] 304 | 305 | '@rollup/rollup-linux-arm-musleabihf@4.27.2': 306 | resolution: {integrity: sha512-V9Xg6eXtgBtHq2jnuQwM/jr2mwe2EycnopO8cbOvpzFuySCGtKlPCI3Hj9xup/pJK5Q0388qfZZy2DqV2J8ftw==} 307 | cpu: [arm] 308 | os: [linux] 309 | 310 | '@rollup/rollup-linux-arm64-gnu@4.27.2': 311 | resolution: {integrity: sha512-uCFX9gtZJoQl2xDTpRdseYuNqyKkuMDtH6zSrBTA28yTfKyjN9hQ2B04N5ynR8ILCoSDOrG/Eg+J2TtJ1e/CSA==} 312 | cpu: [arm64] 313 | os: [linux] 314 | 315 | '@rollup/rollup-linux-arm64-musl@4.27.2': 316 | resolution: {integrity: sha512-/PU9P+7Rkz8JFYDHIi+xzHabOu9qEWR07L5nWLIUsvserrxegZExKCi2jhMZRd0ATdboKylu/K5yAXbp7fYFvA==} 317 | cpu: [arm64] 318 | os: [linux] 319 | 320 | '@rollup/rollup-linux-powerpc64le-gnu@4.27.2': 321 | resolution: {integrity: sha512-eCHmol/dT5odMYi/N0R0HC8V8QE40rEpkyje/ZAXJYNNoSfrObOvG/Mn+s1F/FJyB7co7UQZZf6FuWnN6a7f4g==} 322 | cpu: [ppc64] 323 | os: [linux] 324 | 325 | '@rollup/rollup-linux-riscv64-gnu@4.27.2': 326 | resolution: {integrity: sha512-DEP3Njr9/ADDln3kNi76PXonLMSSMiCir0VHXxmGSHxCxDfQ70oWjHcJGfiBugzaqmYdTC7Y+8Int6qbnxPBIQ==} 327 | cpu: [riscv64] 328 | os: [linux] 329 | 330 | '@rollup/rollup-linux-s390x-gnu@4.27.2': 331 | resolution: {integrity: sha512-NHGo5i6IE/PtEPh5m0yw5OmPMpesFnzMIS/lzvN5vknnC1sXM5Z/id5VgcNPgpD+wHmIcuYYgW+Q53v+9s96lQ==} 332 | cpu: [s390x] 333 | os: [linux] 334 | 335 | '@rollup/rollup-linux-x64-gnu@4.27.2': 336 | resolution: {integrity: sha512-PaW2DY5Tan+IFvNJGHDmUrORadbe/Ceh8tQxi8cmdQVCCYsLoQo2cuaSj+AU+YRX8M4ivS2vJ9UGaxfuNN7gmg==} 337 | cpu: [x64] 338 | os: [linux] 339 | 340 | '@rollup/rollup-linux-x64-musl@4.27.2': 341 | resolution: {integrity: sha512-dOlWEMg2gI91Qx5I/HYqOD6iqlJspxLcS4Zlg3vjk1srE67z5T2Uz91yg/qA8sY0XcwQrFzWWiZhMNERylLrpQ==} 342 | cpu: [x64] 343 | os: [linux] 344 | 345 | '@rollup/rollup-win32-arm64-msvc@4.27.2': 346 | resolution: {integrity: sha512-euMIv/4x5Y2/ImlbGl88mwKNXDsvzbWUlT7DFky76z2keajCtcbAsN9LUdmk31hAoVmJJYSThgdA0EsPeTr1+w==} 347 | cpu: [arm64] 348 | os: [win32] 349 | 350 | '@rollup/rollup-win32-ia32-msvc@4.27.2': 351 | resolution: {integrity: sha512-RsnE6LQkUHlkC10RKngtHNLxb7scFykEbEwOFDjr3CeCMG+Rr+cKqlkKc2/wJ1u4u990urRHCbjz31x84PBrSQ==} 352 | cpu: [ia32] 353 | os: [win32] 354 | 355 | '@rollup/rollup-win32-x64-msvc@4.27.2': 356 | resolution: {integrity: sha512-foJM5vv+z2KQmn7emYdDLyTbkoO5bkHZE1oth2tWbQNGW7mX32d46Hz6T0MqXdWS2vBZhaEtHqdy9WYwGfiliA==} 357 | cpu: [x64] 358 | os: [win32] 359 | 360 | '@tsconfig/node10@1.0.11': 361 | resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} 362 | 363 | '@tsconfig/node12@1.0.11': 364 | resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} 365 | 366 | '@tsconfig/node14@1.0.3': 367 | resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} 368 | 369 | '@tsconfig/node16@1.0.4': 370 | resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} 371 | 372 | '@types/estree@1.0.6': 373 | resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} 374 | 375 | '@types/json5@0.0.29': 376 | resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} 377 | 378 | '@types/node@22.10.10': 379 | resolution: {integrity: sha512-X47y/mPNzxviAGY5TcYPtYL8JsY3kAq2n8fMmKoRCxq/c4v4pyGNCzM2R6+M5/umG4ZfHuT+sgqDYqWc9rJ6ww==} 380 | 381 | '@typescript-eslint/eslint-plugin@8.14.0': 382 | resolution: {integrity: sha512-tqp8H7UWFaZj0yNO6bycd5YjMwxa6wIHOLZvWPkidwbgLCsBMetQoGj7DPuAlWa2yGO3H48xmPwjhsSPPCGU5w==} 383 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 384 | peerDependencies: 385 | '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 386 | eslint: ^8.57.0 || ^9.0.0 387 | typescript: '*' 388 | peerDependenciesMeta: 389 | typescript: 390 | optional: true 391 | 392 | '@typescript-eslint/parser@8.14.0': 393 | resolution: {integrity: sha512-2p82Yn9juUJq0XynBXtFCyrBDb6/dJombnz6vbo6mgQEtWHfvHbQuEa9kAOVIt1c9YFwi7H6WxtPj1kg+80+RA==} 394 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 395 | peerDependencies: 396 | eslint: ^8.57.0 || ^9.0.0 397 | typescript: '*' 398 | peerDependenciesMeta: 399 | typescript: 400 | optional: true 401 | 402 | '@typescript-eslint/scope-manager@8.14.0': 403 | resolution: {integrity: sha512-aBbBrnW9ARIDn92Zbo7rguLnqQ/pOrUguVpbUwzOhkFg2npFDwTgPGqFqE0H5feXcOoJOfX3SxlJaKEVtq54dw==} 404 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 405 | 406 | '@typescript-eslint/type-utils@8.14.0': 407 | resolution: {integrity: sha512-Xcz9qOtZuGusVOH5Uk07NGs39wrKkf3AxlkK79RBK6aJC1l03CobXjJbwBPSidetAOV+5rEVuiT1VSBUOAsanQ==} 408 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 409 | peerDependencies: 410 | typescript: '*' 411 | peerDependenciesMeta: 412 | typescript: 413 | optional: true 414 | 415 | '@typescript-eslint/types@8.14.0': 416 | resolution: {integrity: sha512-yjeB9fnO/opvLJFAsPNYlKPnEM8+z4og09Pk504dkqonT02AyL5Z9SSqlE0XqezS93v6CXn49VHvB2G7XSsl0g==} 417 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 418 | 419 | '@typescript-eslint/typescript-estree@8.14.0': 420 | resolution: {integrity: sha512-OPXPLYKGZi9XS/49rdaCbR5j/S14HazviBlUQFvSKz3npr3NikF+mrgK7CFVur6XEt95DZp/cmke9d5i3vtVnQ==} 421 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 422 | peerDependencies: 423 | typescript: '*' 424 | peerDependenciesMeta: 425 | typescript: 426 | optional: true 427 | 428 | '@typescript-eslint/utils@8.14.0': 429 | resolution: {integrity: sha512-OGqj6uB8THhrHj0Fk27DcHPojW7zKwKkPmHXHvQ58pLYp4hy8CSUdTKykKeh+5vFqTTVmjz0zCOOPKRovdsgHA==} 430 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 431 | peerDependencies: 432 | eslint: ^8.57.0 || ^9.0.0 433 | 434 | '@typescript-eslint/visitor-keys@8.14.0': 435 | resolution: {integrity: sha512-vG0XZo8AdTH9OE6VFRwAZldNc7qtJ/6NLGWak+BtENuEUXGZgFpihILPiBvKXvJ2nFu27XNGC6rKiwuaoMbYzQ==} 436 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 437 | 438 | '@ungap/structured-clone@1.2.0': 439 | resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} 440 | 441 | acorn-jsx@5.3.2: 442 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 443 | peerDependencies: 444 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 445 | 446 | acorn-walk@8.3.4: 447 | resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} 448 | engines: {node: '>=0.4.0'} 449 | 450 | acorn@8.14.0: 451 | resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} 452 | engines: {node: '>=0.4.0'} 453 | hasBin: true 454 | 455 | ajv@6.12.6: 456 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 457 | 458 | ansi-colors@4.1.3: 459 | resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} 460 | engines: {node: '>=6'} 461 | 462 | ansi-regex@5.0.1: 463 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 464 | engines: {node: '>=8'} 465 | 466 | ansi-regex@6.1.0: 467 | resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} 468 | engines: {node: '>=12'} 469 | 470 | ansi-styles@4.3.0: 471 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 472 | engines: {node: '>=8'} 473 | 474 | ansi-styles@6.2.1: 475 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 476 | engines: {node: '>=12'} 477 | 478 | any-promise@1.3.0: 479 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 480 | 481 | anymatch@3.1.3: 482 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 483 | engines: {node: '>= 8'} 484 | 485 | arg@4.1.3: 486 | resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} 487 | 488 | argparse@1.0.10: 489 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 490 | 491 | argparse@2.0.1: 492 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 493 | 494 | arrify@1.0.1: 495 | resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} 496 | engines: {node: '>=0.10.0'} 497 | 498 | autolinker@0.28.1: 499 | resolution: {integrity: sha512-zQAFO1Dlsn69eXaO6+7YZc+v84aquQKbwpzCE3L0stj56ERn9hutFxPopViLjo9G+rWwjozRhgS5KJ25Xy19cQ==} 500 | 501 | balanced-match@1.0.2: 502 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 503 | 504 | binary-extensions@2.3.0: 505 | resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} 506 | engines: {node: '>=8'} 507 | 508 | brace-expansion@1.1.11: 509 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 510 | 511 | brace-expansion@2.0.1: 512 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 513 | 514 | braces@3.0.3: 515 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 516 | engines: {node: '>=8'} 517 | 518 | browser-stdout@1.3.1: 519 | resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} 520 | 521 | buffer-from@1.1.2: 522 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 523 | 524 | bundle-require@5.0.0: 525 | resolution: {integrity: sha512-GuziW3fSSmopcx4KRymQEJVbZUfqlCqcq7dvs6TYwKRZiegK/2buMxQTPs6MGlNv50wms1699qYO54R8XfRX4w==} 526 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 527 | peerDependencies: 528 | esbuild: '>=0.18' 529 | 530 | cac@6.7.14: 531 | resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} 532 | engines: {node: '>=8'} 533 | 534 | callsites@3.1.0: 535 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 536 | engines: {node: '>=6'} 537 | 538 | camelcase@6.3.0: 539 | resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} 540 | engines: {node: '>=10'} 541 | 542 | chalk@4.1.2: 543 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 544 | engines: {node: '>=10'} 545 | 546 | chokidar@3.6.0: 547 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 548 | engines: {node: '>= 8.10.0'} 549 | 550 | chokidar@4.0.1: 551 | resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} 552 | engines: {node: '>= 14.16.0'} 553 | 554 | cliui@7.0.4: 555 | resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} 556 | 557 | color-convert@2.0.1: 558 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 559 | engines: {node: '>=7.0.0'} 560 | 561 | color-name@1.1.4: 562 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 563 | 564 | commander@4.1.1: 565 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 566 | engines: {node: '>= 6'} 567 | 568 | concat-map@0.0.1: 569 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 570 | 571 | concat-with-sourcemaps@1.1.0: 572 | resolution: {integrity: sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==} 573 | 574 | consola@3.2.3: 575 | resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} 576 | engines: {node: ^14.18.0 || >=16.10.0} 577 | 578 | core-util-is@1.0.3: 579 | resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} 580 | 581 | create-require@1.1.1: 582 | resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} 583 | 584 | cross-spawn@7.0.5: 585 | resolution: {integrity: sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==} 586 | engines: {node: '>= 8'} 587 | 588 | debug@4.3.7: 589 | resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} 590 | engines: {node: '>=6.0'} 591 | peerDependencies: 592 | supports-color: '*' 593 | peerDependenciesMeta: 594 | supports-color: 595 | optional: true 596 | 597 | decamelize@4.0.0: 598 | resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} 599 | engines: {node: '>=10'} 600 | 601 | deep-is@0.1.4: 602 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 603 | 604 | diff@3.5.0: 605 | resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} 606 | engines: {node: '>=0.3.1'} 607 | 608 | diff@4.0.2: 609 | resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} 610 | engines: {node: '>=0.3.1'} 611 | 612 | diff@5.2.0: 613 | resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} 614 | engines: {node: '>=0.3.1'} 615 | 616 | doctrine@3.0.0: 617 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 618 | engines: {node: '>=6.0.0'} 619 | 620 | eastasianwidth@0.2.0: 621 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 622 | 623 | emoji-regex@8.0.0: 624 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 625 | 626 | emoji-regex@9.2.2: 627 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 628 | 629 | esbuild-register@3.6.0: 630 | resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} 631 | peerDependencies: 632 | esbuild: '>=0.12 <1' 633 | 634 | esbuild@0.24.0: 635 | resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} 636 | engines: {node: '>=18'} 637 | hasBin: true 638 | 639 | escalade@3.2.0: 640 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 641 | engines: {node: '>=6'} 642 | 643 | escape-string-regexp@4.0.0: 644 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 645 | engines: {node: '>=10'} 646 | 647 | eslint-scope@7.2.2: 648 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} 649 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 650 | 651 | eslint-visitor-keys@3.4.3: 652 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 653 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 654 | 655 | eslint@8.57.1: 656 | resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} 657 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 658 | deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. 659 | hasBin: true 660 | 661 | espree@9.6.1: 662 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} 663 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 664 | 665 | esquery@1.6.0: 666 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 667 | engines: {node: '>=0.10'} 668 | 669 | esrecurse@4.3.0: 670 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 671 | engines: {node: '>=4.0'} 672 | 673 | estraverse@5.3.0: 674 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 675 | engines: {node: '>=4.0'} 676 | 677 | esutils@2.0.3: 678 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 679 | engines: {node: '>=0.10.0'} 680 | 681 | extend-shallow@2.0.1: 682 | resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} 683 | engines: {node: '>=0.10.0'} 684 | 685 | fast-deep-equal@3.1.3: 686 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 687 | 688 | fast-glob@3.3.2: 689 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 690 | engines: {node: '>=8.6.0'} 691 | 692 | fast-json-stable-stringify@2.1.0: 693 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 694 | 695 | fast-levenshtein@2.0.6: 696 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 697 | 698 | fastq@1.17.1: 699 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 700 | 701 | fdir@6.4.2: 702 | resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} 703 | peerDependencies: 704 | picomatch: ^3 || ^4 705 | peerDependenciesMeta: 706 | picomatch: 707 | optional: true 708 | 709 | file-entry-cache@6.0.1: 710 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 711 | engines: {node: ^10.12.0 || >=12.0.0} 712 | 713 | fill-range@6.0.0: 714 | resolution: {integrity: sha512-HaePWycCxz/O/VsefR6fRhhZ+64gSwUAy5GIN1gX+8Z+JPFWvNsz2qaeYLq/hS3RgC06MlkZFSE+4UObHvbpXw==} 715 | engines: {node: '>=4.0'} 716 | 717 | fill-range@7.1.1: 718 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 719 | engines: {node: '>=8'} 720 | 721 | find-up@5.0.0: 722 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 723 | engines: {node: '>=10'} 724 | 725 | flat-cache@3.2.0: 726 | resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} 727 | engines: {node: ^10.12.0 || >=12.0.0} 728 | 729 | flat@5.0.2: 730 | resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} 731 | hasBin: true 732 | 733 | flatted@3.3.1: 734 | resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} 735 | 736 | foreground-child@3.3.0: 737 | resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} 738 | engines: {node: '>=14'} 739 | 740 | fs.realpath@1.0.0: 741 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 742 | 743 | fsevents@2.3.3: 744 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 745 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 746 | os: [darwin] 747 | 748 | get-caller-file@2.0.5: 749 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 750 | engines: {node: 6.* || 8.* || >= 10.*} 751 | 752 | gfm-code-block-regex@1.0.0: 753 | resolution: {integrity: sha512-aP0XZhL1LNyCT3r89k4MfUCT5FYcUAWbBb2HmFlBvOgYVtDXGYqyG6pRmxwJqwbLRGyK/kdt8IrsJVmuxPVvDw==} 754 | engines: {node: '>=0.10.0'} 755 | 756 | gfm-code-blocks@1.0.0: 757 | resolution: {integrity: sha512-MdJip0Y/0UArlhvBE5heNAFgR/aJr5rdcnodC6nJK1yPKmEfhe89h9LZVn724mqcslAj5rOYT07oQoHr1tmDuw==} 758 | engines: {node: '>=0.10.0'} 759 | 760 | glob-parent@5.1.2: 761 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 762 | engines: {node: '>= 6'} 763 | 764 | glob-parent@6.0.2: 765 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 766 | engines: {node: '>=10.13.0'} 767 | 768 | glob@10.4.5: 769 | resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} 770 | hasBin: true 771 | 772 | glob@7.2.3: 773 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 774 | deprecated: Glob versions prior to v9 are no longer supported 775 | 776 | glob@8.1.0: 777 | resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} 778 | engines: {node: '>=12'} 779 | deprecated: Glob versions prior to v9 are no longer supported 780 | 781 | globals@13.24.0: 782 | resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} 783 | engines: {node: '>=8'} 784 | 785 | graphemer@1.4.0: 786 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 787 | 788 | gulp-format-md@2.0.0: 789 | resolution: {integrity: sha512-hn5CxC/Pzog+HYzoS5tx9404Dw3d/E3TZcPSbcCoL3PJNN2PN43rycut1AGLi1NiLAqI4E8t1xNCbLfof6mP9A==} 790 | engines: {node: '>=8'} 791 | 792 | gulp-header@1.8.12: 793 | resolution: {integrity: sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ==} 794 | deprecated: Removed event-stream from gulp-header 795 | 796 | has-flag@4.0.0: 797 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 798 | engines: {node: '>=8'} 799 | 800 | he@1.2.0: 801 | resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} 802 | hasBin: true 803 | 804 | ignore@5.3.2: 805 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 806 | engines: {node: '>= 4'} 807 | 808 | import-fresh@3.3.0: 809 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 810 | engines: {node: '>=6'} 811 | 812 | imurmurhash@0.1.4: 813 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 814 | engines: {node: '>=0.8.19'} 815 | 816 | inflight@1.0.6: 817 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 818 | deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. 819 | 820 | inherits@2.0.4: 821 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 822 | 823 | is-binary-path@2.1.0: 824 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 825 | engines: {node: '>=8'} 826 | 827 | is-extendable@0.1.1: 828 | resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} 829 | engines: {node: '>=0.10.0'} 830 | 831 | is-extglob@2.1.1: 832 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 833 | engines: {node: '>=0.10.0'} 834 | 835 | is-fullwidth-code-point@3.0.0: 836 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 837 | engines: {node: '>=8'} 838 | 839 | is-glob@4.0.3: 840 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 841 | engines: {node: '>=0.10.0'} 842 | 843 | is-number@7.0.0: 844 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 845 | engines: {node: '>=0.12.0'} 846 | 847 | is-path-inside@3.0.3: 848 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 849 | engines: {node: '>=8'} 850 | 851 | is-plain-obj@2.1.0: 852 | resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} 853 | engines: {node: '>=8'} 854 | 855 | is-unicode-supported@0.1.0: 856 | resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} 857 | engines: {node: '>=10'} 858 | 859 | isarray@1.0.0: 860 | resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} 861 | 862 | isexe@2.0.0: 863 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 864 | 865 | isobject@3.0.1: 866 | resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} 867 | engines: {node: '>=0.10.0'} 868 | 869 | jackspeak@3.4.3: 870 | resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} 871 | 872 | joycon@3.1.1: 873 | resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} 874 | engines: {node: '>=10'} 875 | 876 | js-yaml@4.1.0: 877 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 878 | hasBin: true 879 | 880 | json-buffer@3.0.1: 881 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 882 | 883 | json-schema-traverse@0.4.1: 884 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 885 | 886 | json-stable-stringify-without-jsonify@1.0.1: 887 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 888 | 889 | json5@1.0.2: 890 | resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} 891 | hasBin: true 892 | 893 | json5@2.2.3: 894 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 895 | engines: {node: '>=6'} 896 | hasBin: true 897 | 898 | keyv@4.5.4: 899 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 900 | 901 | levn@0.4.1: 902 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 903 | engines: {node: '>= 0.8.0'} 904 | 905 | lilconfig@3.1.2: 906 | resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} 907 | engines: {node: '>=14'} 908 | 909 | lines-and-columns@1.2.4: 910 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 911 | 912 | list-item@2.0.0: 913 | resolution: {integrity: sha512-hxCRzLagZIT8txXzLxcefV7oHelVzLlZ76W5DMNHqW8x/42O6D6f9m6Tt09qhLsOHynUXGe4YwZySEmGjHgOTw==} 914 | engines: {node: '>=4'} 915 | 916 | load-tsconfig@0.2.5: 917 | resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} 918 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 919 | 920 | locate-path@6.0.0: 921 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 922 | engines: {node: '>=10'} 923 | 924 | lodash._reinterpolate@3.0.0: 925 | resolution: {integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==} 926 | 927 | lodash.merge@4.6.2: 928 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 929 | 930 | lodash.sortby@4.7.0: 931 | resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} 932 | 933 | lodash.template@4.5.0: 934 | resolution: {integrity: sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==} 935 | 936 | lodash.templatesettings@4.2.0: 937 | resolution: {integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==} 938 | 939 | log-symbols@4.1.0: 940 | resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} 941 | engines: {node: '>=10'} 942 | 943 | lru-cache@10.4.3: 944 | resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 945 | 946 | make-error@1.3.6: 947 | resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} 948 | 949 | markdown-utils@1.0.0: 950 | resolution: {integrity: sha512-d09qgYTIYrLEwMgVeaQpQMp+PpPZGsunX5IHY1mFEWLLT9U2tmlzvcUBIEnYNzsE48OKOzXyPWGOVaO3oLTOwQ==} 951 | engines: {node: '>=4'} 952 | 953 | merge2@1.4.1: 954 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 955 | engines: {node: '>= 8'} 956 | 957 | micromatch@4.0.8: 958 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 959 | engines: {node: '>=8.6'} 960 | 961 | minimatch@3.1.2: 962 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 963 | 964 | minimatch@5.1.6: 965 | resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} 966 | engines: {node: '>=10'} 967 | 968 | minimatch@9.0.5: 969 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 970 | engines: {node: '>=16 || 14 >=14.17'} 971 | 972 | minimist@1.2.8: 973 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 974 | 975 | minipass@7.1.2: 976 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 977 | engines: {node: '>=16 || 14 >=14.17'} 978 | 979 | mkdirp@0.5.6: 980 | resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} 981 | hasBin: true 982 | 983 | mocha@10.8.2: 984 | resolution: {integrity: sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==} 985 | engines: {node: '>= 14.0.0'} 986 | hasBin: true 987 | 988 | ms@2.1.3: 989 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 990 | 991 | mz@2.7.0: 992 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 993 | 994 | natural-compare@1.4.0: 995 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 996 | 997 | normalize-path@3.0.0: 998 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 999 | engines: {node: '>=0.10.0'} 1000 | 1001 | object-assign@4.1.1: 1002 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1003 | engines: {node: '>=0.10.0'} 1004 | 1005 | once@1.4.0: 1006 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 1007 | 1008 | optionator@0.9.4: 1009 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 1010 | engines: {node: '>= 0.8.0'} 1011 | 1012 | p-limit@3.1.0: 1013 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1014 | engines: {node: '>=10'} 1015 | 1016 | p-locate@5.0.0: 1017 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1018 | engines: {node: '>=10'} 1019 | 1020 | package-json-from-dist@1.0.1: 1021 | resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} 1022 | 1023 | parent-module@1.0.1: 1024 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1025 | engines: {node: '>=6'} 1026 | 1027 | path-exists@4.0.0: 1028 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1029 | engines: {node: '>=8'} 1030 | 1031 | path-is-absolute@1.0.1: 1032 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 1033 | engines: {node: '>=0.10.0'} 1034 | 1035 | path-key@3.1.1: 1036 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1037 | engines: {node: '>=8'} 1038 | 1039 | path-scurry@1.11.1: 1040 | resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} 1041 | engines: {node: '>=16 || 14 >=14.18'} 1042 | 1043 | picocolors@1.1.1: 1044 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1045 | 1046 | picomatch@2.3.1: 1047 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1048 | engines: {node: '>=8.6'} 1049 | 1050 | picomatch@4.0.2: 1051 | resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} 1052 | engines: {node: '>=12'} 1053 | 1054 | pirates@4.0.6: 1055 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 1056 | engines: {node: '>= 6'} 1057 | 1058 | postcss-load-config@6.0.1: 1059 | resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} 1060 | engines: {node: '>= 18'} 1061 | peerDependencies: 1062 | jiti: '>=1.21.0' 1063 | postcss: '>=8.0.9' 1064 | tsx: ^4.8.1 1065 | yaml: ^2.4.2 1066 | peerDependenciesMeta: 1067 | jiti: 1068 | optional: true 1069 | postcss: 1070 | optional: true 1071 | tsx: 1072 | optional: true 1073 | yaml: 1074 | optional: true 1075 | 1076 | prelude-ls@1.2.1: 1077 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1078 | engines: {node: '>= 0.8.0'} 1079 | 1080 | prettier@3.3.3: 1081 | resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} 1082 | engines: {node: '>=14'} 1083 | hasBin: true 1084 | 1085 | pretty-remarkable@1.0.0: 1086 | resolution: {integrity: sha512-uFNIULmMgcMZs++dCRwMLoQdwkjprIleWEOYk6LzwoRZ874QVBKut+SCFQsYsWz1Eh+9wYdI86XsI5TQiMRfHA==} 1087 | engines: {node: '>=4.0'} 1088 | 1089 | process-nextick-args@2.0.1: 1090 | resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} 1091 | 1092 | punycode@2.3.1: 1093 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1094 | engines: {node: '>=6'} 1095 | 1096 | queue-microtask@1.2.3: 1097 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1098 | 1099 | randombytes@2.1.0: 1100 | resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} 1101 | 1102 | readable-stream@2.3.8: 1103 | resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} 1104 | 1105 | readdirp@3.6.0: 1106 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1107 | engines: {node: '>=8.10.0'} 1108 | 1109 | readdirp@4.0.2: 1110 | resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} 1111 | engines: {node: '>= 14.16.0'} 1112 | 1113 | remarkable@1.7.4: 1114 | resolution: {integrity: sha512-e6NKUXgX95whv7IgddywbeN/ItCkWbISmc2DiqHJb0wTrqZIexqdco5b8Z3XZoo/48IdNVKM9ZCvTPJ4F5uvhg==} 1115 | engines: {node: '>= 0.10.0'} 1116 | hasBin: true 1117 | 1118 | require-directory@2.1.1: 1119 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 1120 | engines: {node: '>=0.10.0'} 1121 | 1122 | resolve-from@4.0.0: 1123 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1124 | engines: {node: '>=4'} 1125 | 1126 | resolve-from@5.0.0: 1127 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 1128 | engines: {node: '>=8'} 1129 | 1130 | reusify@1.0.4: 1131 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1132 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1133 | 1134 | rimraf@3.0.2: 1135 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 1136 | deprecated: Rimraf versions prior to v4 are no longer supported 1137 | hasBin: true 1138 | 1139 | rollup@4.27.2: 1140 | resolution: {integrity: sha512-KreA+PzWmk2yaFmZVwe6GB2uBD86nXl86OsDkt1bJS9p3vqWuEQ6HnJJ+j/mZi/q0920P99/MVRlB4L3crpF5w==} 1141 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1142 | hasBin: true 1143 | 1144 | run-parallel@1.2.0: 1145 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1146 | 1147 | safe-buffer@5.1.2: 1148 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 1149 | 1150 | sections@1.0.0: 1151 | resolution: {integrity: sha512-fIM8mM3bPainFNKxQn3K+fCl2ZPYdo13GrUDPmjvQfK3b3jeC1E4c0t/irS0qcsG6JLTJNxjNOX6k10URz0ZJg==} 1152 | engines: {node: '>=0.10.0'} 1153 | 1154 | semver@7.6.3: 1155 | resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} 1156 | engines: {node: '>=10'} 1157 | hasBin: true 1158 | 1159 | serialize-javascript@6.0.2: 1160 | resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} 1161 | 1162 | shebang-command@2.0.0: 1163 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1164 | engines: {node: '>=8'} 1165 | 1166 | shebang-regex@3.0.0: 1167 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1168 | engines: {node: '>=8'} 1169 | 1170 | signal-exit@4.1.0: 1171 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1172 | engines: {node: '>=14'} 1173 | 1174 | sort-by-value@0.1.0: 1175 | resolution: {integrity: sha512-hTkhmGnyccPZcgIGtvC32Oipl2Qf8rRd/G1beErsgJurdO9i35PDeeR+vEsbpvGibzQuNB1P2yhFn9E/daD2rw==} 1176 | engines: {node: '>=4'} 1177 | 1178 | source-map-support@0.5.21: 1179 | resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 1180 | 1181 | source-map@0.6.1: 1182 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1183 | engines: {node: '>=0.10.0'} 1184 | 1185 | source-map@0.8.0-beta.0: 1186 | resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} 1187 | engines: {node: '>= 8'} 1188 | 1189 | sprintf-js@1.0.3: 1190 | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 1191 | 1192 | string-width@4.2.3: 1193 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1194 | engines: {node: '>=8'} 1195 | 1196 | string-width@5.1.2: 1197 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1198 | engines: {node: '>=12'} 1199 | 1200 | string_decoder@1.1.1: 1201 | resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} 1202 | 1203 | strip-ansi@6.0.1: 1204 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1205 | engines: {node: '>=8'} 1206 | 1207 | strip-ansi@7.1.0: 1208 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1209 | engines: {node: '>=12'} 1210 | 1211 | strip-bom@3.0.0: 1212 | resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} 1213 | engines: {node: '>=4'} 1214 | 1215 | strip-json-comments@3.1.1: 1216 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1217 | engines: {node: '>=8'} 1218 | 1219 | sucrase@3.35.0: 1220 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 1221 | engines: {node: '>=16 || 14 >=14.17'} 1222 | hasBin: true 1223 | 1224 | supports-color@7.2.0: 1225 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1226 | engines: {node: '>=8'} 1227 | 1228 | supports-color@8.1.1: 1229 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} 1230 | engines: {node: '>=10'} 1231 | 1232 | text-table@0.2.0: 1233 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 1234 | 1235 | thenify-all@1.6.0: 1236 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 1237 | engines: {node: '>=0.8'} 1238 | 1239 | thenify@3.3.1: 1240 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 1241 | 1242 | through2@2.0.5: 1243 | resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} 1244 | 1245 | tinyexec@0.3.1: 1246 | resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} 1247 | 1248 | tinyglobby@0.2.10: 1249 | resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==} 1250 | engines: {node: '>=12.0.0'} 1251 | 1252 | to-regex-range@4.0.3: 1253 | resolution: {integrity: sha512-AtJgwCeygrdcfleD1nolmv8TSJcsPvSsvnqQRzc1AkEa//+RRTseKZpaXOfZk2/U1B+bz0sRpkaF1oHX5YmHKg==} 1254 | engines: {node: '>=4.0'} 1255 | 1256 | to-regex-range@5.0.1: 1257 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1258 | engines: {node: '>=8.0'} 1259 | 1260 | tr46@1.0.1: 1261 | resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} 1262 | 1263 | tree-kill@1.2.2: 1264 | resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} 1265 | hasBin: true 1266 | 1267 | ts-api-utils@1.4.0: 1268 | resolution: {integrity: sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==} 1269 | engines: {node: '>=16'} 1270 | peerDependencies: 1271 | typescript: '>=4.2.0' 1272 | 1273 | ts-interface-checker@0.1.13: 1274 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 1275 | 1276 | ts-mocha@10.0.0: 1277 | resolution: {integrity: sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==} 1278 | engines: {node: '>= 6.X.X'} 1279 | hasBin: true 1280 | peerDependencies: 1281 | mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X 1282 | 1283 | ts-node@10.9.2: 1284 | resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} 1285 | hasBin: true 1286 | peerDependencies: 1287 | '@swc/core': '>=1.2.50' 1288 | '@swc/wasm': '>=1.2.50' 1289 | '@types/node': '*' 1290 | typescript: '>=2.7' 1291 | peerDependenciesMeta: 1292 | '@swc/core': 1293 | optional: true 1294 | '@swc/wasm': 1295 | optional: true 1296 | 1297 | ts-node@7.0.1: 1298 | resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} 1299 | engines: {node: '>=4.2.0'} 1300 | hasBin: true 1301 | 1302 | tsconfig-paths@3.15.0: 1303 | resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} 1304 | 1305 | tsconfig-paths@4.2.0: 1306 | resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} 1307 | engines: {node: '>=6'} 1308 | 1309 | tsup@8.3.5: 1310 | resolution: {integrity: sha512-Tunf6r6m6tnZsG9GYWndg0z8dEV7fD733VBFzFJ5Vcm1FtlXB8xBD/rtrBi2a3YKEV7hHtxiZtW5EAVADoe1pA==} 1311 | engines: {node: '>=18'} 1312 | hasBin: true 1313 | peerDependencies: 1314 | '@microsoft/api-extractor': ^7.36.0 1315 | '@swc/core': ^1 1316 | postcss: ^8.4.12 1317 | typescript: '>=4.5.0' 1318 | peerDependenciesMeta: 1319 | '@microsoft/api-extractor': 1320 | optional: true 1321 | '@swc/core': 1322 | optional: true 1323 | postcss: 1324 | optional: true 1325 | typescript: 1326 | optional: true 1327 | 1328 | type-check@0.4.0: 1329 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1330 | engines: {node: '>= 0.8.0'} 1331 | 1332 | type-fest@0.20.2: 1333 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 1334 | engines: {node: '>=10'} 1335 | 1336 | typescript@5.6.3: 1337 | resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} 1338 | engines: {node: '>=14.17'} 1339 | hasBin: true 1340 | 1341 | undici-types@6.20.0: 1342 | resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} 1343 | 1344 | uri-js@4.4.1: 1345 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1346 | 1347 | util-deprecate@1.0.2: 1348 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1349 | 1350 | v8-compile-cache-lib@3.0.1: 1351 | resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} 1352 | 1353 | webidl-conversions@4.0.2: 1354 | resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} 1355 | 1356 | whatwg-url@7.1.0: 1357 | resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} 1358 | 1359 | which@2.0.2: 1360 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1361 | engines: {node: '>= 8'} 1362 | hasBin: true 1363 | 1364 | word-wrap@1.2.5: 1365 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1366 | engines: {node: '>=0.10.0'} 1367 | 1368 | workerpool@6.5.1: 1369 | resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} 1370 | 1371 | wrap-ansi@7.0.0: 1372 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1373 | engines: {node: '>=10'} 1374 | 1375 | wrap-ansi@8.1.0: 1376 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 1377 | engines: {node: '>=12'} 1378 | 1379 | wrappy@1.0.2: 1380 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 1381 | 1382 | xtend@4.0.2: 1383 | resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} 1384 | engines: {node: '>=0.4'} 1385 | 1386 | y18n@5.0.8: 1387 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 1388 | engines: {node: '>=10'} 1389 | 1390 | yargs-parser@20.2.9: 1391 | resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} 1392 | engines: {node: '>=10'} 1393 | 1394 | yargs-unparser@2.0.0: 1395 | resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} 1396 | engines: {node: '>=10'} 1397 | 1398 | yargs@16.2.0: 1399 | resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} 1400 | engines: {node: '>=10'} 1401 | 1402 | yn@2.0.0: 1403 | resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} 1404 | engines: {node: '>=4'} 1405 | 1406 | yn@3.1.1: 1407 | resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} 1408 | engines: {node: '>=6'} 1409 | 1410 | yocto-queue@0.1.0: 1411 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1412 | engines: {node: '>=10'} 1413 | 1414 | snapshots: 1415 | 1416 | '@cspotcode/source-map-support@0.8.1': 1417 | dependencies: 1418 | '@jridgewell/trace-mapping': 0.3.9 1419 | 1420 | '@esbuild/aix-ppc64@0.24.0': 1421 | optional: true 1422 | 1423 | '@esbuild/android-arm64@0.24.0': 1424 | optional: true 1425 | 1426 | '@esbuild/android-arm@0.24.0': 1427 | optional: true 1428 | 1429 | '@esbuild/android-x64@0.24.0': 1430 | optional: true 1431 | 1432 | '@esbuild/darwin-arm64@0.24.0': 1433 | optional: true 1434 | 1435 | '@esbuild/darwin-x64@0.24.0': 1436 | optional: true 1437 | 1438 | '@esbuild/freebsd-arm64@0.24.0': 1439 | optional: true 1440 | 1441 | '@esbuild/freebsd-x64@0.24.0': 1442 | optional: true 1443 | 1444 | '@esbuild/linux-arm64@0.24.0': 1445 | optional: true 1446 | 1447 | '@esbuild/linux-arm@0.24.0': 1448 | optional: true 1449 | 1450 | '@esbuild/linux-ia32@0.24.0': 1451 | optional: true 1452 | 1453 | '@esbuild/linux-loong64@0.24.0': 1454 | optional: true 1455 | 1456 | '@esbuild/linux-mips64el@0.24.0': 1457 | optional: true 1458 | 1459 | '@esbuild/linux-ppc64@0.24.0': 1460 | optional: true 1461 | 1462 | '@esbuild/linux-riscv64@0.24.0': 1463 | optional: true 1464 | 1465 | '@esbuild/linux-s390x@0.24.0': 1466 | optional: true 1467 | 1468 | '@esbuild/linux-x64@0.24.0': 1469 | optional: true 1470 | 1471 | '@esbuild/netbsd-x64@0.24.0': 1472 | optional: true 1473 | 1474 | '@esbuild/openbsd-arm64@0.24.0': 1475 | optional: true 1476 | 1477 | '@esbuild/openbsd-x64@0.24.0': 1478 | optional: true 1479 | 1480 | '@esbuild/sunos-x64@0.24.0': 1481 | optional: true 1482 | 1483 | '@esbuild/win32-arm64@0.24.0': 1484 | optional: true 1485 | 1486 | '@esbuild/win32-ia32@0.24.0': 1487 | optional: true 1488 | 1489 | '@esbuild/win32-x64@0.24.0': 1490 | optional: true 1491 | 1492 | '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)': 1493 | dependencies: 1494 | eslint: 8.57.1 1495 | eslint-visitor-keys: 3.4.3 1496 | 1497 | '@eslint-community/regexpp@4.12.1': {} 1498 | 1499 | '@eslint/eslintrc@2.1.4': 1500 | dependencies: 1501 | ajv: 6.12.6 1502 | debug: 4.3.7(supports-color@8.1.1) 1503 | espree: 9.6.1 1504 | globals: 13.24.0 1505 | ignore: 5.3.2 1506 | import-fresh: 3.3.0 1507 | js-yaml: 4.1.0 1508 | minimatch: 3.1.2 1509 | strip-json-comments: 3.1.1 1510 | transitivePeerDependencies: 1511 | - supports-color 1512 | 1513 | '@eslint/js@8.57.1': {} 1514 | 1515 | '@humanwhocodes/config-array@0.13.0': 1516 | dependencies: 1517 | '@humanwhocodes/object-schema': 2.0.3 1518 | debug: 4.3.7(supports-color@8.1.1) 1519 | minimatch: 3.1.2 1520 | transitivePeerDependencies: 1521 | - supports-color 1522 | 1523 | '@humanwhocodes/module-importer@1.0.1': {} 1524 | 1525 | '@humanwhocodes/object-schema@2.0.3': {} 1526 | 1527 | '@isaacs/cliui@8.0.2': 1528 | dependencies: 1529 | string-width: 5.1.2 1530 | string-width-cjs: string-width@4.2.3 1531 | strip-ansi: 7.1.0 1532 | strip-ansi-cjs: strip-ansi@6.0.1 1533 | wrap-ansi: 8.1.0 1534 | wrap-ansi-cjs: wrap-ansi@7.0.0 1535 | 1536 | '@jridgewell/gen-mapping@0.3.5': 1537 | dependencies: 1538 | '@jridgewell/set-array': 1.2.1 1539 | '@jridgewell/sourcemap-codec': 1.5.0 1540 | '@jridgewell/trace-mapping': 0.3.25 1541 | 1542 | '@jridgewell/resolve-uri@3.1.2': {} 1543 | 1544 | '@jridgewell/set-array@1.2.1': {} 1545 | 1546 | '@jridgewell/sourcemap-codec@1.5.0': {} 1547 | 1548 | '@jridgewell/trace-mapping@0.3.25': 1549 | dependencies: 1550 | '@jridgewell/resolve-uri': 3.1.2 1551 | '@jridgewell/sourcemap-codec': 1.5.0 1552 | 1553 | '@jridgewell/trace-mapping@0.3.9': 1554 | dependencies: 1555 | '@jridgewell/resolve-uri': 3.1.2 1556 | '@jridgewell/sourcemap-codec': 1.5.0 1557 | 1558 | '@nodelib/fs.scandir@2.1.5': 1559 | dependencies: 1560 | '@nodelib/fs.stat': 2.0.5 1561 | run-parallel: 1.2.0 1562 | 1563 | '@nodelib/fs.stat@2.0.5': {} 1564 | 1565 | '@nodelib/fs.walk@1.2.8': 1566 | dependencies: 1567 | '@nodelib/fs.scandir': 2.1.5 1568 | fastq: 1.17.1 1569 | 1570 | '@pkgjs/parseargs@0.11.0': 1571 | optional: true 1572 | 1573 | '@rollup/rollup-android-arm-eabi@4.27.2': 1574 | optional: true 1575 | 1576 | '@rollup/rollup-android-arm64@4.27.2': 1577 | optional: true 1578 | 1579 | '@rollup/rollup-darwin-arm64@4.27.2': 1580 | optional: true 1581 | 1582 | '@rollup/rollup-darwin-x64@4.27.2': 1583 | optional: true 1584 | 1585 | '@rollup/rollup-freebsd-arm64@4.27.2': 1586 | optional: true 1587 | 1588 | '@rollup/rollup-freebsd-x64@4.27.2': 1589 | optional: true 1590 | 1591 | '@rollup/rollup-linux-arm-gnueabihf@4.27.2': 1592 | optional: true 1593 | 1594 | '@rollup/rollup-linux-arm-musleabihf@4.27.2': 1595 | optional: true 1596 | 1597 | '@rollup/rollup-linux-arm64-gnu@4.27.2': 1598 | optional: true 1599 | 1600 | '@rollup/rollup-linux-arm64-musl@4.27.2': 1601 | optional: true 1602 | 1603 | '@rollup/rollup-linux-powerpc64le-gnu@4.27.2': 1604 | optional: true 1605 | 1606 | '@rollup/rollup-linux-riscv64-gnu@4.27.2': 1607 | optional: true 1608 | 1609 | '@rollup/rollup-linux-s390x-gnu@4.27.2': 1610 | optional: true 1611 | 1612 | '@rollup/rollup-linux-x64-gnu@4.27.2': 1613 | optional: true 1614 | 1615 | '@rollup/rollup-linux-x64-musl@4.27.2': 1616 | optional: true 1617 | 1618 | '@rollup/rollup-win32-arm64-msvc@4.27.2': 1619 | optional: true 1620 | 1621 | '@rollup/rollup-win32-ia32-msvc@4.27.2': 1622 | optional: true 1623 | 1624 | '@rollup/rollup-win32-x64-msvc@4.27.2': 1625 | optional: true 1626 | 1627 | '@tsconfig/node10@1.0.11': {} 1628 | 1629 | '@tsconfig/node12@1.0.11': {} 1630 | 1631 | '@tsconfig/node14@1.0.3': {} 1632 | 1633 | '@tsconfig/node16@1.0.4': {} 1634 | 1635 | '@types/estree@1.0.6': {} 1636 | 1637 | '@types/json5@0.0.29': 1638 | optional: true 1639 | 1640 | '@types/node@22.10.10': 1641 | dependencies: 1642 | undici-types: 6.20.0 1643 | 1644 | '@typescript-eslint/eslint-plugin@8.14.0(@typescript-eslint/parser@8.14.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3)': 1645 | dependencies: 1646 | '@eslint-community/regexpp': 4.12.1 1647 | '@typescript-eslint/parser': 8.14.0(eslint@8.57.1)(typescript@5.6.3) 1648 | '@typescript-eslint/scope-manager': 8.14.0 1649 | '@typescript-eslint/type-utils': 8.14.0(eslint@8.57.1)(typescript@5.6.3) 1650 | '@typescript-eslint/utils': 8.14.0(eslint@8.57.1)(typescript@5.6.3) 1651 | '@typescript-eslint/visitor-keys': 8.14.0 1652 | eslint: 8.57.1 1653 | graphemer: 1.4.0 1654 | ignore: 5.3.2 1655 | natural-compare: 1.4.0 1656 | ts-api-utils: 1.4.0(typescript@5.6.3) 1657 | optionalDependencies: 1658 | typescript: 5.6.3 1659 | transitivePeerDependencies: 1660 | - supports-color 1661 | 1662 | '@typescript-eslint/parser@8.14.0(eslint@8.57.1)(typescript@5.6.3)': 1663 | dependencies: 1664 | '@typescript-eslint/scope-manager': 8.14.0 1665 | '@typescript-eslint/types': 8.14.0 1666 | '@typescript-eslint/typescript-estree': 8.14.0(typescript@5.6.3) 1667 | '@typescript-eslint/visitor-keys': 8.14.0 1668 | debug: 4.3.7(supports-color@8.1.1) 1669 | eslint: 8.57.1 1670 | optionalDependencies: 1671 | typescript: 5.6.3 1672 | transitivePeerDependencies: 1673 | - supports-color 1674 | 1675 | '@typescript-eslint/scope-manager@8.14.0': 1676 | dependencies: 1677 | '@typescript-eslint/types': 8.14.0 1678 | '@typescript-eslint/visitor-keys': 8.14.0 1679 | 1680 | '@typescript-eslint/type-utils@8.14.0(eslint@8.57.1)(typescript@5.6.3)': 1681 | dependencies: 1682 | '@typescript-eslint/typescript-estree': 8.14.0(typescript@5.6.3) 1683 | '@typescript-eslint/utils': 8.14.0(eslint@8.57.1)(typescript@5.6.3) 1684 | debug: 4.3.7(supports-color@8.1.1) 1685 | ts-api-utils: 1.4.0(typescript@5.6.3) 1686 | optionalDependencies: 1687 | typescript: 5.6.3 1688 | transitivePeerDependencies: 1689 | - eslint 1690 | - supports-color 1691 | 1692 | '@typescript-eslint/types@8.14.0': {} 1693 | 1694 | '@typescript-eslint/typescript-estree@8.14.0(typescript@5.6.3)': 1695 | dependencies: 1696 | '@typescript-eslint/types': 8.14.0 1697 | '@typescript-eslint/visitor-keys': 8.14.0 1698 | debug: 4.3.7(supports-color@8.1.1) 1699 | fast-glob: 3.3.2 1700 | is-glob: 4.0.3 1701 | minimatch: 9.0.5 1702 | semver: 7.6.3 1703 | ts-api-utils: 1.4.0(typescript@5.6.3) 1704 | optionalDependencies: 1705 | typescript: 5.6.3 1706 | transitivePeerDependencies: 1707 | - supports-color 1708 | 1709 | '@typescript-eslint/utils@8.14.0(eslint@8.57.1)(typescript@5.6.3)': 1710 | dependencies: 1711 | '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) 1712 | '@typescript-eslint/scope-manager': 8.14.0 1713 | '@typescript-eslint/types': 8.14.0 1714 | '@typescript-eslint/typescript-estree': 8.14.0(typescript@5.6.3) 1715 | eslint: 8.57.1 1716 | transitivePeerDependencies: 1717 | - supports-color 1718 | - typescript 1719 | 1720 | '@typescript-eslint/visitor-keys@8.14.0': 1721 | dependencies: 1722 | '@typescript-eslint/types': 8.14.0 1723 | eslint-visitor-keys: 3.4.3 1724 | 1725 | '@ungap/structured-clone@1.2.0': {} 1726 | 1727 | acorn-jsx@5.3.2(acorn@8.14.0): 1728 | dependencies: 1729 | acorn: 8.14.0 1730 | 1731 | acorn-walk@8.3.4: 1732 | dependencies: 1733 | acorn: 8.14.0 1734 | 1735 | acorn@8.14.0: {} 1736 | 1737 | ajv@6.12.6: 1738 | dependencies: 1739 | fast-deep-equal: 3.1.3 1740 | fast-json-stable-stringify: 2.1.0 1741 | json-schema-traverse: 0.4.1 1742 | uri-js: 4.4.1 1743 | 1744 | ansi-colors@4.1.3: {} 1745 | 1746 | ansi-regex@5.0.1: {} 1747 | 1748 | ansi-regex@6.1.0: {} 1749 | 1750 | ansi-styles@4.3.0: 1751 | dependencies: 1752 | color-convert: 2.0.1 1753 | 1754 | ansi-styles@6.2.1: {} 1755 | 1756 | any-promise@1.3.0: {} 1757 | 1758 | anymatch@3.1.3: 1759 | dependencies: 1760 | normalize-path: 3.0.0 1761 | picomatch: 2.3.1 1762 | 1763 | arg@4.1.3: {} 1764 | 1765 | argparse@1.0.10: 1766 | dependencies: 1767 | sprintf-js: 1.0.3 1768 | 1769 | argparse@2.0.1: {} 1770 | 1771 | arrify@1.0.1: {} 1772 | 1773 | autolinker@0.28.1: 1774 | dependencies: 1775 | gulp-header: 1.8.12 1776 | 1777 | balanced-match@1.0.2: {} 1778 | 1779 | binary-extensions@2.3.0: {} 1780 | 1781 | brace-expansion@1.1.11: 1782 | dependencies: 1783 | balanced-match: 1.0.2 1784 | concat-map: 0.0.1 1785 | 1786 | brace-expansion@2.0.1: 1787 | dependencies: 1788 | balanced-match: 1.0.2 1789 | 1790 | braces@3.0.3: 1791 | dependencies: 1792 | fill-range: 7.1.1 1793 | 1794 | browser-stdout@1.3.1: {} 1795 | 1796 | buffer-from@1.1.2: {} 1797 | 1798 | bundle-require@5.0.0(esbuild@0.24.0): 1799 | dependencies: 1800 | esbuild: 0.24.0 1801 | load-tsconfig: 0.2.5 1802 | 1803 | cac@6.7.14: {} 1804 | 1805 | callsites@3.1.0: {} 1806 | 1807 | camelcase@6.3.0: {} 1808 | 1809 | chalk@4.1.2: 1810 | dependencies: 1811 | ansi-styles: 4.3.0 1812 | supports-color: 7.2.0 1813 | 1814 | chokidar@3.6.0: 1815 | dependencies: 1816 | anymatch: 3.1.3 1817 | braces: 3.0.3 1818 | glob-parent: 5.1.2 1819 | is-binary-path: 2.1.0 1820 | is-glob: 4.0.3 1821 | normalize-path: 3.0.0 1822 | readdirp: 3.6.0 1823 | optionalDependencies: 1824 | fsevents: 2.3.3 1825 | 1826 | chokidar@4.0.1: 1827 | dependencies: 1828 | readdirp: 4.0.2 1829 | 1830 | cliui@7.0.4: 1831 | dependencies: 1832 | string-width: 4.2.3 1833 | strip-ansi: 6.0.1 1834 | wrap-ansi: 7.0.0 1835 | 1836 | color-convert@2.0.1: 1837 | dependencies: 1838 | color-name: 1.1.4 1839 | 1840 | color-name@1.1.4: {} 1841 | 1842 | commander@4.1.1: {} 1843 | 1844 | concat-map@0.0.1: {} 1845 | 1846 | concat-with-sourcemaps@1.1.0: 1847 | dependencies: 1848 | source-map: 0.6.1 1849 | 1850 | consola@3.2.3: {} 1851 | 1852 | core-util-is@1.0.3: {} 1853 | 1854 | create-require@1.1.1: {} 1855 | 1856 | cross-spawn@7.0.5: 1857 | dependencies: 1858 | path-key: 3.1.1 1859 | shebang-command: 2.0.0 1860 | which: 2.0.2 1861 | 1862 | debug@4.3.7(supports-color@8.1.1): 1863 | dependencies: 1864 | ms: 2.1.3 1865 | optionalDependencies: 1866 | supports-color: 8.1.1 1867 | 1868 | decamelize@4.0.0: {} 1869 | 1870 | deep-is@0.1.4: {} 1871 | 1872 | diff@3.5.0: {} 1873 | 1874 | diff@4.0.2: {} 1875 | 1876 | diff@5.2.0: {} 1877 | 1878 | doctrine@3.0.0: 1879 | dependencies: 1880 | esutils: 2.0.3 1881 | 1882 | eastasianwidth@0.2.0: {} 1883 | 1884 | emoji-regex@8.0.0: {} 1885 | 1886 | emoji-regex@9.2.2: {} 1887 | 1888 | esbuild-register@3.6.0(esbuild@0.24.0): 1889 | dependencies: 1890 | debug: 4.3.7(supports-color@8.1.1) 1891 | esbuild: 0.24.0 1892 | transitivePeerDependencies: 1893 | - supports-color 1894 | 1895 | esbuild@0.24.0: 1896 | optionalDependencies: 1897 | '@esbuild/aix-ppc64': 0.24.0 1898 | '@esbuild/android-arm': 0.24.0 1899 | '@esbuild/android-arm64': 0.24.0 1900 | '@esbuild/android-x64': 0.24.0 1901 | '@esbuild/darwin-arm64': 0.24.0 1902 | '@esbuild/darwin-x64': 0.24.0 1903 | '@esbuild/freebsd-arm64': 0.24.0 1904 | '@esbuild/freebsd-x64': 0.24.0 1905 | '@esbuild/linux-arm': 0.24.0 1906 | '@esbuild/linux-arm64': 0.24.0 1907 | '@esbuild/linux-ia32': 0.24.0 1908 | '@esbuild/linux-loong64': 0.24.0 1909 | '@esbuild/linux-mips64el': 0.24.0 1910 | '@esbuild/linux-ppc64': 0.24.0 1911 | '@esbuild/linux-riscv64': 0.24.0 1912 | '@esbuild/linux-s390x': 0.24.0 1913 | '@esbuild/linux-x64': 0.24.0 1914 | '@esbuild/netbsd-x64': 0.24.0 1915 | '@esbuild/openbsd-arm64': 0.24.0 1916 | '@esbuild/openbsd-x64': 0.24.0 1917 | '@esbuild/sunos-x64': 0.24.0 1918 | '@esbuild/win32-arm64': 0.24.0 1919 | '@esbuild/win32-ia32': 0.24.0 1920 | '@esbuild/win32-x64': 0.24.0 1921 | 1922 | escalade@3.2.0: {} 1923 | 1924 | escape-string-regexp@4.0.0: {} 1925 | 1926 | eslint-scope@7.2.2: 1927 | dependencies: 1928 | esrecurse: 4.3.0 1929 | estraverse: 5.3.0 1930 | 1931 | eslint-visitor-keys@3.4.3: {} 1932 | 1933 | eslint@8.57.1: 1934 | dependencies: 1935 | '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) 1936 | '@eslint-community/regexpp': 4.12.1 1937 | '@eslint/eslintrc': 2.1.4 1938 | '@eslint/js': 8.57.1 1939 | '@humanwhocodes/config-array': 0.13.0 1940 | '@humanwhocodes/module-importer': 1.0.1 1941 | '@nodelib/fs.walk': 1.2.8 1942 | '@ungap/structured-clone': 1.2.0 1943 | ajv: 6.12.6 1944 | chalk: 4.1.2 1945 | cross-spawn: 7.0.5 1946 | debug: 4.3.7(supports-color@8.1.1) 1947 | doctrine: 3.0.0 1948 | escape-string-regexp: 4.0.0 1949 | eslint-scope: 7.2.2 1950 | eslint-visitor-keys: 3.4.3 1951 | espree: 9.6.1 1952 | esquery: 1.6.0 1953 | esutils: 2.0.3 1954 | fast-deep-equal: 3.1.3 1955 | file-entry-cache: 6.0.1 1956 | find-up: 5.0.0 1957 | glob-parent: 6.0.2 1958 | globals: 13.24.0 1959 | graphemer: 1.4.0 1960 | ignore: 5.3.2 1961 | imurmurhash: 0.1.4 1962 | is-glob: 4.0.3 1963 | is-path-inside: 3.0.3 1964 | js-yaml: 4.1.0 1965 | json-stable-stringify-without-jsonify: 1.0.1 1966 | levn: 0.4.1 1967 | lodash.merge: 4.6.2 1968 | minimatch: 3.1.2 1969 | natural-compare: 1.4.0 1970 | optionator: 0.9.4 1971 | strip-ansi: 6.0.1 1972 | text-table: 0.2.0 1973 | transitivePeerDependencies: 1974 | - supports-color 1975 | 1976 | espree@9.6.1: 1977 | dependencies: 1978 | acorn: 8.14.0 1979 | acorn-jsx: 5.3.2(acorn@8.14.0) 1980 | eslint-visitor-keys: 3.4.3 1981 | 1982 | esquery@1.6.0: 1983 | dependencies: 1984 | estraverse: 5.3.0 1985 | 1986 | esrecurse@4.3.0: 1987 | dependencies: 1988 | estraverse: 5.3.0 1989 | 1990 | estraverse@5.3.0: {} 1991 | 1992 | esutils@2.0.3: {} 1993 | 1994 | extend-shallow@2.0.1: 1995 | dependencies: 1996 | is-extendable: 0.1.1 1997 | 1998 | fast-deep-equal@3.1.3: {} 1999 | 2000 | fast-glob@3.3.2: 2001 | dependencies: 2002 | '@nodelib/fs.stat': 2.0.5 2003 | '@nodelib/fs.walk': 1.2.8 2004 | glob-parent: 5.1.2 2005 | merge2: 1.4.1 2006 | micromatch: 4.0.8 2007 | 2008 | fast-json-stable-stringify@2.1.0: {} 2009 | 2010 | fast-levenshtein@2.0.6: {} 2011 | 2012 | fastq@1.17.1: 2013 | dependencies: 2014 | reusify: 1.0.4 2015 | 2016 | fdir@6.4.2(picomatch@4.0.2): 2017 | optionalDependencies: 2018 | picomatch: 4.0.2 2019 | 2020 | file-entry-cache@6.0.1: 2021 | dependencies: 2022 | flat-cache: 3.2.0 2023 | 2024 | fill-range@6.0.0: 2025 | dependencies: 2026 | is-number: 7.0.0 2027 | to-regex-range: 4.0.3 2028 | 2029 | fill-range@7.1.1: 2030 | dependencies: 2031 | to-regex-range: 5.0.1 2032 | 2033 | find-up@5.0.0: 2034 | dependencies: 2035 | locate-path: 6.0.0 2036 | path-exists: 4.0.0 2037 | 2038 | flat-cache@3.2.0: 2039 | dependencies: 2040 | flatted: 3.3.1 2041 | keyv: 4.5.4 2042 | rimraf: 3.0.2 2043 | 2044 | flat@5.0.2: {} 2045 | 2046 | flatted@3.3.1: {} 2047 | 2048 | foreground-child@3.3.0: 2049 | dependencies: 2050 | cross-spawn: 7.0.5 2051 | signal-exit: 4.1.0 2052 | 2053 | fs.realpath@1.0.0: {} 2054 | 2055 | fsevents@2.3.3: 2056 | optional: true 2057 | 2058 | get-caller-file@2.0.5: {} 2059 | 2060 | gfm-code-block-regex@1.0.0: {} 2061 | 2062 | gfm-code-blocks@1.0.0: 2063 | dependencies: 2064 | gfm-code-block-regex: 1.0.0 2065 | 2066 | glob-parent@5.1.2: 2067 | dependencies: 2068 | is-glob: 4.0.3 2069 | 2070 | glob-parent@6.0.2: 2071 | dependencies: 2072 | is-glob: 4.0.3 2073 | 2074 | glob@10.4.5: 2075 | dependencies: 2076 | foreground-child: 3.3.0 2077 | jackspeak: 3.4.3 2078 | minimatch: 9.0.5 2079 | minipass: 7.1.2 2080 | package-json-from-dist: 1.0.1 2081 | path-scurry: 1.11.1 2082 | 2083 | glob@7.2.3: 2084 | dependencies: 2085 | fs.realpath: 1.0.0 2086 | inflight: 1.0.6 2087 | inherits: 2.0.4 2088 | minimatch: 3.1.2 2089 | once: 1.4.0 2090 | path-is-absolute: 1.0.1 2091 | 2092 | glob@8.1.0: 2093 | dependencies: 2094 | fs.realpath: 1.0.0 2095 | inflight: 1.0.6 2096 | inherits: 2.0.4 2097 | minimatch: 5.1.6 2098 | once: 1.4.0 2099 | 2100 | globals@13.24.0: 2101 | dependencies: 2102 | type-fest: 0.20.2 2103 | 2104 | graphemer@1.4.0: {} 2105 | 2106 | gulp-format-md@2.0.0: 2107 | dependencies: 2108 | pretty-remarkable: 1.0.0 2109 | remarkable: 1.7.4 2110 | sections: 1.0.0 2111 | through2: 2.0.5 2112 | 2113 | gulp-header@1.8.12: 2114 | dependencies: 2115 | concat-with-sourcemaps: 1.1.0 2116 | lodash.template: 4.5.0 2117 | through2: 2.0.5 2118 | 2119 | has-flag@4.0.0: {} 2120 | 2121 | he@1.2.0: {} 2122 | 2123 | ignore@5.3.2: {} 2124 | 2125 | import-fresh@3.3.0: 2126 | dependencies: 2127 | parent-module: 1.0.1 2128 | resolve-from: 4.0.0 2129 | 2130 | imurmurhash@0.1.4: {} 2131 | 2132 | inflight@1.0.6: 2133 | dependencies: 2134 | once: 1.4.0 2135 | wrappy: 1.0.2 2136 | 2137 | inherits@2.0.4: {} 2138 | 2139 | is-binary-path@2.1.0: 2140 | dependencies: 2141 | binary-extensions: 2.3.0 2142 | 2143 | is-extendable@0.1.1: {} 2144 | 2145 | is-extglob@2.1.1: {} 2146 | 2147 | is-fullwidth-code-point@3.0.0: {} 2148 | 2149 | is-glob@4.0.3: 2150 | dependencies: 2151 | is-extglob: 2.1.1 2152 | 2153 | is-number@7.0.0: {} 2154 | 2155 | is-path-inside@3.0.3: {} 2156 | 2157 | is-plain-obj@2.1.0: {} 2158 | 2159 | is-unicode-supported@0.1.0: {} 2160 | 2161 | isarray@1.0.0: {} 2162 | 2163 | isexe@2.0.0: {} 2164 | 2165 | isobject@3.0.1: {} 2166 | 2167 | jackspeak@3.4.3: 2168 | dependencies: 2169 | '@isaacs/cliui': 8.0.2 2170 | optionalDependencies: 2171 | '@pkgjs/parseargs': 0.11.0 2172 | 2173 | joycon@3.1.1: {} 2174 | 2175 | js-yaml@4.1.0: 2176 | dependencies: 2177 | argparse: 2.0.1 2178 | 2179 | json-buffer@3.0.1: {} 2180 | 2181 | json-schema-traverse@0.4.1: {} 2182 | 2183 | json-stable-stringify-without-jsonify@1.0.1: {} 2184 | 2185 | json5@1.0.2: 2186 | dependencies: 2187 | minimist: 1.2.8 2188 | optional: true 2189 | 2190 | json5@2.2.3: {} 2191 | 2192 | keyv@4.5.4: 2193 | dependencies: 2194 | json-buffer: 3.0.1 2195 | 2196 | levn@0.4.1: 2197 | dependencies: 2198 | prelude-ls: 1.2.1 2199 | type-check: 0.4.0 2200 | 2201 | lilconfig@3.1.2: {} 2202 | 2203 | lines-and-columns@1.2.4: {} 2204 | 2205 | list-item@2.0.0: 2206 | dependencies: 2207 | fill-range: 6.0.0 2208 | is-number: 7.0.0 2209 | 2210 | load-tsconfig@0.2.5: {} 2211 | 2212 | locate-path@6.0.0: 2213 | dependencies: 2214 | p-locate: 5.0.0 2215 | 2216 | lodash._reinterpolate@3.0.0: {} 2217 | 2218 | lodash.merge@4.6.2: {} 2219 | 2220 | lodash.sortby@4.7.0: {} 2221 | 2222 | lodash.template@4.5.0: 2223 | dependencies: 2224 | lodash._reinterpolate: 3.0.0 2225 | lodash.templatesettings: 4.2.0 2226 | 2227 | lodash.templatesettings@4.2.0: 2228 | dependencies: 2229 | lodash._reinterpolate: 3.0.0 2230 | 2231 | log-symbols@4.1.0: 2232 | dependencies: 2233 | chalk: 4.1.2 2234 | is-unicode-supported: 0.1.0 2235 | 2236 | lru-cache@10.4.3: {} 2237 | 2238 | make-error@1.3.6: {} 2239 | 2240 | markdown-utils@1.0.0: 2241 | dependencies: 2242 | is-number: 7.0.0 2243 | list-item: 2.0.0 2244 | 2245 | merge2@1.4.1: {} 2246 | 2247 | micromatch@4.0.8: 2248 | dependencies: 2249 | braces: 3.0.3 2250 | picomatch: 2.3.1 2251 | 2252 | minimatch@3.1.2: 2253 | dependencies: 2254 | brace-expansion: 1.1.11 2255 | 2256 | minimatch@5.1.6: 2257 | dependencies: 2258 | brace-expansion: 2.0.1 2259 | 2260 | minimatch@9.0.5: 2261 | dependencies: 2262 | brace-expansion: 2.0.1 2263 | 2264 | minimist@1.2.8: {} 2265 | 2266 | minipass@7.1.2: {} 2267 | 2268 | mkdirp@0.5.6: 2269 | dependencies: 2270 | minimist: 1.2.8 2271 | 2272 | mocha@10.8.2: 2273 | dependencies: 2274 | ansi-colors: 4.1.3 2275 | browser-stdout: 1.3.1 2276 | chokidar: 3.6.0 2277 | debug: 4.3.7(supports-color@8.1.1) 2278 | diff: 5.2.0 2279 | escape-string-regexp: 4.0.0 2280 | find-up: 5.0.0 2281 | glob: 8.1.0 2282 | he: 1.2.0 2283 | js-yaml: 4.1.0 2284 | log-symbols: 4.1.0 2285 | minimatch: 5.1.6 2286 | ms: 2.1.3 2287 | serialize-javascript: 6.0.2 2288 | strip-json-comments: 3.1.1 2289 | supports-color: 8.1.1 2290 | workerpool: 6.5.1 2291 | yargs: 16.2.0 2292 | yargs-parser: 20.2.9 2293 | yargs-unparser: 2.0.0 2294 | 2295 | ms@2.1.3: {} 2296 | 2297 | mz@2.7.0: 2298 | dependencies: 2299 | any-promise: 1.3.0 2300 | object-assign: 4.1.1 2301 | thenify-all: 1.6.0 2302 | 2303 | natural-compare@1.4.0: {} 2304 | 2305 | normalize-path@3.0.0: {} 2306 | 2307 | object-assign@4.1.1: {} 2308 | 2309 | once@1.4.0: 2310 | dependencies: 2311 | wrappy: 1.0.2 2312 | 2313 | optionator@0.9.4: 2314 | dependencies: 2315 | deep-is: 0.1.4 2316 | fast-levenshtein: 2.0.6 2317 | levn: 0.4.1 2318 | prelude-ls: 1.2.1 2319 | type-check: 0.4.0 2320 | word-wrap: 1.2.5 2321 | 2322 | p-limit@3.1.0: 2323 | dependencies: 2324 | yocto-queue: 0.1.0 2325 | 2326 | p-locate@5.0.0: 2327 | dependencies: 2328 | p-limit: 3.1.0 2329 | 2330 | package-json-from-dist@1.0.1: {} 2331 | 2332 | parent-module@1.0.1: 2333 | dependencies: 2334 | callsites: 3.1.0 2335 | 2336 | path-exists@4.0.0: {} 2337 | 2338 | path-is-absolute@1.0.1: {} 2339 | 2340 | path-key@3.1.1: {} 2341 | 2342 | path-scurry@1.11.1: 2343 | dependencies: 2344 | lru-cache: 10.4.3 2345 | minipass: 7.1.2 2346 | 2347 | picocolors@1.1.1: {} 2348 | 2349 | picomatch@2.3.1: {} 2350 | 2351 | picomatch@4.0.2: {} 2352 | 2353 | pirates@4.0.6: {} 2354 | 2355 | postcss-load-config@6.0.1: 2356 | dependencies: 2357 | lilconfig: 3.1.2 2358 | 2359 | prelude-ls@1.2.1: {} 2360 | 2361 | prettier@3.3.3: {} 2362 | 2363 | pretty-remarkable@1.0.0: 2364 | dependencies: 2365 | markdown-utils: 1.0.0 2366 | 2367 | process-nextick-args@2.0.1: {} 2368 | 2369 | punycode@2.3.1: {} 2370 | 2371 | queue-microtask@1.2.3: {} 2372 | 2373 | randombytes@2.1.0: 2374 | dependencies: 2375 | safe-buffer: 5.1.2 2376 | 2377 | readable-stream@2.3.8: 2378 | dependencies: 2379 | core-util-is: 1.0.3 2380 | inherits: 2.0.4 2381 | isarray: 1.0.0 2382 | process-nextick-args: 2.0.1 2383 | safe-buffer: 5.1.2 2384 | string_decoder: 1.1.1 2385 | util-deprecate: 1.0.2 2386 | 2387 | readdirp@3.6.0: 2388 | dependencies: 2389 | picomatch: 2.3.1 2390 | 2391 | readdirp@4.0.2: {} 2392 | 2393 | remarkable@1.7.4: 2394 | dependencies: 2395 | argparse: 1.0.10 2396 | autolinker: 0.28.1 2397 | 2398 | require-directory@2.1.1: {} 2399 | 2400 | resolve-from@4.0.0: {} 2401 | 2402 | resolve-from@5.0.0: {} 2403 | 2404 | reusify@1.0.4: {} 2405 | 2406 | rimraf@3.0.2: 2407 | dependencies: 2408 | glob: 7.2.3 2409 | 2410 | rollup@4.27.2: 2411 | dependencies: 2412 | '@types/estree': 1.0.6 2413 | optionalDependencies: 2414 | '@rollup/rollup-android-arm-eabi': 4.27.2 2415 | '@rollup/rollup-android-arm64': 4.27.2 2416 | '@rollup/rollup-darwin-arm64': 4.27.2 2417 | '@rollup/rollup-darwin-x64': 4.27.2 2418 | '@rollup/rollup-freebsd-arm64': 4.27.2 2419 | '@rollup/rollup-freebsd-x64': 4.27.2 2420 | '@rollup/rollup-linux-arm-gnueabihf': 4.27.2 2421 | '@rollup/rollup-linux-arm-musleabihf': 4.27.2 2422 | '@rollup/rollup-linux-arm64-gnu': 4.27.2 2423 | '@rollup/rollup-linux-arm64-musl': 4.27.2 2424 | '@rollup/rollup-linux-powerpc64le-gnu': 4.27.2 2425 | '@rollup/rollup-linux-riscv64-gnu': 4.27.2 2426 | '@rollup/rollup-linux-s390x-gnu': 4.27.2 2427 | '@rollup/rollup-linux-x64-gnu': 4.27.2 2428 | '@rollup/rollup-linux-x64-musl': 4.27.2 2429 | '@rollup/rollup-win32-arm64-msvc': 4.27.2 2430 | '@rollup/rollup-win32-ia32-msvc': 4.27.2 2431 | '@rollup/rollup-win32-x64-msvc': 4.27.2 2432 | fsevents: 2.3.3 2433 | 2434 | run-parallel@1.2.0: 2435 | dependencies: 2436 | queue-microtask: 1.2.3 2437 | 2438 | safe-buffer@5.1.2: {} 2439 | 2440 | sections@1.0.0: 2441 | dependencies: 2442 | gfm-code-blocks: 1.0.0 2443 | sort-by-value: 0.1.0 2444 | 2445 | semver@7.6.3: {} 2446 | 2447 | serialize-javascript@6.0.2: 2448 | dependencies: 2449 | randombytes: 2.1.0 2450 | 2451 | shebang-command@2.0.0: 2452 | dependencies: 2453 | shebang-regex: 3.0.0 2454 | 2455 | shebang-regex@3.0.0: {} 2456 | 2457 | signal-exit@4.1.0: {} 2458 | 2459 | sort-by-value@0.1.0: 2460 | dependencies: 2461 | extend-shallow: 2.0.1 2462 | isobject: 3.0.1 2463 | 2464 | source-map-support@0.5.21: 2465 | dependencies: 2466 | buffer-from: 1.1.2 2467 | source-map: 0.6.1 2468 | 2469 | source-map@0.6.1: {} 2470 | 2471 | source-map@0.8.0-beta.0: 2472 | dependencies: 2473 | whatwg-url: 7.1.0 2474 | 2475 | sprintf-js@1.0.3: {} 2476 | 2477 | string-width@4.2.3: 2478 | dependencies: 2479 | emoji-regex: 8.0.0 2480 | is-fullwidth-code-point: 3.0.0 2481 | strip-ansi: 6.0.1 2482 | 2483 | string-width@5.1.2: 2484 | dependencies: 2485 | eastasianwidth: 0.2.0 2486 | emoji-regex: 9.2.2 2487 | strip-ansi: 7.1.0 2488 | 2489 | string_decoder@1.1.1: 2490 | dependencies: 2491 | safe-buffer: 5.1.2 2492 | 2493 | strip-ansi@6.0.1: 2494 | dependencies: 2495 | ansi-regex: 5.0.1 2496 | 2497 | strip-ansi@7.1.0: 2498 | dependencies: 2499 | ansi-regex: 6.1.0 2500 | 2501 | strip-bom@3.0.0: {} 2502 | 2503 | strip-json-comments@3.1.1: {} 2504 | 2505 | sucrase@3.35.0: 2506 | dependencies: 2507 | '@jridgewell/gen-mapping': 0.3.5 2508 | commander: 4.1.1 2509 | glob: 10.4.5 2510 | lines-and-columns: 1.2.4 2511 | mz: 2.7.0 2512 | pirates: 4.0.6 2513 | ts-interface-checker: 0.1.13 2514 | 2515 | supports-color@7.2.0: 2516 | dependencies: 2517 | has-flag: 4.0.0 2518 | 2519 | supports-color@8.1.1: 2520 | dependencies: 2521 | has-flag: 4.0.0 2522 | 2523 | text-table@0.2.0: {} 2524 | 2525 | thenify-all@1.6.0: 2526 | dependencies: 2527 | thenify: 3.3.1 2528 | 2529 | thenify@3.3.1: 2530 | dependencies: 2531 | any-promise: 1.3.0 2532 | 2533 | through2@2.0.5: 2534 | dependencies: 2535 | readable-stream: 2.3.8 2536 | xtend: 4.0.2 2537 | 2538 | tinyexec@0.3.1: {} 2539 | 2540 | tinyglobby@0.2.10: 2541 | dependencies: 2542 | fdir: 6.4.2(picomatch@4.0.2) 2543 | picomatch: 4.0.2 2544 | 2545 | to-regex-range@4.0.3: 2546 | dependencies: 2547 | is-number: 7.0.0 2548 | 2549 | to-regex-range@5.0.1: 2550 | dependencies: 2551 | is-number: 7.0.0 2552 | 2553 | tr46@1.0.1: 2554 | dependencies: 2555 | punycode: 2.3.1 2556 | 2557 | tree-kill@1.2.2: {} 2558 | 2559 | ts-api-utils@1.4.0(typescript@5.6.3): 2560 | dependencies: 2561 | typescript: 5.6.3 2562 | 2563 | ts-interface-checker@0.1.13: {} 2564 | 2565 | ts-mocha@10.0.0(mocha@10.8.2): 2566 | dependencies: 2567 | mocha: 10.8.2 2568 | ts-node: 7.0.1 2569 | optionalDependencies: 2570 | tsconfig-paths: 3.15.0 2571 | 2572 | ts-node@10.9.2(@types/node@22.10.10)(typescript@5.6.3): 2573 | dependencies: 2574 | '@cspotcode/source-map-support': 0.8.1 2575 | '@tsconfig/node10': 1.0.11 2576 | '@tsconfig/node12': 1.0.11 2577 | '@tsconfig/node14': 1.0.3 2578 | '@tsconfig/node16': 1.0.4 2579 | '@types/node': 22.10.10 2580 | acorn: 8.14.0 2581 | acorn-walk: 8.3.4 2582 | arg: 4.1.3 2583 | create-require: 1.1.1 2584 | diff: 4.0.2 2585 | make-error: 1.3.6 2586 | typescript: 5.6.3 2587 | v8-compile-cache-lib: 3.0.1 2588 | yn: 3.1.1 2589 | 2590 | ts-node@7.0.1: 2591 | dependencies: 2592 | arrify: 1.0.1 2593 | buffer-from: 1.1.2 2594 | diff: 3.5.0 2595 | make-error: 1.3.6 2596 | minimist: 1.2.8 2597 | mkdirp: 0.5.6 2598 | source-map-support: 0.5.21 2599 | yn: 2.0.0 2600 | 2601 | tsconfig-paths@3.15.0: 2602 | dependencies: 2603 | '@types/json5': 0.0.29 2604 | json5: 1.0.2 2605 | minimist: 1.2.8 2606 | strip-bom: 3.0.0 2607 | optional: true 2608 | 2609 | tsconfig-paths@4.2.0: 2610 | dependencies: 2611 | json5: 2.2.3 2612 | minimist: 1.2.8 2613 | strip-bom: 3.0.0 2614 | 2615 | tsup@8.3.5(typescript@5.6.3): 2616 | dependencies: 2617 | bundle-require: 5.0.0(esbuild@0.24.0) 2618 | cac: 6.7.14 2619 | chokidar: 4.0.1 2620 | consola: 3.2.3 2621 | debug: 4.3.7(supports-color@8.1.1) 2622 | esbuild: 0.24.0 2623 | joycon: 3.1.1 2624 | picocolors: 1.1.1 2625 | postcss-load-config: 6.0.1 2626 | resolve-from: 5.0.0 2627 | rollup: 4.27.2 2628 | source-map: 0.8.0-beta.0 2629 | sucrase: 3.35.0 2630 | tinyexec: 0.3.1 2631 | tinyglobby: 0.2.10 2632 | tree-kill: 1.2.2 2633 | optionalDependencies: 2634 | typescript: 5.6.3 2635 | transitivePeerDependencies: 2636 | - jiti 2637 | - supports-color 2638 | - tsx 2639 | - yaml 2640 | 2641 | type-check@0.4.0: 2642 | dependencies: 2643 | prelude-ls: 1.2.1 2644 | 2645 | type-fest@0.20.2: {} 2646 | 2647 | typescript@5.6.3: {} 2648 | 2649 | undici-types@6.20.0: {} 2650 | 2651 | uri-js@4.4.1: 2652 | dependencies: 2653 | punycode: 2.3.1 2654 | 2655 | util-deprecate@1.0.2: {} 2656 | 2657 | v8-compile-cache-lib@3.0.1: {} 2658 | 2659 | webidl-conversions@4.0.2: {} 2660 | 2661 | whatwg-url@7.1.0: 2662 | dependencies: 2663 | lodash.sortby: 4.7.0 2664 | tr46: 1.0.1 2665 | webidl-conversions: 4.0.2 2666 | 2667 | which@2.0.2: 2668 | dependencies: 2669 | isexe: 2.0.0 2670 | 2671 | word-wrap@1.2.5: {} 2672 | 2673 | workerpool@6.5.1: {} 2674 | 2675 | wrap-ansi@7.0.0: 2676 | dependencies: 2677 | ansi-styles: 4.3.0 2678 | string-width: 4.2.3 2679 | strip-ansi: 6.0.1 2680 | 2681 | wrap-ansi@8.1.0: 2682 | dependencies: 2683 | ansi-styles: 6.2.1 2684 | string-width: 5.1.2 2685 | strip-ansi: 7.1.0 2686 | 2687 | wrappy@1.0.2: {} 2688 | 2689 | xtend@4.0.2: {} 2690 | 2691 | y18n@5.0.8: {} 2692 | 2693 | yargs-parser@20.2.9: {} 2694 | 2695 | yargs-unparser@2.0.0: 2696 | dependencies: 2697 | camelcase: 6.3.0 2698 | decamelize: 4.0.0 2699 | flat: 5.0.2 2700 | is-plain-obj: 2.1.0 2701 | 2702 | yargs@16.2.0: 2703 | dependencies: 2704 | cliui: 7.0.4 2705 | escalade: 3.2.0 2706 | get-caller-file: 2.0.5 2707 | require-directory: 2.1.1 2708 | string-width: 4.2.3 2709 | y18n: 5.0.8 2710 | yargs-parser: 20.2.9 2711 | 2712 | yn@2.0.0: {} 2713 | 2714 | yn@3.1.1: {} 2715 | 2716 | yocto-queue@0.1.0: {} 2717 | -------------------------------------------------------------------------------- /prettier.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | trailingComma: 'none', 3 | tabWidth: 2, 4 | semi: true, 5 | singleQuote: true, 6 | printWidth: 90, 7 | arrowParens: 'avoid', 8 | bracketSpacing: true, 9 | jsxBracketSameLine: false, 10 | jsxSingleQuote: false, 11 | quoteProps: 'consistent' 12 | }; 13 | -------------------------------------------------------------------------------- /src/Segmenter.ts: -------------------------------------------------------------------------------- 1 | export class Segmenter extends Intl.Segmenter { 2 | constructor(language: string, options: Intl.SegmenterOptions = {}) { 3 | super(language, options); 4 | this.language = language; 5 | this.options = options; 6 | } 7 | 8 | * segment(input: string): Generator { 9 | const { maxChunkLength = 100, ...options } = this.options; 10 | let position = 0; 11 | 12 | while (position < input.length) { 13 | const remainingText = input.slice(position); 14 | const chunkSize = Math.min(maxChunkLength, remainingText.length); 15 | const potentialChunk = remainingText.slice(0, chunkSize); 16 | 17 | // Find a safe position to break the string 18 | const breakPoint = this.findSafeBreakPoint(potentialChunk); 19 | const chunk = potentialChunk.slice(0, breakPoint); 20 | 21 | // Process the chunk with Intl.Segmenter. Using this approach instead 22 | // of super.segment() to avoid any potential side effects. 23 | const segmenter = new Intl.Segmenter(this.language, { ...options }); 24 | const segments = segmenter.segment(chunk); 25 | 26 | for (const segment of segments) { 27 | yield segment; 28 | } 29 | 30 | position += breakPoint; 31 | } 32 | } 33 | 34 | findSafeBreakPoint(input: string): number { 35 | // Work backwards from the end of the input 36 | for (let i = input.length - 1; i >= 0; i--) { 37 | // Check for whitespace or simple ASCII characters 38 | if (/\s/.test(input[i]) || /^[\x20-\x7E]$/.test(input[i])) { 39 | return i + 1; 40 | } 41 | } 42 | 43 | // If no safe break points were found, return the full length 44 | return input.length; 45 | } 46 | 47 | getSegments(input: string): Intl.Segment[] { 48 | const array = []; 49 | 50 | // A for loop is much faster than Array.from, it doesn't cause a 51 | // maximum call stack error for large strings. Also, optimizations 52 | // in v8 make using `push` much faster than pre-allocating an array, 53 | // like `Array(input.length)` and setting the values at each index. 54 | for (const segment of this.segment(input)) { 55 | array.push(segment); 56 | } 57 | 58 | return array; 59 | } 60 | 61 | static getSegments( 62 | input: string, 63 | language: string, 64 | options: Intl.SegmenterOptions = {} 65 | ): Intl.Segment[] { 66 | const segmenter = new this(language, options); 67 | return segmenter.getSegments(input); 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /test/Segmenter.test.ts: -------------------------------------------------------------------------------- 1 | import assert from 'node:assert/strict'; 2 | import { Segmenter } from '~/Segmenter'; 3 | 4 | describe('Segmenter', () => { 5 | describe('constructor', () => { 6 | it('should create instance with default options', () => { 7 | const seg = new Segmenter('en'); 8 | assert.strictEqual(seg.language, 'en', 'should set language'); 9 | assert.deepStrictEqual(seg.options, {}, 'should use empty options by default'); 10 | }); 11 | 12 | it('should create instance with custom options', () => { 13 | const opts = { granularity: 'word' as const }; 14 | const seg = new Segmenter('en', opts); 15 | assert.deepStrictEqual(seg.options, opts, 'should store provided options'); 16 | }); 17 | }); 18 | 19 | describe('segment', () => { 20 | it('should segment simple text', () => { 21 | const seg = new Segmenter('en', { granularity: 'word' }); 22 | const text = 'Hello world'; 23 | const segments = Array.from(seg.segment(text)); 24 | 25 | assert.strictEqual(segments.length, 3, 'should have three segments'); 26 | assert.strictEqual(segments[0].segment, 'Hello', 'should segment first word'); 27 | assert.strictEqual(segments[1].segment, ' ', 'should segment space'); 28 | assert.strictEqual(segments[2].segment, 'world', 'should segment second word'); 29 | }); 30 | 31 | it('should handle maxChunkLength', () => { 32 | const seg = new Segmenter('en', { maxChunkLength: 5 }); 33 | const text = 'Hello world'; 34 | const segments = Array.from(seg.segment(text)); 35 | 36 | assert.ok(segments.length > 2, 'should split into multiple chunks'); 37 | assert.strictEqual(segments.map(s => s.segment).join(''), text, 'should preserve full text'); 38 | }); 39 | }); 40 | 41 | describe('findSafeBreakPoint', () => { 42 | it('should find space break points', () => { 43 | const seg = new Segmenter('en'); 44 | const pos = seg.findSafeBreakPoint('Hello world'); 45 | assert.strictEqual(pos, 11, 'should break at end of input with space'); 46 | }); 47 | 48 | it('should handle ASCII characters', () => { 49 | const input = 'Hello!World√ß'; 50 | const seg = new Segmenter('en'); 51 | const pos = seg.findSafeBreakPoint(input); 52 | assert.strictEqual(pos, 11, 'should break at then end of input with ASCII character'); 53 | }); 54 | }); 55 | 56 | describe('getSegments', () => { 57 | it('should return array of segments', () => { 58 | const seg = new Segmenter('en', { granularity: 'word' }); 59 | const segments = seg.getSegments('Hello world'); 60 | 61 | assert.ok(Array.isArray(segments), 'should return array'); 62 | assert.strictEqual(segments.length, 3, 'should have three segments'); 63 | }); 64 | 65 | it('should handle empty input', () => { 66 | const seg = new Segmenter('en'); 67 | const segments = seg.getSegments(''); 68 | assert.strictEqual(segments.length, 0, 'should return empty array'); 69 | }); 70 | }); 71 | 72 | describe('static getSegments', () => { 73 | it('should segment text with default options', () => { 74 | const segments = Segmenter.getSegments('Hello world', 'en'); 75 | assert.ok(segments.length > 0, 'should return segments'); 76 | }); 77 | 78 | it('should segment text with custom options', () => { 79 | const segments = Segmenter.getSegments('Hello world', 'en', { granularity: 'word' }); 80 | assert.strictEqual(segments.length, 3, 'should return word segments'); 81 | }); 82 | }); 83 | }); 84 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": ".", 4 | "allowJs": true, 5 | "allowSyntheticDefaultImports": true, 6 | "checkJs": false, 7 | "esModuleInterop": true, 8 | "isolatedModules": true, 9 | "moduleResolution": "NodeNext", 10 | "module": "NodeNext", 11 | "forceConsistentCasingInFileNames": true, 12 | "lib": ["ES2022"], 13 | "resolveJsonModule": true, 14 | "strict": true, 15 | "target": "ES2022", 16 | "types": ["node"], 17 | "paths": { "~/*": ["src/*"] } 18 | }, 19 | "ts-node": { 20 | "transpileOnly": true 21 | }, 22 | "include": ["src", "examples"], 23 | "exclude": ["node_modules", "build", "public", "dist", "tmp", "temp"] 24 | } 25 | -------------------------------------------------------------------------------- /tsup.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'tsup'; 2 | 3 | export default defineConfig({ 4 | clean: true, 5 | entry: ['index.ts'], 6 | cjsInterop: true, 7 | format: ['cjs', 'esm'], 8 | keepNames: true, 9 | minify: false, 10 | shims: true, 11 | splitting: false, 12 | sourcemap: true, 13 | target: 'node18' 14 | }); 15 | --------------------------------------------------------------------------------