@stati/core 1.0.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.
@@ -0,0 +1,371 @@
1
+ import type MarkdownIt from 'markdown-it';
2
+ /**
3
+ * Aging rule for Incremental Static Generation (ISG) cache management.
4
+ * Defines how cache TTL changes based on content age.
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * const rule: AgingRule = {
9
+ * untilDays: 7, // Apply this rule for content older than 7 days
10
+ * ttlSeconds: 86400 // Cache for 24 hours
11
+ * };
12
+ * ```
13
+ */
14
+ export interface AgingRule {
15
+ /** Number of days after which this aging rule applies */
16
+ untilDays: number;
17
+ /** Cache time-to-live in seconds for content matching this age */
18
+ ttlSeconds: number;
19
+ }
20
+ /**
21
+ * Configuration for Incremental Static Generation (ISG) caching.
22
+ * Enables smart caching strategies for static site generation.
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * const isgConfig: ISGConfig = {
27
+ * enabled: true,
28
+ * ttlSeconds: 3600, // Default 1 hour cache
29
+ * maxAgeCapDays: 30, // Max age for aging rules
30
+ * aging: [
31
+ * { untilDays: 7, ttlSeconds: 86400 }, // 1 day for week-old content
32
+ * { untilDays: 30, ttlSeconds: 604800 } // 1 week for month-old content
33
+ * ]
34
+ * };
35
+ * ```
36
+ */
37
+ export interface ISGConfig {
38
+ /** Whether ISG caching is enabled */
39
+ enabled?: boolean;
40
+ /** Default cache time-to-live in seconds */
41
+ ttlSeconds?: number;
42
+ /** Maximum age in days for applying aging rules */
43
+ maxAgeCapDays?: number;
44
+ /** Array of aging rules for progressive cache extension */
45
+ aging?: AgingRule[];
46
+ }
47
+ /**
48
+ * Site-wide configuration settings.
49
+ * Contains global metadata and URL configuration for the static site.
50
+ *
51
+ * @example
52
+ * ```typescript
53
+ * const siteConfig: SiteConfig = {
54
+ * title: "My Awesome Blog",
55
+ * baseUrl: "https://myblog.com",
56
+ * defaultLocale: "en-US"
57
+ * };
58
+ * ```
59
+ */
60
+ export interface SiteConfig {
61
+ /** The site's title, used in templates and metadata */
62
+ title: string;
63
+ /** Base URL for the site, used for absolute URL generation */
64
+ baseUrl: string;
65
+ /** Default locale for internationalization (optional) */
66
+ defaultLocale?: string;
67
+ }
68
+ /**
69
+ * Main configuration interface for Stati static site generator.
70
+ * Defines all options for site generation, including directories, templates, and features.
71
+ *
72
+ * @example
73
+ * ```typescript
74
+ * const config: StatiConfig = {
75
+ * srcDir: 'site',
76
+ * outDir: 'dist',
77
+ * staticDir: 'public',
78
+ * site: {
79
+ * title: 'My Blog',
80
+ * baseUrl: 'https://example.com'
81
+ * },
82
+ * markdown: {
83
+ * configure: (md) => md.use(somePlugin)
84
+ * }
85
+ * };
86
+ * ```
87
+ */
88
+ export interface StatiConfig {
89
+ /** Source directory for content files (default: 'site') */
90
+ srcDir?: string;
91
+ /** Output directory for generated site (default: 'dist') */
92
+ outDir?: string;
93
+ /** Directory for static assets (default: 'public') */
94
+ staticDir?: string;
95
+ /** Site-wide configuration */
96
+ site: SiteConfig;
97
+ /** Markdown processing configuration */
98
+ markdown?: {
99
+ /** Array of plugins to load - each item can be a string (plugin name) or [string, options] tuple */
100
+ plugins?: (string | [string, unknown])[];
101
+ /** Function to configure the MarkdownIt instance */
102
+ configure?: (md: MarkdownIt) => void;
103
+ };
104
+ /** Eta template engine configuration */
105
+ eta?: {
106
+ /** Custom template filters */
107
+ filters?: Record<string, (x: unknown) => unknown>;
108
+ };
109
+ /** Incremental Static Generation configuration */
110
+ isg?: ISGConfig;
111
+ /** Build lifecycle hooks */
112
+ hooks?: BuildHooks;
113
+ }
114
+ /**
115
+ * Build context passed to build lifecycle hooks.
116
+ * Contains the full configuration and all loaded pages.
117
+ *
118
+ * @example
119
+ * ```typescript
120
+ * const buildHook = async (ctx: BuildContext) => {
121
+ * console.log(`Building ${ctx.pages.length} pages`);
122
+ * console.log(`Output directory: ${ctx.config.outDir}`);
123
+ * };
124
+ * ```
125
+ */
126
+ export interface BuildContext {
127
+ /** The resolved Stati configuration */
128
+ config: StatiConfig;
129
+ /** Array of all loaded page models */
130
+ pages: PageModel[];
131
+ }
132
+ /**
133
+ * Page context passed to page-specific lifecycle hooks.
134
+ * Contains the current page being processed and site configuration.
135
+ *
136
+ * @example
137
+ * ```typescript
138
+ * const pageHook = async (ctx: PageContext) => {
139
+ * console.log(`Rendering page: ${ctx.page.slug}`);
140
+ * // Modify page content or metadata
141
+ * ctx.page.frontMatter.customField = 'processed';
142
+ * };
143
+ * ```
144
+ */
145
+ export interface PageContext {
146
+ /** The page model being processed */
147
+ page: PageModel;
148
+ /** The resolved Stati configuration */
149
+ config: StatiConfig;
150
+ }
151
+ /**
152
+ * Build lifecycle hooks for customizing the site generation process.
153
+ * Allows developers to inject custom logic at various stages of the build.
154
+ *
155
+ * @example
156
+ * ```typescript
157
+ * const hooks: BuildHooks = {
158
+ * beforeAll: async (ctx) => {
159
+ * console.log('Starting build...');
160
+ * },
161
+ * beforeRender: async (ctx) => {
162
+ * // Add custom data to page context
163
+ * ctx.page.frontMatter.buildTime = new Date().toISOString();
164
+ * },
165
+ * afterAll: async (ctx) => {
166
+ * console.log(`Build complete! Generated ${ctx.pages.length} pages.`);
167
+ * }
168
+ * };
169
+ * ```
170
+ */
171
+ export interface BuildHooks {
172
+ /** Called before starting the build process */
173
+ beforeAll?: (ctx: BuildContext) => Promise<void> | void;
174
+ /** Called after completing the build process */
175
+ afterAll?: (ctx: BuildContext) => Promise<void> | void;
176
+ /** Called before rendering each individual page */
177
+ /** Called before rendering each individual page */
178
+ beforeRender?: (ctx: PageContext) => Promise<void> | void;
179
+ /** Called after rendering each individual page */
180
+ afterRender?: (ctx: PageContext) => Promise<void> | void;
181
+ }
182
+ /**
183
+ * Collection aggregation data available to index page templates.
184
+ * Provides access to child pages and collection metadata for content listing.
185
+ */
186
+ export interface CollectionData {
187
+ /** All pages in the current collection */
188
+ pages: PageModel[];
189
+ /** Direct child pages of the collection */
190
+ children: PageModel[];
191
+ /** Recent pages sorted by publishedAt (most recent first) */
192
+ recentPages: PageModel[];
193
+ /** Pages grouped by tags for aggregation */
194
+ pagesByTag: Record<string, PageModel[]>;
195
+ /** Collection metadata */
196
+ metadata: {
197
+ /** Total number of pages in collection */
198
+ totalPages: number;
199
+ /** Whether collection has child pages */
200
+ hasChildren: boolean;
201
+ /** Path of the collection */
202
+ collectionPath: string;
203
+ /** Name of the collection (derived from path) */
204
+ collectionName: string;
205
+ };
206
+ }
207
+ /**
208
+ * Template rendering context passed to Eta layouts.
209
+ * Contains all data available to templates during rendering.
210
+ */
211
+ export interface TemplateContext {
212
+ /** Site configuration and metadata */
213
+ site: SiteConfig;
214
+ /** Current page data including frontmatter and content */
215
+ page: {
216
+ path: string;
217
+ content: string;
218
+ [key: string]: unknown;
219
+ };
220
+ /** Rendered markdown content */
221
+ content: string;
222
+ /** Site navigation tree */
223
+ navigation: NavNode[];
224
+ /** Discovered partials from underscore folders in hierarchy */
225
+ partials: Record<string, string>;
226
+ /** Collection data for index pages (only available on collection index pages) */
227
+ collection?: CollectionData;
228
+ }
229
+ /**
230
+ * Represents a single page in the static site.
231
+ * Contains all metadata, content, and URL information for a page.
232
+ *
233
+ * @example
234
+ * ```typescript
235
+ * const page: PageModel = {
236
+ * slug: 'my-first-post',
237
+ * url: '/blog/my-first-post',
238
+ * sourcePath: '/content/blog/my-first-post.md',
239
+ * frontMatter: {
240
+ * title: 'My First Post',
241
+ * tags: ['intro', 'blog']
242
+ * },
243
+ * content: '<p>Hello world!</p>',
244
+ * publishedAt: new Date('2024-01-01')
245
+ * };
246
+ * ```
247
+ */
248
+ export interface PageModel {
249
+ /** URL-friendly identifier for the page */
250
+ slug: string;
251
+ /** Full URL path for the page */
252
+ url: string;
253
+ /** Absolute path to the source content file */
254
+ sourcePath: string;
255
+ /** Parsed front matter metadata */
256
+ frontMatter: FrontMatter;
257
+ /** Rendered HTML content */
258
+ content: string;
259
+ /** Publication date (parsed from front matter or file stats) */
260
+ publishedAt?: Date;
261
+ }
262
+ /**
263
+ * Statistics collected during the build process.
264
+ * Provides useful metrics about the site generation.
265
+ *
266
+ * @example
267
+ * ```typescript
268
+ * const stats: BuildStats = {
269
+ * totalPages: 15,
270
+ * assetsCount: 8,
271
+ * buildTimeMs: 1250,
272
+ * outputSizeBytes: 2048576,
273
+ * cacheHits: 5,
274
+ * cacheMisses: 10
275
+ * };
276
+ * ```
277
+ */
278
+ export interface BuildStats {
279
+ /** Total number of pages processed */
280
+ totalPages: number;
281
+ /** Number of static assets copied */
282
+ assetsCount: number;
283
+ /** Total build time in milliseconds */
284
+ buildTimeMs: number;
285
+ /** Total size of output directory in bytes */
286
+ outputSizeBytes: number;
287
+ /** Number of cache hits (if caching enabled) */
288
+ cacheHits?: number;
289
+ /** Number of cache misses (if caching enabled) */
290
+ cacheMisses?: number;
291
+ }
292
+ /**
293
+ * Navigation node representing a page or collection in the site hierarchy.
294
+ * Provides structured navigation data for templates.
295
+ *
296
+ * @example
297
+ * ```typescript
298
+ * const navNode: NavNode = {
299
+ * title: 'Blog',
300
+ * url: '/blog',
301
+ * path: '/blog',
302
+ * order: 1,
303
+ * children: [
304
+ * {
305
+ * title: 'My First Post',
306
+ * url: '/blog/my-first-post',
307
+ * path: '/blog/my-first-post',
308
+ * order: 1,
309
+ * publishedAt: new Date('2024-01-01')
310
+ * }
311
+ * ]
312
+ * };
313
+ * ```
314
+ */
315
+ export interface NavNode {
316
+ /** Display title for the navigation item */
317
+ title: string;
318
+ /** URL path for the navigation item */
319
+ url: string;
320
+ /** File system path (for organizing hierarchy) */
321
+ path: string;
322
+ /** Numeric order for sorting */
323
+ order?: number;
324
+ /** Publication date for sorting */
325
+ publishedAt?: Date;
326
+ /** Child navigation nodes (for collections/directories) */
327
+ children?: NavNode[];
328
+ /** Whether this node represents a collection/directory */
329
+ isCollection?: boolean;
330
+ }
331
+ /**
332
+ * Front matter metadata extracted from content files.
333
+ * Contains page-specific configuration and metadata in YAML format.
334
+ *
335
+ * @example
336
+ * ```typescript
337
+ * const frontMatter: FrontMatter = {
338
+ * title: 'Getting Started with Stati',
339
+ * description: 'A comprehensive guide to static site generation',
340
+ * tags: ['tutorial', 'documentation'],
341
+ * layout: 'post',
342
+ * order: 1,
343
+ * publishedAt: '2024-01-01',
344
+ * ttlSeconds: 3600,
345
+ * draft: false
346
+ * };
347
+ * ```
348
+ */
349
+ export interface FrontMatter {
350
+ /** Page title for SEO and display */
351
+ title?: string;
352
+ /** Page description for SEO and meta tags */
353
+ description?: string;
354
+ /** Array of tags for categorization */
355
+ tags?: string[];
356
+ /** Template layout to use for rendering */
357
+ layout?: string;
358
+ /** Numeric order for sorting (useful for navigation) */
359
+ order?: number;
360
+ /** Publication date as ISO string */
361
+ publishedAt?: string;
362
+ /** Custom cache TTL in seconds (overrides global ISG settings) */
363
+ ttlSeconds?: number;
364
+ /** Custom max age cap in days (overrides global ISG settings) */
365
+ maxAgeCapDays?: number;
366
+ /** Whether the page is a draft (excludes from build) */
367
+ draft?: boolean;
368
+ /** Additional custom properties */
369
+ [key: string]: unknown;
370
+ }
371
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1 @@
1
+ export {};
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@stati/core",
3
+ "version": "1.0.0",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "types": "./dist/index.d.ts",
10
+ "default": "./dist/index.js"
11
+ },
12
+ "./types": {
13
+ "types": "./dist/types.d.ts",
14
+ "default": "./dist/types.js"
15
+ },
16
+ "./config": {
17
+ "types": "./dist/config/index.d.ts",
18
+ "default": "./dist/config/index.js"
19
+ }
20
+ },
21
+ "files": [
22
+ "dist"
23
+ ],
24
+ "scripts": {
25
+ "build": "tsc -p tsconfig.json",
26
+ "dev": "tsc -p tsconfig.json --watch",
27
+ "test": "vitest run"
28
+ },
29
+ "dependencies": {
30
+ "eta": "^3.5.0",
31
+ "fast-glob": "^3.3.3",
32
+ "fs-extra": "^11.2.0",
33
+ "gray-matter": "^4.0.3",
34
+ "markdown-it": "^14.1.0"
35
+ },
36
+ "devDependencies": {
37
+ "@types/fs-extra": "^11.0.4",
38
+ "@types/markdown-it": "^14.1.2"
39
+ }
40
+ }