@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.
Files changed (37) hide show
  1. package/README.md +57 -5
  2. package/dist/cli/commands/analyze.d.ts.map +1 -1
  3. package/dist/cli/commands/analyze.js +2 -35
  4. package/dist/cli/commands/analyze.js.map +1 -1
  5. package/dist/cli/commands/generate.d.ts +5 -2
  6. package/dist/cli/commands/generate.d.ts.map +1 -1
  7. package/dist/cli/commands/generate.js +291 -10
  8. package/dist/cli/commands/generate.js.map +1 -1
  9. package/dist/cli/commands/validate.d.ts.map +1 -1
  10. package/dist/cli/commands/validate.js +2 -34
  11. package/dist/cli/commands/validate.js.map +1 -1
  12. package/dist/cli/commands/watch.d.ts.map +1 -1
  13. package/dist/cli/commands/watch.js +2 -34
  14. package/dist/cli/commands/watch.js.map +1 -1
  15. package/dist/cli/index.js +6 -3
  16. package/dist/cli/index.js.map +1 -1
  17. package/dist/cli/utils/config.d.ts +15 -0
  18. package/dist/cli/utils/config.d.ts.map +1 -0
  19. package/dist/cli/utils/config.js +88 -0
  20. package/dist/cli/utils/config.js.map +1 -0
  21. package/dist/core/FacetParser.d.ts +18 -1
  22. package/dist/core/FacetParser.d.ts.map +1 -1
  23. package/dist/core/FacetParser.js +45 -3
  24. package/dist/core/FacetParser.js.map +1 -1
  25. package/dist/core/IDChangeDetector.d.ts +50 -0
  26. package/dist/core/IDChangeDetector.d.ts.map +1 -0
  27. package/dist/core/IDChangeDetector.js +147 -0
  28. package/dist/core/IDChangeDetector.js.map +1 -0
  29. package/dist/core/TestScanner.d.ts +8 -0
  30. package/dist/core/TestScanner.d.ts.map +1 -1
  31. package/dist/core/TestScanner.js +47 -6
  32. package/dist/core/TestScanner.js.map +1 -1
  33. package/dist/types.d.ts +7 -1
  34. package/dist/types.d.ts.map +1 -1
  35. package/dist/types.js +2 -0
  36. package/dist/types.js.map +1 -1
  37. package/package.json +1 -1
