@eevee-ta/cli 0.1.0-beta.1 → 1.2.0

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 (75) hide show
  1. package/README.md +195 -119
  2. package/assets/skills/eevee-integration/SKILL.md +46 -0
  3. package/assets/skills/eevee-integration/agents/openai.yaml +3 -0
  4. package/assets/skills/eevee-integration/references/intake.md +87 -0
  5. package/assets/skills/eevee-integration/references/java-springboot.md +182 -0
  6. package/assets/skills/eevee-integration/references/umijs.md +210 -0
  7. package/assets/skills/eevee-mcp/SKILL.md +87 -3
  8. package/assets/skills/eevee-mcp/reference.md +31 -2
  9. package/dist/src/bin/cli.js +66 -27
  10. package/dist/src/bin/cli.js.map +1 -1
  11. package/dist/src/commands/business-command.js +9 -4
  12. package/dist/src/commands/business-command.js.map +1 -1
  13. package/dist/src/commands/i18n-command.js +194 -0
  14. package/dist/src/commands/i18n-command.js.map +1 -0
  15. package/dist/src/commands/skill-command.js +80 -29
  16. package/dist/src/commands/skill-command.js.map +1 -1
  17. package/dist/src/lib/business-catalog.js +24 -20
  18. package/dist/src/lib/business-catalog.js.map +1 -1
  19. package/dist/src/lib/config.js +1 -1
  20. package/dist/src/lib/config.js.map +1 -1
  21. package/dist/src/lib/http.js +95 -0
  22. package/dist/src/lib/http.js.map +1 -0
  23. package/dist/src/lib/i18n-exporter.js +402 -0
  24. package/dist/src/lib/i18n-exporter.js.map +1 -0
  25. package/dist/src/lib/i18n-scanner.js +1172 -0
  26. package/dist/src/lib/i18n-scanner.js.map +1 -0
  27. package/dist/src/lib/mcp-client.js +5 -4
  28. package/dist/src/lib/mcp-client.js.map +1 -1
  29. package/dist/src/lib/skill-installer.js +140 -42
  30. package/dist/src/lib/skill-installer.js.map +1 -1
  31. package/dist/src/lib/updater.js +129 -0
  32. package/dist/src/lib/updater.js.map +1 -0
  33. package/dist/src/lib/version.js +55 -0
  34. package/dist/src/lib/version.js.map +1 -0
  35. package/install.sh +203 -0
  36. package/package.json +9 -9
  37. package/scripts/postinstall.mjs +31 -0
  38. package/assets/skills/eevee-migration/SKILL.md +0 -181
  39. package/assets/skills/eevee-project-setup/SKILL.md +0 -266
  40. package/dist/src/commands/intl-command.js +0 -131
  41. package/dist/src/commands/intl-command.js.map +0 -1
  42. package/dist/src/commands/lint-command.js +0 -105
  43. package/dist/src/commands/lint-command.js.map +0 -1
  44. package/dist/src/lib/intl-catalog.js +0 -58
  45. package/dist/src/lib/intl-catalog.js.map +0 -1
  46. package/dist/src/lib/intl-config.js +0 -125
  47. package/dist/src/lib/intl-config.js.map +0 -1
  48. package/dist/src/lib/intl-downloader.js +0 -217
  49. package/dist/src/lib/intl-downloader.js.map +0 -1
  50. package/dist/src/lib/intl-serializers/csv.js +0 -25
  51. package/dist/src/lib/intl-serializers/csv.js.map +0 -1
  52. package/dist/src/lib/intl-serializers/custom.js +0 -23
  53. package/dist/src/lib/intl-serializers/custom.js.map +0 -1
  54. package/dist/src/lib/intl-serializers/index.js +0 -22
  55. package/dist/src/lib/intl-serializers/index.js.map +0 -1
  56. package/dist/src/lib/intl-serializers/js.js +0 -10
  57. package/dist/src/lib/intl-serializers/js.js.map +0 -1
  58. package/dist/src/lib/intl-serializers/json.js +0 -7
  59. package/dist/src/lib/intl-serializers/json.js.map +0 -1
  60. package/dist/src/lib/intl-serializers/properties.js +0 -43
  61. package/dist/src/lib/intl-serializers/properties.js.map +0 -1
  62. package/dist/src/lib/intl-serializers/ts.js +0 -16
  63. package/dist/src/lib/intl-serializers/ts.js.map +0 -1
  64. package/dist/src/lib/intl-serializers/xml.js +0 -21
  65. package/dist/src/lib/intl-serializers/xml.js.map +0 -1
  66. package/dist/src/lib/lint-config.js +0 -180
  67. package/dist/src/lib/lint-config.js.map +0 -1
  68. package/dist/src/lib/lint-java.js +0 -226
  69. package/dist/src/lib/lint-java.js.map +0 -1
  70. package/dist/src/lib/lint-types.js +0 -2
  71. package/dist/src/lib/lint-types.js.map +0 -1
  72. package/dist/src/lib/lint-web.js +0 -183
  73. package/dist/src/lib/lint-web.js.map +0 -1
  74. package/dist/src/lib/lint.js +0 -192
  75. package/dist/src/lib/lint.js.map +0 -1
