@atlisp/lint 0.1.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 (86) hide show
  1. package/README.md +150 -0
  2. package/atlisp-lint.default.json +52 -0
  3. package/bin/atlisp-lint +2 -0
  4. package/dist/atlisp-lint.default.json +52 -0
  5. package/dist/checks/bare-names.d.ts +3 -0
  6. package/dist/checks/bare-names.d.ts.map +1 -0
  7. package/dist/checks/bare-names.js +28 -0
  8. package/dist/checks/bare-names.js.map +1 -0
  9. package/dist/checks/cl-syntax.d.ts +3 -0
  10. package/dist/checks/cl-syntax.d.ts.map +1 -0
  11. package/dist/checks/cl-syntax.js +24 -0
  12. package/dist/checks/cl-syntax.js.map +1 -0
  13. package/dist/checks/dangerous-calls.d.ts +3 -0
  14. package/dist/checks/dangerous-calls.d.ts.map +1 -0
  15. package/dist/checks/dangerous-calls.js +43 -0
  16. package/dist/checks/dangerous-calls.js.map +1 -0
  17. package/dist/checks/encoding.d.ts +3 -0
  18. package/dist/checks/encoding.d.ts.map +1 -0
  19. package/dist/checks/encoding.js +33 -0
  20. package/dist/checks/encoding.js.map +1 -0
  21. package/dist/checks/module-reg.d.ts +3 -0
  22. package/dist/checks/module-reg.d.ts.map +1 -0
  23. package/dist/checks/module-reg.js +25 -0
  24. package/dist/checks/module-reg.js.map +1 -0
  25. package/dist/checks/namespace-header.d.ts +3 -0
  26. package/dist/checks/namespace-header.d.ts.map +1 -0
  27. package/dist/checks/namespace-header.js +28 -0
  28. package/dist/checks/namespace-header.js.map +1 -0
  29. package/dist/checks/open-close.d.ts +3 -0
  30. package/dist/checks/open-close.d.ts.map +1 -0
  31. package/dist/checks/open-close.js +22 -0
  32. package/dist/checks/open-close.js.map +1 -0
  33. package/dist/checks/parens.d.ts +3 -0
  34. package/dist/checks/parens.d.ts.map +1 -0
  35. package/dist/checks/parens.js +42 -0
  36. package/dist/checks/parens.js.map +1 -0
  37. package/dist/checks/token-in-url.d.ts +3 -0
  38. package/dist/checks/token-in-url.d.ts.map +1 -0
  39. package/dist/checks/token-in-url.js +23 -0
  40. package/dist/checks/token-in-url.js.map +1 -0
  41. package/dist/checks/trailing-ws.d.ts +3 -0
  42. package/dist/checks/trailing-ws.d.ts.map +1 -0
  43. package/dist/checks/trailing-ws.js +19 -0
  44. package/dist/checks/trailing-ws.js.map +1 -0
  45. package/dist/checks/vlax.d.ts +3 -0
  46. package/dist/checks/vlax.d.ts.map +1 -0
  47. package/dist/checks/vlax.js +19 -0
  48. package/dist/checks/vlax.js.map +1 -0
  49. package/dist/config.d.ts +4 -0
  50. package/dist/config.d.ts.map +1 -0
  51. package/dist/config.js +128 -0
  52. package/dist/config.js.map +1 -0
  53. package/dist/formatters.d.ts +4 -0
  54. package/dist/formatters.d.ts.map +1 -0
  55. package/dist/formatters.js +33 -0
  56. package/dist/formatters.js.map +1 -0
  57. package/dist/index.d.ts +2 -0
  58. package/dist/index.d.ts.map +1 -0
  59. package/dist/index.js +236 -0
  60. package/dist/index.js.map +1 -0
  61. package/dist/lib/lint-sbcl.lisp +126 -0
  62. package/dist/locale.d.ts +4 -0
  63. package/dist/locale.d.ts.map +1 -0
  64. package/dist/locale.js +91 -0
  65. package/dist/locale.js.map +1 -0
  66. package/dist/runner.d.ts +3 -0
  67. package/dist/runner.d.ts.map +1 -0
  68. package/dist/runner.js +113 -0
  69. package/dist/runner.js.map +1 -0
  70. package/dist/sbcl.d.ts +3 -0
  71. package/dist/sbcl.d.ts.map +1 -0
  72. package/dist/sbcl.js +121 -0
  73. package/dist/sbcl.js.map +1 -0
  74. package/dist/stub-packages.json +41 -0
  75. package/dist/types.d.ts +60 -0
  76. package/dist/types.d.ts.map +1 -0
  77. package/dist/types.js +3 -0
  78. package/dist/types.js.map +1 -0
  79. package/dist/utils.d.ts +12 -0
  80. package/dist/utils.d.ts.map +1 -0
  81. package/dist/utils.js +104 -0
  82. package/dist/utils.js.map +1 -0
  83. package/lib/lint-sbcl.lisp +126 -0
  84. package/package.json +35 -0
  85. package/pre-commit/hook.sh +4 -0
  86. package/stub-packages.json +41 -0