package/README.md CHANGED
@@ -384,14 +384,24 @@ test('comprehensive test', {
384
384
 
385
385
  ## Configuration
386
386
 
387
- **facet.config.js:**
387
+ Facet Coverage supports multiple configuration file formats. The CLI looks for config files in this order:
388
+
389
+ 1. `facet.config.js` (ESM or CommonJS)
390
+ 2. `facet.config.mjs` (ESM only)
391
+ 3. `facet.config.json` (JSON)
392
+
393
+ ### Configuration Formats
394
+
395
+ **JavaScript (ESM):**
388
396
 
389
397
  ```javascript
398
+ // facet.config.js
390
399
  export default {
391
- // Where structure files live
392
- structureFiles: [
393
- 'features/**/.facet/structure.json'
394
- ],
400
+ // Glob pattern(s) for finding facet markdown files
401
+ facetPattern: ['features/**/*.facet.md', 'features/**/facets/*.md'],
402
+
403
+ // Where structure files are generated
404
+ structureFiles: ['features/**/.facet/structure.json'],
395
405
 
396
406
  // Where tests live
397
407
  testDir: './features/**/tests',
@@ -422,6 +432,48 @@ export default {
422
432
  };
423
433
  ```
424
434
 
435
+ **JSON:**
436
+
437
+ ```json
438
+ {
439
+ "facetPattern": ["features/**/*.facet.md", "features/**/facets/*.md"],
440
+ "structureFiles": ["features/**/.facet/structure.json"],
441
+ "testDir": "./features/**/tests",
442
+ "testPatterns": ["**/*.spec.ts", "**/*.test.ts"],
443
+ "validation": {
444
+ "requireSourceExists": true,
445
+ "requireSectionExists": true,
446
+ "requireAllTestsLinked": false
447
+ },
448
+ "output": {
449
+ "dir": ".facet-coverage",
450
+ "formats": ["json", "html", "markdown"]
451
+ },
452
+ "thresholds": {
453
+ "global": 75,
454
+ "byType": {
455
+ "compliance": 100
456
+ }
457
+ }
458
+ }
459
+ ```
460
+
461
+ ### Configuration Options
462
+
463
+ | Option | Type | Default | Description |
464
+ |--------|------|---------|-------------|
465
+ | `facetPattern` | `string \| string[]` | `['features/**/*.facet.md', 'features/**/facets/*.md']` | Glob pattern(s) for finding facet files |
466
+ | `structureFiles` | `string[]` | `['features/**/.facet/structure.json']` | Glob patterns for structure files |
467
+ | `testDir` | `string` | `'./features/**/tests'` | Test directory pattern |
468
+ | `testPatterns` | `string[]` | `['**/*.spec.ts', '**/*.test.ts']` | Test file patterns |
469
+ | `validation.requireSourceExists` | `boolean` | `true` | Check if source files exist |
470
+ | `validation.requireSectionExists` | `boolean` | `true` | Check if sections exist in files |
471
+ | `validation.requireAllTestsLinked` | `boolean` | `false` | Require every test links to a facet |
472
+ | `output.dir` | `string` | `'.facet-coverage'` | Output directory for reports |
473
+ | `output.formats` | `string[]` | `['json', 'html', 'markdown']` | Report formats to generate |
474
+ | `thresholds.global` | `number` | `75` | Overall coverage threshold % |
475
+ | `thresholds.byType` | `object` | `{}` | Per-type coverage thresholds |
476
+
425
477
  ---
426
478
 
427
479
  ## ID Patterns
@@ -1 +1 @@
1
- {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/analyze.ts"],"names":[],"mappings":"AASA,UAAU,cAAc;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwEhF"}
1
+ {"version":3,"file":"analyze.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/analyze.ts"],"names":[],"mappings":"AAOA,UAAU,cAAc;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwEhF"}
@@ -1,20 +1,18 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.analyzeCommand = analyzeCommand;
4
- const fs_1 = require("fs");
5
- const path_1 = require("path");
6
4
  const CoverageCalculator_js_1 = require("../../core/CoverageCalculator.js");
7
5
  const JsonReporter_js_1 = require("../../reporters/JsonReporter.js");
8
6
  const HtmlReporter_js_1 = require("../../reporters/HtmlReporter.js");
9
7
  const MarkdownReporter_js_1 = require("../../reporters/MarkdownReporter.js");
10
- const types_js_1 = require("../../types.js");
8
+ const config_js_1 = require("../utils/config.js");
11
9
  /**
12
10
  * Analyze facet coverage
13
11
  */
14
12
  async function analyzeCommand(options = {}) {
15
13
  const cwd = process.cwd();
16
14
  // Load config
17
- const config = await loadConfig(options.config, cwd);
15
+ const config = await (0, config_js_1.loadConfig)(options.config, cwd);
18
16
  // Override with CLI options
19
17
  if (options.threshold) {
20
18
  config.thresholds.global = parseInt(options.threshold, 10);
@@ -72,37 +70,6 @@ async function analyzeCommand(options = {}) {
72
70
  process.exit(1);
73
71
  }
74
72
  }
75
- /**
76
- * Load configuration from file or use defaults
77
- */
78
- async function loadConfig(configPath, cwd) {
79
- const configFiles = [
80
- configPath,
81
- 'facet.config.js',
82
- 'facet.config.mjs',
83
- 'facet.config.json',
84
- ].filter(Boolean);
85
- for (const file of configFiles) {
86
- const fullPath = (0, path_1.resolve)(cwd, file);
87
- if ((0, fs_1.existsSync)(fullPath)) {
88
- if (file.endsWith('.json')) {
89
- const content = (0, fs_1.readFileSync)(fullPath, 'utf-8');
90
- return { ...types_js_1.defaultConfig, ...JSON.parse(content) };
91
- }
92
- else {
93
- // Dynamic import for JS config
94
- try {
95
- const imported = await import(fullPath);
96
- return { ...types_js_1.defaultConfig, ...(imported.default || imported) };
97
- }
98
- catch (error) {
99
- console.warn(`Warning: Could not load config from ${file}`);
100
- }
101
- }
102
- }
103
- }
104
- return types_js_1.defaultConfig;
105
- }
106
73
  /**
107
74
  * Print coverage report to console
108
75
  */
@@ -1 +1 @@
1
- {"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../../src/cli/commands/analyze.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"analyze.js","sourceRoot":"","sources":["../../../src/cli/commands/analyze.ts"],"names":[],"mappings":"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"}
@@ -2,10 +2,13 @@ interface GenerateOptions {
2
2
  output?: string;
3
3
  type?: string;
4
4
  noTypes?: boolean;
5
+ config?: string;
6
+ global?: boolean;
7
+ quiet?: boolean;
5
8
  }
6
9
  /**
7
- * Generate structure.json from facet markdown files
10
+ * Generate structure.json and TypeScript types from facet markdown files
8
11
  */
9
- export declare function generateCommand(dir: string, options?: GenerateOptions): Promise<void>;
12
+ export declare function generateCommand(dir?: string, options?: GenerateOptions): Promise<void>;
10
13
  export {};
11
14
  //# sourceMappingURL=generate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"AAKA,UAAU,eAAe;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAiFD;;GAEG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiF/F"}
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"AASA,UAAU,eAAe;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAqfD;;GAEG;AACH,wBAAsB,eAAe,CACnC,GAAG,CAAC,EAAE,MAAM,EACZ,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAWf"}
@@ -3,15 +3,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.generateCommand = generateCommand;
4
4
  const fs_1 = require("fs");
5
5
  const path_1 = require("path");
6
+ const glob_1 = require("glob");
6
7
  const FacetParser_js_1 = require("../../core/FacetParser.js");
8
+ const IDChangeDetector_js_1 = require("../../core/IDChangeDetector.js");
9
+ const TestScanner_js_1 = require("../../core/TestScanner.js");
10
+ const config_js_1 = require("../utils/config.js");
7
11
  /**
8
12
  * Convert a facet ID to a valid TypeScript identifier
9
13
  * e.g., "business:guest-purchase-flow" -> "BUSINESS_GUEST_PURCHASE_FLOW"
14
+ * e.g., "checkout/payments/pci:card-storage" -> "CHECKOUT_PAYMENTS_PCI_CARD_STORAGE"
10
15
  */
11
16
  function toConstantName(facetId) {
12
17
  return facetId
13
18
  .toUpperCase()
14
- .replace(/[:-]/g, '_')
19
+ .replace(/[/:-]/g, '_')
15
20
  .replace(/[^A-Z0-9_]/g, '');
16
21
  }
17
22
  /**
@@ -79,9 +84,217 @@ ${facetIds.map(id => ` '${id}',`).join('\n')}
79
84
  `;
80
85
  }
81
86
  /**
82
- * Generate structure.json from facet markdown files
87
+ * Generate global types file that combines all features
83
88
  */
84
- async function generateCommand(dir, options = {}) {
89
+ function generateGlobalTypesFile(allFacets, featureImports) {
90
+ const facetIds = allFacets.map(f => f.id);
91
+ // Generate the union type
92
+ const unionType = facetIds.length > 0
93
+ ? facetIds.map(id => ` | '${id}'`).join('\n')
94
+ : " | never";
95
+ // Generate constants for each facet ID
96
+ const constants = allFacets.map(f => {
97
+ const constName = toConstantName(f.id);
98
+ const comment = f.title ? ` /** ${f.title} */` : '';
99
+ return `${comment}\n ${constName}: '${f.id}' as const,`;
100
+ }).join('\n');
101
+ // Generate re-exports for each feature
102
+ const reExports = Array.from(featureImports.entries())
103
+ .map(([feature, path]) => `export * as ${feature} from '${path}';`)
104
+ .join('\n');
105
+ return `/**
106
+ * Auto-generated Global Facet types
107
+ * Combines all features for single import point
108
+ *
109
+ * Generated by: bunx facet generate --global
110
+ * DO NOT EDIT THIS FILE MANUALLY
111
+ */
112
+
113
+ // Re-export all feature-specific types
114
+ ${reExports}
115
+
116
+ /**
117
+ * All valid facet IDs across ALL features
118
+ */
119
+ export type FacetId =
120
+ ${unionType};
121
+
122
+ /**
123
+ * Combined Facet ID constants from all features
124
+ */
125
+ export const Facets = {
126
+ ${constants}
127
+ } as const;
128
+
129
+ /**
130
+ * Type-safe facet annotation helper (global version)
131
+ */
132
+ export function facet<T extends FacetId>(...facetIds: T[]): { facets: T[]; toString: () => string } {
133
+ return {
134
+ facets: facetIds,
135
+ toString: () => facetIds.join(', '),
136
+ };
137
+ }
138
+
139
+ /**
140
+ * All facet IDs across all features
141
+ */
142
+ export const allFacetIds: FacetId[] = [
143
+ ${facetIds.map(id => ` '${id}',`).join('\n')}
144
+ ];
145
+ `;
146
+ }
147
+ /**
148
+ * Get facet type from file path.
149
+ * Handles both .facet.md and .md extensions.
150
+ */
151
+ function getFacetType(filePath, options) {
152
+ if (options.type) {
153
+ return options.type;
154
+ }
155
+ return FacetParser_js_1.FacetParser.getFilePrefix(filePath);
156
+ }
157
+ /**
158
+ * Find facet files in a directory (both conventions)
159
+ */
160
+ function findFacetFilesInDir(dir) {
161
+ const files = [];
162
+ // Find *.facet.md files in the directory
163
+ const entries = (0, fs_1.readdirSync)(dir, { withFileTypes: true });
164
+ for (const entry of entries) {
165
+ if (entry.isFile()) {
166
+ if (entry.name.endsWith('.facet.md') || entry.name.endsWith('.md')) {
167
+ files.push((0, path_1.join)(dir, entry.name));
168
+ }
169
+ }
170
+ }
171
+ return files;
172
+ }
173
+ /**
174
+ * Recursively discover all facet files matching patterns
175
+ */
176
+ async function discoverFacetFiles(rootDir, patterns) {
177
+ const allFiles = [];
178
+ for (const pattern of patterns) {
179
+ const matches = await (0, glob_1.glob)(pattern, { cwd: rootDir, absolute: true });
180
+ allFiles.push(...matches);
181
+ }
182
+ // Remove duplicates
183
+ return [...new Set(allFiles)];
184
+ }
185
+ /**
186
+ * Group facet files by their feature directory
187
+ */
188
+ function groupByFeature(files, rootDir) {
189
+ const groups = new Map();
190
+ for (const file of files) {
191
+ // Determine feature directory
192
+ let featureDir;
193
+ const fileDir = (0, path_1.dirname)(file);
194
+ if ((0, path_1.basename)(fileDir) === 'facets') {
195
+ // Legacy: features/checkout/facets/business.md -> features/checkout
196
+ featureDir = (0, path_1.dirname)(fileDir);
197
+ }
198
+ else {
199
+ // New: features/checkout/business.facet.md -> features/checkout
200
+ featureDir = fileDir;
201
+ }
202
+ const existing = groups.get(featureDir) || [];
203
+ existing.push(file);
204
+ groups.set(featureDir, existing);
205
+ }
206
+ return groups;
207
+ }
208
+ /**
209
+ * Process a single feature directory and generate outputs
210
+ */
211
+ async function processFeature(featureDir, files, rootDir, options, config) {
212
+ const parser = new FacetParser_js_1.FacetParser();
213
+ const facets = [];
214
+ const featureName = (0, path_1.basename)(featureDir);
215
+ console.log(`\n Feature: ${featureName}`);
216
+ for (const filePath of files) {
217
+ const parsed = parser.parseFile(filePath);
218
+ const type = getFacetType(filePath, options);
219
+ const fileName = (0, path_1.basename)(filePath);
220
+ console.log(` šŸ“„ ${fileName}`);
221
+ for (const section of parsed.sections) {
222
+ // Only include top-level sections (h2 or the first h1 if no h2s)
223
+ if (section.level <= 2) {
224
+ // Use hierarchical ID if nested, simple ID otherwise
225
+ const relPath = (0, path_1.relative)(rootDir, featureDir);
226
+ const isNested = relPath.includes('/') || relPath !== (0, path_1.basename)(featureDir);
227
+ const facetId = isNested
228
+ ? FacetParser_js_1.FacetParser.generateHierarchicalFacetId(rootDir, filePath, section.slug)
229
+ : FacetParser_js_1.FacetParser.generateFacetId(filePath, section.slug);
230
+ // Determine relative source path
231
+ const sourcePath = FacetParser_js_1.FacetParser.isFacetMdFile(filePath)
232
+ ? fileName
233
+ : `facets/${fileName}`;
234
+ facets.push({
235
+ id: facetId,
236
+ source: {
237
+ file: sourcePath,
238
+ section: section.slug,
239
+ },
240
+ type,
241
+ title: section.title,
242
+ });
243
+ console.log(` āœ“ ${facetId}`);
244
+ }
245
+ }
246
+ }
247
+ // Determine output directory
248
+ const outputDir = options.output || (0, path_1.join)(featureDir, '.facet');
249
+ // Build structure object
250
+ const structure = {
251
+ feature: featureName,
252
+ facets,
253
+ };
254
+ // Ensure output directory exists
255
+ (0, fs_1.mkdirSync)(outputDir, { recursive: true });
256
+ // Write structure file
257
+ const structurePath = (0, path_1.join)(outputDir, 'structure.json');
258
+ // Detect ID changes before writing
259
+ if (!options.quiet) {
260
+ const changeReport = IDChangeDetector_js_1.IDChangeDetector.detectChanges(structurePath, facets);
261
+ if (changeReport.hasChanges) {
262
+ console.log('\n āš ļø Facet ID Changes Detected:');
263
+ const reportLines = IDChangeDetector_js_1.IDChangeDetector.formatReport(changeReport);
264
+ for (const line of reportLines) {
265
+ console.log(line);
266
+ }
267
+ // Show affected tests if we have config
268
+ if (config && (changeReport.renamed.length > 0 || changeReport.removed.length > 0)) {
269
+ const scanner = new TestScanner_js_1.TestScanner(config);
270
+ const affected = await IDChangeDetector_js_1.IDChangeDetector.findAffectedTests(changeReport, scanner, rootDir);
271
+ if (affected.size > 0) {
272
+ console.log('\n Tests that may need updates:');
273
+ for (const [oldId, tests] of affected) {
274
+ console.log(`\n For "${oldId}":`);
275
+ for (const test of tests) {
276
+ console.log(` - ${test.file}:${test.line} "${test.title}"`);
277
+ }
278
+ }
279
+ }
280
+ }
281
+ console.log('');
282
+ }
283
+ }
284
+ (0, fs_1.writeFileSync)(structurePath, JSON.stringify(structure, null, 2));
285
+ // Generate TypeScript types file (unless disabled)
286
+ if (!options.noTypes) {
287
+ const typesContent = generateTypesFile(facets, featureName);
288
+ const typesPath = (0, path_1.join)(outputDir, 'facets.ts');
289
+ (0, fs_1.writeFileSync)(typesPath, typesContent);
290
+ }
291
+ console.log(` āœ… Generated: ${(0, path_1.relative)(process.cwd(), outputDir)}`);
292
+ return { facets, outputDir };
293
+ }
294
+ /**
295
+ * Generate from explicit directory (backwards compatible)
296
+ */
297
+ async function generateFromDirectory(dir, options) {
85
298
  const facetsDir = (0, path_1.resolve)(process.cwd(), dir);
86
299
  if (!(0, fs_1.existsSync)(facetsDir)) {
87
300
  console.error(`āŒ Directory not found: ${facetsDir}`);
@@ -89,27 +302,29 @@ async function generateCommand(dir, options = {}) {
89
302
  }
90
303
  console.log(`šŸ’Ž Generating structure from: ${facetsDir}`);
91
304
  // Find all markdown files in the directory
92
- const files = (0, fs_1.readdirSync)(facetsDir).filter(f => f.endsWith('.md'));
305
+ const files = findFacetFilesInDir(facetsDir);
93
306
  if (files.length === 0) {
94
307
  console.error(`āŒ No markdown files found in: ${facetsDir}`);
95
308
  process.exit(1);
96
309
  }
97
310
  const parser = new FacetParser_js_1.FacetParser();
98
311
  const facets = [];
99
- for (const file of files) {
100
- const filePath = (0, path_1.join)(facetsDir, file);
312
+ for (const filePath of files) {
101
313
  const parsed = parser.parseFile(filePath);
102
- // Determine facet type from filename (e.g., business.md -> business)
103
- const type = options.type || (0, path_1.basename)(file, '.md');
314
+ const file = (0, path_1.basename)(filePath);
315
+ const type = getFacetType(filePath, options);
104
316
  console.log(` šŸ“„ ${file}`);
105
317
  for (const section of parsed.sections) {
106
- // Only include top-level sections (h2 or the first h1 if no h2s)
107
318
  if (section.level <= 2) {
108
319
  const facetId = FacetParser_js_1.FacetParser.generateFacetId(file, section.slug);
320
+ // Determine source path based on file type
321
+ const sourcePath = FacetParser_js_1.FacetParser.isFacetMdFile(filePath)
322
+ ? file
323
+ : `facets/${file}`;
109
324
  facets.push({
110
325
  id: facetId,
111
326
  source: {
112
- file: `facets/${file}`,
327
+ file: sourcePath,
113
328
  section: section.slug,
114
329
  },
115
330
  type,
@@ -145,4 +360,70 @@ async function generateCommand(dir, options = {}) {
145
360
  console.log(` Types: ${typesPath}`);
146
361
  }
147
362
  }
363
+ /**
364
+ * Generate from config patterns
365
+ */
366
+ async function generateFromConfig(config, options) {
367
+ const cwd = process.cwd();
368
+ // Get facet patterns from config
369
+ const patterns = Array.isArray(config.facetPattern)
370
+ ? config.facetPattern
371
+ : config.facetPattern
372
+ ? [config.facetPattern]
373
+ : ['features/**/*.facet.md', 'features/**/facets/*.md'];
374
+ console.log('šŸ’Ž Discovering facet files...\n');
375
+ // Find all matching files
376
+ const files = await discoverFacetFiles(cwd, patterns);
377
+ if (files.length === 0) {
378
+ console.error('āŒ No facet files found matching patterns:');
379
+ for (const pattern of patterns) {
380
+ console.error(` - ${pattern}`);
381
+ }
382
+ console.error('\nMake sure facet files exist or specify a directory explicitly:');
383
+ console.error(' bunx facet generate features/checkout/facets/');
384
+ process.exit(1);
385
+ }
386
+ console.log(`Found ${files.length} facet file(s)`);
387
+ // Group files by feature
388
+ const featureGroups = groupByFeature(files, cwd);
389
+ const allFacets = [];
390
+ const featureOutputs = new Map();
391
+ // Process each feature
392
+ for (const [featureDir, featureFiles] of featureGroups) {
393
+ const { facets, outputDir } = await processFeature(featureDir, featureFiles, cwd, options, config);
394
+ allFacets.push(...facets);
395
+ // Store for global types
396
+ const featureName = (0, path_1.basename)(featureDir);
397
+ const relativeOutput = (0, path_1.relative)((0, path_1.join)(cwd, '.facet'), (0, path_1.join)(outputDir, 'facets'));
398
+ featureOutputs.set(featureName, relativeOutput);
399
+ }
400
+ // Generate global types if requested
401
+ if (options.global && !options.noTypes) {
402
+ const globalOutputDir = (0, path_1.join)(cwd, '.facet');
403
+ (0, fs_1.mkdirSync)(globalOutputDir, { recursive: true });
404
+ const globalTypesContent = generateGlobalTypesFile(allFacets, featureOutputs);
405
+ const globalTypesPath = (0, path_1.join)(globalOutputDir, 'facets.ts');
406
+ (0, fs_1.writeFileSync)(globalTypesPath, globalTypesContent);
407
+ console.log(`\nāœ… Generated global types: ${(0, path_1.relative)(cwd, globalTypesPath)}`);
408
+ }
409
+ // Summary
410
+ console.log(`\nšŸ“Š Summary:`);
411
+ console.log(` Features: ${featureGroups.size}`);
412
+ console.log(` Total Facets: ${allFacets.length}`);
413
+ }
414
+ /**
415
+ * Generate structure.json and TypeScript types from facet markdown files
416
+ */
417
+ async function generateCommand(dir, options = {}) {
418
+ const cwd = process.cwd();
419
+ if (dir) {
420
+ // Backwards compatible: explicit directory provided
421
+ await generateFromDirectory(dir, options);
422
+ }
423
+ else {
424
+ // New behavior: use config to find facet files
425
+ const config = await (0, config_js_1.loadConfig)(options.config, cwd);
426
+ await generateFromConfig(config, options);
427
+ }
428
+ }
148
429
  //# sourceMappingURL=generate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/cli/commands/generate.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":"AAMA,UAAU,eAAe;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BlF"}
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/validate.ts"],"names":[],"mappings":"AAIA,UAAU,eAAe;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BlF"}
@@ -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 types_js_1 = require("../../types.js");
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
  */