archprint 0.13.1 → 0.15.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 (134) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +21 -12
  3. package/dist/cli/adopted-rules.d.ts +30 -2
  4. package/dist/cli/adopted-rules.d.ts.map +1 -1
  5. package/dist/cli/adopted-rules.js +158 -2
  6. package/dist/cli/adopted-rules.js.map +1 -1
  7. package/dist/cli/allow.d.ts.map +1 -1
  8. package/dist/cli/allow.js +21 -4
  9. package/dist/cli/allow.js.map +1 -1
  10. package/dist/cli/allowed-evidence.d.ts.map +1 -1
  11. package/dist/cli/allowed-evidence.js +183 -1
  12. package/dist/cli/allowed-evidence.js.map +1 -1
  13. package/dist/cli/check-evaluate.d.ts.map +1 -1
  14. package/dist/cli/check-evaluate.js +124 -0
  15. package/dist/cli/check-evaluate.js.map +1 -1
  16. package/dist/cli/generate.d.ts +4 -4
  17. package/dist/cli/generate.d.ts.map +1 -1
  18. package/dist/cli/generate.js +115 -42
  19. package/dist/cli/generate.js.map +1 -1
  20. package/dist/cli/layout.d.ts +5 -2
  21. package/dist/cli/layout.d.ts.map +1 -1
  22. package/dist/cli/layout.js +43 -10
  23. package/dist/cli/layout.js.map +1 -1
  24. package/dist/cli/migrate.d.ts.map +1 -1
  25. package/dist/cli/migrate.js +1 -2
  26. package/dist/cli/migrate.js.map +1 -1
  27. package/dist/cli/program.d.ts.map +1 -1
  28. package/dist/cli/program.js +10 -6
  29. package/dist/cli/program.js.map +1 -1
  30. package/dist/cli/recommend.d.ts +3 -0
  31. package/dist/cli/recommend.d.ts.map +1 -1
  32. package/dist/cli/recommend.js +28 -8
  33. package/dist/cli/recommend.js.map +1 -1
  34. package/dist/cli/report.js +1 -1
  35. package/dist/cli/report.js.map +1 -1
  36. package/dist/detector/cycle-detector.d.ts +5 -0
  37. package/dist/detector/cycle-detector.d.ts.map +1 -1
  38. package/dist/detector/cycle-detector.js +20 -0
  39. package/dist/detector/cycle-detector.js.map +1 -1
  40. package/dist/detector/dependency-internals-detector.d.ts.map +1 -1
  41. package/dist/detector/dependency-internals-detector.js +6 -20
  42. package/dist/detector/dependency-internals-detector.js.map +1 -1
  43. package/dist/detector/entry-purity-detector.d.ts +7 -0
  44. package/dist/detector/entry-purity-detector.d.ts.map +1 -1
  45. package/dist/detector/entry-purity-detector.js +21 -10
  46. package/dist/detector/entry-purity-detector.js.map +1 -1
  47. package/dist/detector/phantom-dependency-detector.d.ts +7 -0
  48. package/dist/detector/phantom-dependency-detector.d.ts.map +1 -1
  49. package/dist/detector/phantom-dependency-detector.js +18 -39
  50. package/dist/detector/phantom-dependency-detector.js.map +1 -1
  51. package/dist/detector/server-client-detector.d.ts +5 -0
  52. package/dist/detector/server-client-detector.d.ts.map +1 -1
  53. package/dist/detector/server-client-detector.js +8 -3
  54. package/dist/detector/server-client-detector.js.map +1 -1
  55. package/dist/generator/app-isolation-emitters.d.ts +1 -0
  56. package/dist/generator/app-isolation-emitters.d.ts.map +1 -1
  57. package/dist/generator/app-isolation-emitters.js +2 -1
  58. package/dist/generator/app-isolation-emitters.js.map +1 -1
  59. package/dist/generator/depcruise-exempt.d.ts +4 -0
  60. package/dist/generator/depcruise-exempt.d.ts.map +1 -1
  61. package/dist/generator/depcruise-exempt.js +7 -0
  62. package/dist/generator/depcruise-exempt.js.map +1 -1
  63. package/dist/generator/dependency-internals-emitters.d.ts +2 -1
  64. package/dist/generator/dependency-internals-emitters.d.ts.map +1 -1
  65. package/dist/generator/dependency-internals-emitters.js +7 -3
  66. package/dist/generator/dependency-internals-emitters.js.map +1 -1
  67. package/dist/generator/entry-purity-emitters.d.ts +7 -3
  68. package/dist/generator/entry-purity-emitters.d.ts.map +1 -1
  69. package/dist/generator/entry-purity-emitters.js +19 -5
  70. package/dist/generator/entry-purity-emitters.js.map +1 -1
  71. package/dist/generator/env-access-emitters.d.ts +1 -0
  72. package/dist/generator/env-access-emitters.d.ts.map +1 -1
  73. package/dist/generator/env-access-emitters.js +1 -0
  74. package/dist/generator/env-access-emitters.js.map +1 -1
  75. package/dist/generator/eslint-app-emitter.d.ts +59 -0
  76. package/dist/generator/eslint-app-emitter.d.ts.map +1 -0
  77. package/dist/generator/eslint-app-emitter.js +275 -0
  78. package/dist/generator/eslint-app-emitter.js.map +1 -0
  79. package/dist/generator/eslint-preset-emitter.d.ts +2 -2
  80. package/dist/generator/eslint-preset-emitter.d.ts.map +1 -1
  81. package/dist/generator/eslint-preset-emitter.js +6 -6
  82. package/dist/generator/eslint-preset-emitter.js.map +1 -1
  83. package/dist/generator/feature-slice-emitters.d.ts +1 -0
  84. package/dist/generator/feature-slice-emitters.d.ts.map +1 -1
  85. package/dist/generator/feature-slice-emitters.js +2 -1
  86. package/dist/generator/feature-slice-emitters.js.map +1 -1
  87. package/dist/generator/layer-emitters.d.ts.map +1 -1
  88. package/dist/generator/layer-emitters.js +2 -6
  89. package/dist/generator/layer-emitters.js.map +1 -1
  90. package/dist/generator/phantom-dependency-emitters.d.ts +2 -1
  91. package/dist/generator/phantom-dependency-emitters.d.ts.map +1 -1
  92. package/dist/generator/phantom-dependency-emitters.js +7 -3
  93. package/dist/generator/phantom-dependency-emitters.js.map +1 -1
  94. package/dist/generator/role-layering-emitters.d.ts +2 -0
  95. package/dist/generator/role-layering-emitters.d.ts.map +1 -1
  96. package/dist/generator/role-layering-emitters.js +2 -1
  97. package/dist/generator/role-layering-emitters.js.map +1 -1
  98. package/dist/generator/server-client-emitters.d.ts +10 -3
  99. package/dist/generator/server-client-emitters.d.ts.map +1 -1
  100. package/dist/generator/server-client-emitters.js +23 -4
  101. package/dist/generator/server-client-emitters.js.map +1 -1
  102. package/dist/generator/stories-isolation-emitters.d.ts +1 -0
  103. package/dist/generator/stories-isolation-emitters.d.ts.map +1 -1
  104. package/dist/generator/stories-isolation-emitters.js +2 -1
  105. package/dist/generator/stories-isolation-emitters.js.map +1 -1
  106. package/dist/generator/ui-data-isolation-emitters.d.ts +1 -0
  107. package/dist/generator/ui-data-isolation-emitters.d.ts.map +1 -1
  108. package/dist/generator/ui-data-isolation-emitters.js +2 -1
  109. package/dist/generator/ui-data-isolation-emitters.js.map +1 -1
  110. package/dist/generator/workspace-package-emitters.d.ts +1 -0
  111. package/dist/generator/workspace-package-emitters.d.ts.map +1 -1
  112. package/dist/generator/workspace-package-emitters.js +1 -0
  113. package/dist/generator/workspace-package-emitters.js.map +1 -1
  114. package/dist/scanner/directives.d.ts +6 -0
  115. package/dist/scanner/directives.d.ts.map +1 -0
  116. package/dist/scanner/directives.js +35 -0
  117. package/dist/scanner/directives.js.map +1 -0
  118. package/dist/scanner/package-name.d.ts +10 -0
  119. package/dist/scanner/package-name.d.ts.map +1 -0
  120. package/dist/scanner/package-name.js +37 -0
  121. package/dist/scanner/package-name.js.map +1 -0
  122. package/dist/scanner/resolve-import.d.ts +5 -0
  123. package/dist/scanner/resolve-import.d.ts.map +1 -1
  124. package/dist/scanner/resolve-import.js +22 -19
  125. package/dist/scanner/resolve-import.js.map +1 -1
  126. package/dist/scanner/role-classifier.d.ts +11 -2
  127. package/dist/scanner/role-classifier.d.ts.map +1 -1
  128. package/dist/scanner/role-classifier.js +13 -39
  129. package/dist/scanner/role-classifier.js.map +1 -1
  130. package/package.json +2 -2
  131. package/dist/generator/eslint-layer-emitter.d.ts +0 -29
  132. package/dist/generator/eslint-layer-emitter.d.ts.map +0 -1
  133. package/dist/generator/eslint-layer-emitter.js +0 -121
  134. package/dist/generator/eslint-layer-emitter.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"server-client-emitters.d.ts","sourceRoot":"","sources":["../../src/generator/server-client-emitters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAElF,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IACpC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACvB,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,gBAAgB,EAAE,CAAC;CAC/B;AAED,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,oBAAoB,GAC7B,kBAAkB,CAepB"}
