@facet-coverage/core 0.2.0 → 0.4.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 +64 -523
- 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 +496 -16
- 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 +54 -2
- package/dist/core/FacetParser.d.ts.map +1 -1
- package/dist/core/FacetParser.js +151 -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 +11 -0
- package/dist/core/TestScanner.d.ts.map +1 -1
- package/dist/core/TestScanner.js +76 -6
- package/dist/core/TestScanner.js.map +1 -1
- package/dist/core/Validator.d.ts +4 -0
- package/dist/core/Validator.d.ts.map +1 -1
- package/dist/core/Validator.js +22 -4
- package/dist/core/Validator.js.map +1 -1
- package/dist/types.d.ts +32 -2
- 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,17 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.validateCommand = validateCommand;
|
|
4
|
-
const fs_1 = require("fs");
|
|
5
|
-
const path_1 = require("path");
|
|
6
4
|
const Validator_js_1 = require("../../core/Validator.js");
|
|
7
|
-
const
|
|
5
|
+
const config_js_1 = require("../utils/config.js");
|
|
8
6
|
/**
|
|
9
7
|
* Validate facet structure and test links
|
|
10
8
|
*/
|
|
11
9
|
async function validateCommand(options = {}) {
|
|
12
10
|
const cwd = process.cwd();
|
|
13
11
|
// Load config
|
|
14
|
-
const config = await loadConfig(options.config, cwd);
|
|
12
|
+
const config = await (0, config_js_1.loadConfig)(options.config, cwd);
|
|
15
13
|
// Enable strict mode if requested
|
|
16
14
|
if (options.strict) {
|
|
17
15
|
config.validation.requireAllTestsLinked = true;
|
|
@@ -30,36 +28,6 @@ async function validateCommand(options = {}) {
|
|
|
30
28
|
process.exit(1);
|
|
31
29
|
}
|
|
32
30
|
}
|
|
33
|
-
/**
|
|
34
|
-
* Load configuration from file or use defaults
|
|
35
|
-
*/
|
|
36
|
-
async function loadConfig(configPath, cwd) {
|
|
37
|
-
const configFiles = [
|
|
38
|
-
configPath,
|
|
39
|
-
'facet.config.js',
|
|
40
|
-
'facet.config.mjs',
|
|
41
|
-
'facet.config.json',
|
|
42
|
-
].filter(Boolean);
|
|
43
|
-
for (const file of configFiles) {
|
|
44
|
-
const fullPath = (0, path_1.resolve)(cwd, file);
|
|
45
|
-
if ((0, fs_1.existsSync)(fullPath)) {
|
|
46
|
-
if (file.endsWith('.json')) {
|
|
47
|
-
const content = (0, fs_1.readFileSync)(fullPath, 'utf-8');
|
|
48
|
-
return { ...types_js_1.defaultConfig, ...JSON.parse(content) };
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
try {
|
|
52
|
-
const imported = await import(fullPath);
|
|
53
|
-
return { ...types_js_1.defaultConfig, ...(imported.default || imported) };
|
|
54
|
-
}
|
|
55
|
-
catch (error) {
|
|
56
|
-
console.warn(`Warning: Could not load config from ${file}`);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
return types_js_1.defaultConfig;
|
|
62
|
-
}
|
|
63
31
|
/**
|
|
64
32
|
* Print validation results
|
|
65
33
|
*/
|
|
@@ -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":";;AAaA,0CA0BC;AAvCD,0DAAoD;AAEpD,kDAAgD;AAQhD;;GAEG;AACI,KAAK,UAAU,eAAe,CAAC,UAA2B,EAAE;IACjE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,cAAc;IACd,MAAM,MAAM,GAAG,MAAM,IAAA,sBAAU,EAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAErD,kCAAkC;IAClC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,CAAC,UAAU,CAAC,qBAAqB,GAAG,IAAI,CAAC;IACjD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;IAEjD,MAAM,SAAS,GAAG,IAAI,wBAAS,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAE7C,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,4CAA4C;IAC5C,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,MAAwB;IACrD,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QACvD,OAAO;IACT,CAAC;IAED,eAAe;IACf,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,MAAM,CAAC,MAAM,MAAM,CAAC,CAAC;QAErD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACvD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAEzD,OAAO,CAAC,GAAG,CAAC,KAAK,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,GAAG,QAAQ,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC;QAC1F,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,iBAAiB;IACjB,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,QAAQ,CAAC,MAAM,MAAM,CAAC,CAAC;QAE3D,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3D,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAE7D,OAAO,CAAC,GAAG,CAAC,SAAS,OAAO,CAAC,OAAO,GAAG,QAAQ,GAAG,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC;QACpE,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,UAAU;IACV,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IACpD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;IACnE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,IAAY;IAChC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,gBAAgB;YACnB,OAAO,IAAI,CAAC;QACd,KAAK,iBAAiB;YACpB,OAAO,IAAI,CAAC;QACd,KAAK,kBAAkB;YACrB,OAAO,KAAK,CAAC;QACf,KAAK,aAAa;YAChB,OAAO,IAAI,CAAC;QACd,KAAK,cAAc;YACjB,OAAO,IAAI,CAAC;QACd;YACE,OAAO,GAAG,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { MarkdownSection, ParsedMarkdown } from '../types.js';
|
|
1
|
+
import type { MarkdownSection, ParsedMarkdown, SubFacetMarker } from '../types.js';
|
|
2
2
|
/**
|
|
3
3
|
* Parses markdown files and extracts sections
|
|
4
4
|
*/
|
|
@@ -7,6 +7,18 @@ export declare class FacetParser {
|
|
|
7
7
|
* Convert a title to a URL-friendly slug
|
|
8
8
|
*/
|
|
9
9
|
static slugify(title: string): string;
|
|
10
|
+
/**
|
|
11
|
+
* Parse sub-facet markers from content lines.
|
|
12
|
+
* Supports three patterns:
|
|
13
|
+
* 1. List item IDs: `1. **Item** {#sub-id} - description` or `- Item {#sub-id}`
|
|
14
|
+
* 2. Comment markers: `<!-- @facet:sub-id -->`
|
|
15
|
+
* 3. Empty link anchors: `[](#sub-id)` - renders invisibly in markdown
|
|
16
|
+
*
|
|
17
|
+
* @param lines - Array of content lines
|
|
18
|
+
* @param startLineNumber - The 1-indexed line number of the first line in the array
|
|
19
|
+
* @returns Array of SubFacetMarker objects
|
|
20
|
+
*/
|
|
21
|
+
static parseSubFacets(lines: string[], startLineNumber: number): SubFacetMarker[];
|
|
10
22
|
/**
|
|
11
23
|
* Parse a markdown file and extract all sections
|
|
12
24
|
*/
|
|
@@ -28,12 +40,52 @@ export declare class FacetParser {
|
|
|
28
40
|
*/
|
|
29
41
|
getSectionSlugs(filePath: string): string[];
|
|
30
42
|
/**
|
|
31
|
-
*
|
|
43
|
+
* Check if a file uses the .facet.md naming convention
|
|
44
|
+
*/
|
|
45
|
+
static isFacetMdFile(filePath: string): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Extract the filename without extension as a prefix.
|
|
48
|
+
* Handles both naming conventions:
|
|
49
|
+
* - business.facet.md -> "business"
|
|
50
|
+
* - business.md -> "business"
|
|
32
51
|
*/
|
|
33
52
|
static getFilePrefix(filePath: string): string;
|
|
34
53
|
/**
|
|
35
54
|
* Generate facet ID from file and section
|
|
36
55
|
*/
|
|
37
56
|
static generateFacetId(filePath: string, sectionSlug: string): string;
|
|
57
|
+
/**
|
|
58
|
+
* Generate hierarchical facet ID that includes the path from root.
|
|
59
|
+
* Used for nested feature structures.
|
|
60
|
+
*
|
|
61
|
+
* @param rootDir - The root features directory
|
|
62
|
+
* @param facetFile - The facet markdown file path
|
|
63
|
+
* @param sectionSlug - The section slug
|
|
64
|
+
* @returns ID like "checkout/payments/pci:section-slug" or "business:section-slug"
|
|
65
|
+
*/
|
|
66
|
+
static generateHierarchicalFacetId(rootDir: string, facetFile: string, sectionSlug: string): string;
|
|
67
|
+
/**
|
|
68
|
+
* Generate a sub-facet ID from a parent facet ID and sub-facet marker ID.
|
|
69
|
+
* Creates hierarchical ID like "type:parent/child"
|
|
70
|
+
*
|
|
71
|
+
* @param parentFacetId - The parent facet ID (e.g., "compliance:pci-dss")
|
|
72
|
+
* @param subFacetId - The local sub-facet ID from marker (e.g., "tls")
|
|
73
|
+
* @returns Combined ID like "compliance:pci-dss/tls"
|
|
74
|
+
*/
|
|
75
|
+
static generateSubFacetId(parentFacetId: string, subFacetId: string): string;
|
|
76
|
+
/**
|
|
77
|
+
* Check if a facet ID is a sub-facet (contains "/" after the ":")
|
|
78
|
+
*
|
|
79
|
+
* @param facetId - The facet ID to check
|
|
80
|
+
* @returns true if this is a sub-facet ID
|
|
81
|
+
*/
|
|
82
|
+
static isSubFacetId(facetId: string): boolean;
|
|
83
|
+
/**
|
|
84
|
+
* Extract parent facet ID from a sub-facet ID
|
|
85
|
+
*
|
|
86
|
+
* @param subFacetId - The sub-facet ID (e.g., "compliance:pci-dss/tls")
|
|
87
|
+
* @returns The parent ID (e.g., "compliance:pci-dss") or null if not a sub-facet
|
|
88
|
+
*/
|
|
89
|
+
static getParentFacetId(subFacetId: string): string | null;
|
|
38
90
|
}
|
|
39
91
|
//# 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,cAAc,EAAE,MAAM,aAAa,CAAC;AAEnF;;GAEG;AACH,qBAAa,WAAW;IACtB;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAUrC;;;;;;;;;;OAUG;IACH,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,eAAe,EAAE,MAAM,GAAG,cAAc,EAAE;IA+DjF;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc;IAS3C;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAW,GAAG,cAAc;IAyDpE;;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;IAqBT;;;;;;;OAOG;IACH,MAAM,CAAC,kBAAkB,CAAC,aAAa,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM;IAI5E;;;;;OAKG;IACH,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAM7C;;;;;OAKG;IACH,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;CAS3D"}
|
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
|
*/
|
|
@@ -18,6 +19,70 @@ class FacetParser {
|
|
|
18
19
|
.replace(/-+/g, '-') // Replace multiple hyphens with single
|
|
19
20
|
.replace(/^-|-$/g, ''); // Remove leading/trailing hyphens
|
|
20
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* Parse sub-facet markers from content lines.
|
|
24
|
+
* Supports three patterns:
|
|
25
|
+
* 1. List item IDs: `1. **Item** {#sub-id} - description` or `- Item {#sub-id}`
|
|
26
|
+
* 2. Comment markers: `<!-- @facet:sub-id -->`
|
|
27
|
+
* 3. Empty link anchors: `[](#sub-id)` - renders invisibly in markdown
|
|
28
|
+
*
|
|
29
|
+
* @param lines - Array of content lines
|
|
30
|
+
* @param startLineNumber - The 1-indexed line number of the first line in the array
|
|
31
|
+
* @returns Array of SubFacetMarker objects
|
|
32
|
+
*/
|
|
33
|
+
static parseSubFacets(lines, startLineNumber) {
|
|
34
|
+
const subFacets = [];
|
|
35
|
+
// Pattern for list item with {#id}: matches "1. **text** {#id} - rest", "- text {#id}", "* text {#id}"
|
|
36
|
+
// The {#id} can appear anywhere in the list item, followed by optional content
|
|
37
|
+
// Captures: list marker, text before {#id}, the ID, and optional rest
|
|
38
|
+
const listItemPattern = /^(\s*(?:[-*]|\d+\.)\s+)(.+?)\s*\{#([a-z0-9-]+)\}(.*)$/;
|
|
39
|
+
// Pattern for comment markers: <!-- @facet:id --> or <!-- @facet: id -->
|
|
40
|
+
const commentPattern = /<!--\s*@facet:\s*([a-z0-9-]+)\s*-->/g;
|
|
41
|
+
// Pattern for empty link anchors: [](#id) or []( #id ) with optional whitespace
|
|
42
|
+
const emptyLinkPattern = /\[\]\(\s*#([a-z0-9-]+)\s*\)/g;
|
|
43
|
+
for (let i = 0; i < lines.length; i++) {
|
|
44
|
+
const line = lines[i];
|
|
45
|
+
const lineNumber = startLineNumber + i;
|
|
46
|
+
// Check for list item with {#id}
|
|
47
|
+
const listMatch = line.match(listItemPattern);
|
|
48
|
+
if (listMatch) {
|
|
49
|
+
// Extract title: the text before {#id}
|
|
50
|
+
let title = listMatch[2].trim();
|
|
51
|
+
// Remove markdown bold: **text** -> text
|
|
52
|
+
title = title.replace(/\*\*([^*]+)\*\*/g, '$1');
|
|
53
|
+
// Clean up any trailing punctuation
|
|
54
|
+
title = title.replace(/[:\s-]+$/, '').trim();
|
|
55
|
+
subFacets.push({
|
|
56
|
+
id: listMatch[3],
|
|
57
|
+
title: title,
|
|
58
|
+
line: lineNumber,
|
|
59
|
+
type: 'list-item',
|
|
60
|
+
});
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
// Check for comment markers (can have multiple per line)
|
|
64
|
+
let commentMatch;
|
|
65
|
+
while ((commentMatch = commentPattern.exec(line)) !== null) {
|
|
66
|
+
subFacets.push({
|
|
67
|
+
id: commentMatch[1],
|
|
68
|
+
line: lineNumber,
|
|
69
|
+
type: 'comment',
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
commentPattern.lastIndex = 0;
|
|
73
|
+
// Check for empty link anchors (can have multiple per line)
|
|
74
|
+
let linkMatch;
|
|
75
|
+
while ((linkMatch = emptyLinkPattern.exec(line)) !== null) {
|
|
76
|
+
subFacets.push({
|
|
77
|
+
id: linkMatch[1],
|
|
78
|
+
line: lineNumber,
|
|
79
|
+
type: 'link',
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
emptyLinkPattern.lastIndex = 0;
|
|
83
|
+
}
|
|
84
|
+
return subFacets;
|
|
85
|
+
}
|
|
21
86
|
/**
|
|
22
87
|
* Parse a markdown file and extract all sections
|
|
23
88
|
*/
|
|
@@ -35,14 +100,17 @@ class FacetParser {
|
|
|
35
100
|
const lines = content.split('\n');
|
|
36
101
|
const sections = [];
|
|
37
102
|
// First pass: find all headings
|
|
103
|
+
// Supports explicit anchor syntax: ## Heading {#custom-id}
|
|
38
104
|
const headings = [];
|
|
39
105
|
for (let i = 0; i < lines.length; i++) {
|
|
40
106
|
const line = lines[i];
|
|
41
|
-
|
|
107
|
+
// Match heading with optional {#anchor-id} at the end
|
|
108
|
+
const match = line.match(/^(#{1,6})\s+(.+?)(?:\s*\{#([a-z0-9-]+)\})?\s*$/);
|
|
42
109
|
if (match) {
|
|
43
110
|
headings.push({
|
|
44
111
|
level: match[1].length,
|
|
45
112
|
title: match[2].trim(),
|
|
113
|
+
explicitId: match[3] || undefined,
|
|
46
114
|
line: i + 1, // 1-indexed
|
|
47
115
|
});
|
|
48
116
|
}
|
|
@@ -56,13 +124,18 @@ class FacetParser {
|
|
|
56
124
|
// Extract content between headings
|
|
57
125
|
const contentLines = lines.slice(startLine, endLine - 1);
|
|
58
126
|
const sectionContent = contentLines.join('\n').trim();
|
|
127
|
+
// Parse sub-facets from section content
|
|
128
|
+
// Content starts at line after heading (startLine is the heading itself)
|
|
129
|
+
const subFacets = FacetParser.parseSubFacets(contentLines, startLine + 1);
|
|
59
130
|
sections.push({
|
|
60
131
|
title: heading.title,
|
|
61
|
-
slug: FacetParser.slugify(heading.title),
|
|
132
|
+
slug: heading.explicitId || FacetParser.slugify(heading.title),
|
|
62
133
|
level: heading.level,
|
|
63
134
|
startLine,
|
|
64
135
|
endLine,
|
|
65
136
|
content: sectionContent,
|
|
137
|
+
explicitId: heading.explicitId,
|
|
138
|
+
subFacets: subFacets.length > 0 ? subFacets : undefined,
|
|
66
139
|
});
|
|
67
140
|
}
|
|
68
141
|
return {
|
|
@@ -96,10 +169,22 @@ class FacetParser {
|
|
|
96
169
|
return parsed.sections.map(s => s.slug);
|
|
97
170
|
}
|
|
98
171
|
/**
|
|
99
|
-
*
|
|
172
|
+
* Check if a file uses the .facet.md naming convention
|
|
173
|
+
*/
|
|
174
|
+
static isFacetMdFile(filePath) {
|
|
175
|
+
return filePath.toLowerCase().endsWith('.facet.md');
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Extract the filename without extension as a prefix.
|
|
179
|
+
* Handles both naming conventions:
|
|
180
|
+
* - business.facet.md -> "business"
|
|
181
|
+
* - business.md -> "business"
|
|
100
182
|
*/
|
|
101
183
|
static getFilePrefix(filePath) {
|
|
102
184
|
const basename = filePath.split('/').pop() || '';
|
|
185
|
+
if (FacetParser.isFacetMdFile(filePath)) {
|
|
186
|
+
return basename.replace(/\.facet\.md$/i, '').toLowerCase();
|
|
187
|
+
}
|
|
103
188
|
return basename.replace(/\.md$/i, '').toLowerCase();
|
|
104
189
|
}
|
|
105
190
|
/**
|
|
@@ -109,6 +194,69 @@ class FacetParser {
|
|
|
109
194
|
const prefix = FacetParser.getFilePrefix(filePath);
|
|
110
195
|
return `${prefix}:${sectionSlug}`;
|
|
111
196
|
}
|
|
197
|
+
/**
|
|
198
|
+
* Generate hierarchical facet ID that includes the path from root.
|
|
199
|
+
* Used for nested feature structures.
|
|
200
|
+
*
|
|
201
|
+
* @param rootDir - The root features directory
|
|
202
|
+
* @param facetFile - The facet markdown file path
|
|
203
|
+
* @param sectionSlug - The section slug
|
|
204
|
+
* @returns ID like "checkout/payments/pci:section-slug" or "business:section-slug"
|
|
205
|
+
*/
|
|
206
|
+
static generateHierarchicalFacetId(rootDir, facetFile, sectionSlug) {
|
|
207
|
+
// Get the directory containing the facet file
|
|
208
|
+
const facetDir = (0, path_1.dirname)(facetFile);
|
|
209
|
+
// Calculate relative path from root
|
|
210
|
+
let relativePath = (0, path_1.relative)(rootDir, facetDir);
|
|
211
|
+
// Remove 'facets' directory from the path if present
|
|
212
|
+
relativePath = relativePath
|
|
213
|
+
.split('/')
|
|
214
|
+
.filter((p) => p !== 'facets' && p !== '.')
|
|
215
|
+
.join('/');
|
|
216
|
+
const prefix = FacetParser.getFilePrefix(facetFile);
|
|
217
|
+
if (relativePath) {
|
|
218
|
+
return `${relativePath}/${prefix}:${sectionSlug}`;
|
|
219
|
+
}
|
|
220
|
+
return `${prefix}:${sectionSlug}`;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Generate a sub-facet ID from a parent facet ID and sub-facet marker ID.
|
|
224
|
+
* Creates hierarchical ID like "type:parent/child"
|
|
225
|
+
*
|
|
226
|
+
* @param parentFacetId - The parent facet ID (e.g., "compliance:pci-dss")
|
|
227
|
+
* @param subFacetId - The local sub-facet ID from marker (e.g., "tls")
|
|
228
|
+
* @returns Combined ID like "compliance:pci-dss/tls"
|
|
229
|
+
*/
|
|
230
|
+
static generateSubFacetId(parentFacetId, subFacetId) {
|
|
231
|
+
return `${parentFacetId}/${subFacetId}`;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Check if a facet ID is a sub-facet (contains "/" after the ":")
|
|
235
|
+
*
|
|
236
|
+
* @param facetId - The facet ID to check
|
|
237
|
+
* @returns true if this is a sub-facet ID
|
|
238
|
+
*/
|
|
239
|
+
static isSubFacetId(facetId) {
|
|
240
|
+
const colonIndex = facetId.indexOf(':');
|
|
241
|
+
if (colonIndex === -1)
|
|
242
|
+
return false;
|
|
243
|
+
return facetId.indexOf('/', colonIndex) !== -1;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Extract parent facet ID from a sub-facet ID
|
|
247
|
+
*
|
|
248
|
+
* @param subFacetId - The sub-facet ID (e.g., "compliance:pci-dss/tls")
|
|
249
|
+
* @returns The parent ID (e.g., "compliance:pci-dss") or null if not a sub-facet
|
|
250
|
+
*/
|
|
251
|
+
static getParentFacetId(subFacetId) {
|
|
252
|
+
const colonIndex = subFacetId.indexOf(':');
|
|
253
|
+
if (colonIndex === -1)
|
|
254
|
+
return null;
|
|
255
|
+
const slashIndex = subFacetId.indexOf('/', colonIndex);
|
|
256
|
+
if (slashIndex === -1)
|
|
257
|
+
return null;
|
|
258
|
+
return subFacetId.substring(0, slashIndex);
|
|
259
|
+
}
|
|
112
260
|
}
|
|
113
261
|
exports.FacetParser = FacetParser;
|
|
114
262
|
//# 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":"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"}
|