i18next-cli 1.46.4 → 1.47.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/README.md +198 -3
  2. package/dist/cjs/cli.js +50 -1
  3. package/dist/cjs/extractor/core/extractor.js +27 -18
  4. package/dist/cjs/extractor/core/translation-manager.js +10 -3
  5. package/dist/cjs/extractor/parsers/call-expression-handler.js +9 -1
  6. package/dist/cjs/extractor/parsers/jsx-handler.js +10 -1
  7. package/dist/cjs/index.js +5 -0
  8. package/dist/cjs/init.js +68 -12
  9. package/dist/cjs/instrumenter/core/instrumenter.js +1633 -0
  10. package/dist/cjs/instrumenter/core/key-generator.js +71 -0
  11. package/dist/cjs/instrumenter/core/string-detector.js +290 -0
  12. package/dist/cjs/instrumenter/core/transformer.js +339 -0
  13. package/dist/cjs/linter.js +8 -9
  14. package/dist/cjs/utils/jsx-attributes.js +131 -0
  15. package/dist/esm/cli.js +50 -1
  16. package/dist/esm/extractor/core/extractor.js +27 -18
  17. package/dist/esm/extractor/core/translation-manager.js +10 -3
  18. package/dist/esm/extractor/parsers/call-expression-handler.js +9 -1
  19. package/dist/esm/extractor/parsers/jsx-handler.js +10 -1
  20. package/dist/esm/index.js +3 -0
  21. package/dist/esm/init.js +68 -12
  22. package/dist/esm/instrumenter/core/instrumenter.js +1630 -0
  23. package/dist/esm/instrumenter/core/key-generator.js +68 -0
  24. package/dist/esm/instrumenter/core/string-detector.js +288 -0
  25. package/dist/esm/instrumenter/core/transformer.js +336 -0
  26. package/dist/esm/linter.js +8 -9
  27. package/dist/esm/utils/jsx-attributes.js +121 -0
  28. package/package.json +2 -1
  29. package/types/cli.d.ts.map +1 -1
  30. package/types/extractor/core/extractor.d.ts.map +1 -1
  31. package/types/extractor/core/translation-manager.d.ts.map +1 -1
  32. package/types/extractor/parsers/call-expression-handler.d.ts.map +1 -1
  33. package/types/extractor/parsers/jsx-handler.d.ts.map +1 -1
  34. package/types/index.d.ts +2 -1
  35. package/types/index.d.ts.map +1 -1
  36. package/types/init.d.ts.map +1 -1
  37. package/types/instrumenter/core/instrumenter.d.ts +16 -0
  38. package/types/instrumenter/core/instrumenter.d.ts.map +1 -0
  39. package/types/instrumenter/core/key-generator.d.ts +30 -0
  40. package/types/instrumenter/core/key-generator.d.ts.map +1 -0
  41. package/types/instrumenter/core/string-detector.d.ts +27 -0
  42. package/types/instrumenter/core/string-detector.d.ts.map +1 -0
  43. package/types/instrumenter/core/transformer.d.ts +31 -0
  44. package/types/instrumenter/core/transformer.d.ts.map +1 -0
  45. package/types/instrumenter/index.d.ts +6 -0
  46. package/types/instrumenter/index.d.ts.map +1 -0
  47. package/types/linter.d.ts.map +1 -1
  48. package/types/types.d.ts +285 -1
  49. package/types/types.d.ts.map +1 -1
  50. package/types/utils/jsx-attributes.d.ts +68 -0
  51. package/types/utils/jsx-attributes.d.ts.map +1 -0
@@ -6,6 +6,7 @@ import { EventEmitter } from 'node:events';
6
6
  import { styleText } from 'node:util';
7
7
  import { ConsoleLogger } from './utils/logger.js';
8
8
  import { createSpinnerLike } from './utils/wrap-ora.js';
9
+ import { acceptedTags, translatableAttributes, ignoredTags, ignoredAttributeLowerSet } from './utils/jsx-attributes.js';
9
10
 
