@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
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
;; @lisp SBCL Lint — syntax validation via SBCL
|
|
2
|
+
;; Usage: sbcl --script lint-sbcl.lisp <src-dir> <stub-packages.json> <walk-exclude-json> <defmacro-allow-files-json>
|
|
3
|
+
|
|
4
|
+
(require :uiop)
|
|
5
|
+
|
|
6
|
+
(defparameter *errors* 0)
|
|
7
|
+
(defparameter *warnings* 0)
|
|
8
|
+
(defparameter *checked* 0)
|
|
9
|
+
|
|
10
|
+
;; ── Stub packages from external file ──────────────────────────────────
|
|
11
|
+
;; File format: alist ((name use*) ...) — valid Lisp data
|
|
12
|
+
(defun load-stub-packages (file-path)
|
|
13
|
+
(flet ((ensure-pkg (name &optional use-list)
|
|
14
|
+
(unless (find-package name)
|
|
15
|
+
(make-package name :use (or use-list '())))))
|
|
16
|
+
(with-open-file (s file-path :direction :input)
|
|
17
|
+
(let ((packages (read s)))
|
|
18
|
+
(dolist (pkg packages)
|
|
19
|
+
(ensure-pkg (first pkg) (second pkg)))))))
|
|
20
|
+
|
|
21
|
+
;; ── File walking ──────────────────────────────────────────────────────
|
|
22
|
+
(defun source-files (dir)
|
|
23
|
+
(sort
|
|
24
|
+
(remove-if-not
|
|
25
|
+
(lambda (p)
|
|
26
|
+
(let ((n (pathname-type p)))
|
|
27
|
+
(and n (string-equal n "lsp"))))
|
|
28
|
+
(uiop:directory-files dir))
|
|
29
|
+
'string< :key #'namestring))
|
|
30
|
+
|
|
31
|
+
(defun walk-tree (dir exclude-dirs)
|
|
32
|
+
(let ((result (source-files dir)))
|
|
33
|
+
(dolist (sub (uiop:subdirectories dir))
|
|
34
|
+
(let ((name (car (last (pathname-directory sub)))))
|
|
35
|
+
(unless (find name exclude-dirs :test 'string=)
|
|
36
|
+
(setf result (append result (walk-tree sub exclude-dirs))))))
|
|
37
|
+
result))
|
|
38
|
+
|
|
39
|
+
;; ── Per-file check ────────────────────────────────────────────────────
|
|
40
|
+
(defun check-file (path src-dir defmacro-allow-files)
|
|
41
|
+
(incf *checked*)
|
|
42
|
+
(let* ((rel (enough-namestring path src-dir))
|
|
43
|
+
(fullname (format nil "~a.~a" (pathname-name path) (pathname-type path))))
|
|
44
|
+
(format t " ~a ... " rel)
|
|
45
|
+
(force-output)
|
|
46
|
+
;; Syntax check via READ
|
|
47
|
+
(handler-case
|
|
48
|
+
(with-open-file (s path :direction :input)
|
|
49
|
+
(loop for form = (read s nil :eof)
|
|
50
|
+
until (eq form :eof)))
|
|
51
|
+
(error (e)
|
|
52
|
+
(let ((msg (princ-to-string e)))
|
|
53
|
+
(cond
|
|
54
|
+
((search "not found" msg)
|
|
55
|
+
(format t "~% [NOTE] ~a: ~a~%" rel
|
|
56
|
+
(subseq msg 0 (min 80 (length msg))))
|
|
57
|
+
(incf *warnings*))
|
|
58
|
+
(t
|
|
59
|
+
(format t "FAIL~% [ERROR] ~a: ~a~%" rel e)
|
|
60
|
+
(incf *errors*)
|
|
61
|
+
(return-from check-file))))))
|
|
62
|
+
;; Trailing whitespace
|
|
63
|
+
(with-open-file (s path :direction :input)
|
|
64
|
+
(loop for line = (read-line s nil nil)
|
|
65
|
+
for lineno from 1
|
|
66
|
+
while line
|
|
67
|
+
when (and (> (length line) 0)
|
|
68
|
+
(find (char line (1- (length line))) '(#\Space #\Tab)))
|
|
69
|
+
do (progn
|
|
70
|
+
(format t "~% [WARN] ~a line ~d: trailing whitespace~%" rel lineno)
|
|
71
|
+
(incf *warnings*))))
|
|
72
|
+
;; CL-ism checks: raw content scan
|
|
73
|
+
(with-open-file (s path :direction :input)
|
|
74
|
+
(let ((content (make-string (file-length s))))
|
|
75
|
+
(file-position s 0)
|
|
76
|
+
(read-sequence content s)
|
|
77
|
+
(when (search "#(" content)
|
|
78
|
+
(format t "~% [WARN] ~a: #( vector syntax (not valid in AutoLISP)~%" rel)
|
|
79
|
+
(incf *warnings*))
|
|
80
|
+
(when (search "#\\" content)
|
|
81
|
+
(format t "~% [WARN] ~a: #\\ character literal syntax (not valid in AutoLISP)~%" rel)
|
|
82
|
+
(incf *warnings*))
|
|
83
|
+
(when (search "#." content)
|
|
84
|
+
(format t "~% [WARN] ~a: #. read-time eval syntax (not valid in AutoLISP)~%" rel)
|
|
85
|
+
(incf *warnings*))
|
|
86
|
+
(when (and (search "defmacro" content)
|
|
87
|
+
(not (some (lambda (s) (search s fullname)) defmacro-allow-files)))
|
|
88
|
+
(format t "~% [WARN] ~a: defmacro (not valid in AutoLISP)~%" rel)
|
|
89
|
+
(incf *warnings*))))
|
|
90
|
+
(format t "OK~%")))
|
|
91
|
+
|
|
92
|
+
;; ── Main ──────────────────────────────────────────────────────────────
|
|
93
|
+
(defun main ()
|
|
94
|
+
(let* ((args (uiop:command-line-arguments))
|
|
95
|
+
(src-dir (first args))
|
|
96
|
+
(stub-file (second args))
|
|
97
|
+
(walk-exclude (if (third args)
|
|
98
|
+
(read-from-string (third args))
|
|
99
|
+
'(".vscode" "test" "experiment" "tools" ".git")))
|
|
100
|
+
(defmacro-allow (if (fourth args)
|
|
101
|
+
(read-from-string (fourth args))
|
|
102
|
+
'("compat-cl"))))
|
|
103
|
+
;; Load stub packages for CAD runtime symbols
|
|
104
|
+
(load-stub-packages stub-file)
|
|
105
|
+
|
|
106
|
+
(format t "~%==================================================~%")
|
|
107
|
+
(format t " @lisp SBCL Lint~%")
|
|
108
|
+
(format t " Source: ~a~%" (namestring (pathname src-dir)))
|
|
109
|
+
(format t "==================================================~%~%")
|
|
110
|
+
(setf *errors* 0 *warnings* 0 *checked* 0)
|
|
111
|
+
|
|
112
|
+
(let ((files (walk-tree src-dir walk-exclude)))
|
|
113
|
+
(format t " Found ~d .lsp files~%~%" (length files))
|
|
114
|
+
(dolist (f files)
|
|
115
|
+
(check-file f src-dir defmacro-allow)))
|
|
116
|
+
|
|
117
|
+
(format t "~%==================================================~%")
|
|
118
|
+
(format t " Scanned: ~d files~%" *checked*)
|
|
119
|
+
(format t " Errors: ~d~%" *errors*)
|
|
120
|
+
(format t " Warnings: ~d~%" *warnings*)
|
|
121
|
+
(format t "==================================================~%~%")
|
|
122
|
+
(if (> *errors* 0)
|
|
123
|
+
(uiop:quit 1)
|
|
124
|
+
(uiop:quit 0))))
|
|
125
|
+
|
|
126
|
+
(main)
|
package/dist/locale.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"locale.d.ts","sourceRoot":"","sources":["../src/locale.ts"],"names":[],"mappings":"AA6EA,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,MAAM,CAMnE"}
|
package/dist/locale.js
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.setLocale = setLocale;
|
|
4
|
+
exports.getLocale = getLocale;
|
|
5
|
+
exports.t = t;
|
|
6
|
+
const messages = {
|
|
7
|
+
en: {
|
|
8
|
+
'parens.mismatch': "Paren mismatch: {0} '(' vs {1} ')' ({2})",
|
|
9
|
+
'encoding.bom': 'UTF-8 BOM detected',
|
|
10
|
+
'encoding.non_utf8_cad': 'Non-UTF-8 encoding (may cause CAD bracket matching errors)',
|
|
11
|
+
'encoding.non_utf8': 'Non-UTF-8 encoding detected',
|
|
12
|
+
'cl_syntax': "Common Lisp syntax '{0}' (not valid in AutoLISP)",
|
|
13
|
+
'dangerous.quit': 'quit call (terminates CAD process)',
|
|
14
|
+
'dangerous.exit': 'exit call (terminates CAD process)',
|
|
15
|
+
'dangerous.command_shell': 'command shell call (shell injection risk)',
|
|
16
|
+
'dangerous.startapp': 'startapp call (launches external process)',
|
|
17
|
+
'dangerous.vl_registry_write': 'vl-registry-write call (modifies Windows registry)',
|
|
18
|
+
'vlax_without_loading': 'vlax-* call without vl-load-com in file',
|
|
19
|
+
'token_in_url': 'Possible token exposure in string: token= in URL',
|
|
20
|
+
'open_without_close': 'File has {0} open() calls but {1} close() calls (possible resource leak)',
|
|
21
|
+
'bare_function_names': "Unnamespaced function '{0}' (missing @:: or C: prefix)",
|
|
22
|
+
'module_registration': 'Module file missing @::*modules* registration (expected in last lines)',
|
|
23
|
+
'namespace_header.missing': 'Missing (in-package {0}) header',
|
|
24
|
+
'namespace_header.wrong': 'in-package target is not {0}',
|
|
25
|
+
'trailing_whitespace': 'Trailing whitespace',
|
|
26
|
+
'runner.read_error': 'Cannot read file',
|
|
27
|
+
'sbcl.script_not_found': 'lint-sbcl.lisp not found at {0}',
|
|
28
|
+
'sbcl.not_found': "SBCL (Steel Bank Common Lisp) is required but not found.\nInstall it from: https://www.sbcl.org/platform-table.html\nOr on Windows via: winget install sbcl\nOr on macOS via: brew install sbcl\nOr on Linux via: apt install sbcl",
|
|
29
|
+
'summary.tag_fail': 'FAIL',
|
|
30
|
+
'summary.tag_warn': 'WARN',
|
|
31
|
+
'summary.line': 'Line',
|
|
32
|
+
'summary.header': '=== Summary ===',
|
|
33
|
+
'summary.all_ok': ' All files OK',
|
|
34
|
+
'summary.errors_warnings': ' {0} error(s), {1} warning(s)',
|
|
35
|
+
'summary.done': '=== Done ===',
|
|
36
|
+
'index.no_files': 'No .lsp files found',
|
|
37
|
+
'index.config_exists': 'atlisp-lint.json already exists',
|
|
38
|
+
'index.config_created': 'Created {0}',
|
|
39
|
+
'index.not_git': 'Not a git repository: no .git/hooks directory',
|
|
40
|
+
'index.hook_installed': 'Installed pre-commit hook at {0}',
|
|
41
|
+
},
|
|
42
|
+
zh: {
|
|
43
|
+
'parens.mismatch': "括号不匹配:{0} 个 '(' vs {1} 个 ')'({2})",
|
|
44
|
+
'encoding.bom': '检测到 UTF-8 BOM',
|
|
45
|
+
'encoding.non_utf8_cad': '非 UTF-8 编码(可能导致 CAD 括号匹配错误)',
|
|
46
|
+
'encoding.non_utf8': '检测到非 UTF-8 编码',
|
|
47
|
+
'cl_syntax': "Common Lisp 语法 '{0}'(在 AutoLISP 中无效)",
|
|
48
|
+
'dangerous.quit': 'quit 调用(会终止 CAD 进程)',
|
|
49
|
+
'dangerous.exit': 'exit 调用(会终止 CAD 进程)',
|
|
50
|
+
'dangerous.command_shell': 'command shell 调用(存在命令注入风险)',
|
|
51
|
+
'dangerous.startapp': 'startapp 调用(会启动外部程序)',
|
|
52
|
+
'dangerous.vl_registry_write': 'vl-registry-write 调用(会修改 Windows 注册表)',
|
|
53
|
+
'vlax_without_loading': '文件中使用了 vlax-* 函数但未调用 vl-load-com',
|
|
54
|
+
'token_in_url': '字符串中可能泄露令牌:URL 中包含 token=',
|
|
55
|
+
'open_without_close': '文件中有 {0} 个 open() 调用,但只有 {1} 个 close() 调用(可能存在资源泄露)',
|
|
56
|
+
'bare_function_names': "函数 '{0}' 缺少命名空间前缀(缺少 @:: 或 C: 前缀)",
|
|
57
|
+
'module_registration': '模块文件缺少 @::*modules* 注册(应在文件末尾附近)',
|
|
58
|
+
'namespace_header.missing': '缺少 (in-package {0}) 头',
|
|
59
|
+
'namespace_header.wrong': 'in-package 目标不是 {0}',
|
|
60
|
+
'trailing_whitespace': '行尾有多余空格',
|
|
61
|
+
'runner.read_error': '无法读取文件',
|
|
62
|
+
'sbcl.script_not_found': '未找到 lint-sbcl.lisp:{0}',
|
|
63
|
+
'sbcl.not_found': "未找到 SBCL(Steel Bank Common Lisp)。\n请从以下地址安装:https://www.sbcl.org/platform-table.html\nWindows 下可用:winget install sbcl\nmacOS 下可用:brew install sbcl\nLinux 下可用:apt install sbcl",
|
|
64
|
+
'summary.tag_fail': '失败',
|
|
65
|
+
'summary.tag_warn': '警告',
|
|
66
|
+
'summary.line': '行',
|
|
67
|
+
'summary.header': '=== 概要 ===',
|
|
68
|
+
'summary.all_ok': ' 所有文件检查通过',
|
|
69
|
+
'summary.errors_warnings': ' {0} 个错误,{1} 个警告',
|
|
70
|
+
'summary.done': '=== 完成 ===',
|
|
71
|
+
'index.no_files': '未找到 .lsp 文件',
|
|
72
|
+
'index.config_exists': 'atlisp-lint.json 已存在',
|
|
73
|
+
'index.config_created': '已创建 {0}',
|
|
74
|
+
'index.not_git': '不是 git 仓库:没有 .git/hooks 目录',
|
|
75
|
+
'index.hook_installed': '已在 {0} 安装 pre-commit hook',
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
let currentLocale = 'zh';
|
|
79
|
+
function setLocale(locale) {
|
|
80
|
+
currentLocale = locale;
|
|
81
|
+
}
|
|
82
|
+
function getLocale() {
|
|
83
|
+
return currentLocale;
|
|
84
|
+
}
|
|
85
|
+
function t(key, ...args) {
|
|
86
|
+
const msg = messages[currentLocale]?.[key] ||
|
|
87
|
+
messages['en']?.[key] ||
|
|
88
|
+
key;
|
|
89
|
+
return msg.replace(/\{(\d+)\}/g, (_, index) => String(args[Number(index)] ?? ''));
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=locale.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"locale.js","sourceRoot":"","sources":["../src/locale.ts"],"names":[],"mappings":"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"}
|
package/dist/runner.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAgB5C,wBAAgB,SAAS,CACvB,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,GACnD,KAAK,EAAE,CA4ET"}
|
package/dist/runner.js
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
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.lintFiles = lintFiles;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const encoding_1 = require("./checks/encoding");
|
|
40
|
+
const parens_1 = require("./checks/parens");
|
|
41
|
+
const cl_syntax_1 = require("./checks/cl-syntax");
|
|
42
|
+
const dangerous_calls_1 = require("./checks/dangerous-calls");
|
|
43
|
+
const vlax_1 = require("./checks/vlax");
|
|
44
|
+
const token_in_url_1 = require("./checks/token-in-url");
|
|
45
|
+
const open_close_1 = require("./checks/open-close");
|
|
46
|
+
const bare_names_1 = require("./checks/bare-names");
|
|
47
|
+
const module_reg_1 = require("./checks/module-reg");
|
|
48
|
+
const namespace_header_1 = require("./checks/namespace-header");
|
|
49
|
+
const trailing_ws_1 = require("./checks/trailing-ws");
|
|
50
|
+
const config_1 = require("./config");
|
|
51
|
+
const locale_1 = require("./locale");
|
|
52
|
+
function lintFiles(files, config, rootDir) {
|
|
53
|
+
(0, locale_1.setLocale)(config.locale || 'zh');
|
|
54
|
+
const allIssues = [];
|
|
55
|
+
for (const filepath of files) {
|
|
56
|
+
const relPath = path.relative(rootDir, filepath);
|
|
57
|
+
let content;
|
|
58
|
+
try {
|
|
59
|
+
content = fs.readFileSync(filepath, 'utf-8');
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
allIssues.push({
|
|
63
|
+
file: relPath, line: 1, severity: 'error', rule: 'read',
|
|
64
|
+
message: (0, locale_1.t)('runner.read_error'),
|
|
65
|
+
});
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
// Encoding
|
|
69
|
+
if ((0, config_1.getCheckSeverity)(config, 'encoding') !== 'off') {
|
|
70
|
+
allIssues.push(...(0, encoding_1.checkEncoding)(content, relPath));
|
|
71
|
+
}
|
|
72
|
+
// Parens
|
|
73
|
+
if ((0, config_1.getCheckSeverity)(config, 'parens') !== 'off') {
|
|
74
|
+
allIssues.push(...(0, parens_1.checkParens)(content, relPath));
|
|
75
|
+
}
|
|
76
|
+
// CL syntax
|
|
77
|
+
if ((0, config_1.getCheckSeverity)(config, 'cl_syntax') !== 'off') {
|
|
78
|
+
allIssues.push(...(0, cl_syntax_1.checkClSyntax)(content, relPath, config.cl_syntax.keywords));
|
|
79
|
+
}
|
|
80
|
+
// Dangerous calls
|
|
81
|
+
allIssues.push(...(0, dangerous_calls_1.checkDangerousCalls)(content, relPath, config.dangerous_calls));
|
|
82
|
+
// vlax-* without vl-load-com
|
|
83
|
+
if ((0, config_1.getCheckSeverity)(config, 'vlax_without_loading') !== 'off') {
|
|
84
|
+
allIssues.push(...(0, vlax_1.checkVlaxWithoutLoading)(content, relPath));
|
|
85
|
+
}
|
|
86
|
+
// Token in URL
|
|
87
|
+
if ((0, config_1.getCheckSeverity)(config, 'token_in_url') !== 'off') {
|
|
88
|
+
allIssues.push(...(0, token_in_url_1.checkTokenInUrl)(content, relPath));
|
|
89
|
+
}
|
|
90
|
+
// Open/close
|
|
91
|
+
if ((0, config_1.getCheckSeverity)(config, 'open_without_close') !== 'off') {
|
|
92
|
+
allIssues.push(...(0, open_close_1.checkOpenWithoutClose)(content, relPath));
|
|
93
|
+
}
|
|
94
|
+
// Bare function names
|
|
95
|
+
if ((0, config_1.getCheckSeverity)(config, 'bare_function_names') !== 'off') {
|
|
96
|
+
allIssues.push(...(0, bare_names_1.checkBareFunctionNames)(content, relPath, config.bare_function_names.allowlist, config.bare_function_names.namespace_pattern));
|
|
97
|
+
}
|
|
98
|
+
// Module registration
|
|
99
|
+
if (config.module_registration.severity !== 'off') {
|
|
100
|
+
allIssues.push(...(0, module_reg_1.checkModuleRegistration)(content, relPath, relPath, config.module_registration));
|
|
101
|
+
}
|
|
102
|
+
// Namespace header
|
|
103
|
+
if (config.namespace_header.severity !== 'off') {
|
|
104
|
+
allIssues.push(...(0, namespace_header_1.checkNamespaceHeader)(content, relPath, config.namespace_header));
|
|
105
|
+
}
|
|
106
|
+
// Trailing whitespace
|
|
107
|
+
if ((0, config_1.getCheckSeverity)(config, 'trailing_whitespace') !== 'off') {
|
|
108
|
+
allIssues.push(...(0, trailing_ws_1.checkTrailingWhitespace)(content, relPath));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return allIssues;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
|
package/dist/sbcl.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sbcl.d.ts","sourceRoot":"","sources":["../src/sbcl.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAmB5C,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,GAC/D,KAAK,EAAE,CAoCT"}
|
package/dist/sbcl.js
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
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.runSbclLint = runSbclLint;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const child_process_1 = require("child_process");
|
|
40
|
+
const locale_1 = require("./locale");
|
|
41
|
+
function findSbcl() {
|
|
42
|
+
const { env } = process;
|
|
43
|
+
const paths = (env.PATH || '').split(path.delimiter);
|
|
44
|
+
for (const dir of paths) {
|
|
45
|
+
const candidate = path.join(dir, process.platform === 'win32' ? 'sbcl.exe' : 'sbcl');
|
|
46
|
+
if (fs.existsSync(candidate))
|
|
47
|
+
return candidate;
|
|
48
|
+
}
|
|
49
|
+
// last resort: just try the command
|
|
50
|
+
try {
|
|
51
|
+
(0, child_process_1.execFileSync)('sbcl', ['--version'], { stdio: 'pipe' });
|
|
52
|
+
return 'sbcl';
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
throw new Error((0, locale_1.t)('sbcl.not_found'));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function runSbclLint(srcDir, sbclConfig, stubPackagesPath) {
|
|
59
|
+
const sbcl = findSbcl();
|
|
60
|
+
// Locate lint-sbcl.lisp bundled with the package
|
|
61
|
+
const scriptPath = path.join(__dirname, '..', 'lib', 'lint-sbcl.lisp');
|
|
62
|
+
if (!fs.existsSync(scriptPath)) {
|
|
63
|
+
return [{
|
|
64
|
+
file: 'internal', line: 1, severity: 'error', rule: 'sbcl',
|
|
65
|
+
message: (0, locale_1.t)('sbcl.script_not_found', scriptPath),
|
|
66
|
+
}];
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
// Convert arrays to Lisp-readable format: ("a" "b")
|
|
70
|
+
const toLispList = (arr) => '(' + arr.map(s => `"${s}"`).join(' ') + ')';
|
|
71
|
+
const result = (0, child_process_1.execFileSync)(sbcl, [
|
|
72
|
+
'--script', scriptPath,
|
|
73
|
+
srcDir,
|
|
74
|
+
stubPackagesPath,
|
|
75
|
+
toLispList(sbclConfig.walk_exclude),
|
|
76
|
+
toLispList(sbclConfig.defmacro_allow_files),
|
|
77
|
+
], {
|
|
78
|
+
encoding: 'utf-8',
|
|
79
|
+
maxBuffer: 50 * 1024 * 1024,
|
|
80
|
+
timeout: 180_000,
|
|
81
|
+
});
|
|
82
|
+
return parseSbclOutput(result, srcDir);
|
|
83
|
+
}
|
|
84
|
+
catch (err) {
|
|
85
|
+
if (err instanceof Error && 'stdout' in err) {
|
|
86
|
+
const e = err;
|
|
87
|
+
const output = e.stdout || e.stderr || err.message;
|
|
88
|
+
return parseSbclOutput(output || '', srcDir);
|
|
89
|
+
}
|
|
90
|
+
throw err;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function parseSbclOutput(output, srcDir) {
|
|
94
|
+
const issues = [];
|
|
95
|
+
for (const line of output.split('\n')) {
|
|
96
|
+
const trimmed = line.trim();
|
|
97
|
+
if (trimmed.startsWith('[ERROR]')) {
|
|
98
|
+
const msg = trimmed.replace(/^\[ERROR\]\s*/, '');
|
|
99
|
+
issues.push({
|
|
100
|
+
file: srcDir, line: 1, severity: 'error', rule: 'sbcl',
|
|
101
|
+
message: `SBCL: ${msg}`,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
else if (trimmed.startsWith('[WARN]')) {
|
|
105
|
+
const msg = trimmed.replace(/^\[WARN\]\s*/, '');
|
|
106
|
+
issues.push({
|
|
107
|
+
file: srcDir, line: 1, severity: 'warn', rule: 'sbcl',
|
|
108
|
+
message: `SBCL: ${msg}`,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
else if (trimmed.startsWith('[NOTE]')) {
|
|
112
|
+
const msg = trimmed.replace(/^\[NOTE\]\s*/, '');
|
|
113
|
+
issues.push({
|
|
114
|
+
file: srcDir, line: 1, severity: 'warn', rule: 'sbcl',
|
|
115
|
+
message: `SBCL: ${msg}`,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return issues;
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=sbcl.js.map
|
package/dist/sbcl.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sbcl.js","sourceRoot":"","sources":["../src/sbcl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
((AUTOLISP ())
|
|
2
|
+
(@ (COMMON-LISP AUTOLISP))
|
|
3
|
+
(C ())
|
|
4
|
+
(JSON ())
|
|
5
|
+
(SIDEBAR ())
|
|
6
|
+
(FUN ())
|
|
7
|
+
(DCL ())
|
|
8
|
+
(BASE ())
|
|
9
|
+
(STRING ())
|
|
10
|
+
(BLOCK ())
|
|
11
|
+
(ENTITY ())
|
|
12
|
+
(LAYER ())
|
|
13
|
+
(LAYOUT ())
|
|
14
|
+
(CURVE ())
|
|
15
|
+
(LIST ())
|
|
16
|
+
(M ())
|
|
17
|
+
(P ())
|
|
18
|
+
(UI ())
|
|
19
|
+
(SYS ())
|
|
20
|
+
(EXCEL ())
|
|
21
|
+
(WORD ())
|
|
22
|
+
(RE ())
|
|
23
|
+
(VECTRA ())
|
|
24
|
+
(DOS ())
|
|
25
|
+
(AT-PM ())
|
|
26
|
+
(QRENCODE ())
|
|
27
|
+
(NETWORK ())
|
|
28
|
+
(PKGMAN ())
|
|
29
|
+
(DATETIME ())
|
|
30
|
+
(DICT ())
|
|
31
|
+
(@NLP ())
|
|
32
|
+
(AT-SIDEBAR ())
|
|
33
|
+
(S ())
|
|
34
|
+
(VL ())
|
|
35
|
+
(VLR ())
|
|
36
|
+
(VLAX ())
|
|
37
|
+
(THEME ())
|
|
38
|
+
(AJAX ())
|
|
39
|
+
(ATLISP ())
|
|
40
|
+
(LOG ())
|
|
41
|
+
(ATLISP-CORE ()))
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export type Severity = 'off' | 'warn' | 'error';
|
|
2
|
+
export interface Issue {
|
|
3
|
+
file: string;
|
|
4
|
+
line: number;
|
|
5
|
+
severity: Severity;
|
|
6
|
+
rule: string;
|
|
7
|
+
message: string;
|
|
8
|
+
}
|
|
9
|
+
export interface CheckConfig {
|
|
10
|
+
severity: Severity;
|
|
11
|
+
[key: string]: unknown;
|
|
12
|
+
}
|
|
13
|
+
export interface ClSyntaxConfig {
|
|
14
|
+
keywords: string[];
|
|
15
|
+
}
|
|
16
|
+
export interface DangerousCallsConfig {
|
|
17
|
+
quit: Severity;
|
|
18
|
+
exit: Severity;
|
|
19
|
+
command_shell: Severity;
|
|
20
|
+
startapp: Severity;
|
|
21
|
+
vl_registry_write: Severity;
|
|
22
|
+
}
|
|
23
|
+
export interface ModuleRegistrationConfig extends CheckConfig {
|
|
24
|
+
patterns: string[];
|
|
25
|
+
dirs: string[];
|
|
26
|
+
}
|
|
27
|
+
export interface NamespaceHeaderConfig extends CheckConfig {
|
|
28
|
+
package: string;
|
|
29
|
+
deps: string[];
|
|
30
|
+
search_lines: number;
|
|
31
|
+
}
|
|
32
|
+
export interface BareFunctionNamesConfig {
|
|
33
|
+
allowlist: string[];
|
|
34
|
+
namespace_pattern: string;
|
|
35
|
+
}
|
|
36
|
+
export interface SbclConfig {
|
|
37
|
+
walk_exclude: string[];
|
|
38
|
+
defmacro_allow_files: string[];
|
|
39
|
+
}
|
|
40
|
+
export interface SourceConfig {
|
|
41
|
+
globs: string[];
|
|
42
|
+
exclude: string[];
|
|
43
|
+
}
|
|
44
|
+
export interface LintConfig {
|
|
45
|
+
locale: string;
|
|
46
|
+
source: SourceConfig;
|
|
47
|
+
checks: Record<string, Severity>;
|
|
48
|
+
cl_syntax: ClSyntaxConfig;
|
|
49
|
+
dangerous_calls: DangerousCallsConfig;
|
|
50
|
+
module_registration: ModuleRegistrationConfig;
|
|
51
|
+
namespace_header: NamespaceHeaderConfig;
|
|
52
|
+
bare_function_names: BareFunctionNamesConfig;
|
|
53
|
+
sbcl: SbclConfig;
|
|
54
|
+
}
|
|
55
|
+
export interface FormattedResult {
|
|
56
|
+
issues: Issue[];
|
|
57
|
+
error_count: number;
|
|
58
|
+
warning_count: number;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;AAEhD,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,QAAQ,CAAC;IACnB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,QAAQ,CAAC;IACf,aAAa,EAAE,QAAQ,CAAC;IACxB,QAAQ,EAAE,QAAQ,CAAC;IACnB,iBAAiB,EAAE,QAAQ,CAAC;CAC7B;AAED,MAAM,WAAW,wBAAyB,SAAQ,WAAW;IAC3D,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,qBAAsB,SAAQ,WAAW;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACjC,SAAS,EAAE,cAAc,CAAC;IAC1B,eAAe,EAAE,oBAAoB,CAAC;IACtC,mBAAmB,EAAE,wBAAwB,CAAC;IAC9C,gBAAgB,EAAE,qBAAqB,CAAC;IACxC,mBAAmB,EAAE,uBAAuB,CAAC;IAC7C,IAAI,EAAE,UAAU,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Strip string contents and comments from a line of AutoLISP code */
|
|
2
|
+
export declare function stripLine(line: string): string;
|
|
3
|
+
export declare function stripLineRaw(line: string): string;
|
|
4
|
+
/** Iterate lines with string-aware content */
|
|
5
|
+
export declare function codeLines(content: string): Generator<{
|
|
6
|
+
lineno: number;
|
|
7
|
+
text: string;
|
|
8
|
+
stripped: string;
|
|
9
|
+
}>;
|
|
10
|
+
/** Extract string literals from a line */
|
|
11
|
+
export declare function extractStrings(line: string): string[];
|
|
12
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAoB9C;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAuBjD;AAED,8CAA8C;AAC9C,wBAAiB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CASzG;AAED,0CAA0C;AAC1C,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CA2BrD"}
|