@cosui/genui-toolkit 1.0.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 (83) hide show
  1. package/README.md +43 -0
  2. package/bin/genui +2 -0
  3. package/dist/auth.d.ts +3 -0
  4. package/dist/auth.d.ts.map +1 -0
  5. package/dist/auth.js +132 -0
  6. package/dist/auth.js.map +1 -0
  7. package/dist/check/artifact.d.ts +16 -0
  8. package/dist/check/artifact.d.ts.map +1 -0
  9. package/dist/check/artifact.js +209 -0
  10. package/dist/check/artifact.js.map +1 -0
  11. package/dist/check/checker.d.ts +6 -0
  12. package/dist/check/checker.d.ts.map +1 -0
  13. package/dist/check/checker.js +79 -0
  14. package/dist/check/checker.js.map +1 -0
  15. package/dist/check/cli.d.ts +5 -0
  16. package/dist/check/cli.d.ts.map +1 -0
  17. package/dist/check/cli.js +110 -0
  18. package/dist/check/cli.js.map +1 -0
  19. package/dist/check/rules/artifact.d.ts +3 -0
  20. package/dist/check/rules/artifact.d.ts.map +1 -0
  21. package/dist/check/rules/artifact.js +96 -0
  22. package/dist/check/rules/artifact.js.map +1 -0
  23. package/dist/check/rules/common.d.ts +16 -0
  24. package/dist/check/rules/common.d.ts.map +1 -0
  25. package/dist/check/rules/common.js +60 -0
  26. package/dist/check/rules/common.js.map +1 -0
  27. package/dist/check/rules/file.d.ts +3 -0
  28. package/dist/check/rules/file.d.ts.map +1 -0
  29. package/dist/check/rules/file.js +157 -0
  30. package/dist/check/rules/file.js.map +1 -0
  31. package/dist/check/rules/html.d.ts +3 -0
  32. package/dist/check/rules/html.d.ts.map +1 -0
  33. package/dist/check/rules/html.js +414 -0
  34. package/dist/check/rules/html.js.map +1 -0
  35. package/dist/check/rules/index.d.ts +6 -0
  36. package/dist/check/rules/index.d.ts.map +1 -0
  37. package/dist/check/rules/index.js +59 -0
  38. package/dist/check/rules/index.js.map +1 -0
  39. package/dist/check/rules/javascript.d.ts +3 -0
  40. package/dist/check/rules/javascript.d.ts.map +1 -0
  41. package/dist/check/rules/javascript.js +541 -0
  42. package/dist/check/rules/javascript.js.map +1 -0
  43. package/dist/check/rules/svg.d.ts +8 -0
  44. package/dist/check/rules/svg.d.ts.map +1 -0
  45. package/dist/check/rules/svg.js +100 -0
  46. package/dist/check/rules/svg.js.map +1 -0
  47. package/dist/check/types.d.ts +50 -0
  48. package/dist/check/types.d.ts.map +1 -0
  49. package/dist/check/types.js +3 -0
  50. package/dist/check/types.js.map +1 -0
  51. package/dist/cli.d.ts +3 -0
  52. package/dist/cli.d.ts.map +1 -0
  53. package/dist/cli.js +62 -0
  54. package/dist/cli.js.map +1 -0
  55. package/dist/config.d.ts +8 -0
  56. package/dist/config.d.ts.map +1 -0
  57. package/dist/config.js +64 -0
  58. package/dist/config.js.map +1 -0
  59. package/dist/env.d.ts +2 -0
  60. package/dist/env.d.ts.map +1 -0
  61. package/dist/env.js +25 -0
  62. package/dist/env.js.map +1 -0
  63. package/dist/output.d.ts +8 -0
  64. package/dist/output.d.ts.map +1 -0
  65. package/dist/output.js +42 -0
  66. package/dist/output.js.map +1 -0
  67. package/dist/preview.d.ts +21 -0
  68. package/dist/preview.d.ts.map +1 -0
  69. package/dist/preview.js +295 -0
  70. package/dist/preview.js.map +1 -0
  71. package/dist/project.d.ts +5 -0
  72. package/dist/project.d.ts.map +1 -0
  73. package/dist/project.js +22 -0
  74. package/dist/project.js.map +1 -0
  75. package/dist/push.d.ts +2 -0
  76. package/dist/push.d.ts.map +1 -0
  77. package/dist/push.js +322 -0
  78. package/dist/push.js.map +1 -0
  79. package/dist/remote.d.ts +15 -0
  80. package/dist/remote.d.ts.map +1 -0
  81. package/dist/remote.js +73 -0
  82. package/dist/remote.js.map +1 -0
  83. package/package.json +27 -0
