@amritk/lint 0.4.8 → 0.5.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 (107) hide show
  1. package/AI.md +73 -4
  2. package/README.md +65 -14
  3. package/dist/core/filter-expression.js +17 -4
  4. package/dist/core/filter.js +82 -35
  5. package/dist/core/glob.js +25 -31
  6. package/dist/core/jsonpath.d.ts +9 -1
  7. package/dist/core/jsonpath.js +74 -16
  8. package/dist/core/lint.d.ts +8 -1
  9. package/dist/core/lint.js +4 -18
  10. package/dist/core/order.d.ts +30 -0
  11. package/dist/core/order.js +36 -0
  12. package/dist/core/pointers.d.ts +3 -2
  13. package/dist/core/pointers.js +27 -18
  14. package/dist/core/ruleset.js +62 -20
  15. package/dist/core/runner.js +16 -23
  16. package/dist/core/severity.d.ts +11 -0
  17. package/dist/core/severity.js +13 -0
  18. package/dist/fix/apply.js +6 -1
  19. package/dist/fix/plugin.js +2 -1
  20. package/dist/functions/or.js +1 -1
  21. package/dist/functions/ref-index.d.ts +15 -0
  22. package/dist/functions/ref-index.js +33 -0
  23. package/dist/functions/schema.d.ts +15 -0
  24. package/dist/functions/schema.js +2 -0
  25. package/dist/functions/typed-enum.js +2 -1
  26. package/dist/functions/unreferenced-reusable-object.js +3 -20
  27. package/dist/functions/xor.js +1 -1
  28. package/dist/index.d.ts +16 -16
  29. package/dist/index.js +24 -93
  30. package/dist/rules/asyncapi/asyncapi.d.ts +3 -0
  31. package/dist/rules/asyncapi/asyncapi.js +563 -0
  32. package/dist/rules/asyncapi/formats.d.ts +23 -0
  33. package/dist/rules/asyncapi/formats.js +49 -0
  34. package/dist/rules/asyncapi/functions/aas-server-variables.d.ts +8 -0
  35. package/dist/rules/asyncapi/functions/aas-server-variables.js +5 -0
  36. package/dist/rules/asyncapi/functions/aas-tags-unique.d.ts +2 -0
  37. package/dist/rules/asyncapi/functions/aas-tags-unique.js +5 -0
  38. package/dist/rules/asyncapi/functions/asyncapi-channel-parameters.d.ts +7 -0
  39. package/dist/rules/asyncapi/functions/asyncapi-channel-parameters.js +46 -0
  40. package/dist/rules/asyncapi/functions/asyncapi-channel-servers.d.ts +27 -0
  41. package/dist/rules/asyncapi/functions/asyncapi-channel-servers.js +61 -0
  42. package/dist/rules/asyncapi/functions/asyncapi-document-schema.d.ts +17 -0
  43. package/dist/rules/asyncapi/functions/asyncapi-document-schema.js +12 -0
  44. package/dist/rules/asyncapi/functions/asyncapi-headers-object.d.ts +23 -0
  45. package/dist/rules/asyncapi/functions/asyncapi-headers-object.js +25 -0
  46. package/dist/rules/asyncapi/functions/asyncapi-message-examples.d.ts +8 -0
  47. package/dist/rules/asyncapi/functions/asyncapi-message-examples.js +42 -0
  48. package/dist/rules/asyncapi/functions/asyncapi-message-id-unique.d.ts +3 -0
  49. package/dist/rules/asyncapi/functions/asyncapi-message-id-unique.js +30 -0
  50. package/dist/rules/asyncapi/functions/asyncapi-operation-id-unique.d.ts +3 -0
  51. package/dist/rules/asyncapi/functions/asyncapi-operation-id-unique.js +30 -0
  52. package/dist/rules/asyncapi/functions/asyncapi-payload.d.ts +14 -0
  53. package/dist/rules/asyncapi/functions/asyncapi-payload.js +32 -0
  54. package/dist/rules/asyncapi/functions/asyncapi-schema-validation.d.ts +11 -0
  55. package/dist/rules/asyncapi/functions/asyncapi-schema-validation.js +17 -0
  56. package/dist/rules/asyncapi/functions/asyncapi-security.d.ts +22 -0
  57. package/dist/rules/asyncapi/functions/asyncapi-security.js +78 -0
  58. package/dist/rules/asyncapi/functions/helpers.d.ts +51 -0
  59. package/dist/rules/asyncapi/functions/helpers.js +91 -0
  60. package/dist/rules/asyncapi/functions/index.d.ts +15 -0
  61. package/dist/rules/asyncapi/functions/index.js +53 -0
  62. package/dist/rules/asyncapi/functions/pointer.d.ts +11 -0
  63. package/dist/rules/asyncapi/functions/pointer.js +11 -0
  64. package/dist/rules/asyncapi/functions/schema-format.d.ts +4 -0
  65. package/dist/rules/asyncapi/functions/schema-format.js +7 -0
  66. package/dist/rules/asyncapi/index.d.ts +33 -0
  67. package/dist/rules/asyncapi/index.js +60 -0
  68. package/dist/rules/asyncapi/schemas/aas20.d.ts +2 -0
  69. package/dist/rules/asyncapi/schemas/aas20.js +4 -0
  70. package/dist/rules/asyncapi/schemas/aas21.d.ts +2 -0
  71. package/dist/rules/asyncapi/schemas/aas21.js +4 -0
  72. package/dist/rules/asyncapi/schemas/aas22.d.ts +2 -0
  73. package/dist/rules/asyncapi/schemas/aas22.js +4 -0
  74. package/dist/rules/asyncapi/schemas/aas23.d.ts +2 -0
  75. package/dist/rules/asyncapi/schemas/aas23.js +4 -0
  76. package/dist/rules/asyncapi/schemas/aas24.d.ts +2 -0
  77. package/dist/rules/asyncapi/schemas/aas24.js +4 -0
  78. package/dist/rules/asyncapi/schemas/aas25.d.ts +2 -0
  79. package/dist/rules/asyncapi/schemas/aas25.js +4 -0
  80. package/dist/rules/asyncapi/schemas/aas26.d.ts +2 -0
  81. package/dist/rules/asyncapi/schemas/aas26.js +4 -0
  82. package/dist/rules/asyncapi/schemas/aas30.d.ts +2 -0
  83. package/dist/rules/asyncapi/schemas/aas30.js +4 -0
  84. package/dist/rules/asyncapi/schemas/index.d.ts +20 -0
  85. package/dist/rules/asyncapi/schemas/index.js +45 -0
  86. package/dist/rules/openapi/fixers.d.ts +6 -2
  87. package/dist/rules/openapi/fixers.js +2 -0
  88. package/dist/rules/openapi/functions/oas-discriminator.js +1 -1
  89. package/dist/rules/openapi/functions/oas-mutually-exclusive.js +1 -1
  90. package/dist/rules/openapi/functions/oas-op-security-defined.js +1 -1
  91. package/dist/rules/openapi/functions/oas-server-variables.d.ts +6 -6
  92. package/dist/rules/openapi/functions/oas-server-variables.js +2 -45
  93. package/dist/rules/openapi/functions/oas-tags-unique.d.ts +2 -3
  94. package/dist/rules/openapi/functions/oas-tags-unique.js +2 -16
  95. package/dist/rules/openapi/functions/oas-unused-component.js +3 -25
  96. package/dist/rules/openapi/index.d.ts +9 -2
  97. package/dist/rules/openapi/index.js +15 -70
  98. package/dist/rules/openapi/schemas/index.js +5 -1
  99. package/dist/rules/shared/helpers.d.ts +2 -0
  100. package/dist/rules/shared/helpers.js +4 -0
  101. package/dist/rules/shared/server-variables.d.ts +27 -0
  102. package/dist/rules/shared/server-variables.js +55 -0
  103. package/dist/rules/shared/tags-unique.d.ts +7 -0
  104. package/dist/rules/shared/tags-unique.js +19 -0
  105. package/dist/ruleset-files.d.ts +47 -0
  106. package/dist/ruleset-files.js +92 -0
  107. package/package.json +8 -4