10
11
  /**
11
12
  * Loads all translation values from the primary locale's JSON files and returns
@@ -72,8 +73,8 @@ async function loadPrimaryTranslationValues(config) {
72
73
  function extractInterpolationKeys(str, config) {
73
74
  const prefix = config.extract.interpolationPrefix ?? '{{';
74
75
  const suffix = config.extract.interpolationSuffix ?? '}}';
75
- // Regex to match {{key}}
76
- const regex = new RegExp(`${prefix.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')}\\s*([\\w.-]+)\\s*${suffix.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')}`, 'g');
76
+ // Regex to match {{key}} or {{key, format}} (i18next formatting syntax)
77
+ const regex = new RegExp(`${prefix.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')}\\s*([\\w.-]+)\\s*(?:,[^}]*)?${suffix.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')}`, 'g');
77
78
  const keys = [];
78
79
  let match;
79
80
  while ((match = regex.exec(str))) {
@@ -244,12 +245,10 @@ function lintInterpolationParams(ast, code, config, translationValues) {
244
245
  }
245
246
  return issues;
246
247
  }
247
- const recommendedAcceptedTags = [
248
- 'a', 'abbr', 'address', 'article', 'aside', 'bdi', 'bdo', 'blockquote', 'button', 'caption', 'cite', 'code', 'data', 'dd', 'del', 'details', 'dfn', 'dialog', 'div', 'dt', 'em', 'figcaption', 'footer', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'header', 'img', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'mark', 'nav', 'option', 'output', 'p', 'pre', 'q', 's', 'samp', 'section', 'small', 'span', 'strong', 'sub', 'summary', 'sup', 'td', 'textarea', 'th', 'time', 'title', 'var'
249
- ].map(s => s.toLowerCase());
250
- const recommendedAcceptedAttributes = ['abbr', 'accesskey', 'alt', 'aria-description', 'aria-label', 'aria-placeholder', 'aria-roledescription', 'aria-valuetext', 'content', 'label', 'placeholder', 'summary', 'title'].map(s => s.toLowerCase());
251
- const defaultIgnoredAttributes = ['className', 'key', 'id', 'style', 'href', 'i18nKey', 'defaults', 'type', 'target'].map(s => s.toLowerCase());
252
- const defaultIgnoredTags = ['script', 'style', 'code'];
248
+ const recommendedAcceptedTags = acceptedTags.map(s => s.toLowerCase());
249
+ const recommendedAcceptedAttributes = translatableAttributes.map(s => s.toLowerCase());
250
+ const defaultIgnoredAttributes = ignoredAttributeLowerSet;
251
+ const defaultIgnoredTags = ignoredTags;
253
252
  class Linter extends EventEmitter {
254
253
  config;
255
254
  logger;
@@ -564,7 +563,7 @@ function findHardcodedStrings(ast, code, config) {
564
563
  };
565
564
  const transComponents = (config.extract.transComponents || ['Trans']).map((s) => s.toLowerCase());
566
565
  const customIgnoredTags = (config?.lint?.ignoredTags || config.extract.ignoredTags || []).map((s) => s.toLowerCase());
567
- const allIgnoredTags = new Set([...transComponents, ...defaultIgnoredTags.map(s => s.toLowerCase()), ...customIgnoredTags]);
566
+ const allIgnoredTags = new Set([...transComponents, ...defaultIgnoredTags.map((s) => s.toLowerCase()), ...customIgnoredTags]);
568
567
  const customIgnoredAttributes = (config?.lint?.ignoredAttributes || config.extract.ignoredAttributes || []).map((s) => s.toLowerCase());
569
568
  const ignoredAttributes = new Set([...defaultIgnoredAttributes, ...customIgnoredAttributes]);
570
569
  const lintAcceptedTags = config?.lint?.acceptedTags ? config.lint.acceptedTags : null;
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Shared constants for JSX / HTML attribute classification.
3
+ *
4
+ * Used by both the **linter** and the **instrumenter** to consistently decide
5
+ * which JSX attribute values are user-facing (translatable) and which are
6
+ * technical / non-translatable.
7
+ *
8
+ * Having a single source of truth avoids drift between the linter's
9
+ * `defaultIgnoredAttributes` / `recommendedAcceptedAttributes` and the
10
+ * instrumenter's `SKIP_JSX_ATTRIBUTES` / `TRANSLATABLE_ATTRIBUTES`.
11
+ */
12
+ // ────────────────────────────────────────────────────────────────────────
13
+ // Translatable attributes
14
+ // ────────────────────────────────────────────────────────────────────────
15
+ /**
16
+ * JSX/HTML attribute names whose values are typically user-visible and
17
+ * should be translated.
18
+ *
19
+ * This is the recommended accepted-list for the linter **and** the set used
20
+ * by the instrumenter's string-detector to allow attribute values through.
21
+ *
22
+ * Exported from the public API as `recommendedAcceptedAttributes`.
23
+ */
24
+ const translatableAttributes = [
25
+ 'abbr', 'accesskey', 'alt',
26
+ 'aria-description', 'aria-label', 'aria-placeholder',
27
+ 'aria-roledescription', 'aria-valuetext',
28
+ 'content', 'description',
29
+ 'label', 'placeholder',
30
+ 'summary', 'caption', 'title'
31
+ ];
32
+ /**
33
+ * Pre-built Set (lower-cased) for fast membership checks in hot loops.
34
+ */
35
+ const translatableAttributeSet = new Set(translatableAttributes.map(s => s.toLowerCase()));
36
+ // ────────────────────────────────────────────────────────────────────────
37
+ // Non-translatable (ignored) attributes
38
+ // ────────────────────────────────────────────────────────────────────────
39
+ /**
40
+ * JSX attribute names whose values are **never** user-facing.
41
+ *
42
+ * The linter uses these as `defaultIgnoredAttributes`, and the instrumenter
43
+ * skips recursing into them entirely so that e.g. `className={...}` is
44
+ * never wrapped in `t()`.
45
+ *
46
+ * Event-handler attributes (on*) are handled separately via a prefix check
47
+ * rather than being enumerated here, but a representative set is included
48
+ * for the instrumenter's early-exit guard which does a Set lookup.
49
+ */
50
+ const ignoredAttributes = [
51
+ // CSS / styling
52
+ 'className', 'class', 'style',
53
+ // Identity / keys
54
+ 'key', 'id', 'htmlFor', 'for', 'name',
55
+ // Links & resources
56
+ 'href', 'src', 'srcSet', 'action',
57
+ // HTML form / behaviour
58
+ 'type', 'target', 'rel', 'role', 'method', 'encType',
59
+ 'autoComplete', 'autoFocus', 'tabIndex',
60
+ // Testing
61
+ 'data-testid', 'data-cy',
62
+ // i18next-specific (already instrumented / extractor config)
63
+ 'i18nKey', 'defaults', 'ns', 'defaultValue',
64
+ // Event handlers (representative set — the instrumenter also does a
65
+ // prefix check for `on[A-Z]`)
66
+ 'onChange', 'onClick', 'onSubmit', 'onFocus', 'onBlur',
67
+ 'onKeyDown', 'onKeyUp', 'onMouseEnter', 'onMouseLeave',
68
+ // React internals
69
+ 'ref', 'dangerouslySetInnerHTML', 'suppressHydrationWarning'
70
+ ];
71
+ /**
72
+ * Pre-built Set for fast membership checks.
73
+ * Values are stored in their original casing — the instrumenter checks the
74
+ * raw SWC attribute name. The linter lower-cases before lookup.
75
+ */
76
+ const ignoredAttributeSet = new Set(ignoredAttributes);
77
+ /**
78
+ * Same set, lower-cased — used by the linter which normalises attr names.
79
+ */
80
+ const ignoredAttributeLowerSet = new Set(ignoredAttributes.map(s => s.toLowerCase()));
81
+ // ────────────────────────────────────────────────────────────────────────
82
+ // Translatable object properties (instrumenter-specific)
83
+ // ────────────────────────────────────────────────────────────────────────
84
+ /**
85
+ * Object / JSON property names whose values are typically user-visible and
86
+ * should be translated. Used by the instrumenter's string-detector to give
87
+ * a confidence boost.
88
+ */
89
+ const translatableProperties = [
90
+ 'label', 'title', 'description', 'text', 'message', 'placeholder',
91
+ 'caption', 'summary', 'heading', 'subheading', 'subtitle', 'tooltip',
92
+ 'hint', 'helpText', 'errorMessage', 'successMessage', 'name'
93
+ ];
94
+ const translatablePropertySet = new Set(translatableProperties);
95
+ // ────────────────────────────────────────────────────────────────────────
96
+ // Ignored tags (linter + potential future instrumenter use)
97
+ // ────────────────────────────────────────────────────────────────────────
98
+ /**
99
+ * HTML/JSX tags whose content should be ignored when linting for hardcoded
100
+ * strings (e.g. `<script>`, `<style>`, `<code>`).
101
+ */
102
+ const ignoredTags = ['script', 'style', 'code'];
103
+ /**
104
+ * Recommended accepted tags — the set of tags the linter considers as
105
+ * potentially containing translatable content.
106
+ *
107
+ * Exported from the public API as `recommendedAcceptedTags`.
108
+ */
109
+ const acceptedTags = [
110
+ 'a', 'abbr', 'address', 'article', 'aside', 'bdi', 'bdo', 'blockquote',
111
+ 'button', 'caption', 'cite', 'code', 'data', 'dd', 'del', 'details',
112
+ 'dfn', 'dialog', 'div', 'dt', 'em', 'figcaption', 'footer',
113
+ 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'header',
114
+ 'img', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'mark', 'nav',
115
+ 'option', 'output', 'p', 'pre', 'q', 's', 'samp', 'section', 'small',
116
+ 'span', 'strong', 'sub', 'summary', 'sup', 'td', 'textarea', 'th',
117
+ 'time', 'title', 'var'
118
+ ];
119
+ new Set(acceptedTags.map(s => s.toLowerCase()));
120
+
121
+ export { acceptedTags, ignoredAttributeLowerSet, ignoredAttributeSet, ignoredAttributes, ignoredTags, translatableAttributeSet, translatableAttributes, translatableProperties, translatablePropertySet };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "i18next-cli",
3
- "version": "1.46.4",
3
+ "version": "1.47.1",
4
4
  "description": "A unified, high-performance i18next CLI.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -79,6 +79,7 @@
