@facet-coverage/core 0.3.0 → 0.5.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 (75) hide show
  1. package/README.md +64 -574
  2. package/dist/cli/commands/generate.d.ts.map +1 -1
  3. package/dist/cli/commands/generate.js +224 -25
  4. package/dist/cli/commands/generate.js.map +1 -1
  5. package/dist/cli/commands/serve.d.ts +12 -0
  6. package/dist/cli/commands/serve.d.ts.map +1 -0
  7. package/dist/cli/commands/serve.js +76 -0
  8. package/dist/cli/commands/serve.js.map +1 -0
  9. package/dist/cli/index.js +10 -0
  10. package/dist/cli/index.js.map +1 -1
  11. package/dist/client/index.js +60 -0
  12. package/dist/core/FacetParser.d.ts +37 -1
  13. package/dist/core/FacetParser.d.ts.map +1 -1
  14. package/dist/core/FacetParser.js +123 -5
  15. package/dist/core/FacetParser.js.map +1 -1
  16. package/dist/core/TestScanner.d.ts +4 -1
  17. package/dist/core/TestScanner.d.ts.map +1 -1
  18. package/dist/core/TestScanner.js +42 -13
  19. package/dist/core/TestScanner.js.map +1 -1
  20. package/dist/core/Validator.d.ts +4 -0
  21. package/dist/core/Validator.d.ts.map +1 -1
  22. package/dist/core/Validator.js +22 -4
  23. package/dist/core/Validator.js.map +1 -1
  24. package/dist/server/DevServer.d.ts +48 -0
  25. package/dist/server/DevServer.d.ts.map +1 -0
  26. package/dist/server/DevServer.js +126 -0
  27. package/dist/server/DevServer.js.map +1 -0
  28. package/dist/server/HotReloadManager.d.ts +49 -0
  29. package/dist/server/HotReloadManager.d.ts.map +1 -0
  30. package/dist/server/HotReloadManager.js +187 -0
  31. package/dist/server/HotReloadManager.js.map +1 -0
  32. package/dist/server/index.d.ts +3 -0
  33. package/dist/server/index.d.ts.map +1 -0
  34. package/dist/server/index.js +6 -0
  35. package/dist/server/index.js.map +1 -0
  36. package/dist/server/routes.d.ts +12 -0
  37. package/dist/server/routes.d.ts.map +1 -0
  38. package/dist/server/routes.js +272 -0
  39. package/dist/server/routes.js.map +1 -0
  40. package/dist/server/views/Dashboard.d.ts +6 -0
  41. package/dist/server/views/Dashboard.d.ts.map +1 -0
  42. package/dist/server/views/Dashboard.js +121 -0
  43. package/dist/server/views/Dashboard.js.map +1 -0
  44. package/dist/server/views/FacetPage.d.ts +6 -0
  45. package/dist/server/views/FacetPage.d.ts.map +1 -0
  46. package/dist/server/views/FacetPage.js +190 -0
  47. package/dist/server/views/FacetPage.js.map +1 -0
  48. package/dist/server/views/FeaturePage.d.ts +6 -0
  49. package/dist/server/views/FeaturePage.d.ts.map +1 -0
  50. package/dist/server/views/FeaturePage.js +98 -0
  51. package/dist/server/views/FeaturePage.js.map +1 -0
  52. package/dist/server/views/Layout.d.ts +17 -0
  53. package/dist/server/views/Layout.d.ts.map +1 -0
  54. package/dist/server/views/Layout.js +59 -0
  55. package/dist/server/views/Layout.js.map +1 -0
  56. package/dist/server/views/Sidebar.d.ts +6 -0
  57. package/dist/server/views/Sidebar.d.ts.map +1 -0
  58. package/dist/server/views/Sidebar.js +59 -0
  59. package/dist/server/views/Sidebar.js.map +1 -0
  60. package/dist/server/views/TestPanel.d.ts +6 -0
  61. package/dist/server/views/TestPanel.d.ts.map +1 -0
  62. package/dist/server/views/TestPanel.js +69 -0
  63. package/dist/server/views/TestPanel.js.map +1 -0
  64. package/dist/server/views/scripts.d.ts +5 -0
  65. package/dist/server/views/scripts.d.ts.map +1 -0
  66. package/dist/server/views/scripts.js +203 -0
  67. package/dist/server/views/scripts.js.map +1 -0
  68. package/dist/server/views/styles.d.ts +6 -0
  69. package/dist/server/views/styles.d.ts.map +1 -0
  70. package/dist/server/views/styles.js +608 -0
  71. package/dist/server/views/styles.js.map +1 -0
  72. package/dist/types.d.ts +27 -3
  73. package/dist/types.d.ts.map +1 -1
  74. package/dist/types.js.map +1 -1
  75. package/package.json +9 -4
@@ -100,6 +100,8 @@ class Validator {
100
100
  const warnings = [];
101
101
  const structureDir = (0, path_1.dirname)(structureFile);
102
102
  const featureDir = (0, path_1.dirname)(structureDir);
103
+ // Build a set of all facet IDs in this structure for parent validation
104
+ const facetIdsInStructure = new Set(structure.facets.map(f => f.id));
103
105
  for (const facet of structure.facets) {
104
106
  // Validate source file exists
105
107
  if (this.config.validation.requireSourceExists) {
@@ -113,8 +115,8 @@ class Validator {
113
115
  });
114
116
  continue; // Skip section check if file doesn't exist
115
117
  }
116
- // Validate section exists
117
- if (this.config.validation.requireSectionExists) {
118
+ // Validate section exists (only for non-sub-facets, sub-facets reference parent's section)
119
+ if (this.config.validation.requireSectionExists && !facet.isSubFacet) {
118
120
  const sectionExists = this.facetParser.sectionExists(sourcePath, facet.source.section);
119
121
  if (!sectionExists) {
120
122
  errors.push({
@@ -135,6 +137,17 @@ class Validator {
135
137
  facetId: facet.id,
136
138
  });
137
139
  }
140
+ // Validate sub-facet parent relationship
141
+ if (facet.isSubFacet && facet.parentId) {
142
+ if (!facetIdsInStructure.has(facet.parentId)) {
143
+ errors.push({
144
+ type: 'orphan-subfacet',
145
+ message: `Sub-facet '${facet.id}' references non-existent parent '${facet.parentId}'`,
146
+ file: structureFile,
147
+ facetId: facet.id,
148
+ });
149
+ }
150
+ }
138
151
  }
139
152
  return {
140
153
  valid: errors.length === 0,
@@ -144,10 +157,15 @@ class Validator {
144
157
  }
145
158
  /**
146
159
  * Check if a facet ID is valid
160
+ * Valid formats:
161
+ * - type:section (e.g., "business:guest-purchase-flow")
162
+ * - path/type:section (e.g., "features/cli/product:generate-command")
163
+ * - type:section/sub-id (e.g., "compliance:pci-dss/tls") - sub-facet
147
164
  */
148
165
  isValidFacetId(id) {
149
- // Allow alphanumeric, hyphens, underscores, and colons
150
- return /^[a-zA-Z0-9_-]+(:?[a-zA-Z0-9_-]+)*$/.test(id);
166
+ // Allow alphanumeric, hyphens, underscores, colons, and slashes
167
+ // Format: [path/]*type:section[/sub-id]
168
+ return /^[a-zA-Z0-9/_-]+:[a-zA-Z0-9_-]+(?:\/[a-zA-Z0-9_-]+)?$/.test(id);
151
169
  }
152
170
  /**
153
171
  * Check if a reference is a valid path-style reference
@@ -1 +1 @@
1
- {"version":3,"file":"Validator.js","sourceRoot":"","sources":["../../src/core/Validator.ts"],"names":[],"mappings":";;;AAAA,2BAAgC;AAChC,+BAAwC;AASxC,0CAA4C;AAC5C,6DAAuD;AACvD,qDAA+C;AAC/C,qDAA+C;AAE/C;;GAEG;AACH,MAAa,SAAS;IACZ,MAAM,CAAc;IACpB,eAAe,CAAkB;IACjC,WAAW,CAAc;IACzB,WAAW,CAAc;IAEjC,YAAY,SAA+B,EAAE;QAC3C,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,wBAAa,EAAE,GAAG,MAAM,EAAE,CAAC;QAC9C,IAAI,CAAC,eAAe,GAAG,IAAI,oCAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxD,IAAI,CAAC,WAAW,GAAG,IAAI,4BAAW,EAAE,CAAC;QACrC,IAAI,CAAC,WAAW,GAAG,IAAI,4BAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;QACxC,MAAM,MAAM,GAAsB,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAsB,EAAE,CAAC;QAEvC,qBAAqB;QACrB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAErE,qBAAqB;QACrB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAE3D,wBAAwB;QACxB,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;QACtC,MAAM,sBAAsB,GAAG,IAAI,GAAG,EAAkB,CAAC;QAEzD,KAAK,MAAM,CAAC,aAAa,EAAE,SAAS,CAAC,IAAI,UAAU,EAAE,CAAC;YACpD,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;gBACrC,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;oBAC9B,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,cAAc;wBACpB,OAAO,EAAE,uBAAuB,KAAK,CAAC,EAAE,qCAAqC;wBAC7E,IAAI,EAAE,aAAa;wBACnB,OAAO,EAAE,KAAK,CAAC,EAAE;qBAClB,CAAC,CAAC;gBACL,CAAC;gBACD,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC1B,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;QAED,0BAA0B;QAC1B,KAAK,MAAM,CAAC,aAAa,EAAE,SAAS,CAAC,IAAI,UAAU,EAAE,CAAC;YACpD,MAAM,eAAe,GAAG,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;YAC9E,MAAM,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;YACvC,QAAQ,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC7C,CAAC;QAED,sBAAsB;QACtB,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;QACxC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC7B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACpC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAE3B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC9B,0CAA0C;oBAC1C,MAAM,cAAc,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;oBAEtE,IAAI,CAAC,cAAc,EAAE,CAAC;wBACpB,QAAQ,CAAC,IAAI,CAAC;4BACZ,IAAI,EAAE,aAAa;4BACnB,OAAO,EAAE,qCAAqC,OAAO,GAAG;4BACxD,IAAI,EAAE,IAAI,CAAC,IAAI;4BACf,IAAI,EAAE,IAAI,CAAC,IAAI;4BACf,OAAO;yBACR,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,2CAA2C;QAC3C,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;YAClC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAChC,MAAM,aAAa,GAAG,sBAAsB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAC1D,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,aAAa;oBACnB,OAAO,EAAE,UAAU,OAAO,8BAA8B;oBACxD,IAAI,EAAE,aAAa;oBACnB,OAAO;iBACR,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;YAC1B,MAAM;YACN,QAAQ;SACT,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,iBAAiB,CACf,SAAyB,EACzB,aAAqB,EACrB,GAAW;QAEX,MAAM,MAAM,GAAsB,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAsB,EAAE,CAAC;QAEvC,MAAM,YAAY,GAAG,IAAA,cAAO,EAAC,aAAa,CAAC,CAAC;QAC5C,MAAM,UAAU,GAAG,IAAA,cAAO,EAAC,YAAY,CAAC,CAAC;QAEzC,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;YACrC,8BAA8B;YAC9B,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC;gBAC/C,MAAM,UAAU,GAAG,IAAA,cAAO,EAAC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAE1D,IAAI,CAAC,IAAA,eAAU,EAAC,UAAU,CAAC,EAAE,CAAC;oBAC5B,MAAM,CAAC,IAAI,CAAC;wBACV,IAAI,EAAE,gBAAgB;wBACtB,OAAO,EAAE,0BAA0B,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE;wBACtD,IAAI,EAAE,aAAa;wBACnB,OAAO,EAAE,KAAK,CAAC,EAAE;qBAClB,CAAC,CAAC;oBACH,SAAS,CAAC,2CAA2C;gBACvD,CAAC;gBAED,0BAA0B;gBAC1B,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,oBAAoB,EAAE,CAAC;oBAChD,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBAEvF,IAAI,CAAC,aAAa,EAAE,CAAC;wBACnB,MAAM,CAAC,IAAI,CAAC;4BACV,IAAI,EAAE,iBAAiB;4BACvB,OAAO,EAAE,YAAY,KAAK,CAAC,MAAM,CAAC,OAAO,kBAAkB,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE;4BAC9E,IAAI,EAAE,aAAa;4BACnB,OAAO,EAAE,KAAK,CAAC,EAAE;yBAClB,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YAED,2BAA2B;YAC3B,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;gBACnC,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,kBAAkB;oBACxB,OAAO,EAAE,aAAa,KAAK,CAAC,EAAE,4BAA4B;oBAC1D,IAAI,EAAE,aAAa;oBACnB,OAAO,EAAE,KAAK,CAAC,EAAE;iBAClB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC;YAC1B,MAAM;YACN,QAAQ;SACT,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,EAAU;QAC/B,uDAAuD;QACvD,OAAO,qCAAqC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxD,CAAC;IAED;;;OAGG;IACK,oBAAoB,CAC1B,GAAW,EACX,UAAuC;QAEvC,gCAAgC;QAChC,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC/C,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC;QAExC,iDAAiD;QACjD,KAAK,MAAM,SAAS,IAAI,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC;YAC5C,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;gBACrC,IACE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;oBACpC,KAAK,CAAC,MAAM,CAAC,OAAO,KAAK,OAAO,EAChC,CAAC;oBACD,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;QACvC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACxC,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;CACF;AA3MD,8BA2MC"}
1
+ {"version":3,"file":"Validator.js","sourceRoot":"","sources":["../../src/core/Validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import type { FacetConfig, CoverageReport } from '../types.js';
2
+ export interface DevServerOptions {
3
+ port: number;
4
+ host: string;
5
+ open: boolean;
6
+ packageRoot: string;
7
+ }
8
+ export interface WebSocketData {
9
+ id: string;
10
+ }
11
+ /**
12
+ * Development server for browsing facet documentation with live coverage
13
+ */
14
+ export declare class DevServer {
15
+ private server;
16
+ private hotReload;
17
+ private config;
18
+ private cwd;
19
+ private options;
20
+ private router;
21
+ private coverageReport;
22
+ constructor(config: FacetConfig, cwd: string, options: DevServerOptions);
23
+ /**
24
+ * Get the current coverage report
25
+ */
26
+ getCoverageReport(): CoverageReport | null;
27
+ /**
28
+ * Get config
29
+ */
30
+ getConfig(): FacetConfig;
31
+ /**
32
+ * Get current working directory
33
+ */
34
+ getCwd(): string;
35
+ /**
36
+ * Calculate coverage and update the cached report
37
+ */
38
+ refreshCoverage(): Promise<CoverageReport>;
39
+ /**
40
+ * Start the development server
41
+ */
42
+ start(): Promise<void>;
43
+ /**
44
+ * Stop the server
45
+ */
46
+ stop(): Promise<void>;
47
+ }
48
+ //# sourceMappingURL=DevServer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DevServer.d.ts","sourceRoot":"","sources":["../../src/server/DevServer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAK/D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAA6C;IAC3D,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,OAAO,CAAmB;IAClC,OAAO,CAAC,MAAM,CAAkC;IAChD,OAAO,CAAC,cAAc,CAA+B;gBAEzC,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB;IASvE;;OAEG;IACH,iBAAiB,IAAI,cAAc,GAAG,IAAI;IAI1C;;OAEG;IACH,SAAS,IAAI,WAAW;IAIxB;;OAEG;IACH,MAAM,IAAI,MAAM;IAIhB;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,cAAc,CAAC;IAMhD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAuE5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAO5B"}
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DevServer = void 0;
4
+ const CoverageCalculator_js_1 = require("../core/CoverageCalculator.js");
5
+ const HotReloadManager_js_1 = require("./HotReloadManager.js");
6
+ const routes_js_1 = require("./routes.js");
7
+ /**
8
+ * Development server for browsing facet documentation with live coverage
9
+ */
10
+ class DevServer {
11
+ server = null;
12
+ hotReload;
13
+ config;
14
+ cwd;
15
+ options;
16
+ router;
17
+ coverageReport = null;
18
+ constructor(config, cwd, options) {
19
+ this.config = config;
20
+ this.cwd = cwd;
21
+ this.options = options;
22
+ this.hotReload = new HotReloadManager_js_1.HotReloadManager(config, cwd);
23
+ this.hotReload.setPackageRoot(options.packageRoot);
24
+ this.router = (0, routes_js_1.createRouter)(this, options.packageRoot);
25
+ }
26
+ /**
27
+ * Get the current coverage report
28
+ */
29
+ getCoverageReport() {
30
+ return this.coverageReport;
31
+ }
32
+ /**
33
+ * Get config
34
+ */
35
+ getConfig() {
36
+ return this.config;
37
+ }
38
+ /**
39
+ * Get current working directory
40
+ */
41
+ getCwd() {
42
+ return this.cwd;
43
+ }
44
+ /**
45
+ * Calculate coverage and update the cached report
46
+ */
47
+ async refreshCoverage() {
48
+ const calculator = new CoverageCalculator_js_1.CoverageCalculator(this.config);
49
+ this.coverageReport = await calculator.calculateCoverage(this.cwd);
50
+ return this.coverageReport;
51
+ }
52
+ /**
53
+ * Start the development server
54
+ */
55
+ async start() {
56
+ // Initial coverage calculation
57
+ console.log('Calculating initial coverage...');
58
+ await this.refreshCoverage();
59
+ const self = this;
60
+ this.server = Bun.serve({
61
+ port: this.options.port,
62
+ hostname: this.options.host,
63
+ fetch(req, server) {
64
+ const url = new URL(req.url);
65
+ // Handle WebSocket upgrade
66
+ if (url.pathname === '/ws') {
67
+ const upgraded = server.upgrade(req, {
68
+ data: { id: crypto.randomUUID() },
69
+ });
70
+ if (upgraded)
71
+ return undefined;
72
+ return new Response('WebSocket upgrade failed', { status: 400 });
73
+ }
74
+ // Handle HTTP requests via router
75
+ return self.router.handle(req);
76
+ },
77
+ websocket: {
78
+ open(ws) {
79
+ self.hotReload.addClient(ws);
80
+ ws.send(JSON.stringify({ type: 'connected', data: { timestamp: new Date().toISOString() } }));
81
+ },
82
+ close(ws) {
83
+ self.hotReload.removeClient(ws);
84
+ },
85
+ message(_ws, _message) {
86
+ // Client messages not needed for now
87
+ },
88
+ },
89
+ });
90
+ // Start file watching for hot reload
91
+ this.hotReload.start(async () => {
92
+ await this.refreshCoverage();
93
+ return this.coverageReport;
94
+ }, () => {
95
+ (0, routes_js_1.clearClientBundleCache)();
96
+ console.log(' Client bundle cache cleared');
97
+ });
98
+ const url = `http://${this.options.host}:${this.options.port}`;
99
+ console.log(`
100
+ \x1b[36m\x1b[1m Facet Documentation Server\x1b[0m
101
+
102
+ Local: ${url}
103
+
104
+ Watching for changes...
105
+ Press Ctrl+C to stop.
106
+ `);
107
+ // Open browser if requested
108
+ if (this.options.open) {
109
+ const { exec } = await import('child_process');
110
+ const command = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open';
111
+ exec(`${command} ${url}`);
112
+ }
113
+ }
114
+ /**
115
+ * Stop the server
116
+ */
117
+ async stop() {
118
+ this.hotReload.stop();
119
+ if (this.server) {
120
+ this.server.stop();
121
+ this.server = null;
122
+ }
123
+ }
124
+ }
125
+ exports.DevServer = DevServer;
126
+ //# sourceMappingURL=DevServer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DevServer.js","sourceRoot":"","sources":["../../src/server/DevServer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { ServerWebSocket } from 'bun';
2
+ import type { FacetConfig, CoverageReport } from '../types.js';
3
+ import type { WebSocketData } from './DevServer.js';
4
+ /**
5
+ * Manages WebSocket connections and file watching for hot reload
6
+ */
7
+ export declare class HotReloadManager {
8
+ private watcher;
9
+ private clientWatcher;
10
+ private clients;
11
+ private config;
12
+ private cwd;
13
+ private packageRoot;
14
+ private debounceTimer;
15
+ private clientDebounceTimer;
16
+ private onRefresh;
17
+ private onClientChange;
18
+ constructor(config: FacetConfig, cwd: string);
19
+ setPackageRoot(packageRoot: string): void;
20
+ /**
21
+ * Add a WebSocket client
22
+ */
23
+ addClient(ws: ServerWebSocket<WebSocketData>): void;
24
+ /**
25
+ * Remove a WebSocket client
26
+ */
27
+ removeClient(ws: ServerWebSocket<WebSocketData>): void;
28
+ /**
29
+ * Start watching for file changes
30
+ */
31
+ start(onRefresh: () => Promise<CoverageReport>, onClientChange?: () => void): void;
32
+ /**
33
+ * Stop watching and clean up
34
+ */
35
+ stop(): void;
36
+ /**
37
+ * Handle file change event with debouncing
38
+ */
39
+ private handleFileChange;
40
+ /**
41
+ * Handle client source file change with debouncing
42
+ */
43
+ private handleClientFileChange;
44
+ /**
45
+ * Broadcast a message to all connected clients
46
+ */
47
+ private broadcast;
48
+ }
49
+ //# sourceMappingURL=HotReloadManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HotReloadManager.d.ts","sourceRoot":"","sources":["../../src/server/HotReloadManager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,KAAK,CAAC;AAC3C,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGpD;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,OAAO,CAAkD;IACjE,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,mBAAmB,CAA8C;IACzE,OAAO,CAAC,SAAS,CAAgD;IACjE,OAAO,CAAC,cAAc,CAA6B;gBAEvC,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM;IAK5C,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAIzC;;OAEG;IACH,SAAS,CAAC,EAAE,EAAE,eAAe,CAAC,aAAa,CAAC,GAAG,IAAI;IAInD;;OAEG;IACH,YAAY,CAAC,EAAE,EAAE,eAAe,CAAC,aAAa,CAAC,GAAG,IAAI;IAItD;;OAEG;IACH,KAAK,CAAC,SAAS,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC,EAAE,MAAM,IAAI,GAAG,IAAI;IAmClF;;OAEG;IACH,IAAI,IAAI,IAAI;IAoBZ;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAyDxB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAuB9B;;OAEG;IACH,OAAO,CAAC,SAAS;CAWlB"}
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HotReloadManager = void 0;
4
+ const chokidar_1 = require("chokidar");
5
+ const generate_js_1 = require("../cli/commands/generate.js");
6
+ /**
7
+ * Manages WebSocket connections and file watching for hot reload
8
+ */
9
+ class HotReloadManager {
10
+ watcher = null;
11
+ clientWatcher = null;
12
+ clients = new Set();
13
+ config;
14
+ cwd;
15
+ packageRoot = '';
16
+ debounceTimer = null;
17
+ clientDebounceTimer = null;
18
+ onRefresh = null;
19
+ onClientChange = null;
20
+ constructor(config, cwd) {
21
+ this.config = config;
22
+ this.cwd = cwd;
23
+ }
24
+ setPackageRoot(packageRoot) {
25
+ this.packageRoot = packageRoot;
26
+ }
27
+ /**
28
+ * Add a WebSocket client
29
+ */
30
+ addClient(ws) {
31
+ this.clients.add(ws);
32
+ }
33
+ /**
34
+ * Remove a WebSocket client
35
+ */
36
+ removeClient(ws) {
37
+ this.clients.delete(ws);
38
+ }
39
+ /**
40
+ * Start watching for file changes
41
+ */
42
+ start(onRefresh, onClientChange) {
43
+ this.onRefresh = onRefresh;
44
+ this.onClientChange = onClientChange || null;
45
+ // Watch patterns matching facet markdown files and test files
46
+ const watchPatterns = [
47
+ ...this.config.structureFiles,
48
+ 'features/**/facets/**/*.md',
49
+ `${this.config.testDir}/**/*.{ts,js,tsx,jsx}`,
50
+ ];
51
+ this.watcher = (0, chokidar_1.watch)(watchPatterns, {
52
+ cwd: this.cwd,
53
+ ignoreInitial: true,
54
+ persistent: true,
55
+ });
56
+ this.watcher.on('all', (event, path) => {
57
+ this.handleFileChange(event, path);
58
+ });
59
+ // Watch client source files for hot reload
60
+ if (this.packageRoot) {
61
+ const clientPath = `${this.packageRoot}/src/server/client`;
62
+ this.clientWatcher = (0, chokidar_1.watch)(`${clientPath}/**/*.{ts,tsx,css}`, {
63
+ ignoreInitial: true,
64
+ persistent: true,
65
+ });
66
+ this.clientWatcher.on('all', (event, path) => {
67
+ this.handleClientFileChange(event, path);
68
+ });
69
+ }
70
+ }
71
+ /**
72
+ * Stop watching and clean up
73
+ */
74
+ stop() {
75
+ if (this.debounceTimer) {
76
+ clearTimeout(this.debounceTimer);
77
+ this.debounceTimer = null;
78
+ }
79
+ if (this.clientDebounceTimer) {
80
+ clearTimeout(this.clientDebounceTimer);
81
+ this.clientDebounceTimer = null;
82
+ }
83
+ if (this.watcher) {
84
+ this.watcher.close();
85
+ this.watcher = null;
86
+ }
87
+ if (this.clientWatcher) {
88
+ this.clientWatcher.close();
89
+ this.clientWatcher = null;
90
+ }
91
+ this.clients.clear();
92
+ }
93
+ /**
94
+ * Handle file change event with debouncing
95
+ */
96
+ handleFileChange(event, path) {
97
+ // Clear existing timer
98
+ if (this.debounceTimer) {
99
+ clearTimeout(this.debounceTimer);
100
+ }
101
+ // Notify clients that a change was detected
102
+ this.broadcast({
103
+ type: 'file-change',
104
+ data: { event, path, timestamp: new Date().toISOString() },
105
+ });
106
+ // Check if this is a markdown file (facet definition)
107
+ const isMarkdownChange = path.endsWith('.md');
108
+ // Debounce to avoid multiple rapid refreshes
109
+ this.debounceTimer = setTimeout(async () => {
110
+ console.log(`\n Change detected: ${path} (${event})`);
111
+ // If markdown changed, regenerate facet structure first
112
+ if (isMarkdownChange) {
113
+ console.log(' Regenerating facet structure...');
114
+ try {
115
+ // Save and restore cwd since generateCommand uses process.cwd()
116
+ const originalCwd = process.cwd();
117
+ process.chdir(this.cwd);
118
+ await (0, generate_js_1.generateCommand)(undefined, { quiet: true });
119
+ process.chdir(originalCwd);
120
+ }
121
+ catch (error) {
122
+ console.error(' Error regenerating structure:', error);
123
+ }
124
+ }
125
+ console.log(' Refreshing coverage...');
126
+ if (this.onRefresh) {
127
+ try {
128
+ const report = await this.onRefresh();
129
+ console.log(` Coverage: ${report.summary.percentage}% (${report.summary.coveredFacets}/${report.summary.totalFacets})`);
130
+ this.broadcast({
131
+ type: 'coverage-update',
132
+ data: {
133
+ timestamp: new Date().toISOString(),
134
+ summary: report.summary,
135
+ },
136
+ });
137
+ }
138
+ catch (error) {
139
+ console.error(' Error refreshing coverage:', error);
140
+ this.broadcast({
141
+ type: 'error',
142
+ data: { message: String(error), timestamp: new Date().toISOString() },
143
+ });
144
+ }
145
+ }
146
+ }, 300);
147
+ }
148
+ /**
149
+ * Handle client source file change with debouncing
150
+ */
151
+ handleClientFileChange(event, path) {
152
+ // Clear existing timer
153
+ if (this.clientDebounceTimer) {
154
+ clearTimeout(this.clientDebounceTimer);
155
+ }
156
+ // Debounce to avoid multiple rapid rebuilds
157
+ this.clientDebounceTimer = setTimeout(() => {
158
+ console.log(`\n Client change detected: ${path} (${event})`);
159
+ console.log(' Rebuilding client bundle...');
160
+ // Clear the bundle cache and notify clients to reload
161
+ if (this.onClientChange) {
162
+ this.onClientChange();
163
+ }
164
+ this.broadcast({
165
+ type: 'client-reload',
166
+ data: { timestamp: new Date().toISOString() },
167
+ });
168
+ }, 200);
169
+ }
170
+ /**
171
+ * Broadcast a message to all connected clients
172
+ */
173
+ broadcast(message) {
174
+ const json = JSON.stringify(message);
175
+ for (const client of this.clients) {
176
+ try {
177
+ client.send(json);
178
+ }
179
+ catch {
180
+ // Client may have disconnected
181
+ this.clients.delete(client);
182
+ }
183
+ }
184
+ }
185
+ }
186
+ exports.HotReloadManager = HotReloadManager;
187
+ //# sourceMappingURL=HotReloadManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HotReloadManager.js","sourceRoot":"","sources":["../../src/server/HotReloadManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { DevServer } from './DevServer.js';
2
+ export type { DevServerOptions } from './DevServer.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DevServer = void 0;
4
+ var DevServer_js_1 = require("./DevServer.js");
5
+ Object.defineProperty(exports, "DevServer", { enumerable: true, get: function () { return DevServer_js_1.DevServer; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":";;;AAAA,+CAA2C;AAAlC,yGAAA,SAAS,OAAA"}
@@ -0,0 +1,12 @@
1
+ import type { DevServer } from './DevServer.js';
2
+ /**
3
+ * Clear the client bundle cache (for hot reload)
4
+ */
5
+ export declare function clearClientBundleCache(): void;
6
+ /**
7
+ * Simple router for handling HTTP requests
8
+ */
9
+ export declare function createRouter(server: DevServer, packageRoot: string): {
10
+ handle(req: Request): Promise<Response>;
11
+ };
12
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/server/routes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAahD;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAuFD;;GAEG;AAEH,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM;gBAqK7C,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC;EA2BhD"}