@stati/core 1.20.3 → 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 +176 -66
- package/dist/core/dev.d.ts.map +1 -1
- package/dist/core/dev.js +100 -28
- 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/preview.js +1 -1
- package/dist/core/templates.js +5 -5
- package/dist/core/utils/bundle-matching.utils.d.ts +2 -0
- package/dist/core/utils/bundle-matching.utils.d.ts.map +1 -1
- 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/logger.utils.d.ts.map +1 -1
- package/dist/core/utils/logger.utils.js +1 -0
- 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 +13 -0
- package/dist/core/utils/typescript.utils.d.ts.map +1 -1
- package/dist/core/utils/typescript.utils.js +82 -3
- 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/dist/seo/generator.d.ts.map +1 -1
- package/dist/seo/generator.js +1 -0
- package/dist/seo/utils/escape-and-validation.utils.d.ts.map +1 -1
- package/dist/seo/utils/escape-and-validation.utils.js +1 -16
- package/dist/types/logging.d.ts +31 -12
- package/dist/types/logging.d.ts.map +1 -1
- 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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/seo/generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAElE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAS7C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,CAsH3D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,EAAE,CAyE/D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,EAAE,CAuDjE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE;IACP,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB,EACD,IAAI,CAAC,EAAE,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,GAChC,MAAM,
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/seo/generator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAElE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAS7C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,CAsH3D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,EAAE,CAyE/D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,EAAE,CAuDjE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE;IACP,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB,EACD,IAAI,CAAC,EAAE,KAAK,CAAC,UAAU,GAAG,MAAM,CAAC,GAChC,MAAM,CA8CR"}
|
package/dist/seo/generator.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"escape-and-validation.utils.d.ts","sourceRoot":"","sources":["../../../src/seo/utils/escape-and-validation.utils.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"escape-and-validation.utils.d.ts","sourceRoot":"","sources":["../../../src/seo/utils/escape-and-validation.utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAgB,MAAM,wBAAwB,CAAC;AACxE,OAAO,KAAK,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAE1E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAUrD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA4B/C;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAU,EACjB,QAAQ,GAAE,MAAW,GACpB,OAAO,CA0CT;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CAiD9D;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,mBAAmB,CAwE3F;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,UAAU,CAAC,CAuCnE"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* SEO utility functions for HTML escaping, validation, and tag detection
|
|
3
3
|
*/
|
|
4
|
-
import { URL } from 'node:url';
|
|
5
4
|
import { SEOTagType as SEOTagTypeEnum } from '../../types/seo.js';
|
|
5
|
+
import { isValidUrl } from './url.utils.js';
|
|
6
6
|
/**
|
|
7
7
|
* HTML escape cache for performance optimization.
|
|
8
8
|
* Stores up to 1000 frequently used strings to avoid repeated escaping.
|
|
@@ -171,21 +171,6 @@ export function generateRobotsContent(seo) {
|
|
|
171
171
|
}
|
|
172
172
|
return directives.length > 0 ? directives.join(', ') : '';
|
|
173
173
|
}
|
|
174
|
-
/**
|
|
175
|
-
* Validate URL format (http or https only).
|
|
176
|
-
*
|
|
177
|
-
* @param url - The URL to validate
|
|
178
|
-
* @returns True if the URL is valid
|
|
179
|
-
*/
|
|
180
|
-
function isValidUrl(url) {
|
|
181
|
-
try {
|
|
182
|
-
const parsed = new URL(url);
|
|
183
|
-
return parsed.protocol === 'http:' || parsed.protocol === 'https:';
|
|
184
|
-
}
|
|
185
|
-
catch {
|
|
186
|
-
return false;
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
174
|
/**
|
|
190
175
|
* Validate SEO metadata before processing.
|
|
191
176
|
* Checks for common issues like invalid URLs, improper lengths, and malformed data.
|
package/dist/types/logging.d.ts
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* file operations, statistics display, and advanced tree-based rendering visualization.
|
|
8
8
|
*
|
|
9
9
|
* Core Methods (Required):
|
|
10
|
-
* - Basic logging: info, success, warning, error
|
|
10
|
+
* - Basic logging: info, success, warning, error, status
|
|
11
11
|
* - Build progress: building, processing, stats
|
|
12
12
|
*
|
|
13
13
|
* Enhanced Methods (Optional):
|
|
@@ -19,13 +19,14 @@
|
|
|
19
19
|
* @example Basic Logger Implementation
|
|
20
20
|
* ```typescript
|
|
21
21
|
* const basicLogger: Logger = {
|
|
22
|
-
* info: (msg) => console.log('\x1b[38;2;
|
|
23
|
-
* success: (msg) => console.log('\x1b[38;2;
|
|
24
|
-
* warning: (msg) => console.warn('\x1b[38;2;
|
|
25
|
-
* error: (msg) => console.error('\x1b[38;2;
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
22
|
+
* info: (msg) => console.log('\x1b[38;2;56;189;248m• ' + msg + '\x1b[0m'),
|
|
23
|
+
* success: (msg) => console.log('\x1b[38;2;34;197;94m✓ ' + msg + '\x1b[0m'),
|
|
24
|
+
* warning: (msg) => console.warn('\x1b[38;2;245;158;11m! ' + msg + '\x1b[0m'),
|
|
25
|
+
* error: (msg) => console.error('\x1b[38;2;239;68;68m× ' + msg + '\x1b[0m'),
|
|
26
|
+
* status: (msg) => console.log('\x1b[38;2;56;189;248m▸ ' + msg + '\x1b[0m'),
|
|
27
|
+
* building: (msg) => console.log('\x1b[38;2;56;189;248m' + msg + '\x1b[0m'),
|
|
28
|
+
* processing: (msg) => console.log('\x1b[38;2;148;163;184m ' + msg + '\x1b[0m'),
|
|
29
|
+
* stats: (msg) => console.log('\x1b[38;2;186;230;253m• ' + msg + '\x1b[0m')
|
|
29
30
|
* };
|
|
30
31
|
* ```
|
|
31
32
|
*
|
|
@@ -36,9 +37,9 @@
|
|
|
36
37
|
* header: (msg) => console.log(boxedMessage(msg)),
|
|
37
38
|
* step: (step, total, msg) => console.log(`[${step}/${total}] ${msg}`),
|
|
38
39
|
* progress: (current, total, msg) => console.log(progressBar(current, total) + ' ' + msg),
|
|
39
|
-
* file: (op, path) => console.log(`
|
|
40
|
-
* url: (label, url) => console.log(`
|
|
41
|
-
* timing: (op, duration) => console.log(`
|
|
40
|
+
* file: (op, path) => console.log(` + ${op} ${path}`),
|
|
41
|
+
* url: (label, url) => console.log(` ${label}: ${url}`),
|
|
42
|
+
* timing: (op, duration) => console.log(` ${op} completed in ${duration}ms`),
|
|
42
43
|
* divider: (title) => console.log('─'.repeat(50) + ' ' + title),
|
|
43
44
|
* statsTable: (stats) => displayStatsTable(stats),
|
|
44
45
|
* startRenderingTree: (label) => initTree(label),
|
|
@@ -58,6 +59,8 @@ export interface Logger {
|
|
|
58
59
|
warning: (message: string) => void;
|
|
59
60
|
/** Log error messages */
|
|
60
61
|
error: (message: string) => void;
|
|
62
|
+
/** Log status/meta messages with status indicator */
|
|
63
|
+
status: (message: string) => void;
|
|
61
64
|
/** Log build progress messages */
|
|
62
65
|
building: (message: string) => void;
|
|
63
66
|
/** Log file processing messages */
|
|
@@ -71,7 +74,7 @@ export interface Logger {
|
|
|
71
74
|
/** Display progress with a bar (optional) */
|
|
72
75
|
progress?: (current: number, total: number, message: string) => void;
|
|
73
76
|
/** Log file operations (optional) */
|
|
74
|
-
file?: (operation: string, path: string) => void;
|
|
77
|
+
file?: (operation: string, path: string, sizeInBytes?: number) => void;
|
|
75
78
|
/** Log URLs with proper styling (optional) */
|
|
76
79
|
url?: (label: string, url: string) => void;
|
|
77
80
|
/** Log timing information (optional) */
|
|
@@ -109,5 +112,21 @@ export interface Logger {
|
|
|
109
112
|
showRenderingTree?: () => void;
|
|
110
113
|
/** Clear the rendering tree (optional) */
|
|
111
114
|
clearRenderingTree?: () => void;
|
|
115
|
+
/** Initialize progress tracking for page rendering (optional) */
|
|
116
|
+
startProgress?: (totalPages: number) => void;
|
|
117
|
+
/**
|
|
118
|
+
* Update progress during page rendering (optional)
|
|
119
|
+
* @param status - 'cached' | 'rendered' | 'error'
|
|
120
|
+
* @param url - The URL of the page being processed
|
|
121
|
+
* @param timing - Render time in milliseconds (for rendered pages)
|
|
122
|
+
*/
|
|
123
|
+
updateProgress?: (status: 'cached' | 'rendered' | 'error', url: string, timing?: number) => void;
|
|
124
|
+
/** End progress tracking and prepare for summary (optional) */
|
|
125
|
+
endProgress?: () => void;
|
|
126
|
+
/**
|
|
127
|
+
* Display a summary of the rendering process (optional)
|
|
128
|
+
* Shows cached/rendered counts, slowest pages, and cache hit rate
|
|
129
|
+
*/
|
|
130
|
+
showRenderingSummary?: () => void;
|
|
112
131
|
}
|
|
113
132
|
//# sourceMappingURL=logging.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../src/types/logging.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH
|
|
1
|
+
{"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../src/types/logging.ts"],"names":[],"mappings":"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"}
|