@bitwisedesign/xanoscriptlint 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 (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +128 -0
  3. package/dist/cli.d.ts +6 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +121 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/config.d.ts +43 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +239 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/customRules.d.ts +4 -0
  12. package/dist/customRules.d.ts.map +1 -0
  13. package/dist/customRules.js +43 -0
  14. package/dist/customRules.js.map +1 -0
  15. package/dist/discover.d.ts +7 -0
  16. package/dist/discover.d.ts.map +1 -0
  17. package/dist/discover.js +70 -0
  18. package/dist/discover.js.map +1 -0
  19. package/dist/lint.d.ts +14 -0
  20. package/dist/lint.d.ts.map +1 -0
  21. package/dist/lint.js +64 -0
  22. package/dist/lint.js.map +1 -0
  23. package/dist/report.d.ts +7 -0
  24. package/dist/report.d.ts.map +1 -0
  25. package/dist/report.js +86 -0
  26. package/dist/report.js.map +1 -0
  27. package/dist/rules/empty_function_run.d.ts +3 -0
  28. package/dist/rules/empty_function_run.d.ts.map +1 -0
  29. package/dist/rules/empty_function_run.js +32 -0
  30. package/dist/rules/empty_function_run.js.map +1 -0
  31. package/dist/rules/index.d.ts +5 -0
  32. package/dist/rules/index.d.ts.map +1 -0
  33. package/dist/rules/index.js +12 -0
  34. package/dist/rules/index.js.map +1 -0
  35. package/dist/rules/no_trailing_newline.d.ts +3 -0
  36. package/dist/rules/no_trailing_newline.d.ts.map +1 -0
  37. package/dist/rules/no_trailing_newline.js +34 -0
  38. package/dist/rules/no_trailing_newline.js.map +1 -0
  39. package/dist/rules/no_var_response.d.ts +3 -0
  40. package/dist/rules/no_var_response.d.ts.map +1 -0
  41. package/dist/rules/no_var_response.js +32 -0
  42. package/dist/rules/no_var_response.js.map +1 -0
  43. package/dist/rules/types.d.ts +30 -0
  44. package/dist/rules/types.d.ts.map +1 -0
  45. package/dist/rules/types.js +2 -0
  46. package/dist/rules/types.js.map +1 -0
  47. package/dist/suppress.d.ts +8 -0
  48. package/dist/suppress.d.ts.map +1 -0
  49. package/dist/suppress.js +107 -0
  50. package/dist/suppress.js.map +1 -0
  51. package/dist/util.d.ts +9 -0
  52. package/dist/util.d.ts.map +1 -0
  53. package/dist/util.js +37 -0
  54. package/dist/util.js.map +1 -0
  55. package/package.json +65 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../src/discover.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAMlD,wBAAsB,eAAe,CAAC,OAAO,EAAE;IAC7C,MAAM,EAAE,cAAc,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAgBpB"}
@@ -0,0 +1,70 @@
1
+ import { readdir } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import picomatch from "picomatch";
4
+ const SKIP_DIRS = new Set(["node_modules", ".git", "dist"]);
5
+ export async function discoverXsFiles(options) {
6
+ const { config, cwd, cliPaths } = options;
7
+ const root = config.configDir;
8
+ const include = config.included.map((pattern) => compileGlob(pattern));
9
+ const exclude = config.excluded.map((pattern) => compileGlob(pattern));
10
+ const discovered = [];
11
+ await walk(root, root, include, exclude, discovered);
12
+ discovered.sort();
13
+ if (cliPaths.length === 0) {
14
+ return discovered;
15
+ }
16
+ const resolvedCli = cliPaths.map((p) => path.resolve(cwd, p));
17
+ return discovered.filter((file) => matchesCliPath(file, resolvedCli));
18
+ }
19
+ async function walk(dir, root, include, exclude, out) {
20
+ let entries;
21
+ try {
22
+ entries = await readdir(dir, { withFileTypes: true });
23
+ }
24
+ catch {
25
+ return;
26
+ }
27
+ for (const entry of entries) {
28
+ const full = path.join(dir, entry.name);
29
+ if (entry.isDirectory()) {
30
+ if (SKIP_DIRS.has(entry.name)) {
31
+ continue;
32
+ }
33
+ await walk(full, root, include, exclude, out);
34
+ continue;
35
+ }
36
+ if (!entry.isFile()) {
37
+ continue;
38
+ }
39
+ const rel = toPosix(path.relative(root, full));
40
+ if (isExcluded(rel, exclude)) {
41
+ continue;
42
+ }
43
+ if (!isIncluded(rel, include)) {
44
+ continue;
45
+ }
46
+ out.push(full);
47
+ }
48
+ }
49
+ function compileGlob(pattern) {
50
+ return picomatch(pattern, { dot: true });
51
+ }
52
+ function isIncluded(rel, include) {
53
+ return include.some((match) => match(rel));
54
+ }
55
+ function isExcluded(rel, exclude) {
56
+ return exclude.some((match) => match(rel));
57
+ }
58
+ function matchesCliPath(file, cliPaths) {
59
+ return cliPaths.some((cliPath) => {
60
+ if (file === cliPath) {
61
+ return true;
62
+ }
63
+ const prefix = cliPath.endsWith(path.sep) ? cliPath : cliPath + path.sep;
64
+ return file.startsWith(prefix);
65
+ });
66
+ }
67
+ function toPosix(rel) {
68
+ return rel.split(path.sep).join("/");
69
+ }
70
+ //# sourceMappingURL=discover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../src/discover.ts"],"names":[],"mappings":"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"}
package/dist/lint.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import type { ResolvedConfig } from "./config.js";
2
+ import type { Correction, SourceFile, Violation } from "./rules/types.js";
3
+ export declare function readSourceFile(filePath: string): SourceFile;
4
+ export declare function lintFiles(files: SourceFile[], config: ResolvedConfig): Violation[];
5
+ export declare function lintFile(file: SourceFile, config: ResolvedConfig): Violation[];
6
+ export declare function fixFile(file: SourceFile, config: ResolvedConfig): {
7
+ text: string;
8
+ changed: boolean;
9
+ corrections: Correction[];
10
+ };
11
+ export type { Correction, SourceFile, Violation } from "./rules/types.js";
12
+ export { builtinRules } from "./rules/index.js";
13
+ export { loadConfig, ConfigError } from "./config.js";
14
+ //# sourceMappingURL=lint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../src/lint.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG1E,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAE3D;AAED,wBAAgB,SAAS,CACvB,KAAK,EAAE,UAAU,EAAE,EACnB,MAAM,EAAE,cAAc,GACrB,SAAS,EAAE,CAMb;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,GAAG,SAAS,EAAE,CAY9E;AAED,wBAAgB,OAAO,CACrB,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,cAAc,GACrB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,UAAU,EAAE,CAAA;CAAE,CAiC/D;AAED,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
package/dist/lint.js ADDED
@@ -0,0 +1,64 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { runCustomRules } from "./customRules.js";
3
+ import { builtinRules } from "./rules/index.js";
4
+ import { isSuppressed, parseSuppressions } from "./suppress.js";
5
+ export function readSourceFile(filePath) {
6
+ return { path: filePath, text: readFileSync(filePath, "utf8") };
7
+ }
8
+ export function lintFiles(files, config) {
9
+ const violations = [];
10
+ for (const file of files) {
11
+ violations.push(...lintFile(file, config));
12
+ }
13
+ return violations;
14
+ }
15
+ export function lintFile(file, config) {
16
+ const found = [];
17
+ for (const rule of builtinRules) {
18
+ if (!config.enabledRuleIds.has(rule.id)) {
19
+ continue;
20
+ }
21
+ const options = config.ruleOptions.get(rule.id) ?? {};
22
+ found.push(...rule.lint(file, options));
23
+ }
24
+ found.push(...runCustomRules(file, config.customRules));
25
+ const suppressions = parseSuppressions(file.text);
26
+ return found.filter((violation) => !isSuppressed(suppressions, violation.line, violation.ruleId));
27
+ }
28
+ export function fixFile(file, config) {
29
+ let current = file;
30
+ const corrections = [];
31
+ for (const rule of builtinRules) {
32
+ if (!config.enabledRuleIds.has(rule.id) || !rule.fix) {
33
+ continue;
34
+ }
35
+ const options = config.ruleOptions.get(rule.id) ?? {};
36
+ const suppressions = parseSuppressions(current.text);
37
+ const violations = rule
38
+ .lint(current, options)
39
+ .filter((violation) => !isSuppressed(suppressions, violation.line, violation.ruleId));
40
+ if (violations.length === 0) {
41
+ continue;
42
+ }
43
+ const next = rule.fix(current, options);
44
+ if (next === null || next === current.text) {
45
+ continue;
46
+ }
47
+ for (const violation of violations) {
48
+ corrections.push({
49
+ ruleId: rule.id,
50
+ file: file.path,
51
+ line: violation.line,
52
+ });
53
+ }
54
+ current = { path: file.path, text: next };
55
+ }
56
+ return {
57
+ text: current.text,
58
+ changed: current.text !== file.text,
59
+ corrections,
60
+ };
61
+ }
62
+ export { builtinRules } from "./rules/index.js";
63
+ export { loadConfig, ConfigError } from "./config.js";
64
+ //# sourceMappingURL=lint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.js","sourceRoot":"","sources":["../src/lint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Correction, Violation } from "./rules/types.js";
2
+ export type ReporterName = "stylish" | "json";
3
+ export declare function formatReport(violations: Violation[], reporter: ReporterName, cwd: string): string;
4
+ export declare function formatFixSummary(corrections: Correction[], cwd: string): string;
5
+ export declare function applyStrict(violations: Violation[], strict: boolean): Violation[];
6
+ export declare function exitCodeFor(violations: Violation[]): number;
7
+ //# sourceMappingURL=report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE9D,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,MAAM,CAAC;AAE9C,wBAAgB,YAAY,CAC1B,UAAU,EAAE,SAAS,EAAE,EACvB,QAAQ,EAAE,YAAY,EACtB,GAAG,EAAE,MAAM,GACV,MAAM,CAKR;AAsDD,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAuB/E;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,OAAO,GAAG,SAAS,EAAE,CAKjF;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,CAE3D"}
package/dist/report.js ADDED
@@ -0,0 +1,86 @@
1
+ import path from "node:path";
2
+ export function formatReport(violations, reporter, cwd) {
3
+ if (reporter === "json") {
4
+ return formatJson(violations, cwd);
5
+ }
6
+ return formatStylish(violations, cwd);
7
+ }
8
+ function formatJson(violations, cwd) {
9
+ const payload = violations.map((violation) => ({
10
+ file: displayPath(violation.file, cwd),
11
+ line: violation.line,
12
+ column: violation.column,
13
+ ruleId: violation.ruleId,
14
+ severity: violation.severity,
15
+ message: violation.message,
16
+ }));
17
+ return JSON.stringify(payload, null, 2);
18
+ }
19
+ function formatStylish(violations, cwd) {
20
+ if (violations.length === 0) {
21
+ return "";
22
+ }
23
+ const byFile = new Map();
24
+ for (const violation of violations) {
25
+ const file = displayPath(violation.file, cwd);
26
+ const list = byFile.get(file) ?? [];
27
+ list.push(violation);
28
+ byFile.set(file, list);
29
+ }
30
+ const sections = [];
31
+ for (const [file, fileViolations] of byFile) {
32
+ const lines = [file];
33
+ for (const violation of fileViolations) {
34
+ lines.push(` ${violation.line}:${violation.column} ${violation.severity.padEnd(7)} ${violation.message} ${violation.ruleId}`);
35
+ }
36
+ sections.push(lines.join("\n"));
37
+ }
38
+ const errors = violations.filter((v) => v.severity === "error").length;
39
+ const warnings = violations.length - errors;
40
+ const problemWord = violations.length === 1 ? "problem" : "problems";
41
+ const errorWord = errors === 1 ? "error" : "errors";
42
+ const warningWord = warnings === 1 ? "warning" : "warnings";
43
+ sections.push(`\n${violations.length} ${problemWord} (${errors} ${errorWord}, ${warnings} ${warningWord})`);
44
+ return sections.join("\n\n");
45
+ }
46
+ function displayPath(file, cwd) {
47
+ const rel = path.relative(cwd, file);
48
+ if (rel.length > 0 && !rel.startsWith("..") && !path.isAbsolute(rel)) {
49
+ return rel.split(path.sep).join("/");
50
+ }
51
+ return file;
52
+ }
53
+ export function formatFixSummary(corrections, cwd) {
54
+ if (corrections.length === 0) {
55
+ return "";
56
+ }
57
+ const byFile = new Map();
58
+ for (const correction of corrections) {
59
+ const file = displayPath(correction.file, cwd);
60
+ const list = byFile.get(file) ?? [];
61
+ list.push(correction);
62
+ byFile.set(file, list);
63
+ }
64
+ const sections = [];
65
+ for (const [file, fileCorrections] of byFile) {
66
+ const lines = [file];
67
+ for (const correction of fileCorrections) {
68
+ lines.push(` ${correction.line}:1 Corrected ${correction.ruleId}`);
69
+ }
70
+ sections.push(lines.join("\n"));
71
+ }
72
+ const violationWord = corrections.length === 1 ? "violation" : "violations";
73
+ const fileWord = byFile.size === 1 ? "file" : "files";
74
+ sections.push(`\nCorrected ${corrections.length} ${violationWord} in ${byFile.size} ${fileWord}`);
75
+ return sections.join("\n\n");
76
+ }
77
+ export function applyStrict(violations, strict) {
78
+ if (!strict) {
79
+ return violations;
80
+ }
81
+ return violations.map((violation) => ({ ...violation, severity: "error" }));
82
+ }
83
+ export function exitCodeFor(violations) {
84
+ return violations.some((violation) => violation.severity === "error") ? 2 : 0;
85
+ }
86
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Rule } from "./types.js";
2
+ export declare const emptyFunctionRun: Rule;
3
+ //# sourceMappingURL=empty_function_run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"empty_function_run.d.ts","sourceRoot":"","sources":["../../src/rules/empty_function_run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAsC,MAAM,YAAY,CAAC;AAK3E,eAAO,MAAM,gBAAgB,EAAE,IA4B9B,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { isCommentLine, splitLines } from "../util.js";
2
+ const EMPTY_RUN = /function\.run\s+(?:"\s*"|'\s*')/;
3
+ export const emptyFunctionRun = {
4
+ id: "empty_function_run",
5
+ description: "function.run must not be called with an empty name",
6
+ defaultEnabled: true,
7
+ defaultSeverity: "error",
8
+ lint(file, options) {
9
+ const severity = options.severity ?? emptyFunctionRun.defaultSeverity;
10
+ const violations = [];
11
+ const lines = splitLines(file.text);
12
+ for (let i = 0; i < lines.length; i += 1) {
13
+ const line = lines[i];
14
+ if (isCommentLine(line)) {
15
+ continue;
16
+ }
17
+ const match = EMPTY_RUN.exec(line);
18
+ if (match) {
19
+ violations.push({
20
+ ruleId: emptyFunctionRun.id,
21
+ message: "function.run has an empty name",
22
+ severity,
23
+ file: file.path,
24
+ line: i + 1,
25
+ column: match.index + 1,
26
+ });
27
+ }
28
+ }
29
+ return violations;
30
+ },
31
+ };
32
+ //# sourceMappingURL=empty_function_run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"empty_function_run.js","sourceRoot":"","sources":["../../src/rules/empty_function_run.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,SAAS,GAAG,iCAAiC,CAAC;AAEpD,MAAM,CAAC,MAAM,gBAAgB,GAAS;IACpC,EAAE,EAAE,oBAAoB;IACxB,WAAW,EAAE,oDAAoD;IACjE,cAAc,EAAE,IAAI;IACpB,eAAe,EAAE,OAAO;IACxB,IAAI,CAAC,IAAgB,EAAE,OAAoB;QACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,gBAAgB,CAAC,eAAe,CAAC;QACtE,MAAM,UAAU,GAAgB,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxB,SAAS;YACX,CAAC;YACD,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,KAAK,EAAE,CAAC;gBACV,UAAU,CAAC,IAAI,CAAC;oBACd,MAAM,EAAE,gBAAgB,CAAC,EAAE;oBAC3B,OAAO,EAAE,gCAAgC;oBACzC,QAAQ;oBACR,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,IAAI,EAAE,CAAC,GAAG,CAAC;oBACX,MAAM,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC;iBACxB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;CACF,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { Rule } from "./types.js";
2
+ export declare const builtinRules: Rule[];
3
+ export declare function builtinRuleById(id: string): Rule | undefined;
4
+ export type { Correction, Rule, RuleOptions, Severity, SourceFile, Violation, } from "./types.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,eAAO,MAAM,YAAY,EAAE,IAAI,EAI9B,CAAC;AAEF,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAE5D;AAED,YAAY,EACV,UAAU,EACV,IAAI,EACJ,WAAW,EACX,QAAQ,EACR,UAAU,EACV,SAAS,GACV,MAAM,YAAY,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { emptyFunctionRun } from "./empty_function_run.js";
2
+ import { noTrailingNewline } from "./no_trailing_newline.js";
3
+ import { noVarResponse } from "./no_var_response.js";
4
+ export const builtinRules = [
5
+ emptyFunctionRun,
6
+ noTrailingNewline,
7
+ noVarResponse,
8
+ ];
9
+ export function builtinRuleById(id) {
10
+ return builtinRules.find((rule) => rule.id === id);
11
+ }
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/rules/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,MAAM,CAAC,MAAM,YAAY,GAAW;IAClC,gBAAgB;IAChB,iBAAiB;IACjB,aAAa;CACd,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,EAAU;IACxC,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Rule } from "./types.js";
2
+ export declare const noTrailingNewline: Rule;
3
+ //# sourceMappingURL=no_trailing_newline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no_trailing_newline.d.ts","sourceRoot":"","sources":["../../src/rules/no_trailing_newline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAsC,MAAM,YAAY,CAAC;AAE3E,eAAO,MAAM,iBAAiB,EAAE,IAgC/B,CAAC"}
@@ -0,0 +1,34 @@
1
+ export const noTrailingNewline = {
2
+ id: "no_trailing_newline",
3
+ description: "XanoScript files must end with } and no trailing newline",
4
+ defaultEnabled: true,
5
+ defaultSeverity: "error",
6
+ lint(file, options) {
7
+ const severity = options.severity ?? noTrailingNewline.defaultSeverity;
8
+ if (file.text.endsWith("}")) {
9
+ return [];
10
+ }
11
+ const lines = file.text.split(/\r?\n/);
12
+ return [
13
+ {
14
+ ruleId: noTrailingNewline.id,
15
+ message: "file must end with } and no trailing newline",
16
+ severity,
17
+ file: file.path,
18
+ line: Math.max(lines.length, 1),
19
+ column: 1,
20
+ },
21
+ ];
22
+ },
23
+ fix(file) {
24
+ const trimmed = file.text.replace(/\s+$/, "");
25
+ if (!trimmed.endsWith("}")) {
26
+ return null;
27
+ }
28
+ if (trimmed === file.text) {
29
+ return null;
30
+ }
31
+ return trimmed;
32
+ },
33
+ };
34
+ //# sourceMappingURL=no_trailing_newline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no_trailing_newline.js","sourceRoot":"","sources":["../../src/rules/no_trailing_newline.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,iBAAiB,GAAS;IACrC,EAAE,EAAE,qBAAqB;IACzB,WAAW,EAAE,0DAA0D;IACvE,cAAc,EAAE,IAAI;IACpB,eAAe,EAAE,OAAO;IACxB,IAAI,CAAC,IAAgB,EAAE,OAAoB;QACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,iBAAiB,CAAC,eAAe,CAAC;QACvE,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACvC,OAAO;YACL;gBACE,MAAM,EAAE,iBAAiB,CAAC,EAAE;gBAC5B,OAAO,EAAE,8CAA8C;gBACvD,QAAQ;gBACR,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC/B,MAAM,EAAE,CAAC;aACV;SACF,CAAC;IACJ,CAAC;IACD,GAAG,CAAC,IAAgB;QAClB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,OAAO,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Rule } from "./types.js";
2
+ export declare const noVarResponse: Rule;
3
+ //# sourceMappingURL=no_var_response.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no_var_response.d.ts","sourceRoot":"","sources":["../../src/rules/no_var_response.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAsC,MAAM,YAAY,CAAC;AAK3E,eAAO,MAAM,aAAa,EAAE,IA4B3B,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { isCommentLine, splitLines } from "../util.js";
2
+ const VAR_RESPONSE = /\bvar\s+\$response\b/;
3
+ export const noVarResponse = {
4
+ id: "no_var_response",
5
+ description: "Do not declare var $response; Xano rewrites it",
6
+ defaultEnabled: false,
7
+ defaultSeverity: "warning",
8
+ lint(file, options) {
9
+ const severity = options.severity ?? noVarResponse.defaultSeverity;
10
+ const violations = [];
11
+ const lines = splitLines(file.text);
12
+ for (let i = 0; i < lines.length; i += 1) {
13
+ const line = lines[i];
14
+ if (isCommentLine(line)) {
15
+ continue;
16
+ }
17
+ const match = VAR_RESPONSE.exec(line);
18
+ if (match) {
19
+ violations.push({
20
+ ruleId: noVarResponse.id,
21
+ message: "var $response is rewritten by Xano; use a different name",
22
+ severity,
23
+ file: file.path,
24
+ line: i + 1,
25
+ column: match.index + 1,
26
+ });
27
+ }
28
+ }
29
+ return violations;
30
+ },
31
+ };
32
+ //# sourceMappingURL=no_var_response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no_var_response.js","sourceRoot":"","sources":["../../src/rules/no_var_response.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,YAAY,GAAG,sBAAsB,CAAC;AAE5C,MAAM,CAAC,MAAM,aAAa,GAAS;IACjC,EAAE,EAAE,iBAAiB;IACrB,WAAW,EAAE,gDAAgD;IAC7D,cAAc,EAAE,KAAK;IACrB,eAAe,EAAE,SAAS;IAC1B,IAAI,CAAC,IAAgB,EAAE,OAAoB;QACzC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,aAAa,CAAC,eAAe,CAAC;QACnE,MAAM,UAAU,GAAgB,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;gBACxB,SAAS;YACX,CAAC;YACD,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtC,IAAI,KAAK,EAAE,CAAC;gBACV,UAAU,CAAC,IAAI,CAAC;oBACd,MAAM,EAAE,aAAa,CAAC,EAAE;oBACxB,OAAO,EAAE,0DAA0D;oBACnE,QAAQ;oBACR,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,IAAI,EAAE,CAAC,GAAG,CAAC;oBACX,MAAM,EAAE,KAAK,CAAC,KAAK,GAAG,CAAC;iBACxB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;CACF,CAAC"}
@@ -0,0 +1,30 @@
1
+ export type Severity = "error" | "warning";
2
+ export interface SourceFile {
3
+ path: string;
4
+ text: string;
5
+ }
6
+ export interface Violation {
7
+ ruleId: string;
8
+ message: string;
9
+ severity: Severity;
10
+ file: string;
11
+ line: number;
12
+ column: number;
13
+ }
14
+ export interface RuleOptions {
15
+ severity?: Severity;
16
+ }
17
+ export interface Correction {
18
+ ruleId: string;
19
+ file: string;
20
+ line: number;
21
+ }
22
+ export interface Rule {
23
+ id: string;
24
+ description: string;
25
+ defaultEnabled: boolean;
26
+ defaultSeverity: Severity;
27
+ lint(file: SourceFile, options: RuleOptions): Violation[];
28
+ fix?(file: SourceFile, options: RuleOptions): string | null;
29
+ }
30
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/rules/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAC;AAE3C,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,EAAE,QAAQ,CAAC;IAC1B,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,GAAG,SAAS,EAAE,CAAC;IAC1D,GAAG,CAAC,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAAC;CAC7D"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/rules/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ export interface SuppressionIndex {
2
+ regionDisabled: Map<number, Set<string>>;
3
+ nextDisabled: Map<number, Set<string>>;
4
+ previousDisabled: Map<number, Set<string>>;
5
+ }
6
+ export declare function parseSuppressions(text: string): SuppressionIndex;
7
+ export declare function isSuppressed(index: SuppressionIndex, line: number, ruleId: string): boolean;
8
+ //# sourceMappingURL=suppress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suppress.d.ts","sourceRoot":"","sources":["../src/suppress.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACzC,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACvC,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;CAC5C;AAKD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CA6ChE;AAED,wBAAgB,YAAY,CAC1B,KAAK,EAAE,gBAAgB,EACvB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,OAAO,CAWT"}
@@ -0,0 +1,107 @@
1
+ import { isBlankLine, isCommentLine, splitLines } from "./util.js";
2
+ const DIRECTIVE = /^\/\/\s*xanoscriptlint:(disable|enable)(?::(next|previous))?(?:\s+(.*))?$/;
3
+ export function parseSuppressions(text) {
4
+ const lines = splitLines(text);
5
+ const regionDisabled = new Map();
6
+ const nextDisabled = new Map();
7
+ const previousDisabled = new Map();
8
+ const active = new Set();
9
+ for (let i = 0; i < lines.length; i += 1) {
10
+ const lineNo = i + 1;
11
+ const trimmed = lines[i].trim();
12
+ const directive = parseDirective(trimmed);
13
+ if (directive && !directive.scope) {
14
+ if (directive.action === "disable") {
15
+ for (const id of directive.ids) {
16
+ active.add(id);
17
+ }
18
+ }
19
+ else {
20
+ for (const id of directive.ids) {
21
+ active.delete(id);
22
+ }
23
+ }
24
+ }
25
+ regionDisabled.set(lineNo, new Set(active));
26
+ }
27
+ for (let i = 0; i < lines.length; i += 1) {
28
+ const trimmed = lines[i].trim();
29
+ const directive = parseDirective(trimmed);
30
+ if (!directive || !directive.scope) {
31
+ continue;
32
+ }
33
+ if (directive.scope === "next") {
34
+ const target = nextCodeLine(lines, i + 1);
35
+ if (target !== undefined) {
36
+ addAll(nextDisabled, target, directive.ids);
37
+ }
38
+ }
39
+ else {
40
+ const target = previousCodeLine(lines, i - 1);
41
+ if (target !== undefined) {
42
+ addAll(previousDisabled, target, directive.ids);
43
+ }
44
+ }
45
+ }
46
+ return { regionDisabled, nextDisabled, previousDisabled };
47
+ }
48
+ export function isSuppressed(index, line, ruleId) {
49
+ if (index.regionDisabled.get(line)?.has(ruleId)) {
50
+ return true;
51
+ }
52
+ if (index.nextDisabled.get(line)?.has(ruleId)) {
53
+ return true;
54
+ }
55
+ if (index.previousDisabled.get(line)?.has(ruleId)) {
56
+ return true;
57
+ }
58
+ return false;
59
+ }
60
+ function parseDirective(trimmed) {
61
+ if (!isCommentLine(trimmed)) {
62
+ return null;
63
+ }
64
+ const match = DIRECTIVE.exec(trimmed);
65
+ if (!match) {
66
+ return null;
67
+ }
68
+ const action = match[1];
69
+ const scope = match[2];
70
+ const ids = (match[3] ?? "")
71
+ .split(/[,\s]+/)
72
+ .map((id) => id.trim())
73
+ .filter((id) => id.length > 0);
74
+ if (ids.length === 0) {
75
+ return null;
76
+ }
77
+ if (action === "enable" && scope) {
78
+ return null;
79
+ }
80
+ return { action, scope, ids };
81
+ }
82
+ function nextCodeLine(lines, start) {
83
+ for (let i = start; i < lines.length; i += 1) {
84
+ if (isBlankLine(lines[i]) || isCommentLine(lines[i])) {
85
+ continue;
86
+ }
87
+ return i + 1;
88
+ }
89
+ return undefined;
90
+ }
91
+ function previousCodeLine(lines, start) {
92
+ for (let i = start; i >= 0; i -= 1) {
93
+ if (isBlankLine(lines[i]) || isCommentLine(lines[i])) {
94
+ continue;
95
+ }
96
+ return i + 1;
97
+ }
98
+ return undefined;
99
+ }
100
+ function addAll(map, line, ids) {
101
+ const set = map.get(line) ?? new Set();
102
+ for (const id of ids) {
103
+ set.add(id);
104
+ }
105
+ map.set(line, set);
106
+ }
107
+ //# sourceMappingURL=suppress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suppress.js","sourceRoot":"","sources":["../src/suppress.ts"],"names":[],"mappings":"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"}
package/dist/util.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ export declare function isCommentLine(line: string): boolean;
2
+ export declare function isBlankLine(line: string): boolean;
3
+ export declare function splitLines(text: string): string[];
4
+ export declare function lineNumberOfOffset(text: string, offset: number): {
5
+ line: number;
6
+ column: number;
7
+ };
8
+ export declare function isMainModule(argv1: string | undefined, modulePath: string): boolean;
9
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAGA,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAEjD;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB,CAYA;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CASnF"}