@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.
- package/README.md +150 -0
- package/atlisp-lint.default.json +52 -0
- package/bin/atlisp-lint +2 -0
- package/dist/atlisp-lint.default.json +52 -0
- package/dist/checks/bare-names.d.ts +3 -0
- package/dist/checks/bare-names.d.ts.map +1 -0
- package/dist/checks/bare-names.js +28 -0
- package/dist/checks/bare-names.js.map +1 -0
- package/dist/checks/cl-syntax.d.ts +3 -0
- package/dist/checks/cl-syntax.d.ts.map +1 -0
- package/dist/checks/cl-syntax.js +24 -0
- package/dist/checks/cl-syntax.js.map +1 -0
- package/dist/checks/dangerous-calls.d.ts +3 -0
- package/dist/checks/dangerous-calls.d.ts.map +1 -0
- package/dist/checks/dangerous-calls.js +43 -0
- package/dist/checks/dangerous-calls.js.map +1 -0
- package/dist/checks/encoding.d.ts +3 -0
- package/dist/checks/encoding.d.ts.map +1 -0
- package/dist/checks/encoding.js +33 -0
- package/dist/checks/encoding.js.map +1 -0
- package/dist/checks/module-reg.d.ts +3 -0
- package/dist/checks/module-reg.d.ts.map +1 -0
- package/dist/checks/module-reg.js +25 -0
- package/dist/checks/module-reg.js.map +1 -0
- package/dist/checks/namespace-header.d.ts +3 -0
- package/dist/checks/namespace-header.d.ts.map +1 -0
- package/dist/checks/namespace-header.js +28 -0
- package/dist/checks/namespace-header.js.map +1 -0
- package/dist/checks/open-close.d.ts +3 -0
- package/dist/checks/open-close.d.ts.map +1 -0
- package/dist/checks/open-close.js +22 -0
- package/dist/checks/open-close.js.map +1 -0
- package/dist/checks/parens.d.ts +3 -0
- package/dist/checks/parens.d.ts.map +1 -0
- package/dist/checks/parens.js +42 -0
- package/dist/checks/parens.js.map +1 -0
- package/dist/checks/token-in-url.d.ts +3 -0
- package/dist/checks/token-in-url.d.ts.map +1 -0
- package/dist/checks/token-in-url.js +23 -0
- package/dist/checks/token-in-url.js.map +1 -0
- package/dist/checks/trailing-ws.d.ts +3 -0
- package/dist/checks/trailing-ws.d.ts.map +1 -0
- package/dist/checks/trailing-ws.js +19 -0
- package/dist/checks/trailing-ws.js.map +1 -0
- package/dist/checks/vlax.d.ts +3 -0
- package/dist/checks/vlax.d.ts.map +1 -0
- package/dist/checks/vlax.js +19 -0
- package/dist/checks/vlax.js.map +1 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +128 -0
- package/dist/config.js.map +1 -0
- package/dist/formatters.d.ts +4 -0
- package/dist/formatters.d.ts.map +1 -0
- package/dist/formatters.js +33 -0
- package/dist/formatters.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +236 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/lint-sbcl.lisp +126 -0
- package/dist/locale.d.ts +4 -0
- package/dist/locale.d.ts.map +1 -0
- package/dist/locale.js +91 -0
- package/dist/locale.js.map +1 -0
- package/dist/runner.d.ts +3 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +113 -0
- package/dist/runner.js.map +1 -0
- package/dist/sbcl.d.ts +3 -0
- package/dist/sbcl.d.ts.map +1 -0
- package/dist/sbcl.js +121 -0
- package/dist/sbcl.js.map +1 -0
- package/dist/stub-packages.json +41 -0
- package/dist/types.d.ts +60 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +12 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +104 -0
- package/dist/utils.js.map +1 -0
- package/lib/lint-sbcl.lisp +126 -0
- package/package.json +35 -0
- package/pre-commit/hook.sh +4 -0
- 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
|
+
}
|
package/bin/atlisp-lint
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|