@@ -0,0 +1,541 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.javascriptRule = void 0;
37
+ const parse5 = __importStar(require("parse5"));
38
+ const ts = __importStar(require("typescript"));
39
+ const node_util_1 = require("node:util");
40
+ const common_1 = require("./common");
41
+ const JAVASCRIPT_MIME_TYPES = new Set([
42
+ 'application/ecmascript',
43
+ 'application/javascript',
44
+ 'application/x-ecmascript',
45
+ 'application/x-javascript',
46
+ 'text/ecmascript',
47
+ 'text/javascript',
48
+ 'text/javascript1.0',
49
+ 'text/javascript1.1',
50
+ 'text/javascript1.2',
51
+ 'text/javascript1.3',
52
+ 'text/javascript1.4',
53
+ 'text/javascript1.5',
54
+ 'text/jscript',
55
+ 'text/livescript',
56
+ 'text/x-ecmascript',
57
+ 'text/x-javascript',
58
+ ]);
59
+ const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';
60
+ const FORBIDDEN_EMBEDDED_ELEMENTS = new Set([
61
+ 'iframe',
62
+ 'frame',
63
+ 'fencedframe',
64
+ 'object',
65
+ 'embed',
66
+ ]);
67
+ const EMBEDDED_ELEMENT_PATTERN = /<(iframe|frame|fencedframe|object|embed)(?:\s|\/?>)/i;
68
+ function collectBindingNames(name, result) {
69
+ if (ts.isIdentifier(name)) {
70
+ result.add(name.text);
71
+ return;
72
+ }
73
+ for (const element of name.elements) {
74
+ if (!ts.isOmittedExpression(element)) {
75
+ collectBindingNames(element.name, result);
76
+ }
77
+ }
78
+ }
79
+ /**
80
+ * 递归遍历源文件 AST,收集其中声明的所有标识符名称
81
+ *
82
+ * 收集范围包括变量声明、函数参数(含解构绑定)、函数声明、类声明,
83
+ * 以及默认导入、具名导入和命名空间导入的本地名称。
84
+ *
85
+ * @param sourceFile 待分析的 TypeScript/JavaScript 源文件 AST
86
+ * @return 源文件中所有已声明标识符名称的集合
87
+ */
88
+ function collectDeclaredNames(sourceFile) {
89
+ const result = new Map();
90
+ const isLexicalScope = (node) => ts.isSourceFile(node)
91
+ || ts.isFunctionLike(node)
92
+ || ts.isBlock(node)
93
+ || ts.isCaseBlock(node)
94
+ || ts.isCatchClause(node)
95
+ || ts.isForStatement(node)
96
+ || ts.isForInStatement(node)
97
+ || ts.isForOfStatement(node)
98
+ || ts.isClassStaticBlockDeclaration(node)
99
+ || ts.isClassLike(node);
100
+ const getScope = (node, blockScoped) => {
101
+ let current = node;
102
+ while (current
103
+ && current !== sourceFile
104
+ && !(blockScoped ? isLexicalScope(current) : ts.isFunctionLike(current))) {
105
+ current = current.parent;
106
+ }
107
+ return current ?? sourceFile;
108
+ };
109
+ const addNames = (scope, name) => {
110
+ const names = result.get(scope) ?? new Set();
111
+ collectBindingNames(name, names);
112
+ result.set(scope, names);
113
+ };
114
+ const visit = (node) => {
115
+ if (ts.isParameter(node)) {
116
+ addNames(getScope(node.parent, false), node.name);
117
+ }
118
+ else if (ts.isVariableDeclaration(node)) {
119
+ const declarationList = node.parent;
120
+ const blockScoped = ts.isCatchClause(declarationList)
121
+ || ts.isVariableDeclarationList(declarationList)
122
+ && (declarationList.flags & ts.NodeFlags.BlockScoped) !== 0;
123
+ addNames(getScope(node.parent, blockScoped), node.name);
124
+ }
125
+ if ((ts.isFunctionDeclaration(node) || ts.isClassDeclaration(node)) && node.name) {
126
+ addNames(getScope(node.parent, true), node.name);
127
+ }
128
+ if ((ts.isFunctionExpression(node) || ts.isClassExpression(node)) && node.name) {
129
+ addNames(node, node.name);
130
+ }
131
+ if (ts.isImportClause(node) && node.name) {
132
+ addNames(sourceFile, node.name);
133
+ }
134
+ if (ts.isImportSpecifier(node) || ts.isNamespaceImport(node)) {
135
+ addNames(sourceFile, node.name);
136
+ }
137
+ ts.forEachChild(node, visit);
138
+ };
139
+ visit(sourceFile);
140
+ return result;
141
+ }
142
+ /**
143
+ * 解析 JS 源码,构建规则校验所需的上下文
144
+ *
145
+ * @param file 源文件路径,用于问题定位与结果标注
146
+ * @param source JS 源码文本
147
+ * @param fullSource 所属完整源码,用于还原内联脚本位置
148
+ * @param baseOffset 脚本在完整源码中的字符偏移
149
+ * @return 包含源文件 AST、已声明标识符集合与位置信息的校验上下文
150
+ */
151
+ function createContext(file, source, fullSource = source, baseOffset = 0) {
152
+ const sourceFile = ts.createSourceFile(file, source, ts.ScriptTarget.Latest, true, ts.ScriptKind.JS);
153
+ return {
154
+ file,
155
+ sourceFile,
156
+ declaredNames: collectDeclaredNames(sourceFile),
157
+ fullSource,
158
+ baseOffset,
159
+ };
160
+ }
161
+ function walkHtml(node, visitor) {
162
+ visitor(node);
163
+ for (const child of node.childNodes ?? []) {
164
+ walkHtml(child, visitor);
165
+ }
166
+ }
167
+ /**
168
+ * 判断节点是否为引用指定名称的全局标识符
169
+ *
170
+ * @param context 校验上下文,提供已声明标识符集合
171
+ * @param node 待判断的 AST 节点
172
+ * @param name 目标标识符名称
173
+ * @return 节点为该名称的标识符且未在源码中声明时返回 true
174
+ */
175
+ function isGlobalIdentifier(context, node, name) {
176
+ if (!ts.isIdentifier(node) || node.text !== name) {
177
+ return false;
178
+ }
179
+ let current = node;
180
+ while (current) {
181
+ if (current.parent && ts.isWithStatement(current.parent) && current.parent.statement === current) {
182
+ return false;
183
+ }
184
+ if (context.declaredNames.has(current)
185
+ && context.declaredNames.get(current)?.has(name)) {
186
+ return false;
187
+ }
188
+ current = current.parent;
189
+ }
190
+ return true;
191
+ }
192
+ function getStaticString(node) {
193
+ return node && (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node))
194
+ ? node.text
195
+ : null;
196
+ }
197
+ function getStaticPropertyName(node) {
198
+ return ts.isPropertyAccessExpression(node)
199
+ ? node.name.text
200
+ : ts.isElementAccessExpression(node)
201
+ ? getStaticString(node.argumentExpression)
202
+ : null;
203
+ }
204
+ function isGlobalReference(context, node, name) {
205
+ if (isGlobalIdentifier(context, node, name)) {
206
+ return true;
207
+ }
208
+ const object = ts.isPropertyAccessExpression(node) || ts.isElementAccessExpression(node)
209
+ ? node.expression
210
+ : undefined;
211
+ return getStaticPropertyName(node) === name
212
+ && object !== undefined
213
+ && ['window', 'globalThis', 'self'].some(globalName => (isGlobalIdentifier(context, object, globalName)));
214
+ }
215
+ /**
216
+ * 计算 AST 节点在源文件中的位置
217
+ *
218
+ * @param context 校验上下文,提供完整源码和字符偏移
219
+ * @param node 待定位的 AST 节点
220
+ * @return 从 1 开始计数的绝对行列位置
221
+ */
222
+ function getOffsetLocation(context, sourceOffset) {
223
+ const offset = context.baseOffset + sourceOffset;
224
+ const before = context.fullSource.slice(0, offset);
225
+ const lastNewline = before.lastIndexOf('\n');
226
+ return {
227
+ line: before.split('\n').length,
228
+ column: offset - lastNewline,
229
+ };
230
+ }
231
+ function getLocation(context, node) {
232
+ return getOffsetLocation(context, node.getStart(context.sourceFile));
233
+ }
234
+ /**
235
+ * 判断表达式是否指向全局 location 对象
236
+ *
237
+ * @param context 校验上下文,提供已声明标识符集合
238
+ * @param node 待判断的表达式节点
239
+ * @returns 表达式为未在源码中声明的 location 或 window.location 时返回 true
240
+ */
241
+ function isLocation(context, node) {
242
+ if (isGlobalIdentifier(context, node, 'location')) {
243
+ return true;
244
+ }
245
+ return ts.isPropertyAccessExpression(node)
246
+ && node.name.text === 'location'
247
+ && ['window', 'globalThis', 'self', 'document'].some(name => (isGlobalIdentifier(context, node.expression, name)));
248
+ }
249
+ /**
250
+ * 从 HTML 源码中提取内联脚本,并为每段脚本构建检查上下文
251
+ *
252
+ * @param file 所属产物文件,用于在诊断结果中标记文件路径
253
+ * @param source HTML 源码文本
254
+ * @returns 每段内联脚本对应的检查上下文列表
255
+ */
256
+ function inlineScripts(file, source) {
257
+ const document = parse5.parse(source, { sourceCodeLocationInfo: true });
258
+ const contexts = [];
259
+ walkHtml(document, node => {
260
+ if ((node.tagName ?? '').toLowerCase() !== 'script'
261
+ || node.namespaceURI !== 'http://www.w3.org/1999/xhtml') {
262
+ return;
263
+ }
264
+ const attrs = new Map((node.attrs ?? []).map(attribute => [attribute.name.toLowerCase(), attribute.value]));
265
+ const type = (attrs.get('type') ?? '').trim().toLowerCase();
266
+ const start = node.sourceCodeLocation?.startTag?.endOffset;
267
+ const end = node.sourceCodeLocation?.endTag?.startOffset;
268
+ let isJavaScript = !type || type === 'module';
269
+ if (type && type !== 'module') {
270
+ try {
271
+ isJavaScript = JAVASCRIPT_MIME_TYPES.has(new node_util_1.MIMEType(type).essence);
272
+ }
273
+ catch {
274
+ isJavaScript = false;
275
+ }
276
+ }
277
+ if (attrs.has('src')
278
+ || !isJavaScript
279
+ || start === undefined || end === undefined || end <= start) {
280
+ return;
281
+ }
282
+ contexts.push(createContext(file.path, source.slice(start, end), source, start));
283
+ });
284
+ return contexts;
285
+ }
286
+ function isExternalTarget(value) {
287
+ const target = value.trim();
288
+ return target.length > 0 && !target.startsWith('#') && !target.startsWith('?');
289
+ }
290
+ /**
291
+ * 检查脚本中的动态代码执行用法,覆盖 eval、Function 构造器
292
+ *
293
+ * @param context 当前脚本的检查上下文,用于判断标识符是否为全局引用并定位诊断位置
294
+ * @param node 待检查的语法树节点
295
+ * @returns 命中动态代码用法时返回对应的 error 级问题,未命中返回 null
296
+ */
297
+ function checkDynamicCode(context, node) {
298
+ if (ts.isCallExpression(node)) {
299
+ if (isGlobalReference(context, node.expression, 'eval')) {
300
+ return {
301
+ ...getLocation(context, node),
302
+ severity: 'error',
303
+ message: '代码使用了 eval,请改写为普通 JavaScript 逻辑',
304
+ };
305
+ }
306
+ // Function 构造器
307
+ if (isGlobalReference(context, node.expression, 'Function')) {
308
+ return {
309
+ ...getLocation(context, node),
310
+ severity: 'error',
311
+ message: '代码使用了 Function 构造器,请改用普通函数声明',
312
+ };
313
+ }
314
+ // setTimeout / setInterval 动态插入代码
315
+ const timerName = ['setTimeout', 'setInterval'].find(name => (isGlobalReference(context, node.expression, name)));
316
+ if (timerName && getStaticString(node.arguments[0]) !== null) {
317
+ return {
318
+ ...getLocation(context, node),
319
+ severity: 'error',
320
+ message: `${timerName} 使用了字符串参数,请改为传入函数`,
321
+ };
322
+ }
323
+ // document.write / writeHTML
324
+ if ((ts.isPropertyAccessExpression(node.expression) || ts.isElementAccessExpression(node.expression))
325
+ && ['write', 'writeln'].includes(getStaticPropertyName(node.expression) ?? '')
326
+ && isGlobalReference(context, node.expression.expression, 'document')) {
327
+ const markup = node.arguments.map(argument => getStaticString(argument) ?? '');
328
+ if (markup.some(value => /<script(?:\s|\/?>)/i.test(value))) {
329
+ return {
330
+ ...getLocation(context, node),
331
+ severity: 'error',
332
+ message: '代码中使用 document.write 写入 <script> 标签,请改为引用代码包内的 JS 文件',
333
+ };
334
+ }
335
+ const embeddedTag = markup
336
+ .map(value => EMBEDDED_ELEMENT_PATTERN.exec(value)?.[1]?.toLowerCase())
337
+ .find(Boolean);
338
+ if (embeddedTag) {
339
+ return {
340
+ ...getLocation(context, node),
341
+ severity: 'error',
342
+ message: `代码中使用 document.write 写入 <${embeddedTag}> 标签,请将内容直接写在页面中`,
343
+ };
344
+ }
345
+ }
346
+ // document.createElement 创建嵌入元素
347
+ const documentMethod = getStaticPropertyName(node.expression);
348
+ if ((ts.isPropertyAccessExpression(node.expression) || ts.isElementAccessExpression(node.expression))
349
+ && ['createElement', 'createElementNS'].includes(documentMethod ?? '')
350
+ && isGlobalReference(context, node.expression.expression, 'document')) {
351
+ const tagName = getStaticString(node.arguments[documentMethod === 'createElement' ? 0 : 1])?.trim().toLowerCase();
352
+ const namespace = documentMethod === 'createElementNS'
353
+ ? getStaticString(node.arguments[0])
354
+ : HTML_NAMESPACE;
355
+ if (tagName
356
+ && namespace === HTML_NAMESPACE
357
+ && FORBIDDEN_EMBEDDED_ELEMENTS.has(tagName)) {
358
+ return {
359
+ ...getLocation(context, node),
360
+ severity: 'error',
361
+ message: `代码中使用 document.${documentMethod} 创建 <${tagName}> 标签,请将内容直接写在页面中`,
362
+ };
363
+ }
364
+ }
365
+ }
366
+ // new Function
367
+ if (ts.isNewExpression(node) && isGlobalReference(context, node.expression, 'Function')) {
368
+ return {
369
+ ...getLocation(context, node),
370
+ severity: 'error',
371
+ message: '代码使用了 new Function,请改用普通函数声明',
372
+ };
373
+ }
374
+ return null;
375
+ }
376
+ /**
377
+ * 禁止 WebRTC
378
+ * @param context 当前脚本的检查上下文,用于判断标识符是否为全局引用并定位诊断位置
379
+ * @param node 待检查的语法树节点
380
+ * @returns 命中 WebRTC 用法时返回对应的 error 级问题,未命中返回 null
381
+ */
382
+ function checkWebRtc(context, node) {
383
+ if (!ts.isNewExpression(node)
384
+ || !['RTCPeerConnection', 'webkitRTCPeerConnection'].some(name => (isGlobalReference(context, node.expression, name)))) {
385
+ return null;
386
+ }
387
+ return {
388
+ ...getLocation(context, node),
389
+ severity: 'error',
390
+ message: '代码使用了 RTCPeerConnection,请删除该逻辑并仅使用代码包内资源',
391
+ };
392
+ }
393
+ /**
394
+ * 禁止 Worker/SharedWorker 构造与 Service Worker 注册
395
+ *
396
+ * @param context 当前脚本的检查上下文,用于判断标识符是否为全局引用并定位诊断位置
397
+ * @param node 待检查的语法树节点
398
+ * @returns 命中后台脚本用法时返回对应的 warning 级问题,未命中返回 null
399
+ */
400
+ function checkBackground(context, node) {
401
+ if (ts.isNewExpression(node) && (isGlobalReference(context, node.expression, 'Worker')
402
+ || isGlobalReference(context, node.expression, 'SharedWorker'))) {
403
+ return {
404
+ ...getLocation(context, node),
405
+ severity: 'warning',
406
+ message: '代码使用了 Worker 或 SharedWorker,请改用当前页面的 JavaScript 逻辑',
407
+ };
408
+ }
409
+ if (!ts.isCallExpression(node) || !ts.isPropertyAccessExpression(node.expression)) {
410
+ return null;
411
+ }
412
+ const call = node.expression;
413
+ if (call.name.text === 'register'
414
+ && ts.isPropertyAccessExpression(call.expression)
415
+ && call.expression.name.text === 'serviceWorker'
416
+ && isGlobalReference(context, call.expression.expression, 'navigator')) {
417
+ return {
418
+ ...getLocation(context, node),
419
+ severity: 'warning',
420
+ message: '代码注册了 Service Worker,请删除该逻辑',
421
+ };
422
+ }
423
+ return null;
424
+ }
425
+ /**
426
+ * 禁止 window.open、location 跳转方法调用与 location 属性赋值
427
+ *
428
+ * @param context 当前脚本的检查上下文,用于判断标识符是否为全局引用并定位诊断位置
429
+ * @param node 待检查的语法树节点
430
+ * @returns 命中导航违规用法时返回对应的 error 级问题,未命中返回 null
431
+ */
432
+ function checkNavigation(context, node) {
433
+ if (ts.isCallExpression(node) && isGlobalReference(context, node.expression, 'open')) {
434
+ return {
435
+ ...getLocation(context, node),
436
+ severity: 'error',
437
+ message: '代码尝试打开新页面,请删除 window.open 或 open 调用',
438
+ };
439
+ }
440
+ if (ts.isCallExpression(node) && ts.isPropertyAccessExpression(node.expression)) {
441
+ const call = node.expression;
442
+ const target = getStaticString(node.arguments[0]);
443
+ if (['assign', 'replace'].includes(call.name.text)
444
+ && isLocation(context, call.expression)
445
+ && target !== null
446
+ && isExternalTarget(target)) {
447
+ return {
448
+ ...getLocation(context, node),
449
+ severity: 'error',
450
+ message: `代码使用了 location.${call.name.text} 跳转,请改为页面内状态切换或 Hash 路由`,
451
+ };
452
+ }
453
+ }
454
+ if (ts.isBinaryExpression(node)
455
+ && node.operatorToken.kind >= ts.SyntaxKind.FirstAssignment
456
+ && node.operatorToken.kind <= ts.SyntaxKind.LastAssignment) {
457
+ const target = getStaticString(node.right);
458
+ if (target === null || !isExternalTarget(target)) {
459
+ return null;
460
+ }
461
+ if (isLocation(context, node.left)) {
462
+ return {
463
+ ...getLocation(context, node),
464
+ severity: 'error',
465
+ message: '代码修改了 location,请改用 location.hash 或页面内状态',
466
+ };
467
+ }
468
+ if (ts.isPropertyAccessExpression(node.left)
469
+ && !['hash', 'search'].includes(node.left.name.text)
470
+ && isLocation(context, node.left.expression)) {
471
+ return {
472
+ ...getLocation(context, node),
473
+ severity: 'error',
474
+ message: `代码修改了 location.${node.left.name.text},请改用 location.hash 或页面内状态`,
475
+ };
476
+ }
477
+ }
478
+ return null;
479
+ }
480
+ /**
481
+ * 遍历脚本语法树,对每个节点执行全部检查项并汇总诊断结果
482
+ *
483
+ * @param context 待检查脚本的上下文,包含文件路径与解析后的语法树
484
+ * @returns 检查命中的诊断结果列表,每项都会补全所属文件路径
485
+ */
486
+ function inspect(context) {
487
+ const sourceFile = context.sourceFile;
488
+ const problems = (sourceFile.parseDiagnostics ?? []).map(diagnostic => ({
489
+ ...getOffsetLocation(context, diagnostic.start ?? 0),
490
+ severity: 'error',
491
+ message: 'JavaScript 语法错误,请修正后重新提交',
492
+ }));
493
+ if (problems.length > 0) {
494
+ return (0, common_1.toDiagnostics)('javascript', problems.map(item => ({
495
+ file: context.file,
496
+ ...item,
497
+ })));
498
+ }
499
+ const checks = [
500
+ checkDynamicCode,
501
+ checkBackground,
502
+ checkNavigation,
503
+ checkWebRtc,
504
+ ];
505
+ const visit = (node) => {
506
+ for (const check of checks) {
507
+ const result = check(context, node);
508
+ if (result) {
509
+ problems.push(result);
510
+ }
511
+ }
512
+ ts.forEachChild(node, visit);
513
+ };
514
+ visit(context.sourceFile);
515
+ return (0, common_1.toDiagnostics)('javascript', problems.map(item => ({
516
+ file: context.file,
517
+ ...item,
518
+ })));
519
+ }
520
+ exports.javascriptRule = {
521
+ id: 'javascript',
522
+ async check({ artifact }) {
523
+ const diagnostics = [];
524
+ for (const file of artifact.files.values()) {
525
+ const extension = file.path.toLowerCase();
526
+ if (!extension.endsWith('.js')
527
+ && !extension.endsWith('.html')) {
528
+ continue;
529
+ }
530
+ const source = await (0, common_1.readUtf8)((0, common_1.toFile)(file));
531
+ const contexts = extension.endsWith('.html')
532
+ ? inlineScripts(file, source)
533
+ : [createContext(file.path, source)];
534
+ for (const context of contexts) {
535
+ diagnostics.push(...inspect(context));
536
+ }
537
+ }
538
+ return diagnostics;
539
+ },
540
+ };
541
+ //# sourceMappingURL=javascript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"javascript.js","sourceRoot":"","sources":["../../../src/check/rules/javascript.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { ArtifactFile, Diagnostic, Rule } from '../types';
2
+ /**
3
+ * 检查 ZIP 中独立的 .svg 资源;HTML 内联 SVG 由 htmlRule 检查
4
+ * 禁止 SVG 脚本、行内事件和 JavaScript URI
5
+ */
6
+ export declare function checkSvg(file: ArtifactFile): Diagnostic[];
7
+ export declare const svgRule: Rule;
8
+ //# sourceMappingURL=svg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svg.d.ts","sourceRoot":"","sources":["../../../src/check/rules/svg.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,YAAY,EAAE,UAAU,EAAE,IAAI,EAAC,MAAM,UAAU,CAAC;AA6B7D;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,UAAU,EAAE,CAsCzD;AAED,eAAO,MAAM,OAAO,EAAE,IAOrB,CAAC"}