@facet-coverage/core 0.2.0 → 0.3.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.
- package/README.md +57 -5
- package/dist/cli/commands/analyze.d.ts.map +1 -1
- package/dist/cli/commands/analyze.js +2 -35
- package/dist/cli/commands/analyze.js.map +1 -1
- package/dist/cli/commands/generate.d.ts +5 -2
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +291 -10
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/validate.d.ts.map +1 -1
- package/dist/cli/commands/validate.js +2 -34
- package/dist/cli/commands/validate.js.map +1 -1
- package/dist/cli/commands/watch.d.ts.map +1 -1
- package/dist/cli/commands/watch.js +2 -34
- package/dist/cli/commands/watch.js.map +1 -1
- package/dist/cli/index.js +6 -3
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/utils/config.d.ts +15 -0
- package/dist/cli/utils/config.d.ts.map +1 -0
- package/dist/cli/utils/config.js +88 -0
- package/dist/cli/utils/config.js.map +1 -0
- package/dist/core/FacetParser.d.ts +18 -1
- package/dist/core/FacetParser.d.ts.map +1 -1
- package/dist/core/FacetParser.js +45 -3
- package/dist/core/FacetParser.js.map +1 -1
- package/dist/core/IDChangeDetector.d.ts +50 -0
- package/dist/core/IDChangeDetector.d.ts.map +1 -0
- package/dist/core/IDChangeDetector.js +147 -0
- package/dist/core/IDChangeDetector.js.map +1 -0
- package/dist/core/TestScanner.d.ts +8 -0
- package/dist/core/TestScanner.d.ts.map +1 -1
- package/dist/core/TestScanner.js +47 -6
- package/dist/core/TestScanner.js.map +1 -1
- package/dist/types.d.ts +7 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/watch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/watch.ts"],"names":[],"mappings":"AASA,UAAU,YAAY;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqD5E"}
|
|
@@ -1,22 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.watchCommand = watchCommand;
|
|
4
|
-
const fs_1 = require("fs");
|
|
5
|
-
const path_1 = require("path");
|
|
6
4
|
const chokidar_1 = require("chokidar");
|
|
7
5
|
const CoverageCalculator_js_1 = require("../../core/CoverageCalculator.js");
|
|
8
6
|
const Validator_js_1 = require("../../core/Validator.js");
|
|
9
7
|
const JsonReporter_js_1 = require("../../reporters/JsonReporter.js");
|
|
10
8
|
const HtmlReporter_js_1 = require("../../reporters/HtmlReporter.js");
|
|
11
9
|
const MarkdownReporter_js_1 = require("../../reporters/MarkdownReporter.js");
|
|
12
|
-
const
|
|
10
|
+
const config_js_1 = require("../utils/config.js");
|
|
13
11
|
/**
|
|
14
12
|
* Watch for changes and re-run analysis
|
|
15
13
|
*/
|
|
16
14
|
async function watchCommand(options = {}) {
|
|
17
15
|
const cwd = process.cwd();
|
|
18
16
|
// Load config
|
|
19
|
-
const config = await loadConfig(options.config, cwd);
|
|
17
|
+
const config = await (0, config_js_1.loadConfig)(options.config, cwd);
|
|
20
18
|
console.log('💎 Facet Coverage Watch Mode\n');
|
|
21
19
|
console.log('Watching for changes...\n');
|
|
22
20
|
// Initial run
|
|
@@ -118,34 +116,4 @@ async function runAnalysis(config, cwd, validate = false) {
|
|
|
118
116
|
console.error('❌ Error during analysis:', error);
|
|
119
117
|
}
|
|
120
118
|
}
|
|
121
|
-
/**
|
|
122
|
-
* Load configuration from file or use defaults
|
|
123
|
-
*/
|
|
124
|
-
async function loadConfig(configPath, cwd) {
|
|
125
|
-
const configFiles = [
|
|
126
|
-
configPath,
|
|
127
|
-
'facet.config.js',
|
|
128
|
-
'facet.config.mjs',
|
|
129
|
-
'facet.config.json',
|
|
130
|
-
].filter(Boolean);
|
|
131
|
-
for (const file of configFiles) {
|
|
132
|
-
const fullPath = (0, path_1.resolve)(cwd, file);
|
|
133
|
-
if ((0, fs_1.existsSync)(fullPath)) {
|
|
134
|
-
if (file.endsWith('.json')) {
|
|
135
|
-
const content = (0, fs_1.readFileSync)(fullPath, 'utf-8');
|
|
136
|
-
return { ...types_js_1.defaultConfig, ...JSON.parse(content) };
|
|
137
|
-
}
|
|
138
|
-
else {
|
|
139
|
-
try {
|
|
140
|
-
const imported = await import(fullPath);
|
|
141
|
-
return { ...types_js_1.defaultConfig, ...(imported.default || imported) };
|
|
142
|
-
}
|
|
143
|
-
catch (error) {
|
|
144
|
-
console.warn(`Warning: Could not load config from ${file}`);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
return types_js_1.defaultConfig;
|
|
150
|
-
}
|
|
151
119
|
//# sourceMappingURL=watch.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../../src/cli/commands/watch.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../../src/cli/commands/watch.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.js
CHANGED
|
@@ -9,15 +9,18 @@ const program = new commander_1.Command();
|
|
|
9
9
|
program
|
|
10
10
|
.name('facet')
|
|
11
11
|
.description('💎 Test every facet of your features - natural specifications with rigorous coverage tracking')
|
|
12
|
-
.version('0.
|
|
12
|
+
.version('0.3.0');
|
|
13
13
|
// Generate command
|
|
14
14
|
program
|
|
15
|
-
.command('generate
|
|
15
|
+
.command('generate [dir]')
|
|
16
16
|
.description('Generate structure.json and TypeScript types from facet markdown files')
|
|
17
17
|
.option('-o, --output <path>', 'Output directory for structure.json and facets.ts')
|
|
18
18
|
.option('-t, --type <type>', 'Override facet type (default: derived from filename)')
|
|
19
|
+
.option('-c, --config <path>', 'Path to config file')
|
|
20
|
+
.option('--global', 'Generate global combined types at root .facet/')
|
|
19
21
|
.option('--no-types', 'Skip TypeScript types generation')
|
|
20
|
-
.
|
|
22
|
+
.option('-q, --quiet', 'Suppress ID change warnings')
|
|
23
|
+
.action((dir, options) => (0, generate_js_1.generateCommand)(dir, options));
|
|
21
24
|
// Analyze command
|
|
22
25
|
program
|
|
23
26
|
.command('analyze')
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;AAAA,yCAAoC;AACpC,wDAAyD;AACzD,sDAAuD;AACvD,wDAAyD;AACzD,kDAAmD;AAEnD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,+FAA+F,CAAC;KAC5G,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,mBAAmB;AACnB,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,wEAAwE,CAAC;KACrF,MAAM,CAAC,qBAAqB,EAAE,mDAAmD,CAAC;KAClF,MAAM,CAAC,mBAAmB,EAAE,sDAAsD,CAAC;KACnF,MAAM,CAAC,YAAY,EAAE,kCAAkC,CAAC;KACxD,MAAM,CAAC,6BAAe,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";;AAAA,yCAAoC;AACpC,wDAAyD;AACzD,sDAAuD;AACvD,wDAAyD;AACzD,kDAAmD;AAEnD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,+FAA+F,CAAC;KAC5G,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,mBAAmB;AACnB,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,wEAAwE,CAAC;KACrF,MAAM,CAAC,qBAAqB,EAAE,mDAAmD,CAAC;KAClF,MAAM,CAAC,mBAAmB,EAAE,sDAAsD,CAAC;KACnF,MAAM,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;KACpD,MAAM,CAAC,UAAU,EAAE,gDAAgD,CAAC;KACpE,MAAM,CAAC,YAAY,EAAE,kCAAkC,CAAC;KACxD,MAAM,CAAC,aAAa,EAAE,6BAA6B,CAAC;KACpD,MAAM,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,IAAA,6BAAe,EAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;AAE3D,kBAAkB;AAClB,OAAO;KACJ,OAAO,CAAC,SAAS,CAAC;KAClB,WAAW,CAAC,wBAAwB,CAAC;KACrC,MAAM,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;KACpD,MAAM,CAAC,uBAAuB,EAAE,sCAAsC,CAAC;KACvE,MAAM,CAAC,0BAA0B,EAAE,+BAA+B,CAAC;KACnE,MAAM,CAAC,QAAQ,EAAE,wBAAwB,CAAC;KAC1C,MAAM,CAAC,UAAU,EAAE,yBAAyB,CAAC;KAC7C,MAAM,CAAC,2BAAc,CAAC,CAAC;AAE1B,mBAAmB;AACnB,OAAO;KACJ,OAAO,CAAC,UAAU,CAAC;KACnB,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;KACpD,MAAM,CAAC,UAAU,EAAE,qDAAqD,CAAC;KACzE,MAAM,CAAC,QAAQ,EAAE,wBAAwB,CAAC;KAC1C,MAAM,CAAC,6BAAe,CAAC,CAAC;AAE3B,gBAAgB;AAChB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,uCAAuC,CAAC;KACpD,MAAM,CAAC,qBAAqB,EAAE,qBAAqB,CAAC;KACpD,MAAM,CAAC,gBAAgB,EAAE,gCAAgC,CAAC;KAC1D,MAAM,CAAC,uBAAY,CAAC,CAAC;AAExB,kBAAkB;AAClB,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { FacetConfig } from '../../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Load configuration from file or use defaults.
|
|
4
|
+
* Supports .js, .mjs, and .json config formats.
|
|
5
|
+
*
|
|
6
|
+
* @param configPath - Optional explicit path to config file
|
|
7
|
+
* @param cwd - Current working directory
|
|
8
|
+
* @returns Merged configuration with defaults
|
|
9
|
+
*/
|
|
10
|
+
export declare function loadConfig(configPath: string | undefined, cwd: string): Promise<FacetConfig>;
|
|
11
|
+
/**
|
|
12
|
+
* Get the resolved config file path if one exists.
|
|
13
|
+
*/
|
|
14
|
+
export declare function findConfigFile(cwd: string): string | null;
|
|
15
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAYlD;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAC9B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,WAAW,CAAC,CA0BtB;AA6BD;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQzD"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.loadConfig = loadConfig;
|
|
4
|
+
exports.findConfigFile = findConfigFile;
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const path_1 = require("path");
|
|
7
|
+
const types_js_1 = require("../../types.js");
|
|
8
|
+
/**
|
|
9
|
+
* Configuration file names to search for (in order of priority)
|
|
10
|
+
*/
|
|
11
|
+
const CONFIG_FILE_NAMES = [
|
|
12
|
+
'facet.config.js',
|
|
13
|
+
'facet.config.mjs',
|
|
14
|
+
'facet.config.json',
|
|
15
|
+
];
|
|
16
|
+
/**
|
|
17
|
+
* Load configuration from file or use defaults.
|
|
18
|
+
* Supports .js, .mjs, and .json config formats.
|
|
19
|
+
*
|
|
20
|
+
* @param configPath - Optional explicit path to config file
|
|
21
|
+
* @param cwd - Current working directory
|
|
22
|
+
* @returns Merged configuration with defaults
|
|
23
|
+
*/
|
|
24
|
+
async function loadConfig(configPath, cwd) {
|
|
25
|
+
const configFiles = [
|
|
26
|
+
configPath,
|
|
27
|
+
...CONFIG_FILE_NAMES,
|
|
28
|
+
].filter(Boolean);
|
|
29
|
+
for (const file of configFiles) {
|
|
30
|
+
const fullPath = (0, path_1.resolve)(cwd, file);
|
|
31
|
+
if ((0, fs_1.existsSync)(fullPath)) {
|
|
32
|
+
if (file.endsWith('.json')) {
|
|
33
|
+
const content = (0, fs_1.readFileSync)(fullPath, 'utf-8');
|
|
34
|
+
return mergeConfig(JSON.parse(content));
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
// Dynamic import for JS/MJS config
|
|
38
|
+
try {
|
|
39
|
+
const imported = await import(fullPath);
|
|
40
|
+
return mergeConfig(imported.default || imported);
|
|
41
|
+
}
|
|
42
|
+
catch (error) {
|
|
43
|
+
console.warn(`Warning: Could not load config from ${file}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return types_js_1.defaultConfig;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Deep merge user config with defaults.
|
|
52
|
+
* Ensures nested objects like validation, output, and thresholds are properly merged.
|
|
53
|
+
*/
|
|
54
|
+
function mergeConfig(userConfig) {
|
|
55
|
+
return {
|
|
56
|
+
...types_js_1.defaultConfig,
|
|
57
|
+
...userConfig,
|
|
58
|
+
validation: {
|
|
59
|
+
...types_js_1.defaultConfig.validation,
|
|
60
|
+
...userConfig.validation,
|
|
61
|
+
},
|
|
62
|
+
output: {
|
|
63
|
+
...types_js_1.defaultConfig.output,
|
|
64
|
+
...userConfig.output,
|
|
65
|
+
},
|
|
66
|
+
thresholds: {
|
|
67
|
+
...types_js_1.defaultConfig.thresholds,
|
|
68
|
+
...userConfig.thresholds,
|
|
69
|
+
byType: {
|
|
70
|
+
...types_js_1.defaultConfig.thresholds.byType,
|
|
71
|
+
...userConfig.thresholds?.byType,
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Get the resolved config file path if one exists.
|
|
78
|
+
*/
|
|
79
|
+
function findConfigFile(cwd) {
|
|
80
|
+
for (const file of CONFIG_FILE_NAMES) {
|
|
81
|
+
const fullPath = (0, path_1.resolve)(cwd, file);
|
|
82
|
+
if ((0, fs_1.existsSync)(fullPath)) {
|
|
83
|
+
return fullPath;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/cli/utils/config.ts"],"names":[],"mappings":";;AAsBA,gCA6BC;AAgCD,wCAQC;AA3FD,2BAA8C;AAC9C,+BAA+B;AAE/B,6CAA+C;AAE/C;;GAEG;AACH,MAAM,iBAAiB,GAAG;IACxB,iBAAiB;IACjB,kBAAkB;IAClB,mBAAmB;CACpB,CAAC;AAEF;;;;;;;GAOG;AACI,KAAK,UAAU,UAAU,CAC9B,UAA8B,EAC9B,GAAW;IAEX,MAAM,WAAW,GAAG;QAClB,UAAU;QACV,GAAG,iBAAiB;KACrB,CAAC,MAAM,CAAC,OAAO,CAAa,CAAC;IAE9B,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,IAAA,cAAO,EAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAEpC,IAAI,IAAA,eAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,MAAM,OAAO,GAAG,IAAA,iBAAY,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAChD,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;YAC1C,CAAC;iBAAM,CAAC;gBACN,mCAAmC;gBACnC,IAAI,CAAC;oBACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;oBACxC,OAAO,WAAW,CAAC,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,CAAC;gBACnD,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,IAAI,CAAC,uCAAuC,IAAI,EAAE,CAAC,CAAC;gBAC9D,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,wBAAa,CAAC;AACvB,CAAC;AAED;;;GAGG;AACH,SAAS,WAAW,CAAC,UAAgC;IACnD,OAAO;QACL,GAAG,wBAAa;QAChB,GAAG,UAAU;QACb,UAAU,EAAE;YACV,GAAG,wBAAa,CAAC,UAAU;YAC3B,GAAG,UAAU,CAAC,UAAU;SACzB;QACD,MAAM,EAAE;YACN,GAAG,wBAAa,CAAC,MAAM;YACvB,GAAG,UAAU,CAAC,MAAM;SACrB;QACD,UAAU,EAAE;YACV,GAAG,wBAAa,CAAC,UAAU;YAC3B,GAAG,UAAU,CAAC,UAAU;YACxB,MAAM,EAAE;gBACN,GAAG,wBAAa,CAAC,UAAU,CAAC,MAAM;gBAClC,GAAG,UAAU,CAAC,UAAU,EAAE,MAAM;aACjC;SACF;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,GAAW;IACxC,KAAK,MAAM,IAAI,IAAI,iBAAiB,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAA,cAAO,EAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACpC,IAAI,IAAA,eAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,OAAO,QAAQ,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -28,12 +28,29 @@ export declare class FacetParser {
|
|
|
28
28
|
*/
|
|
29
29
|
getSectionSlugs(filePath: string): string[];
|
|
30
30
|
/**
|
|
31
|
-
*
|
|
31
|
+
* Check if a file uses the .facet.md naming convention
|
|
32
|
+
*/
|
|
33
|
+
static isFacetMdFile(filePath: string): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Extract the filename without extension as a prefix.
|
|
36
|
+
* Handles both naming conventions:
|
|
37
|
+
* - business.facet.md -> "business"
|
|
38
|
+
* - business.md -> "business"
|
|
32
39
|
*/
|
|
33
40
|
static getFilePrefix(filePath: string): string;
|
|
34
41
|
/**
|
|
35
42
|
* Generate facet ID from file and section
|
|
36
43
|
*/
|
|
37
44
|
static generateFacetId(filePath: string, sectionSlug: string): string;
|
|
45
|
+
/**
|
|
46
|
+
* Generate hierarchical facet ID that includes the path from root.
|
|
47
|
+
* Used for nested feature structures.
|
|
48
|
+
*
|
|
49
|
+
* @param rootDir - The root features directory
|
|
50
|
+
* @param facetFile - The facet markdown file path
|
|
51
|
+
* @param sectionSlug - The section slug
|
|
52
|
+
* @returns ID like "checkout/payments/pci:section-slug" or "business:section-slug"
|
|
53
|
+
*/
|
|
54
|
+
static generateHierarchicalFacetId(rootDir: string, facetFile: string, sectionSlug: string): string;
|
|
38
55
|
}
|
|
39
56
|
//# sourceMappingURL=FacetParser.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FacetParser.d.ts","sourceRoot":"","sources":["../../src/core/FacetParser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FacetParser.d.ts","sourceRoot":"","sources":["../../src/core/FacetParser.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEnE;;GAEG;AACH,qBAAa,WAAW;IACtB;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAUrC;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc;IAS3C;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAW,GAAG,cAAc;IAoDpE;;OAEG;IACH,WAAW,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAI9E;;OAEG;IACH,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO;IAS7D;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAK3C;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAI/C;;;;;OAKG;IACH,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAQ9C;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;IAKrE;;;;;;;;OAQG;IACH,MAAM,CAAC,2BAA2B,CAChC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,MAAM;CAoBV"}
|
package/dist/core/FacetParser.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.FacetParser = void 0;
|
|
4
4
|
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
5
6
|
/**
|
|
6
7
|
* Parses markdown files and extracts sections
|
|
7
8
|
*/
|
|
@@ -35,14 +36,17 @@ class FacetParser {
|
|
|
35
36
|
const lines = content.split('\n');
|
|
36
37
|
const sections = [];
|
|
37
38
|
// First pass: find all headings
|
|
39
|
+
// Supports explicit anchor syntax: ## Heading {#custom-id}
|
|
38
40
|
const headings = [];
|
|
39
41
|
for (let i = 0; i < lines.length; i++) {
|
|
40
42
|
const line = lines[i];
|
|
41
|
-
|
|
43
|
+
// Match heading with optional {#anchor-id} at the end
|
|
44
|
+
const match = line.match(/^(#{1,6})\s+(.+?)(?:\s*\{#([a-z0-9-]+)\})?\s*$/);
|
|
42
45
|
if (match) {
|
|
43
46
|
headings.push({
|
|
44
47
|
level: match[1].length,
|
|
45
48
|
title: match[2].trim(),
|
|
49
|
+
explicitId: match[3] || undefined,
|
|
46
50
|
line: i + 1, // 1-indexed
|
|
47
51
|
});
|
|
48
52
|
}
|
|
@@ -58,11 +62,12 @@ class FacetParser {
|
|
|
58
62
|
const sectionContent = contentLines.join('\n').trim();
|
|
59
63
|
sections.push({
|
|
60
64
|
title: heading.title,
|
|
61
|
-
slug: FacetParser.slugify(heading.title),
|
|
65
|
+
slug: heading.explicitId || FacetParser.slugify(heading.title),
|
|
62
66
|
level: heading.level,
|
|
63
67
|
startLine,
|
|
64
68
|
endLine,
|
|
65
69
|
content: sectionContent,
|
|
70
|
+
explicitId: heading.explicitId,
|
|
66
71
|
});
|
|
67
72
|
}
|
|
68
73
|
return {
|
|
@@ -96,10 +101,22 @@ class FacetParser {
|
|
|
96
101
|
return parsed.sections.map(s => s.slug);
|
|
97
102
|
}
|
|
98
103
|
/**
|
|
99
|
-
*
|
|
104
|
+
* Check if a file uses the .facet.md naming convention
|
|
105
|
+
*/
|
|
106
|
+
static isFacetMdFile(filePath) {
|
|
107
|
+
return filePath.toLowerCase().endsWith('.facet.md');
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Extract the filename without extension as a prefix.
|
|
111
|
+
* Handles both naming conventions:
|
|
112
|
+
* - business.facet.md -> "business"
|
|
113
|
+
* - business.md -> "business"
|
|
100
114
|
*/
|
|
101
115
|
static getFilePrefix(filePath) {
|
|
102
116
|
const basename = filePath.split('/').pop() || '';
|
|
117
|
+
if (FacetParser.isFacetMdFile(filePath)) {
|
|
118
|
+
return basename.replace(/\.facet\.md$/i, '').toLowerCase();
|
|
119
|
+
}
|
|
103
120
|
return basename.replace(/\.md$/i, '').toLowerCase();
|
|
104
121
|
}
|
|
105
122
|
/**
|
|
@@ -109,6 +126,31 @@ class FacetParser {
|
|
|
109
126
|
const prefix = FacetParser.getFilePrefix(filePath);
|
|
110
127
|
return `${prefix}:${sectionSlug}`;
|
|
111
128
|
}
|
|
129
|
+
/**
|
|
130
|
+
* Generate hierarchical facet ID that includes the path from root.
|
|
131
|
+
* Used for nested feature structures.
|
|
132
|
+
*
|
|
133
|
+
* @param rootDir - The root features directory
|
|
134
|
+
* @param facetFile - The facet markdown file path
|
|
135
|
+
* @param sectionSlug - The section slug
|
|
136
|
+
* @returns ID like "checkout/payments/pci:section-slug" or "business:section-slug"
|
|
137
|
+
*/
|
|
138
|
+
static generateHierarchicalFacetId(rootDir, facetFile, sectionSlug) {
|
|
139
|
+
// Get the directory containing the facet file
|
|
140
|
+
const facetDir = (0, path_1.dirname)(facetFile);
|
|
141
|
+
// Calculate relative path from root
|
|
142
|
+
let relativePath = (0, path_1.relative)(rootDir, facetDir);
|
|
143
|
+
// Remove 'facets' directory from the path if present
|
|
144
|
+
relativePath = relativePath
|
|
145
|
+
.split('/')
|
|
146
|
+
.filter((p) => p !== 'facets' && p !== '.')
|
|
147
|
+
.join('/');
|
|
148
|
+
const prefix = FacetParser.getFilePrefix(facetFile);
|
|
149
|
+
if (relativePath) {
|
|
150
|
+
return `${relativePath}/${prefix}:${sectionSlug}`;
|
|
151
|
+
}
|
|
152
|
+
return `${prefix}:${sectionSlug}`;
|
|
153
|
+
}
|
|
112
154
|
}
|
|
113
155
|
exports.FacetParser = FacetParser;
|
|
114
156
|
//# sourceMappingURL=FacetParser.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FacetParser.js","sourceRoot":"","sources":["../../src/core/FacetParser.ts"],"names":[],"mappings":";;;AAAA,2BAA8C;
|
|
1
|
+
{"version":3,"file":"FacetParser.js","sourceRoot":"","sources":["../../src/core/FacetParser.ts"],"names":[],"mappings":";;;AAAA,2BAA8C;AAC9C,+BAAyC;AAGzC;;GAEG;AACH,MAAa,WAAW;IACtB;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,KAAa;QAC1B,OAAO,KAAK;aACT,WAAW,EAAE;aACb,IAAI,EAAE;aACN,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,4BAA4B;aACrD,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,8BAA8B;aACnD,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,uCAAuC;aAC3D,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,kCAAkC;IAC9D,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,QAAgB;QACxB,IAAI,CAAC,IAAA,eAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,EAAE,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,OAAO,GAAG,IAAA,iBAAY,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,OAAe,EAAE,WAAmB,EAAE;QACjD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAsB,EAAE,CAAC;QAEvC,gCAAgC;QAChC,2DAA2D;QAC3D,MAAM,QAAQ,GAA0E,EAAE,CAAC;QAE3F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,sDAAsD;YACtD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;YAE3E,IAAI,KAAK,EAAE,CAAC;gBACV,QAAQ,CAAC,IAAI,CAAC;oBACZ,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM;oBACtB,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;oBACtB,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS;oBACjC,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,YAAY;iBAC1B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,4CAA4C;QAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,WAAW,GAAG,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAEpC,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;YAC/B,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;YAElE,mCAAmC;YACnC,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC;YACzD,MAAM,cAAc,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;YAEtD,QAAQ,CAAC,IAAI,CAAC;gBACZ,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,IAAI,EAAE,OAAO,CAAC,UAAU,IAAI,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;gBAC9D,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,SAAS;gBACT,OAAO;gBACP,OAAO,EAAE,cAAc;gBACvB,UAAU,EAAE,OAAO,CAAC,UAAU;aAC/B,CAAC,CAAC;QACL,CAAC;QAED,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,QAAQ;SACT,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,MAAsB,EAAE,IAAY;QAC9C,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,QAAgB,EAAE,WAAmB;QACjD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACxC,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,KAAK,SAAS,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,QAAgB;QAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACxC,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,QAAgB;QACnC,OAAO,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACtD,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,aAAa,CAAC,QAAgB;QACnC,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QACjD,IAAI,WAAW,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,OAAO,QAAQ,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7D,CAAC;QACD,OAAO,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACtD,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,eAAe,CAAC,QAAgB,EAAE,WAAmB;QAC1D,MAAM,MAAM,GAAG,WAAW,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACnD,OAAO,GAAG,MAAM,IAAI,WAAW,EAAE,CAAC;IACpC,CAAC;IAED;;;;;;;;OAQG;IACH,MAAM,CAAC,2BAA2B,CAChC,OAAe,EACf,SAAiB,EACjB,WAAmB;QAEnB,8CAA8C;QAC9C,MAAM,QAAQ,GAAG,IAAA,cAAO,EAAC,SAAS,CAAC,CAAC;QAEpC,oCAAoC;QACpC,IAAI,YAAY,GAAG,IAAA,eAAQ,EAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAE/C,qDAAqD;QACrD,YAAY,GAAG,YAAY;aACxB,KAAK,CAAC,GAAG,CAAC;aACV,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,GAAG,CAAC;aAClD,IAAI,CAAC,GAAG,CAAC,CAAC;QAEb,MAAM,MAAM,GAAG,WAAW,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAEpD,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,GAAG,YAAY,IAAI,MAAM,IAAI,WAAW,EAAE,CAAC;QACpD,CAAC;QACD,OAAO,GAAG,MAAM,IAAI,WAAW,EAAE,CAAC;IACpC,CAAC;CACF;AA1KD,kCA0KC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { Facet, TestLink } from '../types.js';
|
|
2
|
+
import type { TestScanner } from './TestScanner.js';
|
|
3
|
+
/**
|
|
4
|
+
* Represents a single ID change
|
|
5
|
+
*/
|
|
6
|
+
export interface IDChange {
|
|
7
|
+
/** Type of change */
|
|
8
|
+
type: 'added' | 'removed' | 'renamed';
|
|
9
|
+
/** Old facet ID (for removed/renamed) */
|
|
10
|
+
oldId?: string;
|
|
11
|
+
/** New facet ID (for added/renamed) */
|
|
12
|
+
newId?: string;
|
|
13
|
+
/** Source file */
|
|
14
|
+
file: string;
|
|
15
|
+
/** Section slug */
|
|
16
|
+
section: string;
|
|
17
|
+
/** Facet title */
|
|
18
|
+
title: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Report of all ID changes detected
|
|
22
|
+
*/
|
|
23
|
+
export interface IDChangeReport {
|
|
24
|
+
/** Whether any changes were detected */
|
|
25
|
+
hasChanges: boolean;
|
|
26
|
+
/** Newly added facet IDs */
|
|
27
|
+
added: IDChange[];
|
|
28
|
+
/** Removed facet IDs */
|
|
29
|
+
removed: IDChange[];
|
|
30
|
+
/** Renamed facet IDs (heading changed but same source location) */
|
|
31
|
+
renamed: IDChange[];
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Detects changes in facet IDs between generate runs
|
|
35
|
+
*/
|
|
36
|
+
export declare class IDChangeDetector {
|
|
37
|
+
/**
|
|
38
|
+
* Compare new facets with existing structure.json and detect changes
|
|
39
|
+
*/
|
|
40
|
+
static detectChanges(existingPath: string, newFacets: Facet[]): IDChangeReport;
|
|
41
|
+
/**
|
|
42
|
+
* Find tests that reference changed/removed facet IDs
|
|
43
|
+
*/
|
|
44
|
+
static findAffectedTests(changes: IDChangeReport, scanner: TestScanner, cwd: string): Promise<Map<string, TestLink[]>>;
|
|
45
|
+
/**
|
|
46
|
+
* Format a change report for console output
|
|
47
|
+
*/
|
|
48
|
+
static formatReport(report: IDChangeReport): string[];
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=IDChangeDetector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IDChangeDetector.d.ts","sourceRoot":"","sources":["../../src/core/IDChangeDetector.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAkB,QAAQ,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,qBAAqB;IACrB,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IACtC,yCAAyC;IACzC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,wCAAwC;IACxC,UAAU,EAAE,OAAO,CAAC;IACpB,4BAA4B;IAC5B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,wBAAwB;IACxB,OAAO,EAAE,QAAQ,EAAE,CAAC;IACpB,mEAAmE;IACnE,OAAO,EAAE,QAAQ,EAAE,CAAC;CACrB;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAC3B;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,cAAc;IA8F9E;;OAEG;WACU,iBAAiB,CAC5B,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IAmBnC;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,EAAE;CAgCtD"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IDChangeDetector = void 0;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
/**
|
|
6
|
+
* Detects changes in facet IDs between generate runs
|
|
7
|
+
*/
|
|
8
|
+
class IDChangeDetector {
|
|
9
|
+
/**
|
|
10
|
+
* Compare new facets with existing structure.json and detect changes
|
|
11
|
+
*/
|
|
12
|
+
static detectChanges(existingPath, newFacets) {
|
|
13
|
+
const report = {
|
|
14
|
+
hasChanges: false,
|
|
15
|
+
added: [],
|
|
16
|
+
removed: [],
|
|
17
|
+
renamed: [],
|
|
18
|
+
};
|
|
19
|
+
// If no existing file, all facets are new (but don't report as changes for first-time generation)
|
|
20
|
+
if (!(0, fs_1.existsSync)(existingPath)) {
|
|
21
|
+
return report;
|
|
22
|
+
}
|
|
23
|
+
let existing;
|
|
24
|
+
try {
|
|
25
|
+
existing = JSON.parse((0, fs_1.readFileSync)(existingPath, 'utf-8'));
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// If we can't read/parse existing file, treat as first-time generation
|
|
29
|
+
return report;
|
|
30
|
+
}
|
|
31
|
+
// Build maps for comparison
|
|
32
|
+
// Key by ID for direct ID comparison
|
|
33
|
+
const existingById = new Map();
|
|
34
|
+
// Key by source location (file#section) to detect renames
|
|
35
|
+
const existingBySource = new Map();
|
|
36
|
+
for (const facet of existing.facets) {
|
|
37
|
+
existingById.set(facet.id, facet);
|
|
38
|
+
const sourceKey = `${facet.source.file}#${facet.source.section}`;
|
|
39
|
+
existingBySource.set(sourceKey, facet);
|
|
40
|
+
}
|
|
41
|
+
const newById = new Map();
|
|
42
|
+
const newBySource = new Map();
|
|
43
|
+
for (const facet of newFacets) {
|
|
44
|
+
newById.set(facet.id, facet);
|
|
45
|
+
const sourceKey = `${facet.source.file}#${facet.source.section}`;
|
|
46
|
+
newBySource.set(sourceKey, facet);
|
|
47
|
+
}
|
|
48
|
+
// Detect removed and renamed facets
|
|
49
|
+
for (const [id, facet] of existingById) {
|
|
50
|
+
if (!newById.has(id)) {
|
|
51
|
+
// ID no longer exists - check if it was renamed
|
|
52
|
+
const sourceKey = `${facet.source.file}#${facet.source.section}`;
|
|
53
|
+
const newFacet = newBySource.get(sourceKey);
|
|
54
|
+
if (newFacet && newFacet.id !== id) {
|
|
55
|
+
// Same source location but different ID = renamed (heading changed)
|
|
56
|
+
report.renamed.push({
|
|
57
|
+
type: 'renamed',
|
|
58
|
+
oldId: id,
|
|
59
|
+
newId: newFacet.id,
|
|
60
|
+
file: facet.source.file,
|
|
61
|
+
section: facet.source.section,
|
|
62
|
+
title: newFacet.title || '',
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
else if (!newFacet) {
|
|
66
|
+
// Source location also gone = removed
|
|
67
|
+
report.removed.push({
|
|
68
|
+
type: 'removed',
|
|
69
|
+
oldId: id,
|
|
70
|
+
file: facet.source.file,
|
|
71
|
+
section: facet.source.section,
|
|
72
|
+
title: facet.title || '',
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Detect added facets (excluding those that were renames)
|
|
78
|
+
const renamedNewIds = new Set(report.renamed.map(r => r.newId));
|
|
79
|
+
for (const [id, facet] of newById) {
|
|
80
|
+
if (!existingById.has(id) && !renamedNewIds.has(id)) {
|
|
81
|
+
report.added.push({
|
|
82
|
+
type: 'added',
|
|
83
|
+
newId: id,
|
|
84
|
+
file: facet.source.file,
|
|
85
|
+
section: facet.source.section,
|
|
86
|
+
title: facet.title || '',
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
report.hasChanges =
|
|
91
|
+
report.added.length > 0 ||
|
|
92
|
+
report.removed.length > 0 ||
|
|
93
|
+
report.renamed.length > 0;
|
|
94
|
+
return report;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Find tests that reference changed/removed facet IDs
|
|
98
|
+
*/
|
|
99
|
+
static async findAffectedTests(changes, scanner, cwd) {
|
|
100
|
+
const affected = new Map();
|
|
101
|
+
// Only check removed and renamed (old) IDs
|
|
102
|
+
const changedIds = [
|
|
103
|
+
...changes.removed.map(c => c.oldId),
|
|
104
|
+
...changes.renamed.map(c => c.oldId),
|
|
105
|
+
];
|
|
106
|
+
for (const id of changedIds) {
|
|
107
|
+
const tests = await scanner.getTestsForFacet(id, cwd);
|
|
108
|
+
if (tests.length > 0) {
|
|
109
|
+
affected.set(id, tests);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return affected;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Format a change report for console output
|
|
116
|
+
*/
|
|
117
|
+
static formatReport(report) {
|
|
118
|
+
const lines = [];
|
|
119
|
+
if (report.renamed.length > 0) {
|
|
120
|
+
lines.push('\n Renamed (tests may break):');
|
|
121
|
+
for (const change of report.renamed) {
|
|
122
|
+
lines.push(` ${change.oldId} → ${change.newId}`);
|
|
123
|
+
if (change.title) {
|
|
124
|
+
lines.push(` Title: "${change.title}"`);
|
|
125
|
+
}
|
|
126
|
+
// Extract the section part after the colon for the hint
|
|
127
|
+
const oldSection = change.oldId?.split(':')[1] || change.section;
|
|
128
|
+
lines.push(` 💡 To keep old ID: Add {#${oldSection}} to heading`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (report.removed.length > 0) {
|
|
132
|
+
lines.push('\n Removed:');
|
|
133
|
+
for (const change of report.removed) {
|
|
134
|
+
lines.push(` - ${change.oldId}`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (report.added.length > 0) {
|
|
138
|
+
lines.push('\n Added:');
|
|
139
|
+
for (const change of report.added) {
|
|
140
|
+
lines.push(` + ${change.newId}`);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return lines;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
exports.IDChangeDetector = IDChangeDetector;
|
|
147
|
+
//# sourceMappingURL=IDChangeDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IDChangeDetector.js","sourceRoot":"","sources":["../../src/core/IDChangeDetector.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,14 @@ import type { TestLink, FacetConfig } from '../types.js';
|
|
|
5
5
|
export declare class TestScanner {
|
|
6
6
|
private config;
|
|
7
7
|
constructor(config?: Partial<FacetConfig>);
|
|
8
|
+
/**
|
|
9
|
+
* Convert a Facets constant name to a facet ID.
|
|
10
|
+
* Handles hierarchical IDs like:
|
|
11
|
+
* - FEATURES_CORE_PRODUCT_STRUCTURE_READING -> features/core/product:structure-reading
|
|
12
|
+
* - FEATURES_CLI_DX_CLI_ERGONOMICS -> features/cli/dx:cli-ergonomics
|
|
13
|
+
* - PRODUCT_STRUCTURE_READING -> product:structure-reading (legacy)
|
|
14
|
+
*/
|
|
15
|
+
private convertConstantToFacetId;
|
|
8
16
|
/**
|
|
9
17
|
* Find all test files matching configured patterns
|
|
10
18
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TestScanner.d.ts","sourceRoot":"","sources":["../../src/core/TestScanner.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAGzD;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAc;gBAEhB,MAAM,GAAE,OAAO,CAAC,WAAW,CAAM;IAI7C;;OAEG;IACG,aAAa,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAwBnE;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAE,MAAsB,GAAG,QAAQ,EAAE;IASnE;;;;;;OAMG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAE,MAAsB,GAAG,QAAQ,EAAE;
|
|
1
|
+
{"version":3,"file":"TestScanner.d.ts","sourceRoot":"","sources":["../../src/core/TestScanner.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAGzD;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAc;gBAEhB,MAAM,GAAE,OAAO,CAAC,WAAW,CAAM;IAI7C;;;;;;OAMG;IACH,OAAO,CAAC,wBAAwB;IA8ChC;;OAEG;IACG,aAAa,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAwBnE;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAE,MAAsB,GAAG,QAAQ,EAAE;IASnE;;;;;;OAMG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,GAAE,MAAsB,GAAG,QAAQ,EAAE;IA0MvF;;OAEG;IACG,YAAY,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAgBpE;;OAEG;IACG,wBAAwB,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAajF;;OAEG;IACG,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;CAI1F"}
|