1
+ {"version":3,"file":"server-client-emitters.d.ts","sourceRoot":"","sources":["../../src/generator/server-client-emitters.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,uCAAuC,CAAC;AAG/C,eAAO,MAAM,kBAAkB,6BAA6B,CAAC;AAE7D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IACpC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;KAAE,CAAC;IACnD,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAAC,kBAAkB,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CAC/D;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,gBAAgB,EAAE,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAgB,+BAA+B,CAC7C,QAAQ,EAAE,oBAAoB,EAC9B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,SAAS,MAAM,EAAE,GAChD,kBAAkB,CA4BpB"}
@@ -1,16 +1,35 @@
1
- export function toDependencyCruiserServerClient(analysis) {
1
+ import { SERVER_ONLY_PACKAGE, } from '../detector/server-client-detector.js';
2
+ import { exactAppFiles, exemptDepcruiseFrom, TEST_ROLE_REGEX } from './depcruise-exempt.js';
3
+ export const SERVER_CLIENT_RULE = 'no-server-only-in-client';
4
+ /**
5
+ * The "use client" files the scan found must not import a server-only module or the server-only package. Files
6
+ * that become client components after generation are not covered until the next generate.
7
+ */
8
+ export function toDependencyCruiserServerClient(analysis, appPath, allowedFor) {
2
9
  if (analysis.clientCount === 0 || analysis.gate.status !== 'AUTO')
3
10
  return { forbidden: [] };
4
11
  const conform = analysis.clientCount - analysis.offenderCount;
5
12
  const floor = `${(analysis.gate.conditions.confidence.value * 100).toFixed(0)}%`;
13
+ const serverOnlyPackage = `(^|/)node_modules/${SERVER_ONLY_PACKAGE}/`;
6
14
  return {
7
15
  forbidden: [
8
16
  {
9
- name: 'no-server-only-in-client',
17
+ name: SERVER_CLIENT_RULE,
10
18
  comment: `Archprint inferred server/client boundary: ${conform}/${analysis.clientCount} "use client" modules import no server-only code; a client component importing a server-only module is forbidden (confidence ${floor}).`,
11
19
  severity: 'error',
12
- from: { path: '\\.(ts|tsx)$' },
13
- to: { path: 'node_modules/server-only' },
20
+ from: {
21
+ path: exactAppFiles(analysis.clients, appPath),
22
+ pathNot: exemptDepcruiseFrom(TEST_ROLE_REGEX, [
23
+ ...analysis.violations,
24
+ ...allowedFor(SERVER_CLIENT_RULE).map((file) => ({ file })),
25
+ ]),
26
+ },
27
+ to: {
28
+ path: analysis.serverModules.length === 0
29
+ ? serverOnlyPackage
30
+ : [exactAppFiles(analysis.serverModules, appPath), serverOnlyPackage],
31
+ dependencyTypesNot: ['type-only'],
32
+ },
14
33
  },
15
34
  ],
16
35
  };
@@ -1 +1 @@
1
- {"version":3,"file":"server-client-emitters.js","sourceRoot":"","sources":["../../src/generator/server-client-emitters.ts"],"names":[],"mappings":"AAcA,MAAM,UAAU,+BAA+B,CAC7C,QAA8B;IAE9B,IAAI,QAAQ,CAAC,WAAW,KAAK,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC5F,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC;IAC9D,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACjF,OAAO;QACL,SAAS,EAAE;YACT;gBACE,IAAI,EAAE,0BAA0B;gBAChC,OAAO,EAAE,8CAA8C,OAAO,IAAI,QAAQ,CAAC,WAAW,gIAAgI,KAAK,IAAI;gBAC/N,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE;gBAC9B,EAAE,EAAE,EAAE,IAAI,EAAE,0BAA0B,EAAE;aACzC;SACF;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"server-client-emitters.js","sourceRoot":"","sources":["../../src/generator/server-client-emitters.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,GAEpB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE5F,MAAM,CAAC,MAAM,kBAAkB,GAAG,0BAA0B,CAAC;AAc7D;;;GAGG;AACH,MAAM,UAAU,+BAA+B,CAC7C,QAA8B,EAC9B,OAAe,EACf,UAAiD;IAEjD,IAAI,QAAQ,CAAC,WAAW,KAAK,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC5F,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC;IAC9D,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACjF,MAAM,iBAAiB,GAAG,qBAAqB,mBAAmB,GAAG,CAAC;IACtE,OAAO;QACL,SAAS,EAAE;YACT;gBACE,IAAI,EAAE,kBAAkB;gBACxB,OAAO,EAAE,8CAA8C,OAAO,IAAI,QAAQ,CAAC,WAAW,gIAAgI,KAAK,IAAI;gBAC/N,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE;oBACJ,IAAI,EAAE,aAAa,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;oBAC9C,OAAO,EAAE,mBAAmB,CAAC,eAAe,EAAE;wBAC5C,GAAG,QAAQ,CAAC,UAAU;wBACtB,GAAG,UAAU,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;qBAC5D,CAAC;iBACH;gBACD,EAAE,EAAE;oBACF,IAAI,EACF,QAAQ,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC;wBACjC,CAAC,CAAC,iBAAiB;wBACnB,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,EAAE,iBAAiB,CAAC;oBACzE,kBAAkB,EAAE,CAAC,WAAW,CAAC;iBAClC;aACF;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -13,5 +13,6 @@ export interface StoriesIsolationRule {
13
13
  export interface StoriesIsolationConfig {
14
14
  forbidden: StoriesIsolationRule[];
15
15
  }
16
+ export declare const STORIES_ISOLATION_RULE = "no-import-stories";
16
17
  export declare function toDependencyCruiserStoriesIsolation(analysis: StoriesIsolationAnalysis): StoriesIsolationConfig;
17
18
  //# sourceMappingURL=stories-isolation-emitters.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"stories-isolation-emitters.d.ts","sourceRoot":"","sources":["../../src/generator/stories-isolation-emitters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AAE1F,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IACpC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1B,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACtB;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,oBAAoB,EAAE,CAAC;CACnC;AAID,wBAAgB,mCAAmC,CACjD,QAAQ,EAAE,wBAAwB,GACjC,sBAAsB,CAexB"}
1
+ {"version":3,"file":"stories-isolation-emitters.d.ts","sourceRoot":"","sources":["../../src/generator/stories-isolation-emitters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AAE1F,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IACpC,IAAI,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1B,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACtB;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,oBAAoB,EAAE,CAAC;CACnC;AAED,eAAO,MAAM,sBAAsB,sBAAsB,CAAC;AAI1D,wBAAgB,mCAAmC,CACjD,QAAQ,EAAE,wBAAwB,GACjC,sBAAsB,CAexB"}
@@ -1,3 +1,4 @@
1
+ export const STORIES_ISOLATION_RULE = 'no-import-stories';
1
2
  const STORY_PATH = '\\.stories\\.(ts|tsx)$';
2
3
  export function toDependencyCruiserStoriesIsolation(analysis) {
3
4
  if (analysis.storyCount === 0 || analysis.gate.status !== 'AUTO')
@@ -7,7 +8,7 @@ export function toDependencyCruiserStoriesIsolation(analysis) {
7
8
  return {
8
9
  forbidden: [
9
10
  {
10
- name: 'no-import-stories',
11
+ name: STORIES_ISOLATION_RULE,
11
12
  comment: `Archprint inferred stories isolation: ${conform}/${analysis.storyCount} Storybook stories are loaded by Storybook and imported by nothing; importing a .stories file from other code is forbidden (confidence ${floor}).`,
12
13
  severity: 'error',
13
14
  from: { pathNot: STORY_PATH },
@@ -1 +1 @@
1
- {"version":3,"file":"stories-isolation-emitters.js","sourceRoot":"","sources":["../../src/generator/stories-isolation-emitters.ts"],"names":[],"mappings":"AAcA,MAAM,UAAU,GAAG,wBAAwB,CAAC;AAE5C,MAAM,UAAU,mCAAmC,CACjD,QAAkC;IAElC,IAAI,QAAQ,CAAC,UAAU,KAAK,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC3F,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC;IAC7D,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACjF,OAAO;QACL,SAAS,EAAE;YACT;gBACE,IAAI,EAAE,mBAAmB;gBACzB,OAAO,EAAE,yCAAyC,OAAO,IAAI,QAAQ,CAAC,UAAU,0IAA0I,KAAK,IAAI;gBACnO,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE;gBAC7B,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;aACzB;SACF;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"stories-isolation-emitters.js","sourceRoot":"","sources":["../../src/generator/stories-isolation-emitters.ts"],"names":[],"mappings":"AAcA,MAAM,CAAC,MAAM,sBAAsB,GAAG,mBAAmB,CAAC;AAE1D,MAAM,UAAU,GAAG,wBAAwB,CAAC;AAE5C,MAAM,UAAU,mCAAmC,CACjD,QAAkC;IAElC,IAAI,QAAQ,CAAC,UAAU,KAAK,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC3F,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,aAAa,CAAC;IAC7D,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACjF,OAAO;QACL,SAAS,EAAE;YACT;gBACE,IAAI,EAAE,sBAAsB;gBAC5B,OAAO,EAAE,yCAAyC,OAAO,IAAI,QAAQ,CAAC,UAAU,0IAA0I,KAAK,IAAI;gBACnO,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE;gBAC7B,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;aACzB;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import type { UiDataIsolationAnalysis } from '../detector/ui-data-isolation-detector.js';
2
+ export declare const UI_DATA_RULE = "no-ui-to-data";
2
3
  export interface UiDataRule {
3
4
  name: string;
4
5
  comment: string;
@@ -1 +1 @@
1
- {"version":3,"file":"ui-data-isolation-emitters.d.ts","sourceRoot":"","sources":["../../src/generator/ui-data-isolation-emitters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AAkBzF,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IACpC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACvB,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,UAAU,EAAE,CAAC;CACzB;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,uBAAuB,GAAG,YAAY,CAezF"}
1
+ {"version":3,"file":"ui-data-isolation-emitters.d.ts","sourceRoot":"","sources":["../../src/generator/ui-data-isolation-emitters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AAIzF,eAAO,MAAM,YAAY,kBAAkB,CAAC;AAgB5C,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IACpC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACvB,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,UAAU,EAAE,CAAC;CACzB;AAED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,uBAAuB,GAAG,YAAY,CAezF"}
@@ -1,4 +1,5 @@
1
1
  import { ROLE_PATTERNS } from '../scanner/role-classifier.js';
2
+ export const UI_DATA_RULE = 'no-ui-to-data';
2
3
  const DATA_ROLES = ['DB_MODULE', 'DATA_ACCESS'];
3
4
  const dataPath = () => {
4
5
  const sources = DATA_ROLES.flatMap((role) => (ROLE_PATTERNS.get(role) ?? []).map((pattern) => pattern.source));
@@ -16,7 +17,7 @@ export function toDependencyCruiserUiData(analysis) {
16
17
  return {
17
18
  forbidden: [
18
19
  {
19
- name: 'no-ui-to-data',
20
+ name: UI_DATA_RULE,
20
21
  comment: `Archprint inferred UI/data separation: ${conform}/${analysis.componentCount} UI components never import the data layer (files under db, database or prisma folders, or a prisma, drizzle or kysely client file) directly; a component importing it is forbidden (confidence ${floor}).`,
21
22
  severity: 'error',
22
23
  from: { path: componentPath() },
@@ -1 +1 @@
1
- {"version":3,"file":"ui-data-isolation-emitters.js","sourceRoot":"","sources":["../../src/generator/ui-data-isolation-emitters.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAG9D,MAAM,UAAU,GAAoB,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;AAEjE,MAAM,QAAQ,GAAG,GAAW,EAAE;IAC5B,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAC1C,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CACjE,CAAC;IACF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAClC,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,GAAW,EAAE;IACjC,MAAM,OAAO,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACxF,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AACnE,CAAC,CAAC;AAcF,MAAM,UAAU,yBAAyB,CAAC,QAAiC;IACzE,IAAI,QAAQ,CAAC,cAAc,KAAK,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC/F,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,GAAG,QAAQ,CAAC,aAAa,CAAC;IACjE,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACjF,OAAO;QACL,SAAS,EAAE;YACT;gBACE,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,0CAA0C,OAAO,IAAI,QAAQ,CAAC,cAAc,mMAAmM,KAAK,IAAI;gBACjS,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE;gBAC/B,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;aACzB;SACF;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"ui-data-isolation-emitters.js","sourceRoot":"","sources":["../../src/generator/ui-data-isolation-emitters.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAG9D,MAAM,CAAC,MAAM,YAAY,GAAG,eAAe,CAAC;AAE5C,MAAM,UAAU,GAAoB,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;AAEjE,MAAM,QAAQ,GAAG,GAAW,EAAE;IAC5B,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAC1C,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CACjE,CAAC;IACF,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAClC,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,GAAW,EAAE;IACjC,MAAM,OAAO,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACxF,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AACnE,CAAC,CAAC;AAcF,MAAM,UAAU,yBAAyB,CAAC,QAAiC;IACzE,IAAI,QAAQ,CAAC,cAAc,KAAK,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC/F,MAAM,OAAO,GAAG,QAAQ,CAAC,cAAc,GAAG,QAAQ,CAAC,aAAa,CAAC;IACjE,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IACjF,OAAO;QACL,SAAS,EAAE;YACT;gBACE,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,0CAA0C,OAAO,IAAI,QAAQ,CAAC,cAAc,mMAAmM,KAAK,IAAI;gBACjS,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE;gBAC/B,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;aACzB;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import type { WorkspacePackageAnalysis } from '../detector/workspace-package-detector.js';
2
2
  import { type EslintNoRestrictedImportsConfig } from './deep-relative-emitters.js';
3
+ export declare const WORKSPACE_PACKAGE_RULE = "workspace-package";
3
4
  export declare function toEslintWorkspacePackageApi(analysis: WorkspacePackageAnalysis): EslintNoRestrictedImportsConfig | null;
4
5
  //# sourceMappingURL=workspace-package-emitters.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-package-emitters.d.ts","sourceRoot":"","sources":["../../src/generator/workspace-package-emitters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AAC1F,OAAO,EAAmB,KAAK,+BAA+B,EAAE,MAAM,6BAA6B,CAAC;AAIpG,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,wBAAwB,GACjC,+BAA+B,GAAG,IAAI,CAoBxC"}
1
+ {"version":3,"file":"workspace-package-emitters.d.ts","sourceRoot":"","sources":["../../src/generator/workspace-package-emitters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AAC1F,OAAO,EAAmB,KAAK,+BAA+B,EAAE,MAAM,6BAA6B,CAAC;AAIpG,eAAO,MAAM,sBAAsB,sBAAsB,CAAC;AAE1D,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,wBAAwB,GACjC,+BAA+B,GAAG,IAAI,CAoBxC"}
@@ -1,5 +1,6 @@
1
1
  import { exemptImporters } from './deep-relative-emitters.js';
2
2
  const escapeRegExp = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
3
+ export const WORKSPACE_PACKAGE_RULE = 'workspace-package';
3
4
  export function toEslintWorkspacePackageApi(analysis) {
4
5
  if (analysis.consumerCount === 0 || analysis.packages.length === 0)
5
6
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"workspace-package-emitters.js","sourceRoot":"","sources":["../../src/generator/workspace-package-emitters.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAwC,MAAM,6BAA6B,CAAC;AAEpG,MAAM,YAAY,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAE7F,MAAM,UAAU,2BAA2B,CACzC,QAAkC;IAElC,IAAI,QAAQ,CAAC,aAAa,KAAK,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAChF,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACjD,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5D,OAAO;QACL,GAAG,eAAe,CAAC,QAAQ,CAAC,UAAU,CAAC;QACvC,KAAK,EAAE;YACL,uBAAuB,EAAE;gBACvB,OAAO;gBACP;oBACE,QAAQ,EAAE;wBACR;4BACE,KAAK,EAAE,KAAK,KAAK,IAAI;4BACrB,OAAO,EAAE,0EAA0E;yBACpF;qBACF;iBACF;aACF;SACF;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"workspace-package-emitters.js","sourceRoot":"","sources":["../../src/generator/workspace-package-emitters.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAwC,MAAM,6BAA6B,CAAC;AAEpG,MAAM,YAAY,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAE7F,MAAM,CAAC,MAAM,sBAAsB,GAAG,mBAAmB,CAAC;AAE1D,MAAM,UAAU,2BAA2B,CACzC,QAAkC;IAElC,IAAI,QAAQ,CAAC,aAAa,KAAK,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAChF,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IACjD,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5D,OAAO;QACL,GAAG,eAAe,CAAC,QAAQ,CAAC,UAAU,CAAC;QACvC,KAAK,EAAE;YACL,uBAAuB,EAAE;gBACvB,OAAO;gBACP;oBACE,QAAQ,EAAE;wBACR;4BACE,KAAK,EAAE,KAAK,KAAK,IAAI;4BACrB,OAAO,EAAE,0EAA0E;yBACpF;qBACF;iBACF;aACF;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Whether source text starts with a directive such as "use client", after a BOM, a shebang line, whitespace and
3
+ * comments. Self-contained: the generated ESLint rules embed it.
4
+ */
5
+ export declare function hasLeadingDirective(source: string, directive: string): boolean;
6
+ //# sourceMappingURL=directives.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directives.d.ts","sourceRoot":"","sources":["../../src/scanner/directives.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAwB9E"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Whether source text starts with a directive such as "use client", after a BOM, a shebang line, whitespace and
3
+ * comments. Self-contained: the generated ESLint rules embed it.
4
+ */
5
+ export function hasLeadingDirective(source, directive) {
6
+ const isWhitespace = (c) => c === ' ' || c === '\t' || c === '\n' || c === '\r' || c === '\f' || c === '\v';
7
+ let i = source.charCodeAt(0) === 0xfeff ? 1 : 0;
8
+ if (source.startsWith('#!', i)) {
9
+ const newline = source.indexOf('\n', i);
10
+ if (newline === -1)
11
+ return false;
12
+ i = newline + 1;
13
+ }
14
+ for (;;) {
15
+ while (i < source.length && isWhitespace(source[i]))
16
+ i++;
17
+ if (source.startsWith('//', i)) {
18
+ const newline = source.indexOf('\n', i);
19
+ if (newline === -1)
20
+ return false;
21
+ i = newline + 1;
22
+ }
23
+ else if (source.startsWith('/*', i)) {
24
+ const end = source.indexOf('*/', i + 2);
25
+ if (end === -1)
26
+ return false;
27
+ i = end + 2;
28
+ }
29
+ else {
30
+ break;
31
+ }
32
+ }
33
+ return new RegExp(`^["']${directive}["']`).test(source.slice(i));
34
+ }
35
+ //# sourceMappingURL=directives.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directives.js","sourceRoot":"","sources":["../../src/scanner/directives.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAc,EAAE,SAAiB;IACnE,MAAM,YAAY,GAAG,CAAC,CAAS,EAAW,EAAE,CAC1C,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC;IAClF,IAAI,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACxC,IAAI,OAAO,KAAK,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QACjC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC;IAClB,CAAC;IACD,SAAS,CAAC;QACR,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC;YAAE,CAAC,EAAE,CAAC;QAC1D,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACxC,IAAI,OAAO,KAAK,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAC;YACjC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC;QAClB,CAAC;aAAM,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YACtC,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACxC,IAAI,GAAG,KAAK,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC7B,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;QACd,CAAC;aAAM,CAAC;YACN,MAAM;QACR,CAAC;IACH,CAAC;IACD,OAAO,IAAI,MAAM,CAAC,QAAQ,SAAS,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACnE,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * The npm package an import specifier names, or null for a relative path, a Node builtin, a tsconfig alias, a
3
+ * `#` subpath import, or a `scheme:` specifier. Self-contained: the generated ESLint rules embed it.
4
+ */
5
+ export declare function packageName(specifier: string, aliasPrefixes: readonly string[], builtins: ReadonlySet<string>): string | null;
6
+ /** The package names a package.json text declares in any dependency field. Self-contained: see packageName. */
7
+ export declare function declaredPackages(packageJsonText: string): string[];
8
+ /** Whether an import of package `name` reaches into its build or implementation folders. Self-contained. */
9
+ export declare function isPackageInternal(specifier: string, name: string): boolean;
10
+ //# sourceMappingURL=package-name.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-name.d.ts","sourceRoot":"","sources":["../../src/scanner/package-name.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,WAAW,CACzB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,SAAS,MAAM,EAAE,EAChC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,GAC5B,MAAM,GAAG,IAAI,CASf;AAED,+GAA+G;AAC/G,wBAAgB,gBAAgB,CAAC,eAAe,EAAE,MAAM,GAAG,MAAM,EAAE,CAalE;AAED,4GAA4G;AAC5G,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAG1E"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * The npm package an import specifier names, or null for a relative path, a Node builtin, a tsconfig alias, a
3
+ * `#` subpath import, or a `scheme:` specifier. Self-contained: the generated ESLint rules embed it.
4
+ */
5
+ export function packageName(specifier, aliasPrefixes, builtins) {
6
+ if (specifier.startsWith('.') || specifier.startsWith('#'))
7
+ return null;
8
+ if (/^[a-z][a-z0-9+.-]*:/i.test(specifier))
9
+ return null;
10
+ if (builtins.has(specifier) || builtins.has(specifier.split('/')[0]))
11
+ return null;
12
+ if (aliasPrefixes.some((prefix) => specifier === prefix || specifier.startsWith(`${prefix}/`))) {
13
+ return null;
14
+ }
15
+ const parts = specifier.split('/');
16
+ return specifier.startsWith('@') ? parts.slice(0, 2).join('/') : parts[0];
17
+ }
18
+ /** The package names a package.json text declares in any dependency field. Self-contained: see packageName. */
19
+ export function declaredPackages(packageJsonText) {
20
+ let json;
21
+ try {
22
+ json = JSON.parse(packageJsonText);
23
+ }
24
+ catch {
25
+ return [];
26
+ }
27
+ return ['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies'].flatMap((field) => {
28
+ const deps = json[field];
29
+ return deps !== null && typeof deps === 'object' ? Object.keys(deps) : [];
30
+ });
31
+ }
32
+ /** Whether an import of package `name` reaches into its build or implementation folders. Self-contained. */
33
+ export function isPackageInternal(specifier, name) {
34
+ const subpath = specifier.slice(name.length + 1).split('/')[0] ?? '';
35
+ return ['src', 'internal', 'internals'].includes(subpath);
36
+ }
37
+ //# sourceMappingURL=package-name.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-name.js","sourceRoot":"","sources":["../../src/scanner/package-name.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,WAAW,CACzB,SAAiB,EACjB,aAAgC,EAChC,QAA6B;IAE7B,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACxE,IAAI,sBAAsB,CAAC,IAAI,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IACxD,IAAI,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IACnF,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,KAAK,MAAM,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;QAC/F,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnC,OAAO,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC;AAC7E,CAAC;AAED,+GAA+G;AAC/G,MAAM,UAAU,gBAAgB,CAAC,eAAuB;IACtD,IAAI,IAA6B,CAAC;IAClC,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAA4B,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,CAAC,cAAc,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,sBAAsB,CAAC,CAAC,OAAO,CAC5F,CAAC,KAAK,EAAE,EAAE;QACR,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QACzB,OAAO,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5E,CAAC,CACF,CAAC;AACJ,CAAC;AAED,4GAA4G;AAC5G,MAAM,UAAU,iBAAiB,CAAC,SAAiB,EAAE,IAAY;IAC/D,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACrE,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC5D,CAAC"}
@@ -2,5 +2,10 @@ export interface AliasEntry {
2
2
  prefix: string;
3
3
  dir: string;
4
4
  }
5
+ /**
6
+ * The files an import of `base` (a path without resolution) can mean, in the order TypeScript-style resolution
7
+ * tries them. Self-contained: the generated ESLint rules embed it.
8
+ */
9
+ export declare function firstPartyCandidates(base: string): string[];
5
10
  export declare function resolveFirstPartyImport(specifier: string, fromAbsPath: string, aliases: readonly AliasEntry[]): string | null;
6
11
  //# sourceMappingURL=resolve-import.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-import.d.ts","sourceRoot":"","sources":["../../src/scanner/resolve-import.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb;AA2BD,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,SAAS,UAAU,EAAE,GAC7B,MAAM,GAAG,IAAI,CAcf"}
1
+ {"version":3,"file":"resolve-import.d.ts","sourceRoot":"","sources":["../../src/scanner/resolve-import.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAiB3D;AAkBD,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,SAAS,UAAU,EAAE,GAC7B,MAAM,GAAG,IAAI,CAOf"}
@@ -1,13 +1,25 @@
1
1
  import { existsSync } from 'node:fs';
2
2
  import * as path from 'node:path';
3
- const JS_EXT_TO_TS = {
4
- '.js': ['.ts', '.tsx'],
5
- '.jsx': ['.tsx'],
6
- '.mjs': ['.ts', '.tsx'],
7
- '.cjs': ['.ts', '.tsx'],
8
- };
9
- const BARE_CANDIDATES = ['', '.ts', '.tsx', '.vue', '.svelte', '/index.ts', '/index.tsx'];
10
- const FIRST_PARTY_TARGET = /\.(ts|tsx|vue|svelte)$/;
3
+ /**
4
+ * The files an import of `base` (a path without resolution) can mean, in the order TypeScript-style resolution
5
+ * tries them. Self-contained: the generated ESLint rules embed it.
6
+ */
7
+ export function firstPartyCandidates(base) {
8
+ const jsToTs = {
9
+ '.js': ['.ts', '.tsx'],
10
+ '.jsx': ['.tsx'],
11
+ '.mjs': ['.ts', '.tsx'],
12
+ '.cjs': ['.ts', '.tsx'],
13
+ };
14
+ const name = base.slice(Math.max(base.lastIndexOf('/'), base.lastIndexOf('\\')) + 1);
15
+ const dot = name.lastIndexOf('.');
16
+ const extension = dot > 0 ? name.slice(dot) : '';
17
+ const candidates = (jsToTs[extension] ?? []).map((tsExtension) => base.slice(0, -extension.length) + tsExtension);
18
+ for (const suffix of ['', '.ts', '.tsx', '.vue', '.svelte', '/index.ts', '/index.tsx']) {
19
+ candidates.push(base + suffix);
20
+ }
21
+ return candidates.filter((candidate) => /\.(ts|tsx|vue|svelte)$/.test(candidate));
22
+ }
11
23
  function specifierBase(specifier, fromAbsPath, aliases) {
12
24
  if (specifier.startsWith('.')) {
13
25
  return path.resolve(path.dirname(fromAbsPath), specifier);
@@ -23,17 +35,8 @@ export function resolveFirstPartyImport(specifier, fromAbsPath, aliases) {
23
35
  const base = specifierBase(specifier, fromAbsPath, aliases);
24
36
  if (base === null)
25
37
  return null;
26
- const candidates = [];
27
- const tsExtensions = JS_EXT_TO_TS[path.extname(base)];
28
- if (tsExtensions !== undefined) {
29
- const stem = base.slice(0, -path.extname(base).length);
30
- for (const tsExt of tsExtensions)
31
- candidates.push(stem + tsExt);
32
- }
33
- for (const suffix of BARE_CANDIDATES)
34
- candidates.push(base + suffix);
35
- for (const candidate of candidates) {
36
- if (FIRST_PARTY_TARGET.test(candidate) && existsSync(candidate))
38
+ for (const candidate of firstPartyCandidates(base)) {
39
+ if (existsSync(candidate))
37
40
  return candidate;
38
41
  }
39
42
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-import.js","sourceRoot":"","sources":["../../src/scanner/resolve-import.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAOlC,MAAM,YAAY,GAAsC;IACtD,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,CAAC,MAAM,CAAC;IAChB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,CAAC;AACF,MAAM,eAAe,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;AAC1F,MAAM,kBAAkB,GAAG,wBAAwB,CAAC;AAEpD,SAAS,aAAa,CACpB,SAAiB,EACjB,WAAmB,EACnB,OAA8B;IAE9B,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC,CAAC;IAC5D,CAAC;IACD,KAAK,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,OAAO,EAAE,CAAC;QACtC,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/D,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,SAAiB,EACjB,WAAmB,EACnB,OAA8B;IAE9B,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAC5D,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/B,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACtD,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC;QACvD,KAAK,MAAM,KAAK,IAAI,YAAY;YAAE,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;IAClE,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,eAAe;QAAE,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC;IACrE,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;IACpF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"resolve-import.js","sourceRoot":"","sources":["../../src/scanner/resolve-import.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAOlC;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,MAAM,GAAsC;QAChD,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;QACtB,MAAM,EAAE,CAAC,MAAM,CAAC;QAChB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACrF,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACjD,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAC9C,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,WAAW,CAChE,CAAC;IACF,KAAK,MAAM,MAAM,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,CAAC;QACvF,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,wBAAwB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;AACpF,CAAC;AAED,SAAS,aAAa,CACpB,SAAiB,EACjB,WAAmB,EACnB,OAA8B;IAE9B,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC,CAAC;IAC5D,CAAC;IACD,KAAK,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,OAAO,EAAE,CAAC;QACtC,IAAI,SAAS,KAAK,MAAM,IAAI,SAAS,CAAC,UAAU,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/D,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,SAAiB,EACjB,WAAmB,EACnB,OAA8B;IAE9B,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IAC5D,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/B,KAAK,MAAM,SAAS,IAAI,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,IAAI,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;IAC9C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -6,8 +6,17 @@ export interface RoleClassification {
6
6
  }
7
7
  export declare const ROLE_PATTERNS: ReadonlyMap<Role, readonly RegExp[]>;
8
8
  export declare const REQUEST_ENTRY_ROLES: readonly Role[];
9
+ /** The index of the first rule whose pattern matches the path, or -1. Self-contained: the ESLint rules embed it. */
10
+ export declare function firstMatchingRule(relativePath: string, rules: readonly {
11
+ test: RegExp;
12
+ }[]): number;
13
+ /** The role rules in the order classifyFile tries them, as regex sources. */
14
+ export declare const ROLE_RULE_SOURCES: readonly {
15
+ role: Role;
16
+ source: string;
17
+ }[];
9
18
  export declare function classifyFile(relativePath: string): RoleClassification;
10
- export declare function hasUseServerDirective(sourceHead: string): boolean;
11
- export declare function hasUseClientDirective(sourceHead: string): boolean;
19
+ export declare const hasUseServerDirective: (sourceHead: string) => boolean;
20
+ export declare const hasUseClientDirective: (sourceHead: string) => boolean;
12
21
  export declare function classifyFileWithDirective(relativePath: string, hasServerDirective: boolean): RoleClassification;
13
22
  //# sourceMappingURL=role-classifier.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"role-classifier.d.ts","sourceRoot":"","sources":["../../src/scanner/role-classifier.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,IAAI,GACZ,YAAY,GACZ,SAAS,GACT,YAAY,GACZ,eAAe,GACf,aAAa,GACb,eAAe,GACf,aAAa,GACb,aAAa,GACb,aAAa,GACb,WAAW,GACX,QAAQ,GACR,aAAa,GACb,QAAQ,GACR,MAAM,GACN,WAAW,GACX,SAAS,CAAC;AAEd,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,IAAI,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAoHD,eAAO,MAAM,aAAa,EAAE,WAAW,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAO9D,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,SAAS,IAAI,EAM9C,CAAC;AAEF,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,kBAAkB,CAQrE;AA2BD,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAEjE;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAEjE;AAED,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,MAAM,EACpB,kBAAkB,EAAE,OAAO,GAC1B,kBAAkB,CAOpB"}
1
+ {"version":3,"file":"role-classifier.d.ts","sourceRoot":"","sources":["../../src/scanner/role-classifier.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,IAAI,GACZ,YAAY,GACZ,SAAS,GACT,YAAY,GACZ,eAAe,GACf,aAAa,GACb,eAAe,GACf,aAAa,GACb,aAAa,GACb,aAAa,GACb,WAAW,GACX,QAAQ,GACR,aAAa,GACb,QAAQ,GACR,MAAM,GACN,WAAW,GACX,SAAS,CAAC;AAEd,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,IAAI,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAoHD,eAAO,MAAM,aAAa,EAAE,WAAW,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAO9D,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,SAAS,IAAI,EAM9C,CAAC;AAEF,oHAAoH;AACpH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,MAAM,EACpB,KAAK,EAAE,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,GACjC,MAAM,CAGR;AAED,6EAA6E;AAC7E,eAAO,MAAM,iBAAiB,EAAE,SAAS;IAAE,IAAI,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAEtE,CAAC;AAEF,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,kBAAkB,CAKrE;AAED,eAAO,MAAM,qBAAqB,GAAI,YAAY,MAAM,KAAG,OACZ,CAAC;AAEhD,eAAO,MAAM,qBAAqB,GAAI,YAAY,MAAM,KAAG,OACZ,CAAC;AAEhD,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,MAAM,EACpB,kBAAkB,EAAE,OAAO,GAC1B,kBAAkB,CAOpB"}
@@ -1,3 +1,4 @@
1
+ import { hasLeadingDirective } from './directives.js';
1
2
  const ROLE_RULES = [
2
3
  {
3
4
  role: 'TEST',
@@ -116,48 +117,21 @@ export const REQUEST_ENTRY_ROLES = [
116
117
  'API_HANDLER',
117
118
  'TRPC_ROUTER',
118
119
  ];
119
- export function classifyFile(relativePath) {
120
+ /** The index of the first rule whose pattern matches the path, or -1. Self-contained: the ESLint rules embed it. */
121
+ export function firstMatchingRule(relativePath, rules) {
120
122
  const normalizedPath = relativePath.replace(/\\/g, '/');
121
- for (const rule of ROLE_RULES) {
122
- if (rule.test.test(normalizedPath)) {
123
- return { role: rule.role, confidence: rule.confidence, matchedRule: rule.id };
124
- }
125
- }
126
- return { role: 'UNKNOWN', confidence: 0, matchedRule: null };
127
- }
128
- const USE_SERVER_LITERAL = /^["']use server["']/;
129
- const USE_CLIENT_LITERAL = /^["']use client["']/;
130
- const isWhitespace = (c) => c === ' ' || c === '\t' || c === '\n' || c === '\r' || c === '\f' || c === '\v';
131
- function hasLeadingDirective(sourceHead, literal) {
132
- let i = 0;
133
- const n = sourceHead.length;
134
- for (;;) {
135
- while (i < n && isWhitespace(sourceHead[i]))
136
- i++;
137
- if (sourceHead.startsWith('//', i)) {
138
- const newline = sourceHead.indexOf('\n', i);
139
- if (newline === -1)
140
- return false;
141
- i = newline + 1;
142
- }
143
- else if (sourceHead.startsWith('/*', i)) {
144
- const end = sourceHead.indexOf('*/', i + 2);
145
- if (end === -1)
146
- return false;
147
- i = end + 2;
148
- }
149
- else {
150
- break;
151
- }
152
- }
153
- return literal.test(sourceHead.slice(i));
154
- }
155
- export function hasUseServerDirective(sourceHead) {
156
- return hasLeadingDirective(sourceHead, USE_SERVER_LITERAL);
123
+ return rules.findIndex((rule) => rule.test.test(normalizedPath));
157
124
  }
158
- export function hasUseClientDirective(sourceHead) {
159
- return hasLeadingDirective(sourceHead, USE_CLIENT_LITERAL);
125
+ /** The role rules in the order classifyFile tries them, as regex sources. */
126
+ export const ROLE_RULE_SOURCES = ROLE_RULES.map((rule) => ({ role: rule.role, source: rule.test.source }));
127
+ export function classifyFile(relativePath) {
128
+ const rule = ROLE_RULES[firstMatchingRule(relativePath, ROLE_RULES)];
129
+ return rule === undefined
130
+ ? { role: 'UNKNOWN', confidence: 0, matchedRule: null }
131
+ : { role: rule.role, confidence: rule.confidence, matchedRule: rule.id };
160
132
  }
133
+ export const hasUseServerDirective = (sourceHead) => hasLeadingDirective(sourceHead, 'use server');
134
+ export const hasUseClientDirective = (sourceHead) => hasLeadingDirective(sourceHead, 'use client');
161
135
  export function classifyFileWithDirective(relativePath, hasServerDirective) {
162
136
  const base = classifyFile(relativePath);
163
137
  const isTsx = /\.tsx$/.test(relativePath.replace(/\\/g, '/'));
@@ -1 +1 @@
1
- {"version":3,"file":"role-classifier.js","sourceRoot":"","sources":["../../src/scanner/role-classifier.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"role-classifier.js","sourceRoot":"","sources":["../../src/scanner/role-classifier.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "archprint",
3
- "version": "0.13.1",
3
+ "version": "0.15.0",
4
4
  "mcpName": "io.github.Tommkruix/archprint",
5
5
  "description": "Mine the architecture rules your TypeScript repo already enforces, with the evidence attached.",
6
6
  "keywords": [
@@ -81,7 +81,7 @@
81
81
  "dependencies": {
82
82
  "@modelcontextprotocol/sdk": "^1.31.0",
83
83
  "commander": "^15.0.0",
84
- "ignore": "7.0.12",
84
+ "ignore": "7.0.14",
85
85
  "ts-morph": "28.0.0",
86
86
  "typescript": "6.0.3"
87
87
  },
@@ -1,29 +0,0 @@
1
- import type { LayerBoundary } from '../detector/layer-detector.js';
2
- import { type LayerAlias } from '../detector/layer-paths.js';
3
- export interface EslintLayerRule {
4
- name: string;
5
- from: string;
6
- to: string;
7
- message: string;
8
- ignore: string[];
9
- }
10
- /** The app the rules enforce: where it is, its import aliases, and the gitignored paths the scan left out. */
11
- export interface LayerApp {
12
- appDir: string;
13
- aliases: LayerAlias[];
14
- ignored: string[];
15
- }
16
- export interface EslintLayers extends LayerApp {
17
- rules: EslintLayerRule[];
18
- }
19
- /** The given layer boundaries as ESLint rules, each exempting its known and allowed exceptions. */
20
- export declare function buildEslintLayers(boundaries: readonly LayerBoundary[], app: LayerApp, allowedFor: (ruleId: string) => readonly string[]): EslintLayers | null;
21
- export interface RenderedEslintLayers {
22
- imports: string;
23
- source: string;
24
- rules: string;
25
- config: string;
26
- }
27
- /** The pieces of the generated ESLint file that enforce layer boundaries, located relative to that file. */
28
- export declare function renderEslintLayers(layers: EslintLayers, outDir: string): RenderedEslintLayers;
29
- //# sourceMappingURL=eslint-layer-emitter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"eslint-layer-emitter.d.ts","sourceRoot":"","sources":["../../src/generator/eslint-layer-emitter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,KAAK,UAAU,EAAkC,MAAM,4BAA4B,CAAC;AAM7F,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,8GAA8G;AAC9G,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,YAAa,SAAQ,QAAQ;IAC5C,KAAK,EAAE,eAAe,EAAE,CAAC;CAC1B;AAED,mGAAmG;AACnG,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,SAAS,aAAa,EAAE,EACpC,GAAG,EAAE,QAAQ,EACb,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,SAAS,MAAM,EAAE,GAChD,YAAY,GAAG,IAAI,CAgBrB;AAkED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,4GAA4G;AAC5G,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,oBAAoB,CA+B7F"}