@stati/core 1.21.0 → 1.22.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 (65) hide show
  1. package/dist/config/loader.d.ts +4 -0
  2. package/dist/config/loader.d.ts.map +1 -1
  3. package/dist/config/loader.js +49 -4
  4. package/dist/core/build.d.ts +6 -0
  5. package/dist/core/build.d.ts.map +1 -1
  6. package/dist/core/build.js +134 -24
  7. package/dist/core/dev.d.ts.map +1 -1
  8. package/dist/core/dev.js +86 -19
  9. package/dist/core/isg/builder.d.ts +4 -1
  10. package/dist/core/isg/builder.d.ts.map +1 -1
  11. package/dist/core/isg/builder.js +89 -2
  12. package/dist/core/isg/deps.d.ts +5 -0
  13. package/dist/core/isg/deps.d.ts.map +1 -1
  14. package/dist/core/isg/deps.js +38 -3
  15. package/dist/core/isg/dev-server-lock.d.ts +85 -0
  16. package/dist/core/isg/dev-server-lock.d.ts.map +1 -0
  17. package/dist/core/isg/dev-server-lock.js +248 -0
  18. package/dist/core/isg/hash.d.ts +4 -0
  19. package/dist/core/isg/hash.d.ts.map +1 -1
  20. package/dist/core/isg/hash.js +24 -1
  21. package/dist/core/isg/index.d.ts +3 -2
  22. package/dist/core/isg/index.d.ts.map +1 -1
  23. package/dist/core/isg/index.js +3 -2
  24. package/dist/core/markdown.d.ts +6 -0
  25. package/dist/core/markdown.d.ts.map +1 -1
  26. package/dist/core/markdown.js +23 -0
  27. package/dist/core/templates.js +5 -5
  28. package/dist/core/utils/index.d.ts +1 -1
  29. package/dist/core/utils/index.d.ts.map +1 -1
  30. package/dist/core/utils/index.js +1 -1
  31. package/dist/core/utils/partial-validation.utils.js +2 -2
  32. package/dist/core/utils/paths.utils.d.ts +18 -0
  33. package/dist/core/utils/paths.utils.d.ts.map +1 -1
  34. package/dist/core/utils/paths.utils.js +23 -0
  35. package/dist/core/utils/tailwind-inventory.utils.d.ts +1 -16
  36. package/dist/core/utils/tailwind-inventory.utils.d.ts.map +1 -1
  37. package/dist/core/utils/tailwind-inventory.utils.js +35 -3
  38. package/dist/core/utils/typescript.utils.d.ts +9 -0
  39. package/dist/core/utils/typescript.utils.d.ts.map +1 -1
  40. package/dist/core/utils/typescript.utils.js +41 -0
  41. package/dist/env.d.ts +45 -0
  42. package/dist/env.d.ts.map +1 -1
  43. package/dist/env.js +51 -0
  44. package/dist/index.d.ts +2 -2
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +2 -2
  47. package/dist/metrics/index.d.ts +1 -1
  48. package/dist/metrics/index.d.ts.map +1 -1
  49. package/dist/metrics/index.js +2 -0
  50. package/dist/metrics/recorder.d.ts.map +1 -1
  51. package/dist/metrics/types.d.ts +31 -0
  52. package/dist/metrics/types.d.ts.map +1 -1
  53. package/dist/metrics/utils/html-report.utils.d.ts +24 -0
  54. package/dist/metrics/utils/html-report.utils.d.ts.map +1 -0
  55. package/dist/metrics/utils/html-report.utils.js +1547 -0
  56. package/dist/metrics/utils/index.d.ts +1 -0
  57. package/dist/metrics/utils/index.d.ts.map +1 -1
  58. package/dist/metrics/utils/index.js +2 -0
  59. package/dist/metrics/utils/writer.utils.d.ts +6 -2
  60. package/dist/metrics/utils/writer.utils.d.ts.map +1 -1
  61. package/dist/metrics/utils/writer.utils.js +20 -4
  62. package/dist/search/generator.d.ts +1 -9
  63. package/dist/search/generator.d.ts.map +1 -1
  64. package/dist/search/generator.js +26 -2
  65. package/package.json +1 -1
@@ -6,4 +6,5 @@
6
6
  export { isCI, getGitCommit, getGitBranch, getCpuCount, getPlatform, getArch, getMemoryUsage, getNodeVersion, } from './system.utils.js';
7
7
  export { DEFAULT_METRICS_DIR, generateMetricsFilename, writeMetrics } from './writer.utils.js';
8
8
  export type { WriteMetricsOptions, WriteMetricsResult } from './writer.utils.js';
9
+ export { generateMetricsHtml, writeMetricsHtml } from './html-report.utils.js';
9
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/metrics/utils/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,IAAI,EACJ,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,WAAW,EACX,OAAO,EACP,cAAc,EACd,cAAc,GACf,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE/F,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/metrics/utils/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,IAAI,EACJ,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,WAAW,EACX,OAAO,EACP,cAAc,EACd,cAAc,GACf,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE/F,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAGjF,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC"}
@@ -7,3 +7,5 @@
7
7
  export { isCI, getGitCommit, getGitBranch, getCpuCount, getPlatform, getArch, getMemoryUsage, getNodeVersion, } from './system.utils.js';
