@opensip-cli/checks-universal 0.1.10 → 0.1.11

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 (206) hide show
  1. package/README.md +4 -2
  2. package/dist/__tests__/all-checks-execute.test.d.ts.map +1 -1
  3. package/dist/__tests__/all-checks-execute.test.js +0 -1
  4. package/dist/__tests__/all-checks-execute.test.js.map +1 -1
  5. package/dist/__tests__/behavior-fixtures-10.test.d.ts.map +1 -1
  6. package/dist/__tests__/behavior-fixtures-10.test.js +0 -1
  7. package/dist/__tests__/behavior-fixtures-10.test.js.map +1 -1
  8. package/dist/__tests__/behavior-fixtures-11.test.d.ts.map +1 -1
  9. package/dist/__tests__/behavior-fixtures-11.test.js +0 -1
  10. package/dist/__tests__/behavior-fixtures-11.test.js.map +1 -1
  11. package/dist/__tests__/behavior-fixtures-12.test.d.ts.map +1 -1
  12. package/dist/__tests__/behavior-fixtures-12.test.js +0 -1
  13. package/dist/__tests__/behavior-fixtures-12.test.js.map +1 -1
  14. package/dist/__tests__/behavior-fixtures-2.test.d.ts.map +1 -1
  15. package/dist/__tests__/behavior-fixtures-2.test.js +0 -1
  16. package/dist/__tests__/behavior-fixtures-2.test.js.map +1 -1
  17. package/dist/__tests__/behavior-fixtures-3.test.d.ts.map +1 -1
  18. package/dist/__tests__/behavior-fixtures-3.test.js +0 -1
  19. package/dist/__tests__/behavior-fixtures-3.test.js.map +1 -1
  20. package/dist/__tests__/behavior-fixtures-4.test.d.ts.map +1 -1
  21. package/dist/__tests__/behavior-fixtures-4.test.js +0 -1
  22. package/dist/__tests__/behavior-fixtures-4.test.js.map +1 -1
  23. package/dist/__tests__/behavior-fixtures-5.test.d.ts.map +1 -1
  24. package/dist/__tests__/behavior-fixtures-5.test.js +0 -1
  25. package/dist/__tests__/behavior-fixtures-5.test.js.map +1 -1
  26. package/dist/__tests__/behavior-fixtures-6.test.d.ts.map +1 -1
  27. package/dist/__tests__/behavior-fixtures-6.test.js +0 -1
  28. package/dist/__tests__/behavior-fixtures-6.test.js.map +1 -1
  29. package/dist/__tests__/behavior-fixtures-7.test.d.ts.map +1 -1
  30. package/dist/__tests__/behavior-fixtures-7.test.js +0 -1
  31. package/dist/__tests__/behavior-fixtures-7.test.js.map +1 -1
  32. package/dist/__tests__/behavior-fixtures-8.test.d.ts.map +1 -1
  33. package/dist/__tests__/behavior-fixtures-8.test.js +2 -3
  34. package/dist/__tests__/behavior-fixtures-8.test.js.map +1 -1
  35. package/dist/__tests__/behavior-fixtures-9.test.d.ts.map +1 -1
  36. package/dist/__tests__/behavior-fixtures-9.test.js +0 -1
  37. package/dist/__tests__/behavior-fixtures-9.test.js.map +1 -1
  38. package/dist/__tests__/behavior-fixtures.test.d.ts.map +1 -1
  39. package/dist/__tests__/behavior-fixtures.test.js +10 -9
  40. package/dist/__tests__/behavior-fixtures.test.js.map +1 -1
  41. package/dist/__tests__/file-length-limit.test.js +12 -1
  42. package/dist/__tests__/file-length-limit.test.js.map +1 -1
  43. package/dist/checks/architecture/__tests__/tool-identity-single-source.test.d.ts +2 -0
  44. package/dist/checks/architecture/__tests__/tool-identity-single-source.test.d.ts.map +1 -0
  45. package/dist/checks/architecture/__tests__/tool-identity-single-source.test.js +61 -0
  46. package/dist/checks/architecture/__tests__/tool-identity-single-source.test.js.map +1 -0
  47. package/dist/checks/architecture/docker-best-practices-analyze.d.ts +7 -0
  48. package/dist/checks/architecture/docker-best-practices-analyze.d.ts.map +1 -0
  49. package/dist/checks/architecture/docker-best-practices-analyze.js +301 -0
  50. package/dist/checks/architecture/docker-best-practices-analyze.js.map +1 -0
  51. package/dist/checks/architecture/docker-best-practices-patterns.d.ts +50 -0
  52. package/dist/checks/architecture/docker-best-practices-patterns.d.ts.map +1 -0
  53. package/dist/checks/architecture/docker-best-practices-patterns.js +51 -0
  54. package/dist/checks/architecture/docker-best-practices-patterns.js.map +1 -0
  55. package/dist/checks/architecture/docker-best-practices.d.ts.map +1 -1
  56. package/dist/checks/architecture/docker-best-practices.js +1 -367
  57. package/dist/checks/architecture/docker-best-practices.js.map +1 -1
  58. package/dist/checks/architecture/docker-ignore-validation.d.ts.map +1 -1
  59. package/dist/checks/architecture/docker-ignore-validation.js +0 -1
  60. package/dist/checks/architecture/docker-ignore-validation.js.map +1 -1
  61. package/dist/checks/architecture/docker-version-sync.d.ts.map +1 -1
  62. package/dist/checks/architecture/docker-version-sync.js +0 -1
  63. package/dist/checks/architecture/docker-version-sync.js.map +1 -1
  64. package/dist/checks/architecture/heavy-import-detection.d.ts.map +1 -1
  65. package/dist/checks/architecture/heavy-import-detection.js +1 -0
  66. package/dist/checks/architecture/heavy-import-detection.js.map +1 -1
  67. package/dist/checks/architecture/index.d.ts +1 -0
  68. package/dist/checks/architecture/index.d.ts.map +1 -1
  69. package/dist/checks/architecture/index.js +1 -0
  70. package/dist/checks/architecture/index.js.map +1 -1
  71. package/dist/checks/architecture/modules/empty-package-detection.d.ts.map +1 -1
  72. package/dist/checks/architecture/modules/empty-package-detection.js +0 -1
  73. package/dist/checks/architecture/modules/empty-package-detection.js.map +1 -1
  74. package/dist/checks/architecture/modules/interface-implementation-consistency-constants.d.ts +16 -0
  75. package/dist/checks/architecture/modules/interface-implementation-consistency-constants.d.ts.map +1 -0
  76. package/dist/checks/architecture/modules/interface-implementation-consistency-constants.js +182 -0
  77. package/dist/checks/architecture/modules/interface-implementation-consistency-constants.js.map +1 -0
  78. package/dist/checks/architecture/modules/interface-implementation-consistency-parse.d.ts +23 -0
  79. package/dist/checks/architecture/modules/interface-implementation-consistency-parse.d.ts.map +1 -0
  80. package/dist/checks/architecture/modules/interface-implementation-consistency-parse.js +235 -0
  81. package/dist/checks/architecture/modules/interface-implementation-consistency-parse.js.map +1 -0
  82. package/dist/checks/architecture/modules/interface-implementation-consistency.d.ts.map +1 -1
  83. package/dist/checks/architecture/modules/interface-implementation-consistency.js +4 -462
  84. package/dist/checks/architecture/modules/interface-implementation-consistency.js.map +1 -1
  85. package/dist/checks/architecture/node-version-consistency.d.ts.map +1 -1
  86. package/dist/checks/architecture/node-version-consistency.js +0 -2
  87. package/dist/checks/architecture/node-version-consistency.js.map +1 -1
  88. package/dist/checks/architecture/stale-build-artifacts.d.ts.map +1 -1
  89. package/dist/checks/architecture/stale-build-artifacts.js +0 -1
  90. package/dist/checks/architecture/stale-build-artifacts.js.map +1 -1
  91. package/dist/checks/architecture/tool-has-manifest.d.ts.map +1 -1
  92. package/dist/checks/architecture/tool-has-manifest.js +0 -1
  93. package/dist/checks/architecture/tool-has-manifest.js.map +1 -1
  94. package/dist/checks/architecture/tool-identity-single-source.d.ts +23 -0
  95. package/dist/checks/architecture/tool-identity-single-source.d.ts.map +1 -0
  96. package/dist/checks/architecture/tool-identity-single-source.js +126 -0
  97. package/dist/checks/architecture/tool-identity-single-source.js.map +1 -0
  98. package/dist/checks/documentation/_public-api-graph.d.ts +3 -26
  99. package/dist/checks/documentation/_public-api-graph.d.ts.map +1 -1
  100. package/dist/checks/documentation/_public-api-graph.js +3 -300
  101. package/dist/checks/documentation/_public-api-graph.js.map +1 -1
  102. package/dist/checks/documentation/directive-audit.d.ts.map +1 -1
  103. package/dist/checks/documentation/directive-audit.js +0 -1
  104. package/dist/checks/documentation/directive-audit.js.map +1 -1
  105. package/dist/checks/file-length-limit.d.ts +7 -0
  106. package/dist/checks/file-length-limit.d.ts.map +1 -1
  107. package/dist/checks/file-length-limit.js +14 -2
  108. package/dist/checks/file-length-limit.js.map +1 -1
  109. package/dist/checks/quality/code-structure/dead-code.d.ts.map +1 -1
  110. package/dist/checks/quality/code-structure/dead-code.js +0 -1
  111. package/dist/checks/quality/code-structure/dead-code.js.map +1 -1
  112. package/dist/checks/quality/dependency-version-consistency.d.ts.map +1 -1
  113. package/dist/checks/quality/dependency-version-consistency.js +0 -2
  114. package/dist/checks/quality/dependency-version-consistency.js.map +1 -1
  115. package/dist/checks/quality/frontend/navigation-typing.d.ts.map +1 -1
  116. package/dist/checks/quality/frontend/navigation-typing.js +0 -1
  117. package/dist/checks/quality/frontend/navigation-typing.js.map +1 -1
  118. package/dist/checks/quality/index.d.ts +1 -0
  119. package/dist/checks/quality/index.d.ts.map +1 -1
  120. package/dist/checks/quality/index.js +1 -0
  121. package/dist/checks/quality/index.js.map +1 -1
  122. package/dist/checks/quality/linting/eslint-justifications.d.ts.map +1 -1
  123. package/dist/checks/quality/linting/eslint-justifications.js +0 -1
  124. package/dist/checks/quality/linting/eslint-justifications.js.map +1 -1
  125. package/dist/checks/quality/no-raw-regex-on-code.d.ts.map +1 -1
  126. package/dist/checks/quality/no-raw-regex-on-code.js +2 -3
  127. package/dist/checks/quality/no-raw-regex-on-code.js.map +1 -1
  128. package/dist/checks/quality/patterns/__tests__/performance-anti-patterns-fp.test.d.ts +5 -0
  129. package/dist/checks/quality/patterns/__tests__/performance-anti-patterns-fp.test.d.ts.map +1 -0
  130. package/dist/checks/quality/patterns/__tests__/performance-anti-patterns-fp.test.js +66 -0
  131. package/dist/checks/quality/patterns/__tests__/performance-anti-patterns-fp.test.js.map +1 -0
  132. package/dist/checks/quality/patterns/performance-anti-patterns.d.ts +3 -0
  133. package/dist/checks/quality/patterns/performance-anti-patterns.d.ts.map +1 -1
  134. package/dist/checks/quality/patterns/performance-anti-patterns.js +47 -30
  135. package/dist/checks/quality/patterns/performance-anti-patterns.js.map +1 -1
  136. package/dist/checks/quality/yagni-ignore-hygiene.d.ts +10 -0
  137. package/dist/checks/quality/yagni-ignore-hygiene.d.ts.map +1 -0
  138. package/dist/checks/quality/yagni-ignore-hygiene.js +87 -0
  139. package/dist/checks/quality/yagni-ignore-hygiene.js.map +1 -0
  140. package/dist/checks/quality/yagni-ignore-hygiene.test.d.ts +5 -0
  141. package/dist/checks/quality/yagni-ignore-hygiene.test.d.ts.map +1 -0
  142. package/dist/checks/quality/yagni-ignore-hygiene.test.js +37 -0
  143. package/dist/checks/quality/yagni-ignore-hygiene.test.js.map +1 -0
  144. package/dist/checks/resilience/batch-operation-limits.d.ts +13 -0
  145. package/dist/checks/resilience/batch-operation-limits.d.ts.map +1 -0
  146. package/dist/checks/resilience/batch-operation-limits.js +160 -0
  147. package/dist/checks/resilience/batch-operation-limits.js.map +1 -0
  148. package/dist/checks/resilience/batch-operations.d.ts +2 -21
  149. package/dist/checks/resilience/batch-operations.d.ts.map +1 -1
  150. package/dist/checks/resilience/batch-operations.js +2 -420
  151. package/dist/checks/resilience/batch-operations.js.map +1 -1
  152. package/dist/checks/resilience/dangerous-config-defaults.d.ts.map +1 -1
  153. package/dist/checks/resilience/dangerous-config-defaults.js +0 -1
  154. package/dist/checks/resilience/dangerous-config-defaults.js.map +1 -1
  155. package/dist/checks/resilience/exit-code-correctness.d.ts.map +1 -1
  156. package/dist/checks/resilience/exit-code-correctness.js +0 -1
  157. package/dist/checks/resilience/exit-code-correctness.js.map +1 -1
  158. package/dist/checks/resilience/no-process-exit-in-finally.d.ts.map +1 -1
  159. package/dist/checks/resilience/no-process-exit-in-finally.js +0 -1
  160. package/dist/checks/resilience/no-process-exit-in-finally.js.map +1 -1
  161. package/dist/checks/resilience/readline-cleanup.d.ts.map +1 -1
  162. package/dist/checks/resilience/readline-cleanup.js +0 -1
  163. package/dist/checks/resilience/readline-cleanup.js.map +1 -1
  164. package/dist/checks/resilience/reentrancy-guard.d.ts.map +1 -1
  165. package/dist/checks/resilience/reentrancy-guard.js +0 -1
  166. package/dist/checks/resilience/reentrancy-guard.js.map +1 -1
  167. package/dist/checks/resilience/service-patterns.d.ts.map +1 -1
  168. package/dist/checks/resilience/service-patterns.js +0 -1
  169. package/dist/checks/resilience/service-patterns.js.map +1 -1
  170. package/dist/checks/resilience/unbounded-memory.d.ts +13 -0
  171. package/dist/checks/resilience/unbounded-memory.d.ts.map +1 -0
  172. package/dist/checks/resilience/unbounded-memory.js +229 -0
  173. package/dist/checks/resilience/unbounded-memory.js.map +1 -0
  174. package/dist/checks/security/csp-headers.d.ts.map +1 -1
  175. package/dist/checks/security/csp-headers.js +0 -1
  176. package/dist/checks/security/csp-headers.js.map +1 -1
  177. package/dist/checks/security/hasura-production-config.d.ts.map +1 -1
  178. package/dist/checks/security/hasura-production-config.js +0 -1
  179. package/dist/checks/security/hasura-production-config.js.map +1 -1
  180. package/dist/checks/security/jwt-validation.d.ts.map +1 -1
  181. package/dist/checks/security/jwt-validation.js +0 -2
  182. package/dist/checks/security/jwt-validation.js.map +1 -1
  183. package/dist/checks/security/package-supply-chain-policy.d.ts.map +1 -1
  184. package/dist/checks/security/package-supply-chain-policy.js +9 -15
  185. package/dist/checks/security/package-supply-chain-policy.js.map +1 -1
  186. package/dist/checks/security/semgrep-scan.d.ts.map +1 -1
  187. package/dist/checks/security/semgrep-scan.js +0 -1
  188. package/dist/checks/security/semgrep-scan.js.map +1 -1
  189. package/dist/checks/security/use-centralized-crypto.d.ts.map +1 -1
  190. package/dist/checks/security/use-centralized-crypto.js +2 -3
  191. package/dist/checks/security/use-centralized-crypto.js.map +1 -1
  192. package/dist/checks/testing/test-convention-consistency.d.ts.map +1 -1
  193. package/dist/checks/testing/test-convention-consistency.js +0 -1
  194. package/dist/checks/testing/test-convention-consistency.js.map +1 -1
  195. package/dist/checks/testing/test-file-pairing.js +3 -6
  196. package/dist/checks/testing/test-file-pairing.js.map +1 -1
  197. package/dist/display/architecture.d.ts.map +1 -1
  198. package/dist/display/architecture.js +1 -0
  199. package/dist/display/architecture.js.map +1 -1
  200. package/dist/display/quality.d.ts.map +1 -1
  201. package/dist/display/quality.js +1 -0
  202. package/dist/display/quality.js.map +1 -1
  203. package/dist/display/types.d.ts.map +1 -1
  204. package/dist/display/types.js +0 -1
  205. package/dist/display/types.js.map +1 -1
  206. package/package.json +4 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-identity-single-source.d.ts","sourceRoot":"","sources":["../../../src/checks/architecture/tool-identity-single-source.ts"],"names":[],"mappings":"AAMA,OAAO,EAAe,KAAK,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAE3F,UAAU,gBAAgB;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;CAC9B;AAQD,UAAU,iBAAiB;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACvD;AAED,UAAU,WAAW;IACnB,QAAQ,CAAC,YAAY,CAAC,EAAE,iBAAiB,CAAC;CAC3C;AAsHD,wBAAgB,+BAA+B,CAC7C,GAAG,EAAE,WAAW,EAChB,QAAQ,EAAE,MAAM,GACf,cAAc,EAAE,CAIlB;AAED,wBAAsB,+BAA+B,CACnD,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,cAAc,EAAE,CAAC,CAa3B;AAED,eAAO,MAAM,wBAAwB,sCASnC,CAAC"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * @fileoverview First-party tool packages must declare a single `identity` block
