qfai 0.4.7 → 0.4.9

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 (155) hide show
  1. package/README.md +3 -1
  2. package/dist/cli/index.cjs +2 -2
  3. package/dist/cli/index.d.ts +0 -2
  4. package/dist/cli/index.mjs +2 -2
  5. package/dist/index.cjs +2 -2
  6. package/dist/index.d.ts +167 -2
  7. package/dist/index.mjs +2 -2
  8. package/package.json +3 -1
  9. package/dist/cli/commands/init.d.ts +0 -8
  10. package/dist/cli/commands/init.d.ts.map +0 -1
  11. package/dist/cli/commands/init.js +0 -30
  12. package/dist/cli/commands/init.js.map +0 -1
  13. package/dist/cli/commands/report.d.ts +0 -7
  14. package/dist/cli/commands/report.d.ts.map +0 -1
  15. package/dist/cli/commands/report.js +0 -108
  16. package/dist/cli/commands/report.js.map +0 -1
  17. package/dist/cli/commands/validate.d.ts +0 -9
  18. package/dist/cli/commands/validate.d.ts.map +0 -1
  19. package/dist/cli/commands/validate.js +0 -57
  20. package/dist/cli/commands/validate.js.map +0 -1
  21. package/dist/cli/index.d.ts.map +0 -1
  22. package/dist/cli/index.js +0 -7
  23. package/dist/cli/index.js.map +0 -1
  24. package/dist/cli/lib/args.d.ts +0 -18
  25. package/dist/cli/lib/args.d.ts.map +0 -1
  26. package/dist/cli/lib/args.js +0 -98
  27. package/dist/cli/lib/args.js.map +0 -1
  28. package/dist/cli/lib/assets.d.ts +0 -2
  29. package/dist/cli/lib/assets.d.ts.map +0 -1
  30. package/dist/cli/lib/assets.js +0 -24
  31. package/dist/cli/lib/assets.js.map +0 -1
  32. package/dist/cli/lib/failOn.d.ts +0 -5
  33. package/dist/cli/lib/failOn.d.ts.map +0 -1
  34. package/dist/cli/lib/failOn.js +0 -10
  35. package/dist/cli/lib/failOn.js.map +0 -1
  36. package/dist/cli/lib/fs.d.ts +0 -11
  37. package/dist/cli/lib/fs.d.ts.map +0 -1
  38. package/dist/cli/lib/fs.js +0 -91
  39. package/dist/cli/lib/fs.js.map +0 -1
  40. package/dist/cli/lib/logger.d.ts +0 -4
  41. package/dist/cli/lib/logger.d.ts.map +0 -1
  42. package/dist/cli/lib/logger.js +0 -10
  43. package/dist/cli/lib/logger.js.map +0 -1
  44. package/dist/cli/main.d.ts +0 -2
  45. package/dist/cli/main.d.ts.map +0 -1
  46. package/dist/cli/main.js +0 -66
  47. package/dist/cli/main.js.map +0 -1
  48. package/dist/core/config.d.ts +0 -47
  49. package/dist/core/config.d.ts.map +0 -1
  50. package/dist/core/config.js +0 -224
  51. package/dist/core/config.js.map +0 -1
  52. package/dist/core/contractIndex.d.ts +0 -12
  53. package/dist/core/contractIndex.d.ts.map +0 -1
  54. package/dist/core/contractIndex.js +0 -38
  55. package/dist/core/contractIndex.js.map +0 -1
  56. package/dist/core/contracts.d.ts +0 -5
  57. package/dist/core/contracts.d.ts.map +0 -1
  58. package/dist/core/contracts.js +0 -42
  59. package/dist/core/contracts.js.map +0 -1
  60. package/dist/core/contractsDecl.d.ts +0 -3
  61. package/dist/core/contractsDecl.d.ts.map +0 -1
  62. package/dist/core/contractsDecl.js +0 -19
  63. package/dist/core/contractsDecl.js.map +0 -1
  64. package/dist/core/discovery.d.ts +0 -14
  65. package/dist/core/discovery.d.ts.map +0 -1
  66. package/dist/core/discovery.js +0 -55
  67. package/dist/core/discovery.js.map +0 -1
  68. package/dist/core/fs.d.ts +0 -11
  69. package/dist/core/fs.d.ts.map +0 -1
  70. package/dist/core/fs.js +0 -68
  71. package/dist/core/fs.js.map +0 -1
  72. package/dist/core/gherkin/parse.d.ts +0 -7
  73. package/dist/core/gherkin/parse.d.ts.map +0 -1
  74. package/dist/core/gherkin/parse.js +0 -25
  75. package/dist/core/gherkin/parse.js.map +0 -1
  76. package/dist/core/ids.d.ts +0 -6
  77. package/dist/core/ids.d.ts.map +0 -1
  78. package/dist/core/ids.js +0 -52
  79. package/dist/core/ids.js.map +0 -1
  80. package/dist/core/index.d.ts +0 -13
  81. package/dist/core/index.d.ts.map +0 -1
  82. package/dist/core/index.js +0 -13
  83. package/dist/core/index.js.map +0 -1
  84. package/dist/core/parse/adr.d.ts +0 -13
  85. package/dist/core/parse/adr.d.ts.map +0 -1
  86. package/dist/core/parse/adr.js +0 -33
  87. package/dist/core/parse/adr.js.map +0 -1
  88. package/dist/core/parse/gherkin.d.ts +0 -12
  89. package/dist/core/parse/gherkin.d.ts.map +0 -1
  90. package/dist/core/parse/gherkin.js +0 -22
  91. package/dist/core/parse/gherkin.js.map +0 -1
  92. package/dist/core/parse/markdown.d.ts +0 -14
  93. package/dist/core/parse/markdown.d.ts.map +0 -1
  94. package/dist/core/parse/markdown.js +0 -45
  95. package/dist/core/parse/markdown.js.map +0 -1
  96. package/dist/core/parse/spec.d.ts +0 -36
  97. package/dist/core/parse/spec.d.ts.map +0 -1
  98. package/dist/core/parse/spec.js +0 -123
  99. package/dist/core/parse/spec.js.map +0 -1
  100. package/dist/core/report.d.ts +0 -55
  101. package/dist/core/report.d.ts.map +0 -1
  102. package/dist/core/report.js +0 -393
  103. package/dist/core/report.js.map +0 -1
  104. package/dist/core/scenarioModel.d.ts +0 -33
  105. package/dist/core/scenarioModel.d.ts.map +0 -1
  106. package/dist/core/scenarioModel.js +0 -128
  107. package/dist/core/scenarioModel.js.map +0 -1
  108. package/dist/core/specLayout.d.ts +0 -8
  109. package/dist/core/specLayout.d.ts.map +0 -1
  110. package/dist/core/specLayout.js +0 -36
  111. package/dist/core/specLayout.js.map +0 -1
  112. package/dist/core/traceability.d.ts +0 -26
  113. package/dist/core/traceability.d.ts.map +0 -1
  114. package/dist/core/traceability.js +0 -157
  115. package/dist/core/traceability.js.map +0 -1
  116. package/dist/core/types.d.ts +0 -31
  117. package/dist/core/types.d.ts.map +0 -1
  118. package/dist/core/types.js +0 -2
  119. package/dist/core/types.js.map +0 -1
  120. package/dist/core/validate.d.ts +0 -4
  121. package/dist/core/validate.d.ts.map +0 -1
  122. package/dist/core/validate.js +0 -45
  123. package/dist/core/validate.js.map +0 -1
  124. package/dist/core/validators/contracts.d.ts +0 -5
  125. package/dist/core/validators/contracts.d.ts.map +0 -1
  126. package/dist/core/validators/contracts.js +0 -189
  127. package/dist/core/validators/contracts.js.map +0 -1
  128. package/dist/core/validators/delta.d.ts +0 -4
  129. package/dist/core/validators/delta.d.ts.map +0 -1
  130. package/dist/core/validators/delta.js +0 -68
  131. package/dist/core/validators/delta.js.map +0 -1
  132. package/dist/core/validators/ids.d.ts +0 -4
  133. package/dist/core/validators/ids.d.ts.map +0 -1
  134. package/dist/core/validators/ids.js +0 -88
  135. package/dist/core/validators/ids.js.map +0 -1
  136. package/dist/core/validators/scenario.d.ts +0 -5
  137. package/dist/core/validators/scenario.d.ts.map +0 -1
  138. package/dist/core/validators/scenario.js +0 -127
  139. package/dist/core/validators/scenario.js.map +0 -1
  140. package/dist/core/validators/spec.d.ts +0 -5
  141. package/dist/core/validators/spec.d.ts.map +0 -1
  142. package/dist/core/validators/spec.js +0 -94
  143. package/dist/core/validators/spec.js.map +0 -1
  144. package/dist/core/validators/traceability.d.ts +0 -4
  145. package/dist/core/validators/traceability.d.ts.map +0 -1
  146. package/dist/core/validators/traceability.js +0 -222
  147. package/dist/core/validators/traceability.js.map +0 -1
  148. package/dist/core/version.d.ts +0 -2
  149. package/dist/core/version.d.ts.map +0 -1
  150. package/dist/core/version.js +0 -25
  151. package/dist/core/version.js.map +0 -1
  152. package/dist/index.d.ts.map +0 -1
  153. package/dist/index.js +0 -2
  154. package/dist/index.js.map +0 -1
  155. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -1,128 +0,0 @@