@@ -1,180 +0,0 @@
1
- import { readFile } from 'node:fs/promises';
2
- import path from 'node:path';
3
- import { CliError } from './args.js';
4
- const CONFIG_FILE_NAMES = ['.eevee-lint.json', '.eeveerc.json'];
5
- export async function findPackageJsonFile(startDir) {
6
- let current = path.resolve(startDir);
7
- while (true) {
8
- const candidate = path.join(current, 'package.json');
9
- try {
10
- await readFile(candidate, 'utf8');
11
- return candidate;
12
- }
13
- catch {
14
- const parent = path.dirname(current);
15
- if (parent === current)
16
- return undefined;
17
- current = parent;
18
- }
19
- }
20
- }
21
- export async function loadLintConfig(explicitPath, cwd = process.cwd()) {
22
- const located = await locateLintConfig(explicitPath, cwd);
23
- if (!located) {
24
- throw new CliError('未找到 EEVEE lint 配置;可在 package.json 增加 eevee.lint,创建 .eevee-lint.json,或使用 --config PATH');
25
- }
26
- let raw;
27
- try {
28
- raw = JSON.parse(await readFile(located.configFile, 'utf8'));
29
- }
30
- catch (error) {
31
- throw new CliError(`Lint 配置解析失败 (${located.configFile}): ${error.message}`);
32
- }
33
- return normalizeLintConfig(raw, located.configFile, path.dirname(located.configFile));
34
- }
35
- async function locateLintConfig(explicitPath, cwd) {
36
- if (explicitPath) {
37
- const configFile = path.resolve(explicitPath);
38
- await accessOrThrow(configFile);
39
- return { configFile };
40
- }
41
- for (const name of CONFIG_FILE_NAMES) {
42
- const configFile = path.join(cwd, name);
43
- try {
44
- await readFile(configFile, 'utf8');
45
- return { configFile };
46
- }
47
- catch {
48
- // Continue to the next discovery location.
49
- }
50
- }
51
- const packageFile = await findPackageJsonFile(cwd);
52
- if (!packageFile)
53
- return undefined;
54
- try {
55
- const pkg = JSON.parse(await readFile(packageFile, 'utf8'));
56
- const eevee = pkg.eevee;
57
- if (!eevee?.lint || typeof eevee.lint !== 'object')
58
- return undefined;
59
- return { configFile: packageFile };
60
- }
61
- catch {
62
- return undefined;
63
- }
64
- }
65
- async function accessOrThrow(configFile) {
66
- try {
67
- await readFile(configFile, 'utf8');
68
- }
69
- catch (error) {
70
- throw new CliError(`Lint 配置不存在: ${configFile}`);
71
- }
72
- }
73
- export function normalizeLintConfig(raw, configFile, baseDir) {
74
- if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
75
- throw new CliError(`Lint 配置必须是对象: ${configFile}`);
76
- }
77
- const source = raw;
78
- const languages = source.languages;
79
- if (!languages || typeof languages !== 'object' || Array.isArray(languages)) {
80
- throw new CliError(`Lint 配置缺少 languages 对象: ${configFile}`);
81
- }
82
- const languagesRaw = languages;
83
- const web = languagesRaw.web;
84
- const java = languagesRaw.java;
85
- return {
86
- refresh: normalizeRefresh(source.refresh, configFile),
87
- languages: {
88
- web: web === undefined ? undefined : normalizeWeb(web, configFile, baseDir),
89
- java: java === undefined ? undefined : normalizeJava(java, configFile),
90
- },
91
- };
92
- }
93
- function normalizeRefresh(value, configFile) {
94
- if (value === undefined)
95
- return undefined;
96
- if (!value || typeof value !== 'object' || Array.isArray(value)) {
97
- throw new CliError(`Lint 配置 refresh 必须是对象: ${configFile}`);
98
- }
99
- const raw = value;
100
- if (raw.enabled === false || raw.on_error !== undefined || raw.onError !== undefined) {
101
- throw new CliError(`Lint 配置 refresh 是强制步骤,不支持 enabled=false 或 onError 配置: ${configFile}`);
102
- }
103
- return {
104
- config: typeof raw.config === 'string' && raw.config.trim()
105
- ? path.resolve(path.dirname(configFile), raw.config)
106
- : undefined,
107
- };
108
- }
109
- function stringArray(value, field, configFile) {
110
- if (value === undefined)
111
- return undefined;
112
- if (!Array.isArray(value) || value.some((item) => typeof item !== 'string' || !item.trim())) {
113
- throw new CliError(`Lint 配置 ${field} 必须是非空字符串数组: ${configFile}`);
114
- }
115
- return value.map((item) => String(item).trim());
116
- }
117
- function normalizeWeb(value, configFile, baseDir) {
118
- if (!value || typeof value !== 'object' || Array.isArray(value)) {
119
- throw new CliError(`languages.web 必须是对象: ${configFile}`);
120
- }
121
- const raw = value;
122
- const legacyExcludeProperties = stringArray(raw.excludePropertys, 'languages.web.excludePropertys', configFile);
123
- const excludeProperties = stringArray(raw.excludeProperties, 'languages.web.excludeProperties', configFile);
124
- return {
125
- enabled: raw.enabled === undefined ? true : raw.enabled === true,
126
- root: typeof raw.root === 'string' && raw.root.trim() ? path.resolve(baseDir, raw.root) : baseDir,
127
- includes: stringArray(raw.includes, 'languages.web.includes', configFile),
128
- excludes: stringArray(raw.excludes, 'languages.web.excludes', configFile),
129
- excludeAscii: raw.excludeAscii === undefined ? true : raw.excludeAscii === true,
130
- intlConfig: typeof raw.intlConfig === 'string' && raw.intlConfig.trim()
131
- ? path.resolve(raw.root && typeof raw.root === 'string'
132
- ? path.resolve(baseDir, raw.root)
133
- : baseDir, raw.intlConfig)
134
- : path.resolve(baseDir, 'intl.json'),
135
- tagMatchMap: normalizeTagMatchMap(raw.tagMatchMap, configFile),
136
- excludeProperties: excludeProperties ?? legacyExcludeProperties ?? [],
137
- excludeTrack: raw.excludeTrack === undefined
138
- ? raw.execludeTrack === true
139
- : raw.excludeTrack === true,
140
- };
141
- }
142
- function normalizeTagMatchMap(value, configFile) {
143
- if (value === undefined)
144
- return undefined;
145
- if (!value || typeof value !== 'object' || Array.isArray(value)) {
146
- throw new CliError(`languages.web.tagMatchMap 必须是对象: ${configFile}`);
147
- }
148
- const result = {};
149
- for (const [key, tags] of Object.entries(value)) {
150
- if (!key.trim())
151
- throw new CliError('languages.web.tagMatchMap 的 pattern 不能为空');
152
- const normalized = stringArray(tags, 'languages.web.tagMatchMap[*]', configFile);
153
- if (normalized)
154
- result[key] = normalized;
155
- }
156
- return result;
157
- }
158
- function normalizeJava(value, configFile) {
159
- if (!value || typeof value !== 'object' || Array.isArray(value)) {
160
- throw new CliError(`languages.java 必须是对象: ${configFile}`);
161
- }
162
- const raw = value;
163
- const root = typeof raw.root === 'string' && raw.root.trim()
164
- ? path.resolve(path.dirname(configFile), raw.root)
165
- : path.dirname(configFile);
166
- return {
167
- enabled: raw.enabled === undefined ? false : raw.enabled === true,
168
- root,
169
- includes: stringArray(raw.includes, 'languages.java.includes', configFile),
170
- excludes: stringArray(raw.excludes, 'languages.java.excludes', configFile),
171
- intlConfig: typeof raw.intlConfig === 'string' && raw.intlConfig.trim()
172
- ? path.resolve(root, raw.intlConfig)
173
- : path.resolve(root, 'intl.json'),
174
- tagMatchMap: normalizeTagMatchMap(raw.tagMatchMap, configFile),
175
- localeMethods: stringArray(raw.localeMethods, 'languages.java.localeMethods', configFile),
176
- checkHardcoded: raw.checkHardcoded === undefined ? true : raw.checkHardcoded === true,
177
- excludeMethods: stringArray(raw.excludeMethods, 'languages.java.excludeMethods', configFile),
178
- };
179
- }
180
- //# sourceMappingURL=lint-config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lint-config.js","sourceRoot":"","sources":["../../../src/lib/lint-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAQrC,MAAM,iBAAiB,GAAG,CAAC,kBAAkB,EAAE,eAAe,CAAU,CAAC;AAEzE,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,QAAgB;IACxD,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACrC,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;QACrD,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;YAClC,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,MAAM,KAAK,OAAO;gBAAE,OAAO,SAAS,CAAC;YACzC,OAAO,GAAG,MAAM,CAAC;QACnB,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,YAAqB,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IAC7E,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;IAC1D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,QAAQ,CAChB,uFAAuF,CACxF,CAAC;IACJ,CAAC;IAED,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,QAAQ,CAAC,gBAAgB,OAAO,CAAC,UAAU,MAAO,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;IACzF,CAAC;IACD,OAAO,mBAAmB,CAAC,GAAG,EAAE,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;AACxF,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,YAAgC,EAChC,GAAW;IAEX,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAC9C,MAAM,aAAa,CAAC,UAAU,CAAC,CAAC;QAChC,OAAO,EAAE,UAAU,EAAE,CAAC;IACxB,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,iBAAiB,EAAE,CAAC;QACrC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACnC,OAAO,EAAE,UAAU,EAAE,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,2CAA2C;QAC7C,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,mBAAmB,CAAC,GAAG,CAAC,CAAC;IACnD,IAAI,CAAC,WAAW;QAAE,OAAO,SAAS,CAAC;IACnC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAA4B,CAAC;QACvF,MAAM,KAAK,GAAG,GAAG,CAAC,KAA4C,CAAC;QAC/D,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QACrE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,UAAkB;IAC7C,IAAI,CAAC;QACH,MAAM,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,QAAQ,CAAC,eAAe,UAAU,EAAE,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,GAAY,EACZ,UAAkB,EAClB,OAAe;IAEf,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,QAAQ,CAAC,iBAAiB,UAAU,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,MAAM,MAAM,GAAG,GAA8B,CAAC;IAC9C,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACnC,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,QAAQ,CAAC,2BAA2B,UAAU,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,YAAY,GAAG,SAAoC,CAAC;IAC1D,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC;IAC7B,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC;IAE/B,OAAO;QACL,OAAO,EAAE,gBAAgB,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC;QACrD,SAAS,EAAE;YACT,GAAG,EAAE,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,CAAC;YAC3E,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC;SACvE;KACF,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAc,EAAE,UAAkB;IAC1D,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,QAAQ,CAAC,0BAA0B,UAAU,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,IAAI,GAAG,CAAC,OAAO,KAAK,KAAK,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACrF,MAAM,IAAI,QAAQ,CAChB,yDAAyD,UAAU,EAAE,CACtE,CAAC;IACJ,CAAC;IACD,OAAO;QACL,MAAM,EAAE,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE;YACzD,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC;YACpD,CAAC,CAAC,SAAS;KACd,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,KAAa,EAAE,UAAkB;IACpE,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAC5F,MAAM,IAAI,QAAQ,CAAC,WAAW,KAAK,gBAAgB,UAAU,EAAE,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,YAAY,CAAC,KAAc,EAAE,UAAkB,EAAE,OAAe;IACvE,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,QAAQ,CAAC,wBAAwB,UAAU,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,MAAM,uBAAuB,GAAG,WAAW,CAAC,GAAG,CAAC,gBAAgB,EAAE,gCAAgC,EAAE,UAAU,CAAC,CAAC;IAChH,MAAM,iBAAiB,GAAG,WAAW,CAAC,GAAG,CAAC,iBAAiB,EAAE,iCAAiC,EAAE,UAAU,CAAC,CAAC;IAC5G,OAAO;QACL,OAAO,EAAE,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,KAAK,IAAI;QAChE,IAAI,EAAE,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO;QACjG,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,wBAAwB,EAAE,UAAU,CAAC;QACzE,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,wBAAwB,EAAE,UAAU,CAAC;QACzE,YAAY,EAAE,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,KAAK,IAAI;QAC/E,UAAU,EAAE,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE;YACrE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ;gBACrD,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC;gBACjC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,UAAU,CAAC;YAC5B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC;QACtC,WAAW,EAAE,oBAAoB,CAAC,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC;QAC9D,iBAAiB,EAAE,iBAAiB,IAAI,uBAAuB,IAAI,EAAE;QACrE,YAAY,EAAE,GAAG,CAAC,YAAY,KAAK,SAAS;YAC1C,CAAC,CAAC,GAAG,CAAC,aAAa,KAAK,IAAI;YAC5B,CAAC,CAAC,GAAG,CAAC,YAAY,KAAK,IAAI;KAC9B,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAC3B,KAAc,EACd,UAAkB;IAElB,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,QAAQ,CAAC,oCAAoC,UAAU,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,MAAM,MAAM,GAA6B,EAAE,CAAC;IAC5C,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;QAC3E,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;YAAE,MAAM,IAAI,QAAQ,CAAC,0CAA0C,CAAC,CAAC;QAChF,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,EAAE,8BAA8B,EAAE,UAAU,CAAC,CAAC;QACjF,IAAI,UAAU;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC;IAC3C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,aAAa,CAAC,KAAc,EAAE,UAAkB;IACvD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,QAAQ,CAAC,yBAAyB,UAAU,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE;QAC1D,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC;QAClD,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7B,OAAO;QACL,OAAO,EAAE,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,KAAK,IAAI;QACjE,IAAI;QACJ,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,yBAAyB,EAAE,UAAU,CAAC;QAC1E,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,yBAAyB,EAAE,UAAU,CAAC;QAC1E,UAAU,EAAE,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE;YACrE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,UAAU,CAAC;YACpC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC;QACnC,WAAW,EAAE,oBAAoB,CAAC,GAAG,CAAC,WAAW,EAAE,UAAU,CAAC;QAC9D,aAAa,EAAE,WAAW,CAAC,GAAG,CAAC,aAAa,EAAE,8BAA8B,EAAE,UAAU,CAAC;QACzF,cAAc,EAAE,GAAG,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,KAAK,IAAI;QACrF,cAAc,EAAE,WAAW,CAAC,GAAG,CAAC,cAAc,EAAE,+BAA+B,EAAE,UAAU,CAAC;KAC7F,CAAC;AACJ,CAAC"}
@@ -1,226 +0,0 @@
1
- import { readFile } from 'node:fs/promises';
2
- import path from 'node:path';
3
- import { minimatch } from 'minimatch';
4
- import { lexAndParse } from 'java-parser';
5
- import { CliError } from './args.js';
6
- import { readIntlCatalog } from './intl-catalog.js';
7
- const RULE_ID = 'eevee/java-i18n';
8
- const JAVA_EXTENSIONS = new Set(['.java']);
9
- const DEFAULT_LOCALE_METHODS = new Set([
10
- 'getLocaleMessage',
11
- 'tryLocaleMessage',
12
- 'getMessage',
13
- ]);
14
- const DEFAULT_EXCLUDED_METHODS = new Set([
15
- // 日志和诊断信息通常不是终端用户文案。
16
- 'trace', 'debug', 'info', 'warn', 'error',
17
- 'println', 'printf', 'format',
18
- // 单测断言不是业务文案。
19
- 'assertEquals', 'assertNotEquals', 'assertTrue', 'assertFalse', 'assertNotNull', 'assertNull',
20
- ]);
21
- function walkCst(node, visit) {
22
- visit(node);
23
- for (const children of Object.values(node.children)) {
24
- for (const element of children) {
25
- if (typeof element === 'object' && element !== null && 'name' in element) {
26
- walkCst(element, visit);
27
- }
28
- }
29
- }
30
- }
31
- function collectNamedNodes(root, name) {
32
- const result = [];
33
- walkCst(root, (node) => {
34
- if (node.name === name)
35
- result.push(node);
36
- });
37
- return result;
38
- }
39
- function tokenBefore(source, offset) {
40
- const prefix = source.slice(0, offset).trimEnd();
41
- const match = /([A-Za-z_$][A-Za-z0-9_$]*)$/.exec(prefix);
42
- return match?.[1];
43
- }
44
- function methodNameForInvocation(source, offset) {
45
- return tokenBefore(source, offset);
46
- }
47
- function firstStringLiteral(node) {
48
- if (!node)
49
- return undefined;
50
- const literals = collectNamedNodes(node, 'literal');
51
- for (const literal of literals) {
52
- const token = literal.children.StringLiteral?.[0];
53
- if (!token)
54
- continue;
55
- const raw = token.image;
56
- const value = raw.length >= 2 ? JSON.parse(raw) : raw;
57
- return { token, value };
58
- }
59
- return undefined;
60
- }
61
- function position(source, token) {
62
- return {
63
- start: { line: token.startLine, column: token.startColumn },
64
- end: { line: token.endLine, column: token.endColumn },
65
- };
66
- }
67
- function excerpt(source, token) {
68
- const lines = source.split(/\r?\n/);
69
- return (lines[token.startLine - 1] ?? '').trimEnd();
70
- }
71
- function isInsideRanges(offset, ranges) {
72
- return ranges.some((range) => offset >= range.start && offset <= range.end);
73
- }
74
- function findRegisteredDiagnostic(context, source, token, key) {
75
- const relativeFile = path.relative(context.root, context.file).replaceAll(path.sep, '/');
76
- const mappedTags = Object.entries(context.options.tagMatchMap)
77
- .find(([pattern]) => minimatch(relativeFile, pattern, { dot: true }))?.[1] ?? [];
78
- if (!mappedTags.length)
79
- return undefined;
80
- if (mappedTags.some((tag) => context.catalog.tagTerms.get(tag)?.has(key)))
81
- return undefined;
82
- const registered = context.catalog.allTerms.has(key);
83
- return {
84
- ruleId: RULE_ID,
85
- severity: 'error',
86
- code: registered ? 'tag-mismatch' : 'unregistered',
87
- language: 'java',
88
- file: context.file,
89
- line: token.startLine,
90
- column: token.startColumn,
91
- endLine: token.endLine,
92
- endColumn: token.endColumn,
93
- message: registered
94
- ? `词条【${key}】 标签不匹配`
95
- : `词条【${key}】 未在平台登记`,
96
- hint: registered
97
- ? '确认 Java 项目对应的 EEVEE tag,或将词条补充到该 tag。'
98
- : '先在 EEVEE 平台登记并同步该词条,再在代码中引用。',
99
- excerpt: source.split(/\r?\n/)[token.startLine - 1]?.trimEnd() ?? '',
100
- fixable: false,
101
- };
102
- }
103
- function checkHardcodedChinese(context, source, cst) {
104
- if (!context.options.checkHardcoded)
105
- return [];
106
- const excludedRanges = [];
107
- const invocationNodes = collectNamedNodes(cst, 'methodInvocationSuffix');
108
- for (const invocation of invocationNodes) {
109
- const method = methodNameForInvocation(source, invocation.location.startOffset);
110
- if (method && context.options.excludeMethods.includes(method)) {
111
- excludedRanges.push({ start: invocation.location.startOffset, end: invocation.location.endOffset });
112
- }
113
- }
114
- for (const annotation of collectNamedNodes(cst, 'annotation')) {
115
- excludedRanges.push({ start: annotation.location.startOffset, end: annotation.location.endOffset });
116
- }
117
- const diagnostics = [];
118
- for (const literal of collectNamedNodes(cst, 'literal')) {
119
- const token = literal.children.StringLiteral?.[0];
120
- if (!token)
121
- continue;
122
- const raw = token.image.slice(1, -1);
123
- let value;
124
- try {
125
- value = JSON.parse(`"${raw}"`);
126
- }
127
- catch {
128
- value = raw;
129
- }
130
- if (!/[\u4e00-\u9fa5]/.test(value))
131
- continue;
132
- if (isInsideRanges(token.startOffset, excludedRanges))
133
- continue;
134
- diagnostics.push({
135
- ruleId: RULE_ID,
136
- severity: 'error',
137
- code: 'missing-intl',
138
- language: 'java',
139
- file: context.file,
140
- line: token.startLine,
141
- column: token.startColumn,
142
- endLine: token.endLine,
143
- endColumn: token.endColumn,
144
- message: `词条【${value}】没有国际化`,
145
- hint: '将用户可见文案改为平台词条 key,并通过 LocaleHandler/MessageSource 输出。',
146
- excerpt: source.split(/\r?\n/)[token.startLine - 1]?.trimEnd() ?? '',
147
- fixable: false,
148
- });
149
- }
150
- return diagnostics;
151
- }
152
- function checkLocaleKeys(context, source, cst) {
153
- const diagnostics = [];
154
- for (const invocation of collectNamedNodes(cst, 'methodInvocationSuffix')) {
155
- const method = methodNameForInvocation(source, invocation.location.startOffset);
156
- if (!method || !context.options.localeMethods.includes(method))
157
- continue;
158
- const firstExpression = invocation.children.argumentList?.[0]?.children.expression?.[0];
159
- const literal = firstStringLiteral(firstExpression);
160
- if (literal) {
161
- const diagnostic = findRegisteredDiagnostic(context, source, literal.token, literal.value);
162
- if (diagnostic)
163
- diagnostics.push(diagnostic);
164
- continue;
165
- }
166
- }
167
- return diagnostics;
168
- }
169
- export async function checkJavaFile(request, options) {
170
- const normalized = {
171
- includes: options.includes ?? ['**/*.java'],
172
- excludes: options.excludes ?? ['**/src/test/**', '**/generated/**'],
173
- intlConfig: options.intlConfig
174
- ? path.resolve(request.root, options.intlConfig)
175
- : path.resolve(request.root, 'intl.json'),
176
- tagMatchMap: options.tagMatchMap ?? {},
177
- localeMethods: options.localeMethods ?? [...DEFAULT_LOCALE_METHODS],
178
- checkHardcoded: options.checkHardcoded ?? true,
179
- excludeMethods: options.excludeMethods ?? [...DEFAULT_EXCLUDED_METHODS],
180
- };
181
- const relativeFile = path.relative(request.root, request.file).replaceAll(path.sep, '/');
182
- if (!normalized.includes.some((pattern) => minimatch(relativeFile, pattern, { dot: true }))) {
183
- return { file: request.file, language: 'java', diagnostics: [] };
184
- }
185
- if (normalized.excludes.some((pattern) => minimatch(relativeFile, pattern, { dot: true }))) {
186
- return { file: request.file, language: 'java', diagnostics: [] };
187
- }
188
- let source;
189
- try {
190
- source = await readFile(request.file, 'utf8');
191
- }
192
- catch (error) {
193
- throw new CliError(`无法读取检查文件 (${request.file}): ${error.message}`);
194
- }
195
- let cst;
196
- try {
197
- cst = lexAndParse(source).cst;
198
- }
199
- catch (error) {
200
- throw new CliError(`Java 解析失败 (${request.file}): ${error.message}`);
201
- }
202
- const context = {
203
- root: request.root,
204
- file: request.file,
205
- options: normalized,
206
- catalog: await readIntlCatalog(request.root, normalized.intlConfig),
207
- };
208
- const diagnostics = [
209
- ...checkLocaleKeys(context, source, cst),
210
- ...checkHardcodedChinese(context, source, cst),
211
- ];
212
- return { file: request.file, language: 'java', diagnostics };
213
- }
214
- export function createJavaAdapter(options) {
215
- return {
216
- id: 'java',
217
- description: 'Java 后端国际化检查(LocaleHandler/MessageSource 词条与硬编码中文)',
218
- supports(file) {
219
- return JAVA_EXTENSIONS.has(path.extname(file).toLowerCase());
220
- },
221
- check(request) {
222
- return checkJavaFile(request, options);
223
- },
224
- };
225
- }
226
- //# sourceMappingURL=lint-java.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lint-java.js","sourceRoot":"","sources":["../../../src/lib/lint-java.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=lint-types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lint-types.js","sourceRoot":"","sources":["../../../src/lib/lint-types.ts"],"names":[],"mappings":""}
@@ -1,183 +0,0 @@
1
- import { readFile } from 'node:fs/promises';
2
- import path from 'node:path';
3
- import { minimatch } from 'minimatch';
4
- import ts from 'typescript';
5
- import { CliError } from './args.js';
6
- import { readIntlCatalog } from './intl-catalog.js';
7
- const WEB_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs']);
8
- const RULE_ID = 'eevee/no-created';
9
- function isCallAncestor(node, sourceFile, functionName) {
10
- let current = node.parent;
11
- while (current && current !== sourceFile) {
12
- if (ts.isCallExpression(current)
13
- && ts.isIdentifier(current.expression)
14
- && current.expression.text === functionName) {
15
- return true;
16
- }
17
- current = current.parent;
18
- }
19
- return false;
20
- }
21
- function relativePattern(root, file) {
22
- return path.relative(root, file).replaceAll(path.sep, '/');
23
- }
24
- function isExcludedParent(node) {
25
- const parent = node.parent;
26
- if (!parent)
27
- return true;
28
- return (ts.isImportDeclaration(parent)
29
- || ts.isCallExpression(parent)
30
- || ts.isExportDeclaration(parent)
31
- || ts.isPropertyAccessExpression(parent)
32
- || ts.isPropertySignature(parent));
33
- }
34
- function propertyKeyIdentifier(node) {
35
- const parent = node.parent;
36
- if (!parent || !ts.isPropertyAssignment(parent) || parent.name === node)
37
- return undefined;
38
- return ts.isIdentifier(parent.name) ? parent.name.text : undefined;
39
- }
40
- function isObjectStringKey(node) {
41
- const parent = node.parent;
42
- return !!parent && ts.isPropertyAssignment(parent) && parent.name === node;
43
- }
44
- function position(sourceFile, node) {
45
- const start = sourceFile.getLineAndCharacterOfPosition(node.getStart(sourceFile));
46
- const end = sourceFile.getLineAndCharacterOfPosition(node.getEnd());
47
- return { start, end };
48
- }
49
- function createDiagnostic(input) {
50
- const { sourceFile, node, value, code, message, hint } = input;
51
- const { start, end } = position(sourceFile, node);
52
- const sourceLine = (sourceFile.text.split(/\r?\n/)[start.line] ?? '').trimEnd();
53
- return {
54
- ruleId: RULE_ID,
55
- severity: 'error',
56
- code,
57
- language: 'web',
58
- file: sourceFile.fileName,
59
- line: start.line + 1,
60
- column: start.character + 1,
61
- endLine: end.line + 1,
62
- endColumn: end.character + 1,
63
- message: `词条【${value}】${message}`,
64
- hint,
65
- excerpt: sourceLine,
66
- // 自动改写 source 会引入 key 命名、导入和运行时 API 的语义假设。
67
- fixable: false,
68
- };
69
- }
70
- function checkString(context, sourceFile, node, rawValue) {
71
- const value = rawValue.trim();
72
- if (!value)
73
- return undefined;
74
- if (isExcludedParent(node))
75
- return undefined;
76
- const relativeFile = relativePattern(context.root, sourceFile.fileName);
77
- const includes = context.options.includes;
78
- if (includes.length && !includes.some((pattern) => minimatch(relativeFile, pattern, { dot: true }))) {
79
- return undefined;
80
- }
81
- const excludes = context.options.excludes;
82
- if (excludes.some((pattern) => minimatch(relativeFile, pattern, { dot: true }))) {
83
- return undefined;
84
- }
85
- if (context.options.excludeAscii && !/[\u4e00-\u9fa5]/.test(value))
86
- return undefined;
87
- const propertyKey = propertyKeyIdentifier(node);
88
- if (propertyKey && context.options.excludeProperties.includes(propertyKey))
89
- return undefined;
90
- if (isObjectStringKey(node))
91
- return undefined;
92
- const insideIntlCall = isCallAncestor(node, sourceFile, 'formatMessage');
93
- if (!insideIntlCall) {
94
- if (context.options.excludeTrack && isCallAncestor(node, sourceFile, 'trackEvent'))
95
- return undefined;
96
- return createDiagnostic({
97
- sourceFile,
98
- node,
99
- value,
100
- code: 'missing-intl',
101
- message: '没有国际化',
102
- hint: '将业务文案接入 formatMessage,并确认对应词条已提交到 EEVEE 平台。',
103
- });
104
- }
105
- const mappedTags = Object.entries(context.options.tagMatchMap)
106
- .find(([pattern]) => minimatch(relativeFile, pattern, { dot: true }))?.[1] ?? [];
107
- if (mappedTags.length && !mappedTags.some((tag) => context.catalog.tagTerms.get(tag)?.has(value))) {
108
- const registered = context.catalog.allTerms.has(value);
109
- return createDiagnostic({
110
- sourceFile,
111
- node,
112
- value,
113
- code: registered ? 'tag-mismatch' : 'unregistered',
114
- message: registered ? ' 标签不匹配' : ' 未在平台登记',
115
- hint: registered
116
- ? '确认文件所属 tag 或将词条补充到 tagMatchMap 配置的对应标签。'
117
- : '先在 EEVEE 平台登记并同步该词条,再在代码中引用。',
118
- });
119
- }
120
- return undefined;
121
- }
122
- function visitNode(context, sourceFile, node, diagnostics) {
123
- if (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node)) {
124
- const diagnostic = checkString(context, sourceFile, node, node.text);
125
- if (diagnostic)
126
- diagnostics.push(diagnostic);
127
- }
128
- else if (ts.isJsxText(node)) {
129
- const diagnostic = checkString(context, sourceFile, node, node.text);
130
- if (diagnostic)
131
- diagnostics.push(diagnostic);
132
- }
133
- else if (ts.isTemplateExpression(node)) {
134
- for (const part of [node.head, ...node.templateSpans.map((span) => span.literal)]) {
135
- const value = part.text.trim();
136
- if (!value)
137
- continue;
138
- const diagnostic = checkString(context, sourceFile, part, value);
139
- if (diagnostic)
140
- diagnostics.push(diagnostic);
141
- }
142
- }
143
- ts.forEachChild(node, (child) => visitNode(context, sourceFile, child, diagnostics));
144
- }
145
- export async function checkWebFile(request, options) {
146
- const normalized = {
147
- includes: options.includes ?? ['**/*'],
148
- excludes: options.excludes ?? [],
149
- excludeAscii: options.excludeAscii ?? true,
150
- intlConfig: options.intlConfig ?? path.join(request.root, 'intl.json'),
151
- tagMatchMap: options.tagMatchMap ?? {},
152
- excludeProperties: options.excludeProperties ?? [],
153
- excludeTrack: options.excludeTrack ?? false,
154
- };
155
- let sourceText;
156
- try {
157
- sourceText = await readFile(request.file, 'utf8');
158
- }
159
- catch (error) {
160
- throw new CliError(`无法读取检查文件 (${request.file}): ${error.message}`);
161
- }
162
- const extension = path.extname(request.file).toLowerCase();
163
- const kind = ['.tsx', '.jsx'].includes(extension) ? ts.ScriptKind.TSX : ts.ScriptKind.TS;
164
- const sourceFile = ts.createSourceFile(request.file, sourceText, ts.ScriptTarget.Latest, true, kind);
165
- const catalog = await readIntlCatalog(request.root, normalized.intlConfig);
166
- const context = { root: request.root, options: normalized, catalog };
167
- const diagnostics = [];
168
- visitNode(context, sourceFile, sourceFile, diagnostics);
169
- return { file: request.file, language: 'web', diagnostics };
170
- }
171
- export function createWebAdapter(options) {
172
- return {
173
- id: 'web',
174
- description: 'Web/TS/JS 国际化检查(迁移自 eslint-plugin-eevee no-created)',
175
- supports(file) {
176
- return WEB_EXTENSIONS.has(path.extname(file).toLowerCase());
177
- },
178
- check(request) {
179
- return checkWebFile(request, options);
180
- },
181
- };
182
- }
183
- //# sourceMappingURL=lint-web.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lint-web.js","sourceRoot":"","sources":["../../../src/lib/lint-web.ts"],"names":[],"mappings":"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"}