3
+ * in package.json#opensipTools that matches the normalized runtime surface.
4
+ */
5
+ import path from 'node:path';
6
+ import { defineCheck } from '@opensip-cli/fitness';
7
+ function isJsonObject(value) {
8
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
9
+ }
10
+ function checkIdentity(block, push) {
11
+ const identity = block.identity;
12
+ if (!isJsonObject(identity)) {
13
+ push('identity', 'must declare opensipTools.identity { name, aliases?, layoutKey? }');
14
+ return;
15
+ }
16
+ if (typeof identity.name !== 'string' || identity.name === '') {
17
+ push('identity.name', 'must be a non-empty string (canonical CLI + config namespace)');
18
+ }
19
+ if (block.id !== identity.name) {
20
+ push('id', `must equal identity.name (got id=${JSON.stringify(block.id)}, identity.name=${JSON.stringify(identity.name)})`);
21
+ }
22
+ }
23
+ function findPrimaryCommand(commands) {
24
+ for (const entry of commands) {
25
+ if (!isJsonObject(entry))
26
+ continue;
27
+ const cmd = entry;
28
+ if (cmd.parent === undefined)
29
+ return cmd;
30
+ }
31
+ return undefined;
32
+ }
33
+ function checkPrimaryCommandName(primary, identityName, push) {
34
+ if (primary.name === identityName)
35
+ return;
36
+ push('commands', `primary command name must be identity.name (${JSON.stringify(identityName)}), got ${JSON.stringify(primary.name)}`);
37
+ }
38
+ function checkPrimaryCommandAliases(primary, identity, push) {
39
+ const expectedAliases = Array.isArray(identity.aliases) ? identity.aliases : [];
40
+ const declaredAliases = Array.isArray(primary.aliases) ? primary.aliases : [];
41
+ if (JSON.stringify(declaredAliases) === JSON.stringify(expectedAliases))
42
+ return;
43
+ push('commands', 'primary command aliases must equal identity.aliases exactly');
44
+ }
45
+ function layoutKeyForIdentity(identity, identityName) {
46
+ return typeof identity.layoutKey === 'string' && identity.layoutKey !== ''
47
+ ? identity.layoutKey
48
+ : identityName;
49
+ }
50
+ function checkPluginLayoutDomain(block, layoutKey, push) {
51
+ const pluginDomain = block.pluginLayout?.domain;
52
+ if (pluginDomain === undefined || pluginDomain === layoutKey)
53
+ return;
54
+ push('pluginLayout.domain', `must equal identity.layoutKey ?? identity.name (${JSON.stringify(layoutKey)})`);
55
+ }
56
+ function checkManifestCommands(block, push) {
57
+ const identity = block.identity;
58
+ if (!isJsonObject(identity))
59
+ return;
60
+ const identityName = identity.name;
61
+ if (typeof identityName !== 'string')
62
+ return;
63
+ const commands = block.commands;
64
+ if (!Array.isArray(commands))
65
+ return;
66
+ const primary = findPrimaryCommand(commands);
67
+ if (primary === undefined) {
68
+ push('commands', 'must declare exactly one flat primary command matching identity.name');
69
+ return;
70
+ }
71
+ checkPrimaryCommandName(primary, identityName, push);
72
+ checkPrimaryCommandAliases(primary, identity, push);
73
+ checkPluginLayoutDomain(block, layoutKeyForIdentity(identity, identityName), push);
74
+ }
75
+ function checkManifestBlock(block, filePath) {
76
+ const violations = [];
77
+ const relPath = path.relative(process.cwd(), filePath);
78
+ const push = (field, message) => {
79
+ violations.push({
80
+ line: 1,
81
+ filePath,
82
+ message: `${relPath}: opensipTools.${field} — ${message}`,
83
+ severity: 'error',
84
+ suggestion: 'Declare tool identity once: opensipTools.identity { name, aliases?, layoutKey? }; ' +
85
+ 'id must equal identity.name; primary command name/aliases and pluginLayout.domain must derive from it.',
86
+ type: `identity-${field.replaceAll('.', '-')}`,
87
+ });
88
+ };
89
+ if (block.kind !== 'tool')
90
+ return violations;
91
+ checkIdentity(block, push);
92
+ checkManifestCommands(block, push);
93
+ return violations;
94
+ }
95
+ export function analyzeToolIdentitySingleSource(pkg, filePath) {
96
+ const block = pkg.opensipTools;
97
+ if (!isJsonObject(block) || block.kind !== 'tool')
98
+ return [];
99
+ return checkManifestBlock(block, filePath);
100
+ }
101
+ export async function analyzeAllToolIdentityManifests(files) {
102
+ const violations = [];
103
+ for (const filePath of files.paths) {
104
+ if (path.basename(filePath) !== 'package.json')
105
+ continue;
106
+ let pkg;
107
+ try {
108
+ pkg = JSON.parse(await files.read(filePath));
109
+ }
110
+ catch {
111
+ continue;
112
+ }
113
+ violations.push(...analyzeToolIdentitySingleSource(pkg, filePath));
114
+ }
115
+ return violations;
116
+ }
117
+ export const toolIdentitySingleSource = defineCheck({
118
+ id: 'c8f3e1a2-9b4d-4e6f-a1c0-2d8e7f9a3b5c',
119
+ slug: 'tool-identity-single-source',
120
+ description: 'Tool packages declare opensipTools.identity once; manifest id, primary command, aliases, and pluginLayout.domain must match the normalized runtime surface',
121
+ scope: { languages: ['typescript'], concerns: ['config'] },
122
+ tags: ['architecture'],
123
+ contentFilter: 'raw',
124
+ analyzeAll: analyzeAllToolIdentityManifests,
125
+ });
126
+ //# sourceMappingURL=tool-identity-single-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-identity-single-source.js","sourceRoot":"","sources":["../../../src/checks/architecture/tool-identity-single-source.ts"],"names":[],"mappings":"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"}
@@ -1,30 +1,7 @@
1
1
  /**
2
- * @fileoverview Public-API reachability graph for the public-api-jsdoc check.
2
+ * @fileoverview Re-export shim implementation lives in @opensip-cli/core.
3
3
  *
4
- * Computes the set of source files reachable from a package's
5
- * `package.json#exports` entry barrels via `export ... from` re-exports.
6
- *
7
- * Why re-exports only (not plain `import`): a file imported by a public
8
- * file is internal to that file — its exports are not part of the
9
- * package's published surface. Only `export ... from './foo.js'`
10
- * re-makes `./foo.ts`'s exports visible to consumers.
11
- *
12
- * Used by `public-api-jsdoc` to scope JSDoc requirements to the actual
13
- * npm-published API surface, not every `export` in every internal file.
14
- */
15
- /**
16
- * Reset all memoized state. Intended for tests.
17
- */
18
- export declare function _resetPublicApiGraphCache(): void;
19
- /**
20
- * Determine whether `filePath` is part of the package's public API
21
- * surface — i.e., reachable from the package's `exports` entries via
22
- * `export ... from` re-export chains.
23
- *
24
- * Returns `true` if reachable; `false` if not. Returns `true` (open
25
- * fail) when the package surface cannot be determined (no
26
- * package.json, no `exports`, etc.) so the check degrades to its
27
- * historical broad behavior rather than silently passing.
4
+ * Keeps `_resetPublicApiGraphCache` on this path for existing tests.
28
5
  */
