@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.
- package/dist/config/loader.d.ts +4 -0
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +49 -4
- package/dist/core/build.d.ts +6 -0
- package/dist/core/build.d.ts.map +1 -1
- package/dist/core/build.js +134 -24
- package/dist/core/dev.d.ts.map +1 -1
- package/dist/core/dev.js +86 -19
- package/dist/core/isg/builder.d.ts +4 -1
- package/dist/core/isg/builder.d.ts.map +1 -1
- package/dist/core/isg/builder.js +89 -2
- package/dist/core/isg/deps.d.ts +5 -0
- package/dist/core/isg/deps.d.ts.map +1 -1
- package/dist/core/isg/deps.js +38 -3
- package/dist/core/isg/dev-server-lock.d.ts +85 -0
- package/dist/core/isg/dev-server-lock.d.ts.map +1 -0
- package/dist/core/isg/dev-server-lock.js +248 -0
- package/dist/core/isg/hash.d.ts +4 -0
- package/dist/core/isg/hash.d.ts.map +1 -1
- package/dist/core/isg/hash.js +24 -1
- package/dist/core/isg/index.d.ts +3 -2
- package/dist/core/isg/index.d.ts.map +1 -1
- package/dist/core/isg/index.js +3 -2
- package/dist/core/markdown.d.ts +6 -0
- package/dist/core/markdown.d.ts.map +1 -1
- package/dist/core/markdown.js +23 -0
- package/dist/core/templates.js +5 -5
- package/dist/core/utils/index.d.ts +1 -1
- package/dist/core/utils/index.d.ts.map +1 -1
- package/dist/core/utils/index.js +1 -1
- package/dist/core/utils/partial-validation.utils.js +2 -2
- package/dist/core/utils/paths.utils.d.ts +18 -0
- package/dist/core/utils/paths.utils.d.ts.map +1 -1
- package/dist/core/utils/paths.utils.js +23 -0
- package/dist/core/utils/tailwind-inventory.utils.d.ts +1 -16
- package/dist/core/utils/tailwind-inventory.utils.d.ts.map +1 -1
- package/dist/core/utils/tailwind-inventory.utils.js +35 -3
- package/dist/core/utils/typescript.utils.d.ts +9 -0
- package/dist/core/utils/typescript.utils.d.ts.map +1 -1
- package/dist/core/utils/typescript.utils.js +41 -0
- package/dist/env.d.ts +45 -0
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +51 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/metrics/index.d.ts +1 -1
- package/dist/metrics/index.d.ts.map +1 -1
- package/dist/metrics/index.js +2 -0
- package/dist/metrics/recorder.d.ts.map +1 -1
- package/dist/metrics/types.d.ts +31 -0
- package/dist/metrics/types.d.ts.map +1 -1
- package/dist/metrics/utils/html-report.utils.d.ts +24 -0
- package/dist/metrics/utils/html-report.utils.d.ts.map +1 -0
- package/dist/metrics/utils/html-report.utils.js +1547 -0
- package/dist/metrics/utils/index.d.ts +1 -0
- package/dist/metrics/utils/index.d.ts.map +1 -1
- package/dist/metrics/utils/index.js +2 -0
- package/dist/metrics/utils/writer.utils.d.ts +6 -2
- package/dist/metrics/utils/writer.utils.d.ts.map +1 -1
- package/dist/metrics/utils/writer.utils.js +20 -4
- package/dist/search/generator.d.ts +1 -9
- package/dist/search/generator.d.ts.map +1 -1
- package/dist/search/generator.js +26 -2
- 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
|
|
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;
|
|
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
|
|
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
|
-
|
|
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;
|
|
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"}
|
package/dist/search/generator.js
CHANGED
|
@@ -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
|
-
|
|
235
|
-
|
|
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
|