8
8
  // Writer utilities
9
9
  export { DEFAULT_METRICS_DIR, generateMetricsFilename, writeMetrics } from './writer.utils.js';
10
+ // HTML report utilities
11
+ export { generateMetricsHtml, writeMetricsHtml } from './html-report.utils.js';
@@ -25,6 +25,8 @@ export interface WriteMetricsOptions {
25
25
  outputPath?: string | undefined;
26
26
  /** Format: json (default) or ndjson */
27
27
  format?: 'json' | 'ndjson' | undefined;
28
+ /** Whether to also generate an HTML report (default: false, requires --metrics-html flag) */
29
+ generateHtml?: boolean | undefined;
28
30
  }
29
31
  /**
30
32
  * Result of metrics write operation.
@@ -32,15 +34,16 @@ export interface WriteMetricsOptions {
32
34
  export interface WriteMetricsResult {
33
35
  success: boolean;
34
36
  path?: string;
37
+ htmlPath?: string;
35
38
  error?: string;
36
39
  }
37
40
  /**
38
- * Write build metrics to a JSON file.
41
+ * Write build metrics to a JSON file and optionally an HTML report.
39
42
  * Degrades gracefully on failure - logs warning but doesn't throw.
40
43
  *
41
44
  * @param metrics - The metrics to write
42
45
  * @param options - Write options
43
- * @returns Result indicating success/failure and path
46
+ * @returns Result indicating success/failure and paths
44
47
  *
45
48
  * @example
46
49
  * ```typescript
@@ -50,6 +53,7 @@ export interface WriteMetricsResult {
50
53
  *
51
54
  * if (result.success) {
52
55
  * console.log(`Metrics written to ${result.path}`);
56
+ * console.log(`HTML report: ${result.htmlPath}`);
53
57
  * }
54
58
  * ```
55
59
  */