29
- export declare function isInPublicApiSurface(filePath: string): boolean;
6
+ export { _resetPublicApiGraphCache, isInPublicApiSurface } from '@opensip-cli/core';
30
7
  //# sourceMappingURL=_public-api-graph.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"_public-api-graph.d.ts","sourceRoot":"","sources":["../../../src/checks/documentation/_public-api-graph.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;GAaG;AA8BH;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAqBD;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAI9D"}
1
+ {"version":3,"file":"_public-api-graph.d.ts","sourceRoot":"","sources":["../../../src/checks/documentation/_public-api-graph.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -1,304 +1,7 @@
1
- // @fitness-ignore-file unbounded-memory -- reads small text files (package.json, src/index.ts barrels) for public-API surface computation; per-file memory bounded by standard config/barrel shape.
2
1
  /**
3
- * @fileoverview Public-API reachability graph for the public-api-jsdoc check.
2
+ * @fileoverview Re-export shim implementation lives in @opensip-cli/core.
4
3
  *
5
- * Computes the set of source files reachable from a package's
6
- * `package.json#exports` entry barrels via `export ... from` re-exports.
7
- *
8
- * Why re-exports only (not plain `import`): a file imported by a public
9
- * file is internal to that file — its exports are not part of the
10
- * package's published surface. Only `export ... from './foo.js'`
11
- * re-makes `./foo.ts`'s exports visible to consumers.
12
- *
13
- * Used by `public-api-jsdoc` to scope JSDoc requirements to the actual
14
- * npm-published API surface, not every `export` in every internal file.
15
- */
16
- import { existsSync, readFileSync, statSync } from 'node:fs';
17
- import { dirname, isAbsolute, join, resolve, sep } from 'node:path';
18
- const surfaceCache = new Map();
19
- // Match `export { x }` / `export type { x }` / `export *` /
20
- // `export * as ns` followed by `from '...'`. Split into two simpler
21
- // alternatives to keep regex-complexity below the lint threshold and
22
- // avoid catastrophic backtracking on pathological `{...}` blocks.
23
- // Both patterns are anchored to line boundaries (gm) and use bounded
24
- // character classes — no nested quantifiers — so they run in linear
25
- // time over input.
26
- /* eslint-disable sonarjs/slow-regex -- both patterns are linear: anchored to line start with `^` under the gm flag, and use negated character classes (`[^}\n]*`, `[^'"]+`) rather than nested quantifiers, so they cannot backtrack catastrophically */
27
- const RE_EXPORT_NAMED_FROM = /^\s*export\s+(?:type\s+)?\{[^}\n]*\}\s+from\s+['"]([^'"]+)['"]/gm;
28
- const RE_EXPORT_STAR_FROM = /^\s*export\s+\*(?:\s+as\s+\w+)?\s+from\s+['"]([^'"]+)['"]/gm;
29
- /* eslint-enable sonarjs/slow-regex */
30
- /**
31
- * Reset all memoized state. Intended for tests.
32
- */
33
- export function _resetPublicApiGraphCache() {
34
- surfaceCache.clear();
35
- }
36
- /**
37
- * Walk upward from `filePath` to find the nearest `package.json`.
38
- * Returns the package root directory (the directory containing
39
- * `package.json`), or `undefined` if none found before the filesystem
40
- * root.
41
- */
42
- function findPackageRoot(filePath) {
43
- let dir = dirname(filePath);
44
- // Bound the walk to avoid pathological loops on weird mounts.
45
- for (let i = 0; i < 64; i++) {
46
- const candidate = join(dir, 'package.json');
47
- if (existsSync(candidate))
48
- return dir;
49
- const parent = dirname(dir);
50
- if (parent === dir)
51
- return undefined;
52
- dir = parent;
53
- }
54
- return undefined;
55
- }
56
- /**
57
- * Determine whether `filePath` is part of the package's public API
58
- * surface — i.e., reachable from the package's `exports` entries via
59
- * `export ... from` re-export chains.
60
- *
61
- * Returns `true` if reachable; `false` if not. Returns `true` (open
62
- * fail) when the package surface cannot be determined (no
63
- * package.json, no `exports`, etc.) so the check degrades to its
64
- * historical broad behavior rather than silently passing.
65
- */
66
- export function isInPublicApiSurface(filePath) {
67
- const surface = getPackagePublicSurface(filePath);
68
- if (!surface)
69
- return true;
70
- return surface.publicFiles.has(filePath);
71
- }
72
- /**
73
- * Compute (and memoize) the public-API surface for the package
74
- * containing `filePath`.
75
- */
76
- function getPackagePublicSurface(filePath) {
77
- const packageRoot = findPackageRoot(filePath);
78
- if (!packageRoot)
79
- return null;
80
- const cached = surfaceCache.get(packageRoot);
81
- if (cached !== undefined)
82
- return cached;
83
- const surface = computePackagePublicSurface(packageRoot);
84
- surfaceCache.set(packageRoot, surface);
85
- return surface;
86
- }
87
- function computePackagePublicSurface(packageRoot) {
88
- const pkg = readPackageJson(join(packageRoot, 'package.json'));
89
- if (!pkg)
90
- return null;
91
- if (isBinaryOnlyPackage(pkg)) {
92
- return { packageRoot, publicFiles: new Set() };
93
- }
94
- const entryPaths = collectExportEntries(pkg, packageRoot);
95
- if (entryPaths.length === 0)
96
- return null;
97
- const publicFiles = seedPublicFiles(entryPaths, packageRoot);
98
- walkReExportGraph(publicFiles);
99
- return { packageRoot, publicFiles };
100
- }
101
- /**
102
- * Read and parse a `package.json` file. Returns `null` if the file
103
- * cannot be read or does not contain a JSON object.
104
- */
105
- function readPackageJson(pkgJsonPath) {
106
- let pkg;
107
- try {
108
- pkg = JSON.parse(readFileSync(pkgJsonPath, 'utf8'));
109
- }
110
- catch {
111
- // @fitness-ignore-next-line error-handling-quality -- malformed/unreadable package.json deliberately surfaces via null return; caller treats absence as "no public-API surface info available" and falls back to broad scanning.
112
- return null;
113
- }
114
- if (typeof pkg !== 'object' || pkg === null)
115
- return null;
116
- return pkg;
117
- }
118
- /**
119
- * A binary-only package (CLI executable with no library exports) has
120
- * no public API surface at all — every source file is internal. The
121
- * caller treats this as "empty public surface" rather than "unknown
122
- * surface" so the check correctly skips every file in the package.
123
- */
124
- function isBinaryOnlyPackage(pkg) {
125
- return (pkg.exports === undefined &&
126
- pkg.main === undefined &&
127
- pkg.module === undefined &&
128
- pkg.bin !== undefined);
129
- }
130
- /**
131
- * Map each package.json entry to a source file path and return the
132
- * initial set seeded for the re-export BFS walk.
133
- */
134
- function seedPublicFiles(entryPaths, packageRoot) {
135
- const publicFiles = new Set();
136
- for (const entry of entryPaths) {
137
- const sourceFile = mapDistToSource(entry, packageRoot);
138
- if (sourceFile)
139
- publicFiles.add(sourceFile);
140
- }
141
- return publicFiles;
142
- }
143
- /**
144
- * BFS the `export ... from` re-export graph starting from the seeded
145
- * `publicFiles` set, adding every reached file to the same set.
146
- */
147
- function walkReExportGraph(publicFiles) {
148
- const queue = [...publicFiles];
149
- while (queue.length > 0) {
150
- const file = queue.shift();
151
- /* v8 ignore next -- queue.shift() returns undefined only when empty, which the while condition prevents */
152
- if (file === undefined)
153
- continue;
154
- let content;
155
- try {
156
- content = readFileSync(file, 'utf8');
157
- }
158
- catch {
159
- continue;
160
- }
161
- enqueueLocalReExports(content, dirname(file), publicFiles, queue);
162
- }
163
- }
164
- /**
165
- * Scan a file's content for relative `export ... from` re-exports and
166
- * push any newly-discovered files into both `publicFiles` and `queue`.
167
- */
168
- function enqueueLocalReExports(content, fileDir, publicFiles, queue) {
169
- for (const regex of [RE_EXPORT_NAMED_FROM, RE_EXPORT_STAR_FROM]) {
170
- for (const match of content.matchAll(regex)) {
171
- const spec = match[1];
172
- // Only follow relative imports — bare-package re-exports cross
173
- // the package boundary and are out of scope for this package's
174
- // surface.
175
- if (!spec?.startsWith('.'))
176
- continue;
177
- const resolved = resolveLocalSpecifier(fileDir, spec);
178
- if (resolved !== undefined && !publicFiles.has(resolved)) {
179
- publicFiles.add(resolved);
180
- queue.push(resolved);
181
- }
182
- }
183
- }
184
- }
185
- /**
186
- * Extract a flat list of file targets from a package.json `exports`
187
- * field. Handles string, conditional, and subpath patterns. Patterns
188
- * with `*` are not expanded — they are skipped (and the file falls
189
- * through to the "no entries → open fail" path if no concrete entries
190
- * remain).
191
- *
192
- * Falls back to `main` / `module` when `exports` is absent.
193
- */
194
- function collectExportEntries(pkg, packageRoot) {
195
- const out = [];
196
- const exports_ = pkg.exports;
197
- if (exports_ === undefined) {
198
- for (const field of ['module', 'main']) {
199
- const v = pkg[field];
200
- if (typeof v === 'string')
201
- out.push(resolveExportTarget(v, packageRoot));
202
- }
203
- }
204
- else {
205
- collectFromExportNode(exports_, packageRoot, out);
206
- }
207
- return out;
208
- }
209
- function collectFromExportNode(node, packageRoot, out) {
210
- if (typeof node === 'string') {
211
- // Skip wildcard patterns — we can't enumerate them without a
212
- // directory scan, and conservatively treating the whole tree as
213
- // public would re-introduce the false-positive flood.
214
- if (node.includes('*'))
215
- return;
216
- out.push(resolveExportTarget(node, packageRoot));
217
- return;
218
- }
219
- if (Array.isArray(node)) {
220
- for (const item of node)
221
- collectFromExportNode(item, packageRoot, out);
222
- return;
223
- }
224
- if (typeof node === 'object' && node !== null) {
225
- for (const value of Object.values(node)) {
226
- collectFromExportNode(value, packageRoot, out);
227
- }
228
- }
229
- }
230
- function resolveExportTarget(target, packageRoot) {
231
- const trimmed = target.startsWith('./') ? target.slice(2) : target;
232
- return resolve(packageRoot, trimmed);
233
- }
234
- /**
235
- * Map a built artifact path (typically `./dist/foo.js`) back to its
236
- * TypeScript source path (typically `./src/foo.ts`). Returns
237
- * `undefined` if no source file can be located.
238
- *
239
- * Honors common build layouts: `dist/` → `src/`, `dist/esm/` → `src/`,
240
- * `build/` → `src/`. Also passes through already-source paths.
241
- */
242
- function mapDistToSource(absPath, packageRoot) {
243
- const rel = absPath.startsWith(packageRoot + sep)
244
- ? absPath.slice(packageRoot.length + 1)
245
- : absPath;
246
- const candidates = [];
247
- // dist/foo.js → src/foo.ts (and .tsx)
248
- const distMatch = /^(dist|build)([\\/].*)?$/.exec(rel);
249
- if (distMatch) {
250
- const remainder = rel.slice(distMatch[1].length);
251
- const inSrc = 'src' + remainder;
252
- candidates.push(inSrc);
253
- }
254
- else {
255
- candidates.push(rel);
256
- }
257
- for (const cand of candidates) {
258
- const abs = isAbsolute(cand) ? cand : join(packageRoot, cand);
259
- for (const ext of ['.ts', '.tsx', '.mts', '.cts']) {
260
- const swapped = abs.replace(/\.(js|mjs|cjs)$/, ext);
261
- if (swapped !== abs && fileExists(swapped))
262
- return swapped;
263
- }
264
- if (fileExists(abs))
265
- return abs;
266
- }
267
- return undefined;
268
- }
269
- /**
270
- * Resolve a relative module specifier to an absolute source file path.
271
- * Tries the literal target plus common extension swaps (`.js` → `.ts`,
272
- * `.js` → `.tsx`), and `index.ts` fallback for directory imports.
4
+ * Keeps `_resetPublicApiGraphCache` on this path for existing tests.
273
5
  */
274
- function resolveLocalSpecifier(fromDir, spec) {
275
- const base = resolve(fromDir, spec);
276
- const tries = [];
277
- // Direct extension swap (the Node16 ESM `.js` import convention).
278
- if (/\.(js|mjs|cjs)$/.test(base)) {
279
- for (const ext of ['.ts', '.tsx', '.mts', '.cts']) {
280
- tries.push(base.replace(/\.(js|mjs|cjs)$/, ext));
281
- }
282
- }
283
- tries.push(base);
284
- for (const ext of ['.ts', '.tsx', '.mts', '.cts'])
285
- tries.push(base + ext);
286
- // Directory imports (`./foo` → `./foo/index.ts`)
287
- for (const ext of ['.ts', '.tsx', '.mts', '.cts'])
288
- tries.push(join(base, 'index' + ext));
289
- for (const candidate of tries) {
290
- if (fileExists(candidate))
291
- return candidate;
292
- }
293
- return undefined;
294
- }
295
- function fileExists(p) {
296
- try {
297
- return statSync(p).isFile();
298
- }
299
- catch {
300
- // @fitness-ignore-next-line error-handling-quality -- filesystem probe; exception → false is the function's contract (missing path or permission denied means "not a file", same as truly absent).
301
- return false;
302
- }
303
- }
6
+ export { _resetPublicApiGraphCache, isInPublicApiSurface } from '@opensip-cli/core';
304
7
  //# sourceMappingURL=_public-api-graph.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"_public-api-graph.js","sourceRoot":"","sources":["../../../src/checks/documentation/_public-api-graph.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"_public-api-graph.js","sourceRoot":"","sources":["../../../src/checks/documentation/_public-api-graph.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"directive-audit.d.ts","sourceRoot":"","sources":["../../../src/checks/documentation/directive-audit.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AAmHH;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,sCA2BzB,CAAC"}
1
+ {"version":3,"file":"directive-audit.d.ts","sourceRoot":"","sources":["../../../src/checks/documentation/directive-audit.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;GAaG;AAmHH;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,sCA2BzB,CAAC"}
@@ -1,4 +1,3 @@
1
- // @fitness-ignore-file toctou-race-condition -- TOCTOU acceptable in this non-concurrent context
2
1
  // @fitness-ignore-file semgrep-justifications -- References nosemgrep patterns for directive parsing
3
2
  /**
4
3
  * @fileoverview Directive Audit — surfaces suppression directives for periodic review.
@@ -1 +1 @@
1
- {"version":3,"file":"directive-audit.js","sourceRoot":"","sources":["../../../src/checks/documentation/directive-audit.ts"],"names":[],"mappings":"AAAA,iGAAiG;AACjG,qGAAqG;AACrG;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,WAAW,EAA0C,MAAM,sBAAsB,CAAC;AAE3F,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAIxE,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF,8DAA8D;AAC9D,MAAM,iBAAiB,GAAG;IACxB,kBAAkB;IAClB,gBAAgB;IAChB,iBAAiB;IACjB,eAAe;IACf,WAAW;CACZ,CAAC;AAEF,gFAAgF;AAChF,UAAU;AACV,gFAAgF;AAEhF,SAAS,mBAAmB,CAAC,OAAe;IAC1C,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,qBAAqB,CAAC,OAAe,EAAE,QAAgB,EAAE,IAAY;IAC5E,MAAM,UAAU,GAAoB;QAClC,GAAG,yBAAyB,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC;QACrD,GAAG,qBAAqB,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC;QACjD,GAAG,sBAAsB,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC;QAClD,GAAG,oBAAoB,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC;QAChD,GAAG,sBAAsB,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC;KACnD,CAAC;IAEF,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IAC3C,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB;IACxC,OAAO,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,WAAW,CAAC,QAAgB;IACnC,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC5C,OAAO,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,oBAAoB,CAAC,SAAwB;IACpD,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACrE,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM;QACjC,CAAC,CAAC,+CAA+C,SAAS,CAAC,MAAM,EAAE;QACnE,CAAC,CAAC,8EAA8E,CAAC;IAEnF,OAAO;QACL,QAAQ,EAAE,SAAS,CAAC,QAAQ;QAC5B,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,MAAM,EAAE,CAAC;QACT,OAAO,EAAE,IAAI,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,KAAK,KAAK,SAAS,CAAC,IAAI,GAAG,UAAU,EAAE;QAClF,QAAQ,EAAE,SAAS;QACnB,UAAU;QACV,KAAK,EAAE,SAAS,CAAC,GAAG;QACpB,IAAI,EAAE,aAAa,SAAS,CAAC,MAAM,EAAE;KACtC,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,WAAW;AACX,gFAAgF;AAEhF;;;GAGG;AACH,KAAK,UAAU,eAAe,CAAC,KAAmB;IAChD,MAAM,UAAU,GAAqB,EAAE,CAAC;IAExC,wEAAwE;IACxE,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QACnC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChC,SAAS;QACX,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3C,MAAM,IAAI,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;YAEnC,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;gBAClC,SAAS;YACX,CAAC;YAED,MAAM,UAAU,GAAG,qBAAqB,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;YAElE,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;gBACnC,UAAU,CAAC,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,oCAAoC;QACtC,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,gFAAgF;AAChF,mBAAmB;AACnB,gFAAgF;AAEhF;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,WAAW,CAAC;IACxC,EAAE,EAAE,sCAAsC;IAC1C,IAAI,EAAE,iBAAiB;IACvB,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE;IAC9E,aAAa,EAAE,KAAK;IAEpB,UAAU,EAAE,QAAQ;IACpB,WAAW,EAAE,kDAAkD;IAC/D,eAAe,EAAE;;;;;;;;;;;;;+JAa4I;IAC7J,IAAI,EAAE,CAAC,eAAe,EAAE,OAAO,EAAE,YAAY,EAAE,aAAa,CAAC;IAC7D,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC;IACxB,QAAQ,EAAE,IAAI,EAAE,mCAAmC;IAEnD,UAAU,EAAE,eAAe;CAC5B,CAAC,CAAC"}
1
+ {"version":3,"file":"directive-audit.js","sourceRoot":"","sources":["../../../src/checks/documentation/directive-audit.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,9 @@
5
5
  * language. Counts only non-empty lines so massive whitespace-padded
6
6
  * files don't slip through and trivial generated boilerplate isn't
7
7
  * over-counted (configurable later if needed).
8
+ *
9
+ * Test and fixture paths are excluded — long behavior-fixture suites are
10
+ * intentional; modularity rules apply to production source.
8
11
  */
9
12
  import { type CheckViolation } from '@opensip-cli/fitness';
10
13
  /**
@@ -12,5 +15,9 @@ import { type CheckViolation } from '@opensip-cli/fitness';
12
15
  * line-counting logic without spinning up an ExecutionContext.
13
16
  */
14
17
  export declare function analyzeFileLength(content: string): CheckViolation[];
18
+ /**
19
+ * Per-file entry point: skips test/fixture paths before line counting.
20
+ */
21
+ export declare function analyzeFileLengthForPath(content: string, filePath: string): CheckViolation[];
15
22
  export declare const fileLengthLimit: import("@opensip-cli/fitness").Check;
16
23
  //# sourceMappingURL=file-length-limit.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-length-limit.d.ts","sourceRoot":"","sources":["../../src/checks/file-length-limit.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAe,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAKxE;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,EAAE,CAqBnE;AAED,eAAO,MAAM,eAAe,sCAO1B,CAAC"}
1
+ {"version":3,"file":"file-length-limit.d.ts","sourceRoot":"","sources":["../../src/checks/file-length-limit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAA2B,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAKpF;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,EAAE,CAqBnE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,EAAE,CAK5F;AAED,eAAO,MAAM,eAAe,sCAO1B,CAAC"}
@@ -5,8 +5,11 @@
5
5
  * language. Counts only non-empty lines so massive whitespace-padded
6
6
  * files don't slip through and trivial generated boilerplate isn't
7
7
  * over-counted (configurable later if needed).
8
+ *
9
+ * Test and fixture paths are excluded — long behavior-fixture suites are
10
+ * intentional; modularity rules apply to production source.
8
11
  */
9
- import { defineCheck } from '@opensip-cli/fitness';
12
+ import { defineCheck, isTestFile } from '@opensip-cli/fitness';
10
13
  const SOFT_LIMIT = 400;
11
14
  const HARD_LIMIT = 800;
12
15
  /**
@@ -36,12 +39,21 @@ export function analyzeFileLength(content) {
36
39
  }
37
40
  return violations;
38
41
  }
42
+ /**
43
+ * Per-file entry point: skips test/fixture paths before line counting.
44
+ */
45
+ export function analyzeFileLengthForPath(content, filePath) {
46
+ if (isTestFile(filePath) || filePath.includes('/__fixtures__/')) {
47
+ return [];
48
+ }
49
+ return analyzeFileLength(content);
50
+ }
39
51
  export const fileLengthLimit = defineCheck({
40
52
  id: 'fc8b5ec9-d020-4e76-b16f-f5f73ce9d21e',
41
53
  slug: 'file-length-limit',
42
54
  description: `Files longer than ${HARD_LIMIT} lines hint at insufficient module decomposition`,
43
55
  scope: { languages: [], concerns: [] },
44
56
  tags: ['quality', 'modularity'],
45
- analyze: (content) => analyzeFileLength(content),
57
+ analyze: (content, filePath) => analyzeFileLengthForPath(content, filePath),
46
58
  });
47
59
  //# sourceMappingURL=file-length-limit.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-length-limit.js","sourceRoot":"","sources":["../../src/checks/file-length-limit.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,WAAW,EAAuB,MAAM,sBAAsB,CAAC;AAExE,MAAM,UAAU,GAAG,GAAG,CAAC;AACvB,MAAM,UAAU,GAAG,GAAG,CAAC;AAEvB;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrE,IAAI,KAAK,CAAC,MAAM,IAAI,UAAU;QAAE,OAAO,EAAE,CAAC;IAE1C,MAAM,UAAU,GAAqB,EAAE,CAAC;IACxC,IAAI,KAAK,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;QAC9B,UAAU,CAAC,IAAI,CAAC;YACd,OAAO,EAAE,YAAY,KAAK,CAAC,MAAM,gCAAgC,UAAU,GAAG;YAC9E,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,CAAC;YACP,UAAU,EAAE,kEAAkE;SAC/E,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,UAAU,CAAC,IAAI,CAAC;YACd,OAAO,EAAE,YAAY,KAAK,CAAC,MAAM,gCAAgC,UAAU,GAAG;YAC9E,QAAQ,EAAE,SAAS;YACnB,IAAI,EAAE,CAAC;YACP,UAAU,EAAE,uDAAuD;SACpE,CAAC,CAAC;IACL,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,WAAW,CAAC;IACzC,EAAE,EAAE,sCAAsC;IAC1C,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,qBAAqB,UAAU,kDAAkD;IAC9F,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;IACtC,IAAI,EAAE,CAAC,SAAS,EAAE,YAAY,CAAC;IAC/B,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,CAAC;CACjD,CAAC,CAAC"}
1
+ {"version":3,"file":"file-length-limit.js","sourceRoot":"","sources":["../../src/checks/file-length-limit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAuB,MAAM,sBAAsB,CAAC;AAEpF,MAAM,UAAU,GAAG,GAAG,CAAC;AACvB,MAAM,UAAU,GAAG,GAAG,CAAC;AAEvB;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrE,IAAI,KAAK,CAAC,MAAM,IAAI,UAAU;QAAE,OAAO,EAAE,CAAC;IAE1C,MAAM,UAAU,GAAqB,EAAE,CAAC;IACxC,IAAI,KAAK,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;QAC9B,UAAU,CAAC,IAAI,CAAC;YACd,OAAO,EAAE,YAAY,KAAK,CAAC,MAAM,gCAAgC,UAAU,GAAG;YAC9E,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,CAAC;YACP,UAAU,EAAE,kEAAkE;SAC/E,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,UAAU,CAAC,IAAI,CAAC;YACd,OAAO,EAAE,YAAY,KAAK,CAAC,MAAM,gCAAgC,UAAU,GAAG;YAC9E,QAAQ,EAAE,SAAS;YACnB,IAAI,EAAE,CAAC;YACP,UAAU,EAAE,uDAAuD;SACpE,CAAC,CAAC;IACL,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAe,EAAE,QAAgB;IACxE,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAChE,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,iBAAiB,CAAC,OAAO,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,WAAW,CAAC;IACzC,EAAE,EAAE,sCAAsC;IAC1C,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,qBAAqB,UAAU,kDAAkD;IAC9F,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;IACtC,IAAI,EAAE,CAAC,SAAS,EAAE,YAAY,CAAC;IAC/B,OAAO,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC,wBAAwB,CAAC,OAAO,EAAE,QAAQ,CAAC;CAC5E,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"dead-code.d.ts","sourceRoot":"","sources":["../../../../src/checks/quality/code-structure/dead-code.ts"],"names":[],"mappings":"AACA;;;;GAIG;AAoNH;;;;GAIG;AACH,eAAO,MAAM,QAAQ,sCA8EnB,CAAC"}
1
+ {"version":3,"file":"dead-code.d.ts","sourceRoot":"","sources":["../../../../src/checks/quality/code-structure/dead-code.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoNH;;;;GAIG;AACH,eAAO,MAAM,QAAQ,sCA8EnB,CAAC"}
@@ -1,4 +1,3 @@
1
- // @fitness-ignore-file batch-operation-limits -- iterates bounded collections (config entries, registry items, or small analysis results)
2
1
  /**
3
2
  * @fileoverview Dead code detection using Knip
4
3
  *