@@ -0,0 +1,92 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { createRequire } from "node:module";
3
+ import { dirname, isAbsolute, resolve as resolvePath, sep } from "node:path";
4
+ import { setOwnKey } from "./core/own-key.js";
5
+ import { parseWithPointers } from "./parsers/index.js";
6
+ const require2 = createRequire(import.meta.url);
7
+ const assertWithinRoot = (file, restrictTo, what) => {
8
+ if (restrictTo === void 0)
9
+ return;
10
+ const root = resolvePath(restrictTo);
11
+ const resolved = resolvePath(file);
12
+ if (resolved !== root && !resolved.startsWith(root.endsWith(sep) ? root : `${root}${sep}`)) {
13
+ throw new Error(`${what} "${file}" resolves outside the permitted root ${root}`);
14
+ }
15
+ };
16
+ const loadRulesetFile = (file) => {
17
+ if (/\.(ya?ml|json)$/i.test(file)) {
18
+ return parseWithPointers(readFileSync(file, "utf8")).data;
19
+ }
20
+ const module = require2(file);
21
+ return module.default ?? module;
22
+ };
23
+ const resolveRulesetFile = (name, basePath, options = {}) => {
24
+ if (name.startsWith(".") || isAbsolute(name)) {
25
+ const file2 = resolvePath(basePath, name);
26
+ assertWithinRoot(file2, options.restrictTo, "Extended ruleset");
27
+ return { definition: loadRulesetFile(file2), basePath: dirname(file2) };
28
+ }
29
+ let file;
30
+ try {
31
+ file = require2.resolve(name, { paths: [basePath] });
32
+ } catch {
33
+ throw new Error(`Cannot resolve extended ruleset "${name}" from ${basePath}`);
34
+ }
35
+ assertWithinRoot(file, options.restrictTo, "Extended ruleset");
36
+ return { definition: loadRulesetFile(file), basePath: dirname(file) };
37
+ };
38
+ const loadFunctionByName = (basePath, dir, name, restrictTo) => {
39
+ const baseFile = resolvePath(basePath, dir, name);
40
+ assertWithinRoot(baseFile, restrictTo, "Custom function");
41
+ for (const candidate of [baseFile, `${baseFile}.js`, `${baseFile}.cjs`, `${baseFile}.mjs`]) {
42
+ try {
43
+ const resolvedFile = require2.resolve(candidate);
44
+ const module = require2(resolvedFile);
45
+ const fn = module.default ?? module;
46
+ if (typeof fn !== "function")
47
+ throw new Error(`"${name}" did not export a function`);
48
+ return fn;
49
+ } catch (error) {
50
+ if (error.code !== "MODULE_NOT_FOUND")
51
+ throw error;
52
+ }
53
+ }
54
+ throw new Error(`Cannot resolve custom function "${name}" from ${resolvePath(basePath, dir)}`);
55
+ };
56
+ const collectCustomFunctions = (definition, basePath, into, seen, options) => {
57
+ if (typeof definition !== "object" || definition === null)
58
+ return;
59
+ if (seen.has(definition))
60
+ return;
61
+ seen.add(definition);
62
+ if (definition.extends) {
63
+ const entries = Array.isArray(definition.extends) ? definition.extends : [definition.extends];
64
+ for (const entry of entries) {
65
+ const target = Array.isArray(entry) ? entry[0] : entry;
66
+ if (typeof target === "string") {
67
+ const key = `${basePath}\0${target}`;
68
+ if (seen.has(key))
69
+ continue;
70
+ seen.add(key);
71
+ const resolved = options.resolveExtend(target, basePath);
72
+ if (resolved)
73
+ collectCustomFunctions(resolved.definition, resolved.basePath, into, seen, options);
74
+ } else {
75
+ collectCustomFunctions(target, basePath, into, seen, options);
76
+ }
77
+ }
78
+ }
79
+ if (Array.isArray(definition.functions)) {
80
+ const dir = definition.functionsDir ?? "functions";
81
+ for (const name of definition.functions) {
82
+ setOwnKey(into, name, loadFunctionByName(basePath, dir, name, options.restrictTo));
83
+ }
84
+ }
85
+ };
86
+ export {
87
+ assertWithinRoot,
88
+ collectCustomFunctions,
89
+ loadFunctionByName,
90
+ loadRulesetFile,
91
+ resolveRulesetFile
92
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@amritk/lint",
3
- "version": "0.4.8",
3
+ "version": "0.5.0",
4
4
  "description": "A fast, format-agnostic JSON/YAML style-guide linter with JSON Schema and custom rules.",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",
@@ -60,15 +60,19 @@
60
60
  "./rules/openapi": {
61
61
  "types": "./dist/rules/openapi/index.d.ts",
62
62
  "default": "./dist/rules/openapi/index.js"
63
+ },
64
+ "./rules/asyncapi": {
65
+ "types": "./dist/rules/asyncapi/index.d.ts",
66
+ "default": "./dist/rules/asyncapi/index.js"
63
67
  }
64
68
  },
65
69
  "dependencies": {
66
- "@amritk/runtime-validators": "^0.11.0",
67
- "@amritk/yaml": "^0.7.1",
70
+ "@amritk/runtime-validators": "^0.12.0",
71
+ "@amritk/yaml": "^0.7.2",
68
72
  "jsonc-parser": "^3.3.1"
69
73
  },
70
74
  "devDependencies": {
71
- "@amritk/resolve-refs": "^0.7.0",
75
+ "@amritk/resolve-refs": "^0.7.1",
72
76
  "@stoplight/spectral-core": "^1.23.1",
73
77
  "@stoplight/spectral-parsers": "^1.0.5",
74
78
  "@stoplight/spectral-rulesets": "^1.22.7"