package/README.md ADDED
@@ -0,0 +1,150 @@
1
+ # @atlisp/lint
2
+
3
+ AutoLISP 静态分析工具 — 括号匹配、安全检查、编码检测、命名规范、SBCL 语法校验。
4
+
5
+ ## 安装
6
+
7
+ ```bash
8
+ npm install -g @atlisp/lint
9
+ ```
10
+
11
+ 需要 Node.js >= 18。SBCL 语法校验为可选功能,如需启用请安装 [SBCL](https://www.sbcl.org)。
12
+
13
+ ## 快速开始
14
+
15
+ ```bash
16
+ # 在项目目录下初始化配置文件
17
+ npx @atlisp/lint --init
18
+
19
+ # 运行检查
20
+ npx @atlisp/lint
21
+
22
+ # 输出 JSON 格式
23
+ npx @atlisp/lint --format json
24
+ ```
25
+
26
+ ## CLI 选项
27
+
28
+ ```
29
+ --src <dir> 指定源码目录(可多次使用)
30
+ --test <dir> 指定测试目录(可多次使用)
31
+ --config <path> 指定配置文件路径
32
+ --staged 仅检查 git 暂存区中的 .lsp 文件
33
+ --format <format> 输出格式:default(默认)| json
34
+ --init 在当前目录生成 atlisp-lint.json
35
+ --install-hook 安装 git pre-commit hook
36
+ ```
37
+
38
+ ## 检查规则
39
+
40
+ ### 阶段 1:静态检查
41
+
42
+ | 规则 | 默认 | 说明 |
43
+ |------|------|------|
44
+ | `parens` | error | 括号不匹配 |
45
+ | `encoding` | error | 非 UTF-8 编码 |
46
+ | `cl_syntax` | warn | Common Lisp 特有语法(如 `&key`) |
47
+ | `quit_exit` | error | 调用 `quit` / `exit`(会终止 CAD) |
48
+ | `command_shell` | error | 调用 `command` 执行 shell |
49
+ | `startapp` | warn | 调用 `startapp` 启动外部程序 |
50
+ | `vl_registry_write` | warn | 写注册表 |
51
+ | `vlax_without_loading` | warn | 使用 `vlax-*` 前未调用 `vl-load-com` |
52
+ | `token_in_url` | warn | URL 中包含 `token=`(凭据泄露) |
53
+ | `open_without_close` | warn | open/close 数量不匹配(资源泄露) |
54
+ | `bare_function_names` | warn | defun 缺少命名空间前缀 |
55
+ | `trailing_whitespace` | warn | 行尾多余空格 |
56
+ | `module_registration` | off | 模块文件未注册到 `*modules*` |
57
+ | `namespace_header` | off | 缺少 `(in-package ...)` 头 |
58
+
59
+ ### 阶段 2:SBCL 语法校验
60
+
61
+ 调用 SBCL 对每个 `.lsp` 文件做 Common Lisp reader 级别的深度解析:
62
+
63
+ - 语法错误 — reader 无法解析的内容
64
+ - 符号未找到 — 未注册到 stub packages 中的符号
65
+ - CL-ism — `#(`、`#\`、`#.` 等 AutoLISP 无效语法
66
+ - defmacro — 默认不允许,除非文件在允许列表中
67
+
68
+ ## 配置文件
69
+
70
+ `atlisp-lint.json`:
71
+
72
+ ```json
73
+ {
74
+ "locale": "zh",
75
+ "source": {
76
+ "globs": ["**/*.lsp"],
77
+ "exclude": ["**/node_modules/**", "**/vendor/**", "**/.git/**"]
78
+ },
79
+ "checks": {
80
+ "parens": "error",
81
+ "encoding": "error",
82
+ "cl_syntax": "warn",
83
+ "quit_exit": "error",
84
+ "command_shell": "error",
85
+ "startapp": "warn",
86
+ "vl_registry_write": "warn",
87
+ "vlax_without_loading": "warn",
88
+ "token_in_url": "warn",
89
+ "open_without_close": "warn",
90
+ "bare_function_names": "warn",
91
+ "trailing_whitespace": "warn",
92
+ "module_registration": "off",
93
+ "namespace_header": "off"
94
+ },
95
+ "cl_syntax": {
96
+ "keywords": ["&key"]
97
+ },
98
+ "dangerous_calls": {
99
+ "quit": "error",
100
+ "exit": "error",
101
+ "command_shell": "error",
102
+ "startapp": "warn",
103
+ "vl_registry_write": "warn"
104
+ },
105
+ "bare_function_names": {
106
+ "allowlist": ["T", "nil"],
107
+ "namespace_pattern": "^[a-z]+:"
108
+ },
109
+ "sbcl": {
110
+ "walk_exclude": [".vscode", "vendor", ".git"],
111
+ "defmacro_allow_files": ["compat-cl"]
112
+ }
113
+ }
114
+ ```
115
+
116
+ ## 多语言
117
+
118
+ 支持中文和英文,通过配置文件的 `locale` 字段切换:
119
+
120
+ ```json
121
+ { "locale": "zh" } // 中文(默认)
122
+ { "locale": "en" } // English
123
+ ```
124
+
125
+ ## Git 集成
126
+
127
+ ```bash
128
+ # 安装 pre-commit hook,每次提交前自动检查暂存文件
129
+ npx @atlisp/lint --install-hook
130
+
131
+ # 手动检查暂存文件
132
+ npx @atlisp/lint --staged
133
+ ```
134
+
135
+ ## 开发
136
+
137
+ ```bash
138
+ # 安装依赖
139
+ npm install
140
+
141
+ # 编译
142
+ npm run build
143
+
144
+ # 测试
145
+ npm test
146
+ ```
147
+
148
+ ## 许可
149
+
150
+ MIT
@@ -0,0 +1,52 @@
1
+ {
2
+ "locale": "zh",
3
+ "source": {
4
+ "globs": ["**/*.lsp"],
5
+ "exclude": ["**/node_modules/**", "**/vendor/**", "**/.git/**"]
6
+ },
7
+ "checks": {
8
+ "parens": "error",
9
+ "encoding": "error",
10
+ "cl_syntax": "warn",
11
+ "quit_exit": "error",
12
+ "command_shell": "error",
13
+ "startapp": "warn",
14
+ "vl_registry_write": "warn",
15
+ "vlax_without_loading": "warn",
16
+ "token_in_url": "warn",
17
+ "open_without_close": "warn",
18
+ "bare_function_names": "warn",
19
+ "trailing_whitespace": "warn",
20
+ "module_registration": "off",
21
+ "namespace_header": "off"
22
+ },
23
+ "cl_syntax": {
24
+ "keywords": ["&key"]
25
+ },
26
+ "dangerous_calls": {
27
+ "quit": "error",
28
+ "exit": "error",
29
+ "command_shell": "error",
30
+ "startapp": "warn",
31
+ "vl_registry_write": "warn"
32
+ },
33
+ "module_registration": {
34
+ "severity": "off",
35
+ "patterns": [],
36
+ "dirs": ["modules"]
37
+ },
38
+ "namespace_header": {
39
+ "severity": "off",
40
+ "package": "",
41
+ "deps": [],
42
+ "search_lines": 15
43
+ },
44
+ "bare_function_names": {
45
+ "allowlist": ["T", "nil"],
46
+ "namespace_pattern": "^[a-z]+:"
47
+ },
48
+ "sbcl": {
49
+ "walk_exclude": [".vscode", "vendor", ".git"],
50
+ "defmacro_allow_files": ["compat-cl"]
51
+ }
52
+ }
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ require('../dist/index.js').main();
@@ -0,0 +1,52 @@
1
+ {
2
+ "locale": "zh",
3
+ "source": {
4
+ "globs": ["**/*.lsp"],
5
+ "exclude": ["**/node_modules/**", "**/vendor/**", "**/.git/**"]
6
+ },
7
+ "checks": {
8
+ "parens": "error",
9
+ "encoding": "error",
10
+ "cl_syntax": "warn",
11
+ "quit_exit": "error",
12
+ "command_shell": "error",
13
+ "startapp": "warn",
14
+ "vl_registry_write": "warn",
15
+ "vlax_without_loading": "warn",
16
+ "token_in_url": "warn",
17
+ "open_without_close": "warn",
18
+ "bare_function_names": "warn",
19
+ "trailing_whitespace": "warn",
20
+ "module_registration": "off",
21
+ "namespace_header": "off"
22
+ },
23
+ "cl_syntax": {
24
+ "keywords": ["&key"]
25
+ },
26
+ "dangerous_calls": {
27
+ "quit": "error",
28
+ "exit": "error",
29
+ "command_shell": "error",
30
+ "startapp": "warn",
31
+ "vl_registry_write": "warn"
32
+ },
33
+ "module_registration": {
34
+ "severity": "off",
35
+ "patterns": [],
36
+ "dirs": ["modules"]
37
+ },
38
+ "namespace_header": {
39
+ "severity": "off",
40
+ "package": "",
41
+ "deps": [],
42
+ "search_lines": 15
43
+ },
44
+ "bare_function_names": {
45
+ "allowlist": ["T", "nil"],
46
+ "namespace_pattern": "^[a-z]+:"
47
+ },
48
+ "sbcl": {
49
+ "walk_exclude": [".vscode", "vendor", ".git"],
50
+ "defmacro_allow_files": ["compat-cl"]
51
+ }
52
+ }
@@ -0,0 +1,3 @@
1
+ import { Issue } from '../types';
2
+ export declare function checkBareFunctionNames(content: string, file: string, allowlist: string[], namespacePattern: string): Issue[];
3
+ //# sourceMappingURL=bare-names.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bare-names.d.ts","sourceRoot":"","sources":["../../src/checks/bare-names.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAIjC,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,gBAAgB,EAAE,MAAM,GAC3E,KAAK,EAAE,CAoBT"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkBareFunctionNames = checkBareFunctionNames;
4
+ const utils_1 = require("../utils");
5
+ const locale_1 = require("../locale");
6
+ function checkBareFunctionNames(content, file, allowlist, namespacePattern) {
7
+ const issues = [];
8
+ const nsRegex = new RegExp(namespacePattern);
9
+ for (const { lineno, stripped } of (0, utils_1.codeLines)(content)) {
10
+ const s = stripped.trim();
11
+ const m = s.match(/\(defun\s+(\S+)/);
12
+ if (!m)
13
+ continue;
14
+ const name = m[1];
15
+ if (allowlist.includes(name))
16
+ continue;
17
+ if (name.includes('/'))
18
+ continue; // local: defun foo/bar
19
+ if (!nsRegex.test(name) && !name.includes(':')) {
20
+ issues.push({
21
+ file, line: lineno, severity: 'warn', rule: 'bare_function_names',
22
+ message: (0, locale_1.t)('bare_function_names', name),
23
+ });
24
+ }
25
+ }
26
+ return issues;
27
+ }
28
+ //# sourceMappingURL=bare-names.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bare-names.js","sourceRoot":"","sources":["../../src/checks/bare-names.ts"],"names":[],"mappings":";;AAIA,wDAsBC;AAzBD,oCAAqC;AACrC,sCAA8B;AAE9B,SAAgB,sBAAsB,CACpC,OAAe,EAAE,IAAY,EAAE,SAAmB,EAAE,gBAAwB;IAE5E,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAE7C,KAAK,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,IAAA,iBAAS,EAAC,OAAO,CAAC,EAAE,CAAC;QACtD,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACrC,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAClB,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,SAAS;QACvC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,SAAS,CAAC,uBAAuB;QACzD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB;gBACjE,OAAO,EAAE,IAAA,UAAC,EAAC,qBAAqB,EAAE,IAAI,CAAC;aACxC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Issue } from '../types';
2
+ export declare function checkClSyntax(content: string, file: string, keywords: string[]): Issue[];
3
+ //# sourceMappingURL=cl-syntax.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cl-syntax.d.ts","sourceRoot":"","sources":["../../src/checks/cl-syntax.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAIjC,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,CAgBxF"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkClSyntax = checkClSyntax;
4
+ const utils_1 = require("../utils");
5
+ const locale_1 = require("../locale");
6
+ function checkClSyntax(content, file, keywords) {
7
+ const issues = [];
8
+ for (const { lineno, stripped } of (0, utils_1.codeLines)(content)) {
9
+ const s = stripped.trim();
10
+ if (!s)
11
+ continue;
12
+ for (const kw of keywords) {
13
+ const idx = s.indexOf(kw);
14
+ if (idx >= 0 && (idx === 0 || !/[a-zA-Z]/.test(s[idx - 1]))) {
15
+ issues.push({
16
+ file, line: lineno, severity: 'warn', rule: 'cl_syntax',
17
+ message: (0, locale_1.t)('cl_syntax', kw),
18
+ });
19
+ }
20
+ }
21
+ }
22
+ return issues;
23
+ }
24
+ //# sourceMappingURL=cl-syntax.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cl-syntax.js","sourceRoot":"","sources":["../../src/checks/cl-syntax.ts"],"names":[],"mappings":";;AAIA,sCAgBC;AAnBD,oCAAqC;AACrC,sCAA8B;AAE9B,SAAgB,aAAa,CAAC,OAAe,EAAE,IAAY,EAAE,QAAkB;IAC7E,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,KAAK,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,IAAA,iBAAS,EAAC,OAAO,CAAC,EAAE,CAAC;QACtD,MAAM,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC1B,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC1B,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5D,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW;oBACvD,OAAO,EAAE,IAAA,UAAC,EAAC,WAAW,EAAE,EAAE,CAAC;iBAC5B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Issue, DangerousCallsConfig } from '../types';
2
+ export declare function checkDangerousCalls(content: string, file: string, config: DangerousCallsConfig): Issue[];
3
+ //# sourceMappingURL=dangerous-calls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dangerous-calls.d.ts","sourceRoot":"","sources":["../../src/checks/dangerous-calls.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AA0BvD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,GAC1D,KAAK,EAAE,CAsBT"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkDangerousCalls = checkDangerousCalls;
4
+ const utils_1 = require("../utils");
5
+ const locale_1 = require("../locale");
6
+ const PATTERNS = [
7
+ { rule: 'quit', check: l => /\bquit\b/.test(l), key: 'quit' },
8
+ { rule: 'exit', check: l => /\bexit\b/.test(l), key: 'exit' },
9
+ { rule: 'command_shell', check: l => /\(command\s+"shell"\s/.test(l), key: 'command_shell' },
10
+ { rule: 'startapp', check: l => /\bstartapp\b/.test(l), key: 'startapp' },
11
+ { rule: 'vl_registry_write', check: l => /\bvl-registry-write\b/.test(l), key: 'vl_registry_write' },
12
+ ];
13
+ const MESSAGE_KEYS = {
14
+ quit: 'dangerous.quit',
15
+ exit: 'dangerous.exit',
16
+ command_shell: 'dangerous.command_shell',
17
+ startapp: 'dangerous.startapp',
18
+ vl_registry_write: 'dangerous.vl_registry_write',
19
+ };
20
+ function checkDangerousCalls(content, file, config) {
21
+ const issues = [];
22
+ const lines = content.split('\n');
23
+ for (let lineno = 1; lineno <= lines.length; lineno++) {
24
+ const line = lines[lineno - 1];
25
+ // Strip comments only, keep strings intact
26
+ const stripped = (0, utils_1.stripLineRaw)(line).trim();
27
+ if (!stripped)
28
+ continue;
29
+ for (const p of PATTERNS) {
30
+ const configuredSeverity = config[p.key];
31
+ if (configuredSeverity === 'off')
32
+ continue;
33
+ if (p.check(stripped)) {
34
+ issues.push({
35
+ file, line: lineno, severity: configuredSeverity, rule: p.rule,
36
+ message: (0, locale_1.t)(MESSAGE_KEYS[p.rule]),
37
+ });
38
+ }
39
+ }
40
+ }
41
+ return issues;
42
+ }
43
+ //# sourceMappingURL=dangerous-calls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dangerous-calls.js","sourceRoot":"","sources":["../../src/checks/dangerous-calls.ts"],"names":[],"mappings":";;AA0BA,kDAwBC;AAjDD,oCAAwC;AACxC,sCAA8B;AAQ9B,MAAM,QAAQ,GAAc;IAC1B,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE;IAC7D,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE;IAC7D,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,eAAe,EAAE;IAC5F,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE;IACzE,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,mBAAmB,EAAE;CACrG,CAAC;AAEF,MAAM,YAAY,GAA2B;IAC3C,IAAI,EAAE,gBAAgB;IACtB,IAAI,EAAE,gBAAgB;IACtB,aAAa,EAAE,yBAAyB;IACxC,QAAQ,EAAE,oBAAoB;IAC9B,iBAAiB,EAAE,6BAA6B;CACjD,CAAC;AAEF,SAAgB,mBAAmB,CACjC,OAAe,EAAE,IAAY,EAAE,MAA4B;IAE3D,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;QACtD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC/B,2CAA2C;QAC3C,MAAM,QAAQ,GAAG,IAAA,oBAAY,EAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3C,IAAI,CAAC,QAAQ;YAAE,SAAS;QAExB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,kBAAkB,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YACzC,IAAI,kBAAkB,KAAK,KAAK;gBAAE,SAAS;YAC3C,IAAI,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACtB,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI;oBAC9D,OAAO,EAAE,IAAA,UAAC,EAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;iBACjC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Issue } from '../types';
2
+ export declare function checkEncoding(content: string, file: string): Issue[];
3
+ //# sourceMappingURL=encoding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../../src/checks/encoding.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAGjC,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,KAAK,EAAE,CA6BpE"}
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkEncoding = checkEncoding;
4
+ const locale_1 = require("../locale");
5
+ function checkEncoding(content, file) {
6
+ const issues = [];
7
+ const raw = Buffer.from(content, 'utf-8');
8
+ // BOM detection
9
+ if (raw.length >= 3 && raw[0] === 0xEF && raw[1] === 0xBB && raw[2] === 0xBF) {
10
+ issues.push({
11
+ file, line: 1, severity: 'warn', rule: 'encoding',
12
+ message: (0, locale_1.t)('encoding.bom'),
13
+ });
14
+ }
15
+ // Non-UTF-8 check: if content can't be round-tripped, it's not valid UTF-8
16
+ try {
17
+ const roundtrip = Buffer.from(content, 'utf-8').toString('utf-8');
18
+ if (roundtrip !== content) {
19
+ issues.push({
20
+ file, line: 1, severity: 'error', rule: 'encoding',
21
+ message: (0, locale_1.t)('encoding.non_utf8_cad'),
22
+ });
23
+ }
24
+ }
25
+ catch {
26
+ issues.push({
27
+ file, line: 1, severity: 'error', rule: 'encoding',
28
+ message: (0, locale_1.t)('encoding.non_utf8'),
29
+ });
30
+ }
31
+ return issues;
32
+ }
33
+ //# sourceMappingURL=encoding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoding.js","sourceRoot":"","sources":["../../src/checks/encoding.ts"],"names":[],"mappings":";;AAGA,sCA6BC;AA/BD,sCAA8B;AAE9B,SAAgB,aAAa,CAAC,OAAe,EAAE,IAAY;IACzD,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAE1C,gBAAgB;IAChB,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC7E,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU;YACjD,OAAO,EAAE,IAAA,UAAC,EAAC,cAAc,CAAC;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,2EAA2E;IAC3E,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAClE,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU;gBAClD,OAAO,EAAE,IAAA,UAAC,EAAC,uBAAuB,CAAC;aACpC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU;YAClD,OAAO,EAAE,IAAA,UAAC,EAAC,mBAAmB,CAAC;SAChC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Issue, ModuleRegistrationConfig } from '../types';
2
+ export declare function checkModuleRegistration(content: string, file: string, relPath: string, config: ModuleRegistrationConfig): Issue[];
3
+ //# sourceMappingURL=module-reg.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-reg.d.ts","sourceRoot":"","sources":["../../src/checks/module-reg.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AAG3D,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,wBAAwB,GAC/E,KAAK,EAAE,CAoBT"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkModuleRegistration = checkModuleRegistration;
4
+ const locale_1 = require("../locale");
5
+ function checkModuleRegistration(content, file, relPath, config) {
6
+ if (config.severity === 'off')
7
+ return [];
8
+ const parts = relPath.replace(/\\/g, '/').split('/');
9
+ if (parts.length < 3 || parts[0] !== 'src')
10
+ return [];
11
+ const topDir = parts[1];
12
+ if (!config.dirs.includes(topDir))
13
+ return [];
14
+ const lines = content.split('\n');
15
+ const relevant = lines.filter(l => l.trim().length > 0);
16
+ const tail = relevant.slice(-20).join('\n');
17
+ if (!tail.includes('*modules*')) {
18
+ return [{
19
+ file, line: 1, severity: config.severity, rule: 'module_registration',
20
+ message: (0, locale_1.t)('module_registration'),
21
+ }];
22
+ }
23
+ return [];
24
+ }
25
+ //# sourceMappingURL=module-reg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-reg.js","sourceRoot":"","sources":["../../src/checks/module-reg.ts"],"names":[],"mappings":";;AAIA,0DAsBC;AAxBD,sCAA8B;AAE9B,SAAgB,uBAAuB,CACrC,OAAe,EAAE,IAAY,EAAE,OAAe,EAAE,MAAgC;IAEhF,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK;QAAE,OAAO,EAAE,CAAC;IAEzC,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACrD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK;QAAE,OAAO,EAAE,CAAC;IACtD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IAE7C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE5C,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC;gBACN,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAA4B,EAAE,IAAI,EAAE,qBAAqB;gBACzF,OAAO,EAAE,IAAA,UAAC,EAAC,qBAAqB,CAAC;aAClC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Issue, NamespaceHeaderConfig } from '../types';
2
+ export declare function checkNamespaceHeader(content: string, file: string, config: NamespaceHeaderConfig): Issue[];
3
+ //# sourceMappingURL=namespace-header.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"namespace-header.d.ts","sourceRoot":"","sources":["../../src/checks/namespace-header.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAIxD,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB,GAC3D,KAAK,EAAE,CAoBT"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkNamespaceHeader = checkNamespaceHeader;
4
+ const utils_1 = require("../utils");
5
+ const locale_1 = require("../locale");
6
+ function checkNamespaceHeader(content, file, config) {
7
+ if (config.severity === 'off')
8
+ return [];
9
+ if (!config.package)
10
+ return [];
11
+ const lines = content.split('\n');
12
+ for (let i = 0; i < Math.min(lines.length, config.search_lines); i++) {
13
+ const stripped = (0, utils_1.stripLine)(lines[i]).trim();
14
+ if (stripped.startsWith('(in-package')) {
15
+ if (stripped.includes(config.package))
16
+ return [];
17
+ return [{
18
+ file, line: i + 1, severity: config.severity, rule: 'namespace_header',
19
+ message: (0, locale_1.t)('namespace_header.wrong', config.package),
20
+ }];
21
+ }
22
+ }
23
+ return [{
24
+ file, line: 1, severity: config.severity, rule: 'namespace_header',
25
+ message: (0, locale_1.t)('namespace_header.missing', config.package),
26
+ }];
27
+ }
28
+ //# sourceMappingURL=namespace-header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"namespace-header.js","sourceRoot":"","sources":["../../src/checks/namespace-header.ts"],"names":[],"mappings":";;AAIA,oDAsBC;AAzBD,oCAAqC;AACrC,sCAA8B;AAE9B,SAAgB,oBAAoB,CAClC,OAAe,EAAE,IAAY,EAAE,MAA6B;IAE5D,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK;QAAE,OAAO,EAAE,CAAC;IACzC,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAE/B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACrE,MAAM,QAAQ,GAAG,IAAA,iBAAS,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5C,IAAI,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YACvC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;gBAAE,OAAO,EAAE,CAAC;YACjD,OAAO,CAAC;oBACN,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAA4B,EAAE,IAAI,EAAE,kBAAkB;oBAC1F,OAAO,EAAE,IAAA,UAAC,EAAC,wBAAwB,EAAE,MAAM,CAAC,OAAO,CAAC;iBACrD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,CAAC;YACN,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAA4B,EAAE,IAAI,EAAE,kBAAkB;YACtF,OAAO,EAAE,IAAA,UAAC,EAAC,0BAA0B,EAAE,MAAM,CAAC,OAAO,CAAC;SACvD,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Issue } from '../types';
2
+ export declare function checkOpenWithoutClose(content: string, file: string): Issue[];
3
+ //# sourceMappingURL=open-close.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-close.d.ts","sourceRoot":"","sources":["../../src/checks/open-close.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAIjC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,KAAK,EAAE,CAa5E"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkOpenWithoutClose = checkOpenWithoutClose;
4
+ const utils_1 = require("../utils");
5
+ const locale_1 = require("../locale");
6
+ function checkOpenWithoutClose(content, file) {
7
+ let openCount = 0, closeCount = 0;
8
+ for (const { stripped } of (0, utils_1.codeLines)(content)) {
9
+ if (/\(open\b/.test(stripped))
10
+ openCount++;
11
+ if (/\(close\b/.test(stripped))
12
+ closeCount++;
13
+ }
14
+ if (openCount > closeCount) {
15
+ return [{
16
+ file, line: 1, severity: 'warn', rule: 'open_without_close',
17
+ message: (0, locale_1.t)('open_without_close', openCount, closeCount),
18
+ }];
19
+ }
20
+ return [];
21
+ }
22
+ //# sourceMappingURL=open-close.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open-close.js","sourceRoot":"","sources":["../../src/checks/open-close.ts"],"names":[],"mappings":";;AAIA,sDAaC;AAhBD,oCAAqC;AACrC,sCAA8B;AAE9B,SAAgB,qBAAqB,CAAC,OAAe,EAAE,IAAY;IACjE,IAAI,SAAS,GAAG,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC;IAClC,KAAK,MAAM,EAAE,QAAQ,EAAE,IAAI,IAAA,iBAAS,EAAC,OAAO,CAAC,EAAE,CAAC;QAC9C,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,SAAS,EAAE,CAAC;QAC3C,IAAI,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,UAAU,EAAE,CAAC;IAC/C,CAAC;IACD,IAAI,SAAS,GAAG,UAAU,EAAE,CAAC;QAC3B,OAAO,CAAC;gBACN,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB;gBAC3D,OAAO,EAAE,IAAA,UAAC,EAAC,oBAAoB,EAAE,SAAS,EAAE,UAAU,CAAC;aACxD,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Issue } from '../types';
2
+ export declare function checkParens(content: string, file: string): Issue[];
3
+ //# sourceMappingURL=parens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parens.d.ts","sourceRoot":"","sources":["../../src/checks/parens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAGjC,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,KAAK,EAAE,CAmClE"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkParens = checkParens;
4
+ const locale_1 = require("../locale");
5
+ function checkParens(content, file) {
6
+ let openP = 0, closeP = 0;
7
+ let inStr = false;
8
+ const lines = content.split('\n');
9
+ for (const line of lines) {
10
+ let i = 0;
11
+ while (i < line.length) {
12
+ const ch = line[i];
13
+ if (ch === ';' && !inStr)
14
+ break;
15
+ if (ch === '"') {
16
+ inStr = !inStr;
17
+ i++;
18
+ continue;
19
+ }
20
+ if (ch === '\\' && inStr) {
21
+ i += 2;
22
+ continue;
23
+ }
24
+ if (!inStr) {
25
+ if (ch === '(')
26
+ openP++;
27
+ else if (ch === ')')
28
+ closeP++;
29
+ }
30
+ i++;
31
+ }
32
+ }
33
+ if (openP !== closeP) {
34
+ const diff = openP - closeP;
35
+ return [{
36
+ file, line: 1, severity: 'error', rule: 'parens',
37
+ message: (0, locale_1.t)('parens.mismatch', openP, closeP, (diff > 0 ? '+' : '') + diff),
38
+ }];
39
+ }
40
+ return [];
41
+ }
42
+ //# sourceMappingURL=parens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parens.js","sourceRoot":"","sources":["../../src/checks/parens.ts"],"names":[],"mappings":";;AAGA,kCAmCC;AArCD,sCAA8B;AAE9B,SAAgB,WAAW,CAAC,OAAe,EAAE,IAAY;IACvD,IAAI,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC;IAC1B,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YACvB,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACnB,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,KAAK;gBAAE,MAAM;YAChC,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;gBACf,KAAK,GAAG,CAAC,KAAK,CAAC;gBACf,CAAC,EAAE,CAAC;gBACJ,SAAS;YACX,CAAC;YACD,IAAI,EAAE,KAAK,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,CAAC,IAAI,CAAC,CAAC;gBACP,SAAS;YACX,CAAC;YACD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,IAAI,EAAE,KAAK,GAAG;oBAAE,KAAK,EAAE,CAAC;qBACnB,IAAI,EAAE,KAAK,GAAG;oBAAE,MAAM,EAAE,CAAC;YAChC,CAAC;YACD,CAAC,EAAE,CAAC;QACN,CAAC;IACH,CAAC;IAED,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,KAAK,GAAG,MAAM,CAAC;QAC5B,OAAO,CAAC;gBACN,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ;gBAChD,OAAO,EAAE,IAAA,UAAC,EAAC,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;aAC3E,CAAC,CAAC;IACL,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Issue } from '../types';
2
+ export declare function checkTokenInUrl(content: string, file: string): Issue[];
3
+ //# sourceMappingURL=token-in-url.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-in-url.d.ts","sourceRoot":"","sources":["../../src/checks/token-in-url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAIjC,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,KAAK,EAAE,CAgBtE"}