1
- import { parseGherkin } from "./gherkin/parse.js";
2
- import { extractIds } from "./ids.js";
3
- const SPEC_TAG_RE = /^SPEC-\d{4}$/;
4
- const SC_TAG_RE = /^SC-\d{4}$/;
5
- const BR_TAG_RE = /^BR-\d{4}$/;
6
- const UI_TAG_RE = /^UI-\d{4}$/;
7
- const API_TAG_RE = /^API-\d{4}$/;
8
- const DB_TAG_RE = /^DB-\d{4}$/;
9
- export function parseScenarioDocument(text, uri) {
10
- const { gherkinDocument, errors } = parseGherkin(text, uri);
11
- if (!gherkinDocument) {
12
- return { document: null, errors };
13
- }
14
- const feature = gherkinDocument.feature;
15
- if (!feature) {
16
- return {
17
- document: { uri, featureTags: [], scenarios: [] },
18
- errors,
19
- };
20
- }
21
- const featureTags = collectTagNames(feature.tags);
22
- const scenarios = collectScenarioNodes(feature, featureTags);
23
- return {
24
- document: {
25
- uri,
26
- featureName: feature.name,
27
- featureTags,
28
- scenarios,
29
- },
30
- errors,
31
- };
32
- }
33
- export function buildScenarioAtoms(document) {
34
- return document.scenarios.map((scenario) => {
35
- const specIds = scenario.tags.filter((tag) => SPEC_TAG_RE.test(tag));
36
- const scIds = scenario.tags.filter((tag) => SC_TAG_RE.test(tag));
37
- const brIds = unique(scenario.tags.filter((tag) => BR_TAG_RE.test(tag)));
38
- const contractIds = new Set();
39
- scenario.tags.forEach((tag) => {
40
- if (UI_TAG_RE.test(tag) || API_TAG_RE.test(tag) || DB_TAG_RE.test(tag)) {
41
- contractIds.add(tag);
42
- }
43
- });
44
- for (const step of scenario.steps) {
45
- for (const text of collectStepTexts(step)) {
46
- extractIds(text, "UI").forEach((id) => contractIds.add(id));
47
- extractIds(text, "API").forEach((id) => contractIds.add(id));
48
- extractIds(text, "DB").forEach((id) => contractIds.add(id));
49
- }
50
- }
51
- const atom = {
52
- uri: document.uri,
53
- featureName: document.featureName ?? "",
54
- scenarioName: scenario.name,
55
- kind: scenario.kind,
56
- brIds,
57
- contractIds: Array.from(contractIds).sort(),
58
- };
59
- if (scenario.line !== undefined) {
60
- atom.line = scenario.line;
61
- }
62
- if (specIds.length === 1) {
63
- const specId = specIds[0];
64
- if (specId) {
65
- atom.specId = specId;
66
- }
67
- }
68
- if (scIds.length === 1) {
69
- const scId = scIds[0];
70
- if (scId) {
71
- atom.scId = scId;
72
- }
73
- }
74
- return atom;
75
- });
76
- }
77
- function collectScenarioNodes(feature, featureTags) {
78
- const scenarios = [];
79
- for (const child of feature.children) {
80
- if (child.scenario) {
81
- scenarios.push(buildScenarioNode(child.scenario, featureTags, []));
82
- }
83
- if (child.rule) {
84
- const ruleTags = collectTagNames(child.rule.tags);
85
- for (const ruleChild of child.rule.children) {
86
- if (ruleChild.scenario) {
87
- scenarios.push(buildScenarioNode(ruleChild.scenario, featureTags, ruleTags));
88
- }
89
- }
90
- }
91
- }
92
- return scenarios;
93
- }
94
- function buildScenarioNode(scenario, featureTags, ruleTags) {
95
- const tags = [...featureTags, ...ruleTags, ...collectTagNames(scenario.tags)];
96
- const kind = scenario.examples.length > 0 ? "ScenarioOutline" : "Scenario";
97
- return {
98
- name: scenario.name,
99
- kind,
100
- line: scenario.location?.line,
101
- tags,
102
- steps: scenario.steps,
103
- };
104
- }
105
- function collectTagNames(tags) {
106
- return tags.map((tag) => tag.name.replace(/^@/, ""));
107
- }
108
- function collectStepTexts(step) {
109
- const texts = [];
110
- if (step.text) {
111
- texts.push(step.text);
112
- }
113
- if (step.docString?.content) {
114
- texts.push(step.docString.content);
115
- }
116
- if (step.dataTable?.rows) {
117
- for (const row of step.dataTable.rows) {
118
- for (const cell of row.cells) {
119
- texts.push(cell.value);
120
- }
121
- }
122
- }
123
- return texts;
124
- }
125
- function unique(values) {
126
- return Array.from(new Set(values));
127
- }
128
- //# sourceMappingURL=scenarioModel.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scenarioModel.js","sourceRoot":"","sources":["../../src/core/scenarioModel.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,WAAW,GAAG,cAAc,CAAC;AACnC,MAAM,SAAS,GAAG,YAAY,CAAC;AAC/B,MAAM,SAAS,GAAG,YAAY,CAAC;AAC/B,MAAM,SAAS,GAAG,YAAY,CAAC;AAC/B,MAAM,UAAU,GAAG,aAAa,CAAC;AACjC,MAAM,SAAS,GAAG,YAAY,CAAC;AAoC/B,MAAM,UAAU,qBAAqB,CACnC,IAAY,EACZ,GAAW;IAEX,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC5D,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IACpC,CAAC;IAED,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC;IACxC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,QAAQ,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;YACjD,MAAM;SACP,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,oBAAoB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC7D,OAAO;QACL,QAAQ,EAAE;YACR,GAAG;YACH,WAAW,EAAE,OAAO,CAAC,IAAI;YACzB,WAAW;YACX,SAAS;SACV;QACD,MAAM;KACP,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAA0B;IAC3D,OAAO,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;QACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACrE,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACjE,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAEzE,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;QACtC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YAC5B,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACvE,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACvB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YAClC,KAAK,MAAM,IAAI,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1C,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC5D,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC7D,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QAED,MAAM,IAAI,GAAiB;YACzB,GAAG,EAAE,QAAQ,CAAC,GAAG;YACjB,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,EAAE;YACvC,YAAY,EAAE,QAAQ,CAAC,IAAI;YAC3B,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,KAAK;YACL,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE;SAC5C,CAAC;QAEF,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAChC,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC5B,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YACvB,CAAC;QACH,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACnB,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,oBAAoB,CAC3B,OAAyB,EACzB,WAAqB;IAErB,MAAM,SAAS,GAAmB,EAAE,CAAC;IAErC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACnB,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClD,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC5C,IAAI,SAAS,CAAC,QAAQ,EAAE,CAAC;oBACvB,SAAS,CAAC,IAAI,CACZ,iBAAiB,CAAC,SAAS,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC,CAC7D,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,iBAAiB,CACxB,QAA2B,EAC3B,WAAqB,EACrB,QAAkB;IAElB,MAAM,IAAI,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,QAAQ,EAAE,GAAG,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9E,MAAM,IAAI,GACR,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,UAAU,CAAC;IAChE,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,IAAI;QACJ,IAAI,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI;QAC7B,IAAI;QACJ,KAAK,EAAE,QAAQ,CAAC,KAAK;KACtB,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,IAA6B;IACpD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAmB;IAC3C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IACD,IAAI,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC;QACzB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YACtC,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;gBAC7B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,MAAM,CAAC,MAAgB;IAC9B,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;AACrC,CAAC"}
@@ -1,8 +0,0 @@
1
- export type SpecEntry = {
2
- dir: string;
3
- specPath: string;
4
- deltaPath: string;
5
- scenarioPath: string;
6
- };
7
- export declare function collectSpecEntries(specsRoot: string): Promise<SpecEntry[]>;
8
- //# sourceMappingURL=specLayout.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"specLayout.d.ts","sourceRoot":"","sources":["../../src/core/specLayout.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,SAAS,GAAG;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,SAAS,EAAE,CAAC,CAStB"}
@@ -1,36 +0,0 @@
1
- import { readdir } from "node:fs/promises";
2
- import path from "node:path";
3
- const SPEC_DIR_RE = /^spec-\d{4}$/;
4
- export async function collectSpecEntries(specsRoot) {
5
- const dirs = await listSpecDirs(specsRoot);
6
- const entries = dirs.map((dir) => ({
7
- dir,
8
- specPath: path.join(dir, "spec.md"),
9
- deltaPath: path.join(dir, "delta.md"),
10
- scenarioPath: path.join(dir, "scenario.md"),
11
- }));
12
- return entries.sort((a, b) => a.dir.localeCompare(b.dir));
13
- }
14
- async function listSpecDirs(specsRoot) {
15
- try {
16
- const items = await readdir(specsRoot, { withFileTypes: true });
17
- return items
18
- .filter((item) => item.isDirectory())
19
- .map((item) => item.name)
20
- .filter((name) => SPEC_DIR_RE.test(name.toLowerCase()))
21
- .map((name) => path.join(specsRoot, name));
22
- }
23
- catch (error) {
24
- if (isMissingFileError(error)) {
25
- return [];
26
- }
27
- throw error;
28
- }
29
- }
30
- function isMissingFileError(error) {
31
- if (!error || typeof error !== "object") {
32
- return false;
33
- }
34
- return error.code === "ENOENT";
35
- }
36
- //# sourceMappingURL=specLayout.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"specLayout.js","sourceRoot":"","sources":["../../src/core/specLayout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,WAAW,GAAG,cAAc,CAAC;AASnC,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,SAAiB;IAEjB,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACjC,GAAG;QACH,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC;QACnC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC;QACrC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC;KAC5C,CAAC,CAAC,CAAC;IACJ,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,SAAiB;IAC3C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,OAAO,KAAK;aACT,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;aACpC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;aACxB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;aACtD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;IAC/C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAQ,KAA2B,CAAC,IAAI,KAAK,QAAQ,CAAC;AACxD,CAAC"}
@@ -1,26 +0,0 @@
1
- export declare const SC_TAG_RE: RegExp;
2
- export declare const SC_TEST_ANNOTATION_RE: RegExp;
3
- export declare const DEFAULT_TEST_FILE_EXCLUDE_GLOBS: string[];
4
- export type ScCoverage = {
5
- total: number;
6
- covered: number;
7
- missing: number;
8
- missingIds: string[];
9
- refs: Record<string, string[]>;
10
- };
11
- export type TestFileScan = {
12
- globs: string[];
13
- excludeGlobs: string[];
14
- matchedFileCount: number;
15
- };
16
- export type ScTestReferenceResult = {
17
- refs: Map<string, Set<string>>;
18
- scan: TestFileScan;
19
- error?: string;
20
- };
21
- export declare function extractAnnotatedScIds(text: string): string[];
22
- export declare function collectScIdsFromScenarioFiles(scenarioFiles: string[]): Promise<Set<string>>;
23
- export declare function collectScIdSourcesFromScenarioFiles(scenarioFiles: string[]): Promise<Map<string, Set<string>>>;
24
- export declare function collectScTestReferences(root: string, globs: string[], excludeGlobs: string[]): Promise<ScTestReferenceResult>;
25
- export declare function buildScCoverage(scIds: Iterable<string>, refs: Map<string, Set<string>>): ScCoverage;
26
- //# sourceMappingURL=traceability.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"traceability.d.ts","sourceRoot":"","sources":["../../src/core/traceability.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,SAAS,QAAe,CAAC;AACtC,eAAO,MAAM,qBAAqB,QAAyB,CAAC;AAC5D,eAAO,MAAM,+BAA+B,UAS3C,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/B,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAS5D;AAED,wBAAsB,6BAA6B,CACjD,aAAa,EAAE,MAAM,EAAE,GACtB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAkBtB;AAED,wBAAsB,mCAAmC,CACvD,aAAa,EAAE,MAAM,EAAE,GACtB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAqBnC;AAED,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EAAE,EACf,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,qBAAqB,CAAC,CA4DhC;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,EACvB,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,GAC7B,UAAU,CAwBZ"}
@@ -1,157 +0,0 @@
1
- import { readFile } from "node:fs/promises";
2
- import path from "node:path";
3
- import { collectFilesByGlobs } from "./fs.js";
4
- import { parseScenarioDocument } from "./scenarioModel.js";
5
- export const SC_TAG_RE = /^SC-\d{4}$/;
6
- export const SC_TEST_ANNOTATION_RE = /\bQFAI:SC-(\d{4})\b/g;
7
- export const DEFAULT_TEST_FILE_EXCLUDE_GLOBS = [
8
- "**/node_modules/**",
9
- "**/.git/**",
10
- "**/.qfai/**",
11
- "**/dist/**",
12
- "**/build/**",
13
- "**/coverage/**",
14
- "**/.next/**",
15
- "**/out/**",
16
- ];
17
- export function extractAnnotatedScIds(text) {
18
- const ids = new Set();
19
- for (const match of text.matchAll(SC_TEST_ANNOTATION_RE)) {
20
- const suffix = match[1];
21
- if (suffix) {
22
- ids.add(`SC-${suffix}`);
23
- }
24
- }
25
- return Array.from(ids);
26
- }
27
- export async function collectScIdsFromScenarioFiles(scenarioFiles) {
28
- const scIds = new Set();
29
- for (const file of scenarioFiles) {
30
- const text = await readFile(file, "utf-8");
31
- const { document, errors } = parseScenarioDocument(text, file);
32
- if (!document || errors.length > 0) {
33
- continue;
34
- }
35
- for (const scenario of document.scenarios) {
36
- for (const tag of scenario.tags) {
37
- if (SC_TAG_RE.test(tag)) {
38
- scIds.add(tag);
39
- }
40
- }
41
- }
42
- }
43
- return scIds;
44
- }
45
- export async function collectScIdSourcesFromScenarioFiles(scenarioFiles) {
46
- const sources = new Map();
47
- for (const file of scenarioFiles) {
48
- const text = await readFile(file, "utf-8");
49
- const { document, errors } = parseScenarioDocument(text, file);
50
- if (!document || errors.length > 0) {
51
- continue;
52
- }
53
- for (const scenario of document.scenarios) {
54
- for (const tag of scenario.tags) {
55
- if (!SC_TAG_RE.test(tag)) {
56
- continue;
57
- }
58
- const current = sources.get(tag) ?? new Set();
59
- current.add(file);
60
- sources.set(tag, current);
61
- }
62
- }
63
- }
64
- return sources;
65
- }
66
- export async function collectScTestReferences(root, globs, excludeGlobs) {
67
- const refs = new Map();
68
- const normalizedGlobs = normalizeGlobs(globs);
69
- const normalizedExcludeGlobs = normalizeGlobs(excludeGlobs);
70
- const mergedExcludeGlobs = Array.from(new Set([...DEFAULT_TEST_FILE_EXCLUDE_GLOBS, ...normalizedExcludeGlobs]));
71
- if (normalizedGlobs.length === 0) {
72
- return {
73
- refs,
74
- scan: {
75
- globs: normalizedGlobs,
76
- excludeGlobs: mergedExcludeGlobs,
77
- matchedFileCount: 0,
78
- },
79
- };
80
- }
81
- let files = [];
82
- try {
83
- files = await collectFilesByGlobs(root, {
84
- globs: normalizedGlobs,
85
- ignore: mergedExcludeGlobs,
86
- });
87
- }
88
- catch (error) {
89
- return {
90
- refs,
91
- scan: {
92
- globs: normalizedGlobs,
93
- excludeGlobs: mergedExcludeGlobs,
94
- matchedFileCount: 0,
95
- },
96
- error: formatError(error),
97
- };
98
- }
99
- const normalizedFiles = Array.from(new Set(files.map((file) => path.normalize(file))));
100
- for (const file of normalizedFiles) {
101
- const text = await readFile(file, "utf-8");
102
- const scIds = extractAnnotatedScIds(text);
103
- if (scIds.length === 0) {
104
- continue;
105
- }
106
- for (const scId of scIds) {
107
- const current = refs.get(scId) ?? new Set();
108
- current.add(file);
109
- refs.set(scId, current);
110
- }
111
- }
112
- return {
113
- refs,
114
- scan: {
115
- globs: normalizedGlobs,
116
- excludeGlobs: mergedExcludeGlobs,
117
- matchedFileCount: normalizedFiles.length,
118
- },
119
- };
120
- }
121
- export function buildScCoverage(scIds, refs) {
122
- const sortedScIds = toSortedArray(scIds);
123
- const refsRecord = {};
124
- const missingIds = [];
125
- let covered = 0;
126
- for (const scId of sortedScIds) {
127
- const files = refs.get(scId);
128
- const sortedFiles = files ? toSortedArray(files) : [];
129
- refsRecord[scId] = sortedFiles;
130
- if (sortedFiles.length === 0) {
131
- missingIds.push(scId);
132
- }
133
- else {
134
- covered += 1;
135
- }
136
- }
137
- return {
138
- total: sortedScIds.length,
139
- covered,
140
- missing: missingIds.length,
141
- missingIds,
142
- refs: refsRecord,
143
- };
144
- }
145
- function toSortedArray(values) {
146
- return Array.from(new Set(values)).sort((a, b) => a.localeCompare(b));
147
- }
148
- function normalizeGlobs(globs) {
149
- return globs.map((glob) => glob.trim()).filter((glob) => glob.length > 0);
150
- }
151
- function formatError(error) {
152
- if (error instanceof Error) {
153
- return error.message;
154
- }
155
- return String(error);
156
- }
157
- //# sourceMappingURL=traceability.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"traceability.js","sourceRoot":"","sources":["../../src/core/traceability.ts"],"names":[],"mappings":"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"}
@@ -1,31 +0,0 @@
1
- import type { ScCoverage, TestFileScan } from "./traceability.js";
2
- export type IssueSeverity = "info" | "warning" | "error";
3
- export type IssueLocation = {
4
- line: number;
5
- column?: number;
6
- };
7
- export type Issue = {
8
- code: string;
9
- severity: IssueSeverity;
10
- message: string;
11
- file?: string;
12
- refs?: string[];
13
- rule?: string;
14
- loc?: IssueLocation;
15
- };
16
- export type ValidationCounts = {
17
- info: number;
18
- warning: number;
19
- error: number;
20
- };
21
- export type ValidationTraceability = {
22
- sc: ScCoverage;
23
- testFiles: TestFileScan;
24
- };
25
- export type ValidationResult = {
26
- toolVersion: string;
27
- issues: Issue[];
28
- counts: ValidationCounts;
29
- traceability: ValidationTraceability;
30
- };
31
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAElE,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAEzD,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,KAAK,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,aAAa,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,aAAa,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,EAAE,EAAE,UAAU,CAAC;IACf,SAAS,EAAE,YAAY,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,MAAM,EAAE,gBAAgB,CAAC;IACzB,YAAY,EAAE,sBAAsB,CAAC;CACtC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":""}
@@ -1,4 +0,0 @@
1
- import { type ConfigLoadResult } from "./config.js";
2
- import type { ValidationResult } from "./types.js";
3
- export declare function validateProject(root: string, configResult?: ConfigLoadResult): Promise<ValidationResult>;
4
- //# sourceMappingURL=validate.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/core/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAO7E,OAAO,KAAK,EAA2B,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAS5E,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,YAAY,CAAC,EAAE,gBAAgB,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CAiC3B"}
@@ -1,45 +0,0 @@
1
- import { loadConfig, resolvePath } from "./config.js";
2
- import { collectScenarioFiles } from "./discovery.js";
3
- import { buildScCoverage, collectScIdsFromScenarioFiles, collectScTestReferences, } from "./traceability.js";
4
- import { resolveToolVersion } from "./version.js";
5
- import { validateContracts } from "./validators/contracts.js";
6
- import { validateDeltas } from "./validators/delta.js";
7
- import { validateDefinedIds } from "./validators/ids.js";
8
- import { validateScenarios } from "./validators/scenario.js";
9
- import { validateSpecs } from "./validators/spec.js";
10
- import { validateTraceability } from "./validators/traceability.js";
11
- export async function validateProject(root, configResult) {
12
- const resolved = configResult ?? (await loadConfig(root));
13
- const { config, issues: configIssues } = resolved;
14
- const issues = [
15
- ...configIssues,
16
- ...(await validateSpecs(root, config)),
17
- ...(await validateDeltas(root, config)),
18
- ...(await validateScenarios(root, config)),
19
- ...(await validateContracts(root, config)),
20
- ...(await validateDefinedIds(root, config)),
21
- ...(await validateTraceability(root, config)),
22
- ];
23
- const specsRoot = resolvePath(root, config, "specsDir");
24
- const scenarioFiles = await collectScenarioFiles(specsRoot);
25
- const scIds = await collectScIdsFromScenarioFiles(scenarioFiles);
26
- const { refs: scTestRefs, scan: testFiles } = await collectScTestReferences(root, config.validation.traceability.testFileGlobs, config.validation.traceability.testFileExcludeGlobs);
27
- const scCoverage = buildScCoverage(scIds, scTestRefs);
28
- const toolVersion = await resolveToolVersion();
29
- return {
30
- toolVersion,
31
- issues,
32
- counts: countIssues(issues),
33
- traceability: {
34
- sc: scCoverage,
35
- testFiles,
36
- },
37
- };
38
- }
39
- function countIssues(issues) {
40
- return issues.reduce((acc, issue) => {
41
- acc[issue.severity] += 1;
42
- return acc;
43
- }, { info: 0, warning: 0, error: 0 });
44
- }
45
- //# sourceMappingURL=validate.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/core/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAyB,MAAM,aAAa,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EACL,eAAe,EACf,6BAA6B,EAC7B,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,IAAY,EACZ,YAA+B;IAE/B,MAAM,QAAQ,GAAG,YAAY,IAAI,CAAC,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1D,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,QAAQ,CAAC;IAClD,MAAM,MAAM,GAAG;QACb,GAAG,YAAY;QACf,GAAG,CAAC,MAAM,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACtC,GAAG,CAAC,MAAM,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACvC,GAAG,CAAC,MAAM,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1C,GAAG,CAAC,MAAM,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1C,GAAG,CAAC,MAAM,kBAAkB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC3C,GAAG,CAAC,MAAM,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;KAC9C,CAAC;IAEF,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IACxD,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAC5D,MAAM,KAAK,GAAG,MAAM,6BAA6B,CAAC,aAAa,CAAC,CAAC;IACjE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,MAAM,uBAAuB,CACzE,IAAI,EACJ,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,aAAa,EAC5C,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,oBAAoB,CACpD,CAAC;IACF,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAEtD,MAAM,WAAW,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAC/C,OAAO;QACL,WAAW;QACX,MAAM;QACN,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC;QAC3B,YAAY,EAAE;YACZ,EAAE,EAAE,UAAU;YACd,SAAS;SACV;KACF,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,MAAe;IAClC,OAAO,MAAM,CAAC,MAAM,CAClB,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;QACb,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACzB,OAAO,GAAG,CAAC;IACb,CAAC,EACD,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAClC,CAAC;AACJ,CAAC"}
@@ -1,5 +0,0 @@
1
- import type { QfaiConfig } from "../config.js";
2
- import type { Issue } from "../types.js";
3
- export declare function validateContracts(root: string, config: QfaiConfig): Promise<Issue[]>;
4
- export declare function lintSql(text: string, file: string): Issue[];
5
- //# sourceMappingURL=contracts.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../../src/core/validators/contracts.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAc/C,OAAO,KAAK,EAAE,KAAK,EAAiB,MAAM,aAAa,CAAC;AAYxD,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,KAAK,EAAE,CAAC,CAWlB;AAkLD,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,KAAK,EAAE,CAgB3D"}