@stati/core 1.1.0 → 1.2.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/README.md +19 -7
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +24 -2
- package/dist/core/build.d.ts +2 -0
- package/dist/core/build.d.ts.map +1 -1
- package/dist/core/build.js +120 -27
- package/dist/core/dev.d.ts.map +1 -1
- package/dist/core/dev.js +84 -18
- package/dist/core/invalidate.d.ts +67 -1
- package/dist/core/invalidate.d.ts.map +1 -1
- package/dist/core/invalidate.js +321 -4
- package/dist/core/isg/build-lock.d.ts +116 -0
- package/dist/core/isg/build-lock.d.ts.map +1 -0
- package/dist/core/isg/build-lock.js +243 -0
- package/dist/core/isg/builder.d.ts +51 -0
- package/dist/core/isg/builder.d.ts.map +1 -0
- package/dist/core/isg/builder.js +321 -0
- package/dist/core/isg/deps.d.ts +63 -0
- package/dist/core/isg/deps.d.ts.map +1 -0
- package/dist/core/isg/deps.js +332 -0
- package/dist/core/isg/hash.d.ts +48 -0
- package/dist/core/isg/hash.d.ts.map +1 -0
- package/dist/core/isg/hash.js +82 -0
- package/dist/core/isg/manifest.d.ts +47 -0
- package/dist/core/isg/manifest.d.ts.map +1 -0
- package/dist/core/isg/manifest.js +233 -0
- package/dist/core/isg/ttl.d.ts +101 -0
- package/dist/core/isg/ttl.d.ts.map +1 -0
- package/dist/core/isg/ttl.js +222 -0
- package/dist/core/isg/validation.d.ts +71 -0
- package/dist/core/isg/validation.d.ts.map +1 -0
- package/dist/core/isg/validation.js +226 -0
- package/dist/core/templates.d.ts.map +1 -1
- package/dist/core/templates.js +3 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/types.d.ts +110 -20
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error codes for ISG validation failures.
|
|
3
|
+
* These provide structured error identification for better debugging.
|
|
4
|
+
*/
|
|
5
|
+
export var ISGValidationError;
|
|
6
|
+
(function (ISGValidationError) {
|
|
7
|
+
ISGValidationError["INVALID_TTL"] = "ISG_INVALID_TTL";
|
|
8
|
+
ISGValidationError["INVALID_MAX_AGE_CAP"] = "ISG_INVALID_MAX_AGE_CAP";
|
|
9
|
+
ISGValidationError["INVALID_AGING_RULE"] = "ISG_INVALID_AGING_RULE";
|
|
10
|
+
ISGValidationError["DUPLICATE_AGING_RULE"] = "ISG_DUPLICATE_AGING_RULE";
|
|
11
|
+
ISGValidationError["UNSORTED_AGING_RULES"] = "ISG_UNSORTED_AGING_RULES";
|
|
12
|
+
ISGValidationError["AGING_RULE_EXCEEDS_CAP"] = "ISG_AGING_RULE_EXCEEDS_CAP";
|
|
13
|
+
})(ISGValidationError || (ISGValidationError = {}));
|
|
14
|
+
/**
|
|
15
|
+
* Represents a validation error with context and actionable message.
|
|
16
|
+
*/
|
|
17
|
+
export class ISGConfigurationError extends Error {
|
|
18
|
+
code;
|
|
19
|
+
field;
|
|
20
|
+
value;
|
|
21
|
+
constructor(code, field, value, message) {
|
|
22
|
+
super(message);
|
|
23
|
+
this.code = code;
|
|
24
|
+
this.field = field;
|
|
25
|
+
this.value = value;
|
|
26
|
+
this.name = 'ISGConfigurationError';
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Validates ISG configuration and provides actionable error messages.
|
|
31
|
+
* Throws ISGConfigurationError for invalid configurations.
|
|
32
|
+
*
|
|
33
|
+
* @param config - ISG configuration to validate
|
|
34
|
+
* @throws {ISGConfigurationError} When configuration is invalid
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```typescript
|
|
38
|
+
* try {
|
|
39
|
+
* validateISGConfig(userConfig.isg);
|
|
40
|
+
* } catch (error) {
|
|
41
|
+
* if (error instanceof ISGConfigurationError) {
|
|
42
|
+
* console.error(`${error.code}: ${error.message}`);
|
|
43
|
+
* console.error(`Field: ${error.field}, Value: ${error.value}`);
|
|
44
|
+
* }
|
|
45
|
+
* }
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export function validateISGConfig(config) {
|
|
49
|
+
if (!config) {
|
|
50
|
+
return; // Config is optional
|
|
51
|
+
}
|
|
52
|
+
// Validate TTL seconds
|
|
53
|
+
if (config.ttlSeconds !== undefined) {
|
|
54
|
+
validateTTLSeconds(config.ttlSeconds);
|
|
55
|
+
}
|
|
56
|
+
// Validate max age cap
|
|
57
|
+
if (config.maxAgeCapDays !== undefined) {
|
|
58
|
+
validateMaxAgeCapDays(config.maxAgeCapDays);
|
|
59
|
+
}
|
|
60
|
+
// Validate aging rules
|
|
61
|
+
if (config.aging && Array.isArray(config.aging)) {
|
|
62
|
+
validateAgingRules(config.aging, config.maxAgeCapDays);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Validates TTL seconds value.
|
|
67
|
+
*/
|
|
68
|
+
function validateTTLSeconds(ttlSeconds) {
|
|
69
|
+
if (typeof ttlSeconds !== 'number' || !Number.isInteger(ttlSeconds)) {
|
|
70
|
+
throw new ISGConfigurationError(ISGValidationError.INVALID_TTL, 'ttlSeconds', ttlSeconds, 'ttlSeconds must be a positive integer representing seconds. Example: 3600 (1 hour)');
|
|
71
|
+
}
|
|
72
|
+
if (ttlSeconds < 0) {
|
|
73
|
+
throw new ISGConfigurationError(ISGValidationError.INVALID_TTL, 'ttlSeconds', ttlSeconds, 'ttlSeconds cannot be negative. Use 0 for immediate expiration or a positive value.');
|
|
74
|
+
}
|
|
75
|
+
if (ttlSeconds > 365 * 24 * 3600) {
|
|
76
|
+
// More than 1 year
|
|
77
|
+
throw new ISGConfigurationError(ISGValidationError.INVALID_TTL, 'ttlSeconds', ttlSeconds, 'ttlSeconds is unusually large (>1 year). Consider using maxAgeCapDays for long-term caching.');
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Validates max age cap days value.
|
|
82
|
+
*/
|
|
83
|
+
function validateMaxAgeCapDays(maxAgeCapDays) {
|
|
84
|
+
if (typeof maxAgeCapDays !== 'number' || !Number.isInteger(maxAgeCapDays)) {
|
|
85
|
+
throw new ISGConfigurationError(ISGValidationError.INVALID_MAX_AGE_CAP, 'maxAgeCapDays', maxAgeCapDays, 'maxAgeCapDays must be a positive integer representing days. Example: 365 (1 year)');
|
|
86
|
+
}
|
|
87
|
+
if (maxAgeCapDays <= 0) {
|
|
88
|
+
throw new ISGConfigurationError(ISGValidationError.INVALID_MAX_AGE_CAP, 'maxAgeCapDays', maxAgeCapDays, 'maxAgeCapDays must be positive. Use a value like 30, 90, or 365 days.');
|
|
89
|
+
}
|
|
90
|
+
if (maxAgeCapDays > 3650) {
|
|
91
|
+
// More than 10 years
|
|
92
|
+
throw new ISGConfigurationError(ISGValidationError.INVALID_MAX_AGE_CAP, 'maxAgeCapDays', maxAgeCapDays, 'maxAgeCapDays is unusually large (>10 years). Consider if this is intended.');
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Validates aging rules array.
|
|
97
|
+
*/
|
|
98
|
+
function validateAgingRules(aging, maxAgeCapDays) {
|
|
99
|
+
const seenUntilDays = new Set();
|
|
100
|
+
for (let i = 0; i < aging.length; i++) {
|
|
101
|
+
const rule = aging[i];
|
|
102
|
+
// Skip invalid entries
|
|
103
|
+
if (!rule) {
|
|
104
|
+
throw new ISGConfigurationError(ISGValidationError.INVALID_AGING_RULE, `aging[${i}]`, rule, `Aging rule at index ${i} is null or undefined.`);
|
|
105
|
+
}
|
|
106
|
+
// Validate individual rule
|
|
107
|
+
validateAgingRule(rule, i);
|
|
108
|
+
// Check for duplicates
|
|
109
|
+
if (seenUntilDays.has(rule.untilDays)) {
|
|
110
|
+
throw new ISGConfigurationError(ISGValidationError.DUPLICATE_AGING_RULE, `aging[${i}].untilDays`, rule.untilDays, `Duplicate aging rule for ${rule.untilDays} days. Each untilDays value must be unique.`);
|
|
111
|
+
}
|
|
112
|
+
seenUntilDays.add(rule.untilDays);
|
|
113
|
+
// Check if rule exceeds max age cap
|
|
114
|
+
if (maxAgeCapDays !== undefined && rule.untilDays > maxAgeCapDays) {
|
|
115
|
+
throw new ISGConfigurationError(ISGValidationError.AGING_RULE_EXCEEDS_CAP, `aging[${i}].untilDays`, rule.untilDays, `Aging rule for ${rule.untilDays} days exceeds maxAgeCapDays (${maxAgeCapDays}). Rule will never be used.`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Check if rules are sorted by untilDays (ascending)
|
|
119
|
+
const sortedRules = [...aging].sort((a, b) => a.untilDays - b.untilDays);
|
|
120
|
+
for (let i = 0; i < aging.length; i++) {
|
|
121
|
+
if (aging[i]?.untilDays !== sortedRules[i]?.untilDays) {
|
|
122
|
+
throw new ISGConfigurationError(ISGValidationError.UNSORTED_AGING_RULES, 'aging', aging.map((r) => r.untilDays), 'Aging rules must be sorted by untilDays in ascending order. Sort rules from shortest to longest duration.');
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Validates a single aging rule.
|
|
128
|
+
*/
|
|
129
|
+
function validateAgingRule(rule, index) {
|
|
130
|
+
if (!rule || typeof rule !== 'object') {
|
|
131
|
+
throw new ISGConfigurationError(ISGValidationError.INVALID_AGING_RULE, `aging[${index}]`, rule, 'Aging rule must be an object with untilDays and ttlSeconds properties.');
|
|
132
|
+
}
|
|
133
|
+
// Validate untilDays
|
|
134
|
+
if (typeof rule.untilDays !== 'number' ||
|
|
135
|
+
!Number.isInteger(rule.untilDays) ||
|
|
136
|
+
rule.untilDays <= 0) {
|
|
137
|
+
throw new ISGConfigurationError(ISGValidationError.INVALID_AGING_RULE, `aging[${index}].untilDays`, rule.untilDays, 'untilDays must be a positive integer representing days. Example: 7, 30, 90');
|
|
138
|
+
}
|
|
139
|
+
// Validate ttlSeconds
|
|
140
|
+
if (typeof rule.ttlSeconds !== 'number' ||
|
|
141
|
+
!Number.isInteger(rule.ttlSeconds) ||
|
|
142
|
+
rule.ttlSeconds < 0) {
|
|
143
|
+
throw new ISGConfigurationError(ISGValidationError.INVALID_AGING_RULE, `aging[${index}].ttlSeconds`, rule.ttlSeconds, 'ttlSeconds must be a non-negative integer representing seconds. Example: 3600 (1 hour)');
|
|
144
|
+
}
|
|
145
|
+
// Warn about unusually long TTL in aging rules
|
|
146
|
+
if (rule.ttlSeconds > 30 * 24 * 3600) {
|
|
147
|
+
// More than 30 days
|
|
148
|
+
throw new ISGConfigurationError(ISGValidationError.INVALID_AGING_RULE, `aging[${index}].ttlSeconds`, rule.ttlSeconds, `ttlSeconds in aging rule is unusually large (>30 days). Consider if this is intended for content up to ${rule.untilDays} days old.`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Validates front-matter ISG overrides for a single page.
|
|
153
|
+
* Provides helpful error messages for invalid page-level configuration.
|
|
154
|
+
*
|
|
155
|
+
* @param frontMatter - Page front-matter object
|
|
156
|
+
* @param sourcePath - Path to source file for error context
|
|
157
|
+
* @throws {ISGConfigurationError} When front-matter overrides are invalid
|
|
158
|
+
*
|
|
159
|
+
* @example
|
|
160
|
+
* ```typescript
|
|
161
|
+
* try {
|
|
162
|
+
* validatePageISGOverrides(page.frontMatter, page.sourcePath);
|
|
163
|
+
* } catch (error) {
|
|
164
|
+
* console.error(`Error in ${page.sourcePath}: ${error.message}`);
|
|
165
|
+
* }
|
|
166
|
+
* ```
|
|
167
|
+
*/
|
|
168
|
+
export function validatePageISGOverrides(frontMatter, sourcePath) {
|
|
169
|
+
// Validate page-level ttlSeconds override
|
|
170
|
+
if (frontMatter.ttlSeconds !== undefined) {
|
|
171
|
+
if (typeof frontMatter.ttlSeconds !== 'number' ||
|
|
172
|
+
!Number.isInteger(frontMatter.ttlSeconds) ||
|
|
173
|
+
frontMatter.ttlSeconds < 0) {
|
|
174
|
+
throw new ISGConfigurationError(ISGValidationError.INVALID_TTL, 'ttlSeconds', frontMatter.ttlSeconds, `Invalid ttlSeconds in front-matter of ${sourcePath}. Must be a non-negative integer.`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// Validate page-level maxAgeCapDays override
|
|
178
|
+
if (frontMatter.maxAgeCapDays !== undefined) {
|
|
179
|
+
if (typeof frontMatter.maxAgeCapDays !== 'number' ||
|
|
180
|
+
!Number.isInteger(frontMatter.maxAgeCapDays) ||
|
|
181
|
+
frontMatter.maxAgeCapDays <= 0) {
|
|
182
|
+
throw new ISGConfigurationError(ISGValidationError.INVALID_MAX_AGE_CAP, 'maxAgeCapDays', frontMatter.maxAgeCapDays, `Invalid maxAgeCapDays in front-matter of ${sourcePath}. Must be a positive integer.`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
// Validate tags array
|
|
186
|
+
if (frontMatter.tags !== undefined) {
|
|
187
|
+
if (!Array.isArray(frontMatter.tags)) {
|
|
188
|
+
throw new ISGConfigurationError(ISGValidationError.INVALID_AGING_RULE, // Reusing closest error code
|
|
189
|
+
'tags', frontMatter.tags, `Invalid tags in front-matter of ${sourcePath}. Must be an array of strings.`);
|
|
190
|
+
}
|
|
191
|
+
// Check that all tags are strings
|
|
192
|
+
frontMatter.tags.forEach((tag, index) => {
|
|
193
|
+
if (typeof tag !== 'string') {
|
|
194
|
+
throw new ISGConfigurationError(ISGValidationError.INVALID_AGING_RULE, `tags[${index}]`, tag, `Invalid tag at index ${index} in front-matter of ${sourcePath}. All tags must be strings.`);
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Safely extracts numeric value from front-matter with validation.
|
|
201
|
+
* Used for TTL and max age cap overrides.
|
|
202
|
+
*
|
|
203
|
+
* @param value - Value from front-matter
|
|
204
|
+
* @param fieldName - Name of the field for error messages
|
|
205
|
+
* @param sourcePath - Source file path for error context
|
|
206
|
+
* @returns Validated number or undefined if not set
|
|
207
|
+
*/
|
|
208
|
+
export function extractNumericOverride(value, fieldName, sourcePath) {
|
|
209
|
+
if (value === undefined || value === null) {
|
|
210
|
+
return undefined;
|
|
211
|
+
}
|
|
212
|
+
if (typeof value === 'number') {
|
|
213
|
+
if (!Number.isFinite(value) || value < 0) {
|
|
214
|
+
throw new ISGConfigurationError(ISGValidationError.INVALID_TTL, fieldName, value, `Invalid ${fieldName} in ${sourcePath}: must be a non-negative finite number.`);
|
|
215
|
+
}
|
|
216
|
+
return Math.floor(value); // Ensure integer
|
|
217
|
+
}
|
|
218
|
+
if (typeof value === 'string') {
|
|
219
|
+
const parsed = parseInt(value, 10);
|
|
220
|
+
if (Number.isNaN(parsed) || parsed < 0) {
|
|
221
|
+
throw new ISGConfigurationError(ISGValidationError.INVALID_TTL, fieldName, value, `Invalid ${fieldName} in ${sourcePath}: "${value}" is not a valid non-negative number.`);
|
|
222
|
+
}
|
|
223
|
+
return parsed;
|
|
224
|
+
}
|
|
225
|
+
throw new ISGConfigurationError(ISGValidationError.INVALID_TTL, fieldName, value, `Invalid ${fieldName} in ${sourcePath}: must be a number or numeric string.`);
|
|
226
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/core/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/core/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAM1B,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAkB,MAAM,aAAa,CAAC;AAgRnF,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,GAAG,CAS7D;AAED,wBAAsB,UAAU,CAC9B,IAAI,EAAE,SAAS,EACf,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,WAAW,EACnB,GAAG,EAAE,GAAG,EACR,UAAU,CAAC,EAAE,OAAO,EAAE,EACtB,QAAQ,CAAC,EAAE,SAAS,EAAE,GACrB,OAAO,CAAC,MAAM,CAAC,CAkEjB"}
|
package/dist/core/templates.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Eta } from 'eta';
|
|
2
2
|
import { join, dirname, relative, basename } from 'path';
|
|
3
|
+
import { posix } from 'path';
|
|
3
4
|
import fse from 'fs-extra';
|
|
4
5
|
const { pathExists } = fse;
|
|
5
6
|
import glob from 'fast-glob';
|
|
@@ -216,7 +217,7 @@ async function discoverLayout(pagePath, config, explicitLayout, isIndexPage) {
|
|
|
216
217
|
if (await pathExists(indexLayoutPath)) {
|
|
217
218
|
// Return relative path with forward slashes for Eta
|
|
218
219
|
const relativePath = dir ? `${dir}/index.eta` : 'index.eta';
|
|
219
|
-
return
|
|
220
|
+
return posix.normalize(relativePath);
|
|
220
221
|
}
|
|
221
222
|
}
|
|
222
223
|
// Then check for layout.eta as fallback
|
|
@@ -224,7 +225,7 @@ async function discoverLayout(pagePath, config, explicitLayout, isIndexPage) {
|
|
|
224
225
|
if (await pathExists(layoutPath)) {
|
|
225
226
|
// Return relative path with forward slashes for Eta
|
|
226
227
|
const relativePath = dir ? `${dir}/layout.eta` : 'layout.eta';
|
|
227
|
-
return
|
|
228
|
+
return posix.normalize(relativePath);
|
|
228
229
|
}
|
|
229
230
|
}
|
|
230
231
|
return null;
|
package/dist/index.d.ts
CHANGED
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
export type { StatiConfig, PageModel, FrontMatter, BuildContext, PageContext, BuildHooks, NavNode, ISGConfig, AgingRule, BuildStats, } from './types.js';
|
|
23
23
|
export type { BuildOptions } from './core/build.js';
|
|
24
24
|
export type { DevServerOptions } from './core/dev.js';
|
|
25
|
+
export type { InvalidationResult } from './core/invalidate.js';
|
|
25
26
|
export { build } from './core/build.js';
|
|
26
27
|
export { createDevServer } from './core/dev.js';
|
|
27
28
|
export { loadConfig } from './config/loader.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,YAAY,EACV,WAAW,EACX,SAAS,EACT,WAAW,EACX,YAAY,EACZ,WAAW,EACX,UAAU,EACV,OAAO,EACP,SAAS,EACT,SAAS,EACT,UAAU,GACX,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,YAAY,EACV,WAAW,EACX,SAAS,EACT,WAAW,EACX,YAAY,EACZ,WAAW,EACX,UAAU,EACV,OAAO,EACP,SAAS,EACT,SAAS,EACT,UAAU,GACX,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,YAAY,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGlD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,CAE7D"}
|
package/dist/types.d.ts
CHANGED
|
@@ -44,6 +44,60 @@ export interface ISGConfig {
|
|
|
44
44
|
/** Array of aging rules for progressive cache extension */
|
|
45
45
|
aging?: AgingRule[];
|
|
46
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Cache entry for a single page in the ISG cache manifest.
|
|
49
|
+
* Contains all information needed to determine if a page needs rebuilding.
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```typescript
|
|
53
|
+
* const entry: CacheEntry = {
|
|
54
|
+
* path: '/blog/my-post/index.html',
|
|
55
|
+
* inputsHash: 'sha256-abc123...',
|
|
56
|
+
* deps: ['/site/_layouts/post.eta', '/site/_partials/header.eta'],
|
|
57
|
+
* tags: ['blog', 'tutorial'],
|
|
58
|
+
* publishedAt: '2024-01-01T00:00:00.000Z',
|
|
59
|
+
* renderedAt: '2024-01-15T10:30:00.000Z',
|
|
60
|
+
* ttlSeconds: 21600,
|
|
61
|
+
* maxAgeCapDays: 365
|
|
62
|
+
* };
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export interface CacheEntry {
|
|
66
|
+
/** Output path of the rendered page */
|
|
67
|
+
path: string;
|
|
68
|
+
/** Hash of page content and all dependencies */
|
|
69
|
+
inputsHash: string;
|
|
70
|
+
/** Array of file paths this page depends on (templates, partials) */
|
|
71
|
+
deps: string[];
|
|
72
|
+
/** Tags for invalidation and organization */
|
|
73
|
+
tags: string[];
|
|
74
|
+
/** ISO date when content was originally published */
|
|
75
|
+
publishedAt?: string;
|
|
76
|
+
/** ISO date when page was last rendered */
|
|
77
|
+
renderedAt: string;
|
|
78
|
+
/** Effective TTL for this page in seconds */
|
|
79
|
+
ttlSeconds: number;
|
|
80
|
+
/** Maximum age cap for this page in days */
|
|
81
|
+
maxAgeCapDays?: number;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* ISG cache manifest containing all cached page entries.
|
|
85
|
+
* Persisted as JSON in .stati/cache/manifest.json
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* ```typescript
|
|
89
|
+
* const manifest: CacheManifest = {
|
|
90
|
+
* entries: {
|
|
91
|
+
* '/blog/post-1': { ... },
|
|
92
|
+
* '/about': { ... }
|
|
93
|
+
* }
|
|
94
|
+
* };
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
export interface CacheManifest {
|
|
98
|
+
/** Map of page URLs to their cache entries */
|
|
99
|
+
entries: Record<string, CacheEntry>;
|
|
100
|
+
}
|
|
47
101
|
/**
|
|
48
102
|
* Site-wide configuration settings.
|
|
49
103
|
* Contains global metadata and URL configuration for the static site.
|
|
@@ -269,26 +323,50 @@ export interface PageModel {
|
|
|
269
323
|
publishedAt?: Date;
|
|
270
324
|
}
|
|
271
325
|
/**
|
|
272
|
-
* Logger interface for customizing build output.
|
|
273
|
-
* Provides
|
|
326
|
+
* Logger interface for customizing build output and visualization.
|
|
327
|
+
* Provides comprehensive logging capabilities including basic log levels, build progress tracking,
|
|
328
|
+
* file operations, statistics display, and advanced tree-based rendering visualization.
|
|
274
329
|
*
|
|
275
|
-
*
|
|
330
|
+
* Core Methods (Required):
|
|
331
|
+
* - Basic logging: info, success, warning, error
|
|
332
|
+
* - Build progress: building, processing, stats
|
|
333
|
+
*
|
|
334
|
+
* Enhanced Methods (Optional):
|
|
335
|
+
* - Visual formatting: header, step, progress, divider
|
|
336
|
+
* - File operations: file, url, timing
|
|
337
|
+
* - Statistics: statsTable, navigationTree
|
|
338
|
+
* - Tree visualization: startRenderingTree, addTreeNode, updateTreeNode, showRenderingTree, clearRenderingTree
|
|
339
|
+
*
|
|
340
|
+
* @example Basic Logger Implementation
|
|
276
341
|
* ```typescript
|
|
277
|
-
* const
|
|
278
|
-
* info: (msg) => console.log(
|
|
279
|
-
* success: (msg) => console.log(
|
|
280
|
-
* warning: (msg) => console.warn(
|
|
281
|
-
* error: (msg) => console.error(
|
|
282
|
-
* building: (msg) => console.log(
|
|
283
|
-
* processing: (msg) => console.log(
|
|
284
|
-
* stats: (msg) => console.log(
|
|
342
|
+
* const basicLogger: Logger = {
|
|
343
|
+
* info: (msg) => console.log('\x1b[38;2;37;99;235mℹ️ ' + msg + '\x1b[0m'),
|
|
344
|
+
* success: (msg) => console.log('\x1b[38;2;22;163;74m✅ ' + msg + '\x1b[0m'),
|
|
345
|
+
* warning: (msg) => console.warn('\x1b[38;2;217;119;6m⚠️ ' + msg + '\x1b[0m'),
|
|
346
|
+
* error: (msg) => console.error('\x1b[38;2;220;38;38m❌ ' + msg + '\x1b[0m'),
|
|
347
|
+
* building: (msg) => console.log('\x1b[38;2;79;70;229m' + msg + '\x1b[0m'),
|
|
348
|
+
* processing: (msg) => console.log('\x1b[38;2;107;114;128m ' + msg + '\x1b[0m'),
|
|
349
|
+
* stats: (msg) => console.log('\x1b[38;2;8;145;178m📊 ' + msg + '\x1b[0m')
|
|
350
|
+
* };
|
|
351
|
+
* ```
|
|
352
|
+
*
|
|
353
|
+
* @example Enhanced Logger with Tree Visualization
|
|
354
|
+
* ```typescript
|
|
355
|
+
* const enhancedLogger: Logger = {
|
|
356
|
+
* // ... basic methods ...
|
|
285
357
|
* header: (msg) => console.log(boxedMessage(msg)),
|
|
286
358
|
* step: (step, total, msg) => console.log(`[${step}/${total}] ${msg}`),
|
|
287
359
|
* progress: (current, total, msg) => console.log(progressBar(current, total) + ' ' + msg),
|
|
288
360
|
* file: (op, path) => console.log(` 📄 ${op} ${path}`),
|
|
289
361
|
* url: (label, url) => console.log(` 🔗 ${label}: ${url}`),
|
|
290
362
|
* timing: (op, duration) => console.log(` ⏱️ ${op} completed in ${duration}ms`),
|
|
291
|
-
* divider: (title) => console.log('─'.repeat(50) + ' ' + title)
|
|
363
|
+
* divider: (title) => console.log('─'.repeat(50) + ' ' + title),
|
|
364
|
+
* statsTable: (stats) => displayStatsTable(stats),
|
|
365
|
+
* startRenderingTree: (label) => initTree(label),
|
|
366
|
+
* addTreeNode: (parentId, id, label, status, metadata) => addNode(parentId, id, label, status, metadata),
|
|
367
|
+
* updateTreeNode: (id, status, metadata) => updateNode(id, status, metadata),
|
|
368
|
+
* showRenderingTree: () => renderTree(),
|
|
369
|
+
* clearRenderingTree: () => clearTree()
|
|
292
370
|
* };
|
|
293
371
|
* ```
|
|
294
372
|
*/
|
|
@@ -321,14 +399,6 @@ export interface Logger {
|
|
|
321
399
|
timing?: (operation: string, duration: number) => void;
|
|
322
400
|
/** Display a section divider (optional) */
|
|
323
401
|
divider?: (title?: string) => void;
|
|
324
|
-
/** Start a spinner for long operations (optional) */
|
|
325
|
-
startSpinner?: (text: string, type?: 'building' | 'processing' | 'copying') => unknown;
|
|
326
|
-
/** Stop a spinner with success (optional) */
|
|
327
|
-
succeedSpinner?: (spinner: unknown, text?: string) => void;
|
|
328
|
-
/** Stop a spinner with failure (optional) */
|
|
329
|
-
failSpinner?: (spinner: unknown, text?: string) => void;
|
|
330
|
-
/** Update spinner text (optional) */
|
|
331
|
-
updateSpinner?: (spinner: unknown, text: string) => void;
|
|
332
402
|
/** Display build statistics as a table (optional) */
|
|
333
403
|
statsTable?: (stats: {
|
|
334
404
|
totalPages: number;
|
|
@@ -340,6 +410,26 @@ export interface Logger {
|
|
|
340
410
|
}) => void;
|
|
341
411
|
/** Display navigation tree structure (optional) */
|
|
342
412
|
navigationTree?: (navigation: NavNode[]) => void;
|
|
413
|
+
/** Initialize a rendering tree for build process visualization (optional) */
|
|
414
|
+
startRenderingTree?: (label: string) => void;
|
|
415
|
+
/** Add a step to the rendering tree (optional) */
|
|
416
|
+
addTreeNode?: (parentId: string, id: string, label: string, status?: 'pending' | 'running' | 'cached' | 'completed' | 'error', metadata?: {
|
|
417
|
+
timing?: number;
|
|
418
|
+
cacheHit?: boolean;
|
|
419
|
+
url?: string;
|
|
420
|
+
operation?: string;
|
|
421
|
+
}) => void;
|
|
422
|
+
/** Update a node in the rendering tree (optional) */
|
|
423
|
+
updateTreeNode?: (id: string, status: 'pending' | 'running' | 'cached' | 'completed' | 'error', metadata?: {
|
|
424
|
+
timing?: number;
|
|
425
|
+
cacheHit?: boolean;
|
|
426
|
+
url?: string;
|
|
427
|
+
operation?: string;
|
|
428
|
+
}) => void;
|
|
429
|
+
/** Render and display the current tree (optional) */
|
|
430
|
+
showRenderingTree?: () => void;
|
|
431
|
+
/** Clear the rendering tree (optional) */
|
|
432
|
+
clearRenderingTree?: () => void;
|
|
343
433
|
}
|
|
344
434
|
/**
|
|
345
435
|
* Statistics collected during the build process.
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|