79
79
  "inquirer": "13.3.0",
80
80
  "jiti": "2.6.1",
81
81
  "jsonc-parser": "3.3.1",
82
+ "magic-string": "0.30.12",
82
83
  "minimatch": "10.2.4",
83
84
  "ora": "9.3.0",
84
85
  "react": "^19.2.4",
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAkBnC,QAAA,MAAM,OAAO,SAAgB,CAAA;AAyR7B,OAAO,EAAE,OAAO,EAAE,CAAA"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAmBnC,QAAA,MAAM,OAAO,SAAgB,CAAA;AA2U7B,OAAO,EAAE,OAAO,EAAE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../../../src/extractor/core/extractor.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAMtF,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAK5C;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,oBAAoB,EAC5B,OAAO,GAAE;IACP,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;CACX,GACL,OAAO,CAAC;IAAE,cAAc,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,CAuE1D;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EAAE,EACjB,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,EAC7C,MAAM,GAAE,MAA4B,EACpC,UAAU,CAAC,EAAE,MAAM,EAAE,GACpB,OAAO,CAAC,IAAI,CAAC,CA8Gf;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,OAAO,CAAE,MAAM,EAAE,oBAAoB,EAAE,EAAE,uBAA+B,EAAE,GAAE;IAAE,uBAAuB,CAAC,EAAE,OAAO,CAAA;CAAO,sDAO3I"}
1
+ {"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../../../src/extractor/core/extractor.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAMtF,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAK5C;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,oBAAoB,EAC5B,OAAO,GAAE;IACP,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;CACX,GACL,OAAO,CAAC;IAAE,cAAc,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,CAAC,CA6E1D;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EAAE,EACjB,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,EAC7C,MAAM,GAAE,MAA4B,EACpC,UAAU,CAAC,EAAE,MAAM,EAAE,GACpB,OAAO,CAAC,IAAI,CAAC,CA8Gf;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,OAAO,CAAE,MAAM,EAAE,oBAAoB,EAAE,EAAE,uBAA+B,EAAE,GAAE;IAAE,uBAAuB,CAAC,EAAE,OAAO,CAAA;CAAO,sDAO3I"}
@@ -1 +1 @@
1
- {"version":3,"file":"translation-manager.d.ts","sourceRoot":"","sources":["../../../src/extractor/core/translation-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAg3B3F;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EAC/B,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,MAAM,EAAE,oBAAoB,EAC5B,EACE,uBAA+B,EAC/B,OAAe,EACf,MAA4B,EAC7B,GAAE;IACD,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;CACX,GACL,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA8J9B"}
1
+ {"version":3,"file":"translation-manager.d.ts","sourceRoot":"","sources":["../../../src/extractor/core/translation-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAw3B3F;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EAC/B,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,MAAM,EAAE,oBAAoB,EAC5B,EACE,uBAA+B,EAC/B,OAAe,EACf,MAA4B,EAC7B,GAAE;IACD,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;CACX,GACL,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA8J9B"}
@@ -1 +1 @@
1
- {"version":3,"file":"call-expression-handler.d.ts","sourceRoot":"","sources":["../../../src/extractor/parsers/call-expression-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAA6C,MAAM,WAAW,CAAA;AAC1F,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,EAAgB,SAAS,EAAE,MAAM,aAAa,CAAA;AACvG,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAM1D,qBAAa,qBAAqB;IAChC,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,kBAAkB,CAAoB;IACvC,UAAU,cAAoB;IACrC,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,cAAc,CAAc;gBAGlC,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,EAC7C,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,MAAM,EACd,kBAAkB,EAAE,kBAAkB,EACtC,cAAc,EAAE,MAAM,MAAM,EAC5B,cAAc,EAAE,MAAM,MAAM;IAU9B;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAiB3B;;;;;;;;;;;;;;OAcG;IACH,oBAAoB,CAAE,IAAI,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,GAAG,SAAS,GAAG,IAAI;IAgYxG;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA4BzB,OAAO,CAAC,oBAAoB;IA6E5B,OAAO,CAAC,wBAAwB;IAyEhC;;;;;;OAMG;IACH,OAAO,CAAC,4BAA4B;IA8BpC;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,sBAAsB;IA2C9B;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,gBAAgB;IA+LxB;;;;;;;;;OASG;IACH,OAAO,CAAC,eAAe;CA2BxB"}
1
+ {"version":3,"file":"call-expression-handler.d.ts","sourceRoot":"","sources":["../../../src/extractor/parsers/call-expression-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAA6C,MAAM,WAAW,CAAA;AAC1F,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,EAAgB,SAAS,EAAE,MAAM,aAAa,CAAA;AACvG,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAM1D,qBAAa,qBAAqB;IAChC,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,kBAAkB,CAAoB;IACvC,UAAU,cAAoB;IACrC,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,cAAc,CAAc;gBAGlC,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,EAC7C,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,MAAM,EACd,kBAAkB,EAAE,kBAAkB,EACtC,cAAc,EAAE,MAAM,MAAM,EAC5B,cAAc,EAAE,MAAM,MAAM;IAU9B;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAiB3B;;;;;;;;;;;;;;OAcG;IACH,oBAAoB,CAAE,IAAI,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,GAAG,SAAS,GAAG,IAAI;IAgYxG;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA4BzB,OAAO,CAAC,oBAAoB;IA6E5B,OAAO,CAAC,wBAAwB;IAyEhC;;;;;;OAMG;IACH,OAAO,CAAC,4BAA4B;IA8BpC;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,sBAAsB;IA2C9B;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,gBAAgB;IAyMxB;;;;;;;;;OASG;IACH,OAAO,CAAC,eAAe;CA2BxB"}
@@ -1 +1 @@
1
- {"version":3,"file":"jsx-handler.d.ts","sourceRoot":"","sources":["../../../src/extractor/parsers/jsx-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAoB,MAAM,WAAW,CAAA;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAgB,MAAM,aAAa,CAAA;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAI1D,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,kBAAkB,CAAoB;IAC9C,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,cAAc,CAAc;gBAGlC,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,EAC7C,aAAa,EAAE,aAAa,EAC5B,kBAAkB,EAAE,kBAAkB,EACtC,cAAc,EAAE,MAAM,MAAM,EAC5B,cAAc,EAAE,MAAM,MAAM;IAS9B;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAK3B;;;;;;;;OAQG;IACH,gBAAgB,CAAE,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,GAAG,IAAI;IAwUjI;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,0BAA0B;IAuHlC;;;;;;;;;OASG;IACH,OAAO,CAAC,cAAc;CAevB"}
1
+ {"version":3,"file":"jsx-handler.d.ts","sourceRoot":"","sources":["../../../src/extractor/parsers/jsx-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAoB,MAAM,WAAW,CAAA;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAgB,MAAM,aAAa,CAAA;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAI1D,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,kBAAkB,CAAoB;IAC9C,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,cAAc,CAAc;gBAGlC,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,EAC7C,aAAa,EAAE,aAAa,EAC5B,kBAAkB,EAAE,kBAAkB,EACtC,cAAc,EAAE,MAAM,MAAM,EAC5B,cAAc,EAAE,MAAM,MAAM;IAS9B;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAK3B;;;;;;;;OAQG;IACH,gBAAgB,CAAE,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,GAAG,IAAI;IAwUjI;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,0BAA0B;IAkIlC;;;;;;;;;OASG;IACH,OAAO,CAAC,cAAc;CAevB"}
package/types/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export type { I18nextToolkitConfig, Plugin, LinterPlugin, LintPluginContext, LintIssue, PluginContext, ExtractedKey, TranslationResult, ExtractedKeysMap, RenameKeyResult, Logger, } from './types';
1
+ export type { I18nextToolkitConfig, Plugin, LinterPlugin, InstrumenterPlugin, LintPluginContext, LintIssue, PluginContext, ExtractedKey, TranslationResult, ExtractedKeysMap, RenameKeyResult, Logger, InstrumenterOptions, CandidateString, TransformResult, FileInstrumentationResult, InstrumentationResults, ComponentBoundary, FileScanResult, CustomCandidateScorer, InstrumentPluginContext } from './types';
2
2
  export { defineConfig } from './config';
3
3
  export { extract, findKeys, getTranslations, runExtractor } from './extractor';
4
4
  export { runLinter, recommendedAcceptedTags, recommendedAcceptedAttributes } from './linter';
@@ -6,4 +6,5 @@ export { runSyncer } from './syncer';
6
6
  export { runStatus } from './status';
7
7
  export { runTypesGenerator } from './types-generator';
8
8
  export { runRenameKey } from './rename-key';
9
+ export { runInstrumenter, writeExtractedKeys } from './instrumenter';
9
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,oBAAoB,EACpB,MAAM,EACN,YAAY,EACZ,iBAAiB,EACjB,SAAS,EACT,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,MAAM,GACP,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EACL,OAAO,EACP,QAAQ,EACR,eAAe,EACf,YAAY,EACb,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,6BAA6B,EAAE,MAAM,UAAU,CAAA;AAC5F,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,oBAAoB,EACpB,MAAM,EACN,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EACjB,SAAS,EACT,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,MAAM,EACN,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,yBAAyB,EACzB,sBAAsB,EACtB,iBAAiB,EACjB,cAAc,EACd,qBAAqB,EACrB,uBAAuB,EACxB,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AACvC,OAAO,EACL,OAAO,EACP,QAAQ,EACR,eAAe,EACf,YAAY,EACb,MAAM,aAAa,CAAA;AAEpB,OAAO,EAAE,SAAS,EAAE,uBAAuB,EAAE,6BAA6B,EAAE,MAAM,UAAU,CAAA;AAC5F,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAgCA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAsB,OAAO,kBAmH5B"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAiEA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAsB,OAAO,kBAyI5B"}
@@ -0,0 +1,16 @@
1
+ import type { Logger, I18nextToolkitConfig, InstrumenterOptions, CandidateString, InstrumentationResults } from '../../types';
2
+ /**
3
+ * Main orchestrator for the instrument command.
4
+ * Scans source files for hardcoded strings and instruments them with i18next calls.
5
+ *
6
+ * @param config - Toolkit configuration
7
+ * @param options - Instrumentation options (dry-run, interactive, etc.)
8
+ * @param logger - Logger instance
9
+ * @returns Instrumentation results
10
+ */
11
+ export declare function runInstrumenter(config: I18nextToolkitConfig, options: InstrumenterOptions, logger?: Logger): Promise<InstrumentationResults>;
12
+ /**
13
+ * Extracts and writes translation keys discovered during instrumentation.
14
+ */
15
+ export declare function writeExtractedKeys(candidates: CandidateString[], config: I18nextToolkitConfig, namespace?: string, logger?: Logger): Promise<void>;
16
+ //# sourceMappingURL=instrumenter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instrumenter.d.ts","sourceRoot":"","sources":["../../../src/instrumenter/core/instrumenter.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,MAAM,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,eAAe,EAA6B,sBAAsB,EAAiE,MAAM,aAAa,CAAA;AAUvN;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,oBAAoB,EAC5B,OAAO,EAAE,mBAAmB,EAC5B,MAAM,GAAE,MAA4B,GACnC,OAAO,CAAC,sBAAsB,CAAC,CA8MjC;AA81CD;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,eAAe,EAAE,EAC7B,MAAM,EAAE,oBAAoB,EAC5B,SAAS,CAAC,EAAE,MAAM,EAClB,MAAM,GAAE,MAA4B,GACnC,OAAO,CAAC,IAAI,CAAC,CAoDf"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Generates camelCase keys from English string content.
3
+ *
4
+ * Examples:
5
+ * "Welcome back" → "welcomeBack"
6
+ * "Hello, World!" → "helloWorld"
7
+ * "You have 3 items" → "youHave3Items"
8
+ *
9
+ * @param content - The string content to derive a key from
10
+ * @returns camelCase key
11
+ */
12
+ export declare function generateKeyFromContent(content: string): string;
13
+ /**
14
+ * Interface for tracking generated keys and managing collisions
15
+ */
16
+ export interface KeyRegistry {
17
+ keys: Map<string, string>;
18
+ add(key: string, content: string): string;
19
+ }
20
+ /**
21
+ * Creates a new key registry with collision detection.
22
+ */
23
+ export declare function createKeyRegistry(): KeyRegistry;
24
+ /**
25
+ * Sanitizes a generated key to be valid according to i18next conventions.
26
+ * Removes invalid characters and ensures it's a valid JavaScript identifier
27
+ * that can be used as an object key.
28
+ */
29
+ export declare function sanitizeKey(key: string): string;
30
+ //# sourceMappingURL=key-generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key-generator.d.ts","sourceRoot":"","sources":["../../../src/instrumenter/core/key-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,wBAAgB,sBAAsB,CAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAuB/D;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACzB,GAAG,CAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAAA;CAC3C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAK,WAAW,CAmChD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAWhD"}
@@ -0,0 +1,27 @@
1
+ import type { I18nextToolkitConfig, CandidateString } from '../../types';
2
+ /**
3
+ * Detects if a string is a candidate for translation based on confidence heuristics.
4
+ * Returns null if the string should be skipped, otherwise returns a CandidateString
5
+ * with a confidence score.
6
+ *
7
+ * When a custom scorer is provided via `config.extract.instrumentScorer`, it is
8
+ * called after the built-in skip checks. The scorer can:
9
+ * - Return a number (0-1) to override the confidence score
10
+ * - Return `null` to force-skip the candidate
11
+ * - Return `undefined` to fall back to the built-in heuristic
12
+ *
13
+ * **Important:** This uses heuristic-based detection and will not catch 100% of cases.
14
+ * False positives and false negatives are expected. The results serve as a starting point
15
+ * for manual review and refinement. Always review the generated transformations before
16
+ * committing them to your codebase.
17
+ *
18
+ * @param content - The string content to evaluate
19
+ * @param offset - Byte offset in file (normalized)
20
+ * @param endOffset - End byte offset in file
21
+ * @param file - Source file path
22
+ * @param code - Full source code for context
23
+ * @param config - Toolkit configuration
24
+ * @returns CandidateString with confidence score, or null if should be skipped
25
+ */
26
+ export declare function detectCandidate(content: string, offset: number, endOffset: number, file: string, code: string, config: Omit<I18nextToolkitConfig, 'plugins'>): CandidateString | null;
27
+ //# sourceMappingURL=string-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string-detector.d.ts","sourceRoot":"","sources":["../../../src/instrumenter/core/string-detector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAIxE;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,GAC5C,eAAe,GAAG,IAAI,CAgDxB"}
@@ -0,0 +1,31 @@
1
+ import type { I18nextToolkitConfig, CandidateString, TransformResult, ComponentBoundary, LanguageChangeSite } from '../../types';
2
+ interface TransformerOptions {
3
+ isDryRun?: boolean;
4
+ hasReact: boolean;
5
+ isPrimaryLanguageFile: boolean;
6
+ config: Omit<I18nextToolkitConfig, 'plugins'>;
7
+ /** Detected React function component boundaries (used for hook injection) */
8
+ components?: ComponentBoundary[];
9
+ /** Target namespace for extracted keys (omit to use defaultNS) */
10
+ namespace?: string;
11
+ /** Detected language-change call sites to augment with i18n.changeLanguage() */
12
+ languageChangeSites?: LanguageChangeSite[];
13
+ }
14
+ /**
15
+ * Transforms a source file, replacing candidate strings with instrumented code.
16
+ * Also injects useTranslation() hooks into React function components that
17
+ * contain transformed strings.
18
+ *
19
+ * @param content - Original source code
20
+ * @param file - File path
21
+ * @param candidates - Candidate strings to transform
22
+ * @param options - Transformation options
23
+ * @returns TransformResult with modified content and diff
24
+ */
25
+ export declare function transformFile(content: string, file: string, candidates: CandidateString[], options: TransformerOptions): TransformResult;
26
+ /**
27
+ * Generates a unified diff showing what changed.
28
+ */
29
+ export declare function generateDiff(original: string, modified: string, filePath: string): string;
30
+ export {};
31
+ //# sourceMappingURL=transformer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transformer.d.ts","sourceRoot":"","sources":["../../../src/instrumenter/core/transformer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAGhI,UAAU,kBAAkB;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,EAAE,OAAO,CAAA;IACjB,qBAAqB,EAAE,OAAO,CAAA;IAC9B,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,CAAA;IAC7C,6EAA6E;IAC7E,UAAU,CAAC,EAAE,iBAAiB,EAAE,CAAA;IAChC,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gFAAgF;IAChF,mBAAmB,CAAC,EAAE,kBAAkB,EAAE,CAAA;CAC3C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,eAAe,EAAE,EAC7B,OAAO,EAAE,kBAAkB,GAC1B,eAAe,CA6KjB;AAyKD;;GAEG;AACH,wBAAgB,YAAY,CAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAwB1F"}
@@ -0,0 +1,6 @@
1
+ export type { InstrumenterOptions, CandidateString, TransformResult, FileInstrumentationResult, InstrumentationResults, ComponentBoundary, FileScanResult, LanguageChangeSite, CustomCandidateScorer, InstrumentPluginContext, InstrumenterPlugin } from '../types';
2
+ export { runInstrumenter, writeExtractedKeys } from './core/instrumenter';
3
+ export { detectCandidate } from './core/string-detector';
4
+ export { generateKeyFromContent, createKeyRegistry } from './core/key-generator';
5
+ export { transformFile, generateDiff } from './core/transformer';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/instrumenter/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,yBAAyB,EACzB,sBAAsB,EACtB,iBAAiB,EACjB,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EACrB,uBAAuB,EACvB,kBAAkB,EACnB,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAChF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"linter.d.ts","sourceRoot":"","sources":["../src/linter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAI1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,EAAE,SAAS,EAA6B,MAAM,SAAS,CAAA;AAwPjG,KAAK,cAAc,GAAG;IACpB,QAAQ,EAAE;QAAC;YACT,OAAO,EAAE,MAAM,CAAC;SACjB;KAAC,CAAC;IACH,IAAI,EAAE;QAAC;YACL,OAAO,EAAE,OAAO,CAAC;YACjB,OAAO,EAAE,MAAM,CAAC;YAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;SACpC;KAAC,CAAC;IACH,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;CACvB,CAAA;AAED,eAAO,MAAM,uBAAuB,UAET,CAAA;AAC3B,eAAO,MAAM,6BAA6B,UAAgN,CAAA;AAK1P,qBAAa,MAAO,SAAQ,YAAY,CAAC,cAAc,CAAC;IACtD,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,MAAM,CAAQ;gBAET,MAAM,EAAE,oBAAoB,EAAE,MAAM,GAAE,MAA4B;IAM/E,SAAS,CAAE,KAAK,EAAE,OAAO;IAanB,GAAG;;;;;;;IA2GT,OAAO,CAAC,uBAAuB;YAOjB,qBAAqB;IAWnC,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,0BAA0B;YAUpB,qBAAqB;YAgBrB,uBAAuB;CAgBtC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,SAAS,CAAE,MAAM,EAAE,oBAAoB;;;;;;GAE5D;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,oBAAoB,EAC5B,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,iBAkCnD"}
1
+ {"version":3,"file":"linter.d.ts","sourceRoot":"","sources":["../src/linter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAK1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,EAAE,SAAS,EAA6B,MAAM,SAAS,CAAA;AAwPjG,KAAK,cAAc,GAAG;IACpB,QAAQ,EAAE;QAAC;YACT,OAAO,EAAE,MAAM,CAAC;SACjB;KAAC,CAAC;IACH,IAAI,EAAE;QAAC;YACL,OAAO,EAAE,OAAO,CAAC;YACjB,OAAO,EAAE,MAAM,CAAC;YAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;SACpC;KAAC,CAAC;IACH,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;CACvB,CAAA;AAED,eAAO,MAAM,uBAAuB,EAAE,MAAM,EAAiD,CAAA;AAC7F,eAAO,MAAM,6BAA6B,EAAE,MAAM,EAAqD,CAAA;AAKvG,qBAAa,MAAO,SAAQ,YAAY,CAAC,cAAc,CAAC;IACtD,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,MAAM,CAAQ;gBAET,MAAM,EAAE,oBAAoB,EAAE,MAAM,GAAE,MAA4B;IAM/E,SAAS,CAAE,KAAK,EAAE,OAAO;IAanB,GAAG;;;;;;;IA2GT,OAAO,CAAC,uBAAuB;YAOjB,qBAAqB;IAWnC,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,0BAA0B;YAUpB,qBAAqB;YAgBrB,uBAAuB;CAgBtC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,SAAS,CAAE,MAAM,EAAE,oBAAoB;;;;;;GAE5D;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,oBAAoB,EAC5B,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,iBAkCnD"}