@@ -1 +1 @@
1
- {"version":3,"file":"writer.utils.d.ts","sourceRoot":"","sources":["../../../src/metrics/utils/writer.utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD;;GAEG;AACH,eAAO,MAAM,mBAAmB,YAAY,CAAC;AAE7C;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAIlF;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;CACxC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CA2C7B"}
1
+ {"version":3,"file":"writer.utils.d.ts","sourceRoot":"","sources":["../../../src/metrics/utils/writer.utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAGhD;;GAEG;AACH,eAAO,MAAM,mBAAmB,YAAY,CAAC;AAE7C;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAIlF;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,0CAA0C;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;IACvC,6FAA6F;IAC7F,YAAY,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CA0D7B"}
@@ -4,6 +4,7 @@
4
4
  */
5
5
  import { writeFile, mkdir } from 'node:fs/promises';
6
6
  import { join, dirname } from 'node:path';
7
+ import { generateMetricsHtml } from './html-report.utils.js';
7
8
  /**
8
9
  * Default metrics output directory (relative to cache dir).
9
10
  */
@@ -21,12 +22,12 @@ export function generateMetricsFilename(command, timestamp) {
21
22
  return `${command}-${safeTimestamp}.json`;
22
23
  }
23
24
  /**
24
- * Write build metrics to a JSON file.
25
+ * Write build metrics to a JSON file and optionally an HTML report.
25
26
  * Degrades gracefully on failure - logs warning but doesn't throw.
26
27
  *
27
28
  * @param metrics - The metrics to write
28
29
  * @param options - Write options
29
- * @returns Result indicating success/failure and path
30
+ * @returns Result indicating success/failure and paths
30
31
  *
31
32
  * @example
32
33
  * ```typescript
@@ -36,6 +37,7 @@ export function generateMetricsFilename(command, timestamp) {
36
37
  *
37
38
  * if (result.success) {
38
39
  * console.log(`Metrics written to ${result.path}`);
40
+ * console.log(`HTML report: ${result.htmlPath}`);
39
41
  * }
40
42
  * ```
41
43
  */
@@ -64,12 +66,26 @@ export async function writeMetrics(metrics, options) {
64
66
  // JSON: pretty printed for readability
65
67
  content = JSON.stringify(metrics, null, 2) + '\n';
66
68
  }
67
- // Write file
69
+ // Write JSON file
68
70
  await writeFile(outputPath, content, 'utf-8');
69
- return {
71
+ const result = {
70
72
  success: true,
71
73
  path: outputPath,
72
74
  };
75
+ // Generate HTML report if explicitly enabled
76
+ const shouldGenerateHtml = options.generateHtml === true;
77
+ if (shouldGenerateHtml) {
78
+ try {
79
+ const htmlPath = outputPath.replace(/\.json$/, '.html');
80
+ const htmlContent = generateMetricsHtml(metrics);
81
+ await writeFile(htmlPath, htmlContent, 'utf-8');
82
+ result.htmlPath = htmlPath;
83
+ }
84
+ catch {
85
+ // HTML generation failure is non-critical, don't fail the whole operation
86
+ }
87
+ }
88
+ return result;
73
89
  }
74
90
  catch (error) {
75
91
  // Graceful degradation - don't throw, just report failure
@@ -70,15 +70,7 @@ export interface SearchablePage {
70
70
  * @returns SearchIndex object
71
71
  */
72
72
  export declare function generateSearchIndex(searchablePages: SearchablePage[], config: SearchConfig): SearchIndex;
73
- /**
74
- * Writes the search index to a JSON file.
75
- *
76
- * @param searchIndex - The search index to write
77
- * @param outDir - Output directory path
78
- * @param filename - Pre-computed filename (from computeSearchIndexFilename)
79
- * @returns Metadata about the written search index
80
- */
81
- export declare function writeSearchIndex(searchIndex: SearchIndex, outDir: string, filename: string): Promise<SearchIndexMetadata>;
73
+ export declare function writeSearchIndex(searchIndex: SearchIndex, outDir: string, filename: string, skipIfUnchanged?: boolean): Promise<SearchIndexMetadata>;
82
74
  /**
83
75
  * Computes the search index filename based on configuration.
84
76
  * When hashFilename is true, generates a deterministic hash based on the build ID.
@@ -1 +1 @@
1
- {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/search/generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACd,WAAW,EACX,mBAAmB,EACpB,MAAM,oBAAoB,CAAC;AAE5B;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAuBtE;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CA0CtD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,QAAQ,EAAE,EACf,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,EACnC,MAAM,EAAE,YAAY,GACnB,cAAc,EAAE,CAiGlB;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAsBhF;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,mCAAmC;IACnC,IAAI,EAAE,SAAS,CAAC;IAChB,oEAAoE;IACpE,GAAG,EAAE,QAAQ,EAAE,CAAC;IAChB,kDAAkD;IAClD,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,eAAe,EAAE,cAAc,EAAE,EACjC,MAAM,EAAE,YAAY,GACnB,WAAW,CA6Bb;AAED;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,mBAAmB,CAAC,CAgB9B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAczF"}
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/search/generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACd,WAAW,EACX,mBAAmB,EACpB,MAAM,oBAAoB,CAAC;AAE5B;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAuBtE;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CA0CtD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,QAAQ,EAAE,EACf,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,EACnC,MAAM,EAAE,YAAY,GACnB,cAAc,EAAE,CAiGlB;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAsBhF;AAED;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,mCAAmC;IACnC,IAAI,EAAE,SAAS,CAAC;IAChB,oEAAoE;IACpE,GAAG,EAAE,QAAQ,EAAE,CAAC;IAChB,kDAAkD;IAClD,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,eAAe,EAAE,cAAc,EAAE,EACjC,MAAM,EAAE,YAAY,GACnB,WAAW,CA6Bb;AAiBD,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,eAAe,UAAQ,GACtB,OAAO,CAAC,mBAAmB,CAAC,CAqC9B;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAczF"}
@@ -225,15 +225,39 @@ export function generateSearchIndex(searchablePages, config) {
225
225
  }
226
226
  /**
227
227
  * Writes the search index to a JSON file.
228
+ * Skips write if content hasn't changed (dev mode optimization).
228
229
  *
229
230
  * @param searchIndex - The search index to write
230
231
  * @param outDir - Output directory path
231
232
  * @param filename - Pre-computed filename (from computeSearchIndexFilename)
233
+ * @param skipIfUnchanged - If true, skip write when document count matches previous
232
234
  * @returns Metadata about the written search index
233
235
  */
234
- export async function writeSearchIndex(searchIndex, outDir, filename) {
235
- // Serialize index
236
+ // Cache for search index state (dev mode optimization)
237
+ let lastSearchIndexDocCount = null;
238
+ let lastSearchIndexContentHash = null;
239
+ export async function writeSearchIndex(searchIndex, outDir, filename, skipIfUnchanged = false) {
240
+ // Serialize full index for hash computation and potential write
236
241
  const content = JSON.stringify(searchIndex, null, 0);
242
+ // Skip write if content hash hasn't changed (dev mode optimization)
243
+ // Uses fast MD5 hash to detect actual content changes, not just count
244
+ if (skipIfUnchanged && lastSearchIndexDocCount === searchIndex.documentCount) {
245
+ const contentHash = generateContentHash(content);
246
+ if (contentHash === lastSearchIndexContentHash) {
247
+ return {
248
+ enabled: true,
249
+ indexPath: `/${filename}`,
250
+ documentCount: searchIndex.documentCount,
251
+ };
252
+ }
253
+ // Count matched but content changed - update hash and proceed to write
254
+ lastSearchIndexContentHash = contentHash;
255
+ }
256
+ // Update cached state
257
+ lastSearchIndexDocCount = searchIndex.documentCount;
258
+ if (skipIfUnchanged && !lastSearchIndexContentHash) {
259
+ lastSearchIndexContentHash = generateContentHash(content);
260
+ }
237
261
  // Ensure output directory exists
238
262
  await ensureDir(outDir);
239
263
  // Write the file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stati/core",
3
- "version": "1.21.0",
3
+ "version": "1.22.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",