@stati/core 1.12.5 → 1.14.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 (45) hide show
  1. package/README.md +2 -1
  2. package/dist/config/loader.d.ts.map +1 -1
  3. package/dist/config/loader.js +26 -6
  4. package/dist/constants.d.ts +8 -0
  5. package/dist/constants.d.ts.map +1 -1
  6. package/dist/constants.js +9 -0
  7. package/dist/core/build.d.ts.map +1 -1
  8. package/dist/core/build.js +30 -18
  9. package/dist/core/content.js +1 -1
  10. package/dist/core/dev.d.ts.map +1 -1
  11. package/dist/core/dev.js +49 -6
  12. package/dist/core/isg/build-lock.js +2 -2
  13. package/dist/core/isg/deps.js +1 -1
  14. package/dist/core/isg/hash.js +1 -1
  15. package/dist/core/isg/manifest.js +1 -1
  16. package/dist/core/markdown.js +3 -3
  17. package/dist/core/navigation.js +1 -1
  18. package/dist/core/preview.js +3 -3
  19. package/dist/core/templates.d.ts +1 -1
  20. package/dist/core/templates.d.ts.map +1 -1
  21. package/dist/core/templates.js +3 -2
  22. package/dist/core/utils/fs.utils.d.ts +1 -1
  23. package/dist/core/utils/fs.utils.d.ts.map +1 -1
  24. package/dist/core/utils/index.d.ts +2 -0
  25. package/dist/core/utils/index.d.ts.map +1 -1
  26. package/dist/core/utils/index.js +2 -0
  27. package/dist/core/utils/paths.utils.d.ts.map +1 -1
  28. package/dist/core/utils/paths.utils.js +1 -2
  29. package/dist/core/utils/server.utils.js +2 -2
  30. package/dist/core/utils/tailwind-inventory.utils.js +1 -1
  31. package/dist/core/utils/template-discovery.utils.d.ts.map +1 -1
  32. package/dist/core/utils/template-discovery.utils.js +1 -2
  33. package/dist/core/utils/typescript.utils.d.ts +127 -0
  34. package/dist/core/utils/typescript.utils.d.ts.map +1 -0
  35. package/dist/core/utils/typescript.utils.js +246 -0
  36. package/dist/core/utils/version.utils.js +3 -3
  37. package/dist/env.d.ts +4 -2
  38. package/dist/env.d.ts.map +1 -1
  39. package/dist/types/config.d.ts +67 -0
  40. package/dist/types/config.d.ts.map +1 -1
  41. package/dist/types/content.d.ts +18 -0
  42. package/dist/types/content.d.ts.map +1 -1
  43. package/dist/types/index.d.ts +2 -2
  44. package/dist/types/index.d.ts.map +1 -1
  45. package/package.json +2 -1
package/README.md CHANGED
@@ -93,7 +93,8 @@ That's it! Your site is ready.
93
93
  ### For Advanced Users
94
94
 
95
95
  - **Programmatic API** — Full control over the build process
96
- - **TypeScript-First** — Complete type safety throughout
96
+ - **TypeScript-First** — Complete type safety for configuration
97
+ - **TypeScript Compilation** — Built-in esbuild for client-side TypeScript
97
98
  - **Extensible Hooks** — Customize every stage of the build
98
99
  - **Smart Caching** — Incremental builds with intelligent invalidation
99
100
 
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAgCrD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAExD;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,UAAU,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,WAAW,CAAC,CAuDlF"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAiCrD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAExD;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,UAAU,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,WAAW,CAAC,CA0ElF"}
@@ -1,7 +1,8 @@
1
- import { existsSync } from 'fs';
2
- import { join, resolve } from 'path';
3
- import { pathToFileURL } from 'url';
1
+ import { existsSync } from 'node:fs';
2
+ import { join, resolve } from 'node:path';
3
+ import { pathToFileURL } from 'node:url';
4
4
  import { validateISGConfig, ISGConfigurationError } from '../core/isg/validation.js';
5
+ import { compileStatiConfig, cleanupCompiledConfig } from '../core/utils/index.js';
5
6
  import { DEFAULT_SRC_DIR, DEFAULT_OUT_DIR, DEFAULT_STATIC_DIR, DEFAULT_SITE_TITLE, DEFAULT_DEV_BASE_URL, DEFAULT_TTL_SECONDS, DEFAULT_MAX_AGE_CAP_DAYS, CONFIG_FILE_PATTERNS, } from '../constants.js';
6
7
  /**
7
8
  * Default configuration values for Stati.
@@ -62,9 +63,28 @@ export async function loadConfig(cwd = process.cwd()) {
62
63
  return DEFAULT_CONFIG;
63
64
  }
64
65
  try {
65
- const configUrl = pathToFileURL(resolve(configPath)).href;
66
- const module = await import(configUrl);
67
- const userConfig = module.default || module;
66
+ let configModule;
67
+ let compiledPath;
68
+ // If it's a .ts file, compile it first
69
+ if (configPath.endsWith('.ts')) {
70
+ try {
71
+ compiledPath = await compileStatiConfig(resolve(configPath));
72
+ const configUrl = pathToFileURL(compiledPath).href;
73
+ configModule = await import(configUrl);
74
+ }
75
+ finally {
76
+ // Clean up compiled file
77
+ if (compiledPath) {
78
+ await cleanupCompiledConfig(compiledPath);
79
+ }
80
+ }
81
+ }
82
+ else {
83
+ // Existing logic for .js/.mjs
84
+ const configUrl = pathToFileURL(resolve(configPath)).href;
85
+ configModule = await import(configUrl);
86
+ }
87
+ const userConfig = configModule.default || configModule;
68
88
  const mergedConfig = {
69
89
  ...DEFAULT_CONFIG,
70
90
  ...userConfig,
@@ -70,4 +70,12 @@ export declare const PARTIALS_DIR_PREFIX = "_";
70
70
  export declare const DEFAULT_SITE_TITLE = "My Stati Site";
71
71
  /** Default locale for internationalization */
72
72
  export declare const DEFAULT_LOCALE = "en-US";
73
+ /** Default TypeScript source directory */
74
+ export declare const DEFAULT_TS_SRC_DIR = "src";
75
+ /** Default TypeScript output directory (relative to build output) */
76
+ export declare const DEFAULT_TS_OUT_DIR = "_assets";
77
+ /** Default TypeScript entry point filename */
78
+ export declare const DEFAULT_TS_ENTRY_POINT = "main.ts";
79
+ /** Default TypeScript bundle name */
80
+ export declare const DEFAULT_TS_BUNDLE_NAME = "bundle";
73
81
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,iDAAiD;AACjD,eAAO,MAAM,eAAe,SAAS,CAAC;AAEtC,+CAA+C;AAC/C,eAAO,MAAM,eAAe,SAAS,CAAC;AAEtC,sCAAsC;AACtC,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAE3C,iCAAiC;AACjC,eAAO,MAAM,cAAc,WAAW,CAAC;AAEvC,4DAA4D;AAC5D,eAAO,MAAM,YAAY,UAAU,CAAC;AAEpC,kCAAkC;AAClC,eAAO,MAAM,iBAAiB,kBAAkB,CAAC;AAIjD,qEAAqE;AACrE,eAAO,MAAM,sBAAsB,iCAAkC,CAAC;AAEtE,mCAAmC;AACnC,eAAO,MAAM,gBAAgB,iBAAiB,CAAC;AAE/C,2CAA2C;AAC3C,eAAO,MAAM,oBAAoB,UAEhC,CAAC;AAIF,sCAAsC;AACtC,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAErC,kCAAkC;AAClC,eAAO,MAAM,oBAAoB,OAAO,CAAC;AAEzC,sCAAsC;AACtC,eAAO,MAAM,gBAAgB,cAAc,CAAC;AAE5C,0CAA0C;AAC1C,eAAO,MAAM,oBAAoB,0BAAmD,CAAC;AAIrF,wDAAwD;AACxD,eAAO,MAAM,mBAAmB,QAAQ,CAAC;AAEzC,+DAA+D;AAC/D,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAE5C,qEAAqE;AACrE,eAAO,MAAM,wBAAwB,QAAQ,CAAC;AAI9C,4BAA4B;AAC5B,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC,0BAA0B;AAC1B,eAAO,MAAM,gBAAgB,QAA0B,CAAC;AAExD,yBAAyB;AACzB,eAAO,MAAM,eAAe,QAAwB,CAAC;AAErD,0BAA0B;AAC1B,eAAO,MAAM,gBAAgB,QAAsB,CAAC;AAEpD,8BAA8B;AAC9B,eAAO,MAAM,oBAAoB,QAAyB,CAAC;AAI3D,oDAAoD;AACpD,eAAO,MAAM,aAAa,QAAyB,CAAC;AAEpD,iDAAiD;AACjD,eAAO,MAAM,cAAc,QAA0B,CAAC;AAEtD,6CAA6C;AAC7C,eAAO,MAAM,UAAU,QAAmB,CAAC;AAE3C,iDAAiD;AACjD,eAAO,MAAM,WAAW,QAAuB,CAAC;AAEhD,uCAAuC;AACvC,eAAO,MAAM,WAAW,QAAsB,CAAC;AAE/C,2CAA2C;AAC3C,eAAO,MAAM,SAAS,QAAkB,CAAC;AAEzC,6CAA6C;AAC7C,eAAO,MAAM,UAAU,QAAmB,CAAC;AAI3C,kCAAkC;AAClC,eAAO,MAAM,kBAAkB,SAAS,CAAC;AAEzC,8BAA8B;AAC9B,eAAO,MAAM,kBAAkB,QAAQ,CAAC;AAExC,+BAA+B;AAC/B,eAAO,MAAM,eAAe,eAAgC,CAAC;AAE7D,mEAAmE;AACnE,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAIvC,yBAAyB;AACzB,eAAO,MAAM,kBAAkB,kBAAkB,CAAC;AAElD,8CAA8C;AAC9C,eAAO,MAAM,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,iDAAiD;AACjD,eAAO,MAAM,eAAe,SAAS,CAAC;AAEtC,+CAA+C;AAC/C,eAAO,MAAM,eAAe,SAAS,CAAC;AAEtC,sCAAsC;AACtC,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAE3C,iCAAiC;AACjC,eAAO,MAAM,cAAc,WAAW,CAAC;AAEvC,4DAA4D;AAC5D,eAAO,MAAM,YAAY,UAAU,CAAC;AAEpC,kCAAkC;AAClC,eAAO,MAAM,iBAAiB,kBAAkB,CAAC;AAIjD,qEAAqE;AACrE,eAAO,MAAM,sBAAsB,iCAAkC,CAAC;AAEtE,mCAAmC;AACnC,eAAO,MAAM,gBAAgB,iBAAiB,CAAC;AAE/C,2CAA2C;AAC3C,eAAO,MAAM,oBAAoB,UAEhC,CAAC;AAIF,sCAAsC;AACtC,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAErC,kCAAkC;AAClC,eAAO,MAAM,oBAAoB,OAAO,CAAC;AAEzC,sCAAsC;AACtC,eAAO,MAAM,gBAAgB,cAAc,CAAC;AAE5C,0CAA0C;AAC1C,eAAO,MAAM,oBAAoB,0BAAmD,CAAC;AAIrF,wDAAwD;AACxD,eAAO,MAAM,mBAAmB,QAAQ,CAAC;AAEzC,+DAA+D;AAC/D,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAE5C,qEAAqE;AACrE,eAAO,MAAM,wBAAwB,QAAQ,CAAC;AAI9C,4BAA4B;AAC5B,eAAO,MAAM,kBAAkB,KAAK,CAAC;AAErC,0BAA0B;AAC1B,eAAO,MAAM,gBAAgB,QAA0B,CAAC;AAExD,yBAAyB;AACzB,eAAO,MAAM,eAAe,QAAwB,CAAC;AAErD,0BAA0B;AAC1B,eAAO,MAAM,gBAAgB,QAAsB,CAAC;AAEpD,8BAA8B;AAC9B,eAAO,MAAM,oBAAoB,QAAyB,CAAC;AAI3D,oDAAoD;AACpD,eAAO,MAAM,aAAa,QAAyB,CAAC;AAEpD,iDAAiD;AACjD,eAAO,MAAM,cAAc,QAA0B,CAAC;AAEtD,6CAA6C;AAC7C,eAAO,MAAM,UAAU,QAAmB,CAAC;AAE3C,iDAAiD;AACjD,eAAO,MAAM,WAAW,QAAuB,CAAC;AAEhD,uCAAuC;AACvC,eAAO,MAAM,WAAW,QAAsB,CAAC;AAE/C,2CAA2C;AAC3C,eAAO,MAAM,SAAS,QAAkB,CAAC;AAEzC,6CAA6C;AAC7C,eAAO,MAAM,UAAU,QAAmB,CAAC;AAI3C,kCAAkC;AAClC,eAAO,MAAM,kBAAkB,SAAS,CAAC;AAEzC,8BAA8B;AAC9B,eAAO,MAAM,kBAAkB,QAAQ,CAAC;AAExC,+BAA+B;AAC/B,eAAO,MAAM,eAAe,eAAgC,CAAC;AAE7D,mEAAmE;AACnE,eAAO,MAAM,mBAAmB,MAAM,CAAC;AAIvC,yBAAyB;AACzB,eAAO,MAAM,kBAAkB,kBAAkB,CAAC;AAElD,8CAA8C;AAC9C,eAAO,MAAM,cAAc,UAAU,CAAC;AAItC,0CAA0C;AAC1C,eAAO,MAAM,kBAAkB,QAAQ,CAAC;AAExC,qEAAqE;AACrE,eAAO,MAAM,kBAAkB,YAAY,CAAC;AAE5C,8CAA8C;AAC9C,eAAO,MAAM,sBAAsB,YAAY,CAAC;AAEhD,qCAAqC;AACrC,eAAO,MAAM,sBAAsB,WAAW,CAAC"}
package/dist/constants.js CHANGED
@@ -78,3 +78,12 @@ export const PARTIALS_DIR_PREFIX = '_';
78
78
  export const DEFAULT_SITE_TITLE = 'My Stati Site';
79
79
  /** Default locale for internationalization */
80
80
  export const DEFAULT_LOCALE = 'en-US';
81
+ // === TypeScript Constants ===
82
+ /** Default TypeScript source directory */
83
+ export const DEFAULT_TS_SRC_DIR = 'src';
84
+ /** Default TypeScript output directory (relative to build output) */
85
+ export const DEFAULT_TS_OUT_DIR = '_assets';
86
+ /** Default TypeScript entry point filename */
87
+ export const DEFAULT_TS_ENTRY_POINT = 'main.ts';
88
+ /** Default TypeScript bundle name */
89
+ export const DEFAULT_TS_BUNDLE_NAME = 'bundle';
@@ -1 +1 @@
1
- {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/core/build.ts"],"names":[],"mappings":"AA2CA,OAAO,KAAK,EAEV,UAAU,EACV,MAAM,EAKP,MAAM,mBAAmB,CAAC;AAE3B;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,YAAY;IAC3B,iDAAiD;IACjD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,iDAAiD;IACjD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,0CAA0C;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA4FD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAsB,KAAK,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,CAW3E"}
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/core/build.ts"],"names":[],"mappings":"AA8CA,OAAO,KAAK,EAEV,UAAU,EACV,MAAM,EAMP,MAAM,mBAAmB,CAAC;AAE3B;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,YAAY;IAC3B,iDAAiD;IACjD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,iDAAiD;IACjD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,0CAA0C;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AA4FD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAsB,KAAK,CAAC,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,CAW3E"}
@@ -1,6 +1,5 @@
1
- import { ensureDir, writeFile, remove, pathExists, stat, readdir, copyFile, resolveOutDir, resolveStaticDir, resolveCacheDir, enableInventoryTracking, disableInventoryTracking, clearInventory, writeTailwindClassInventory, getInventorySize, isTailwindUsed, loadPreviousInventory, } from './utils/index.js';
2
- import { join, dirname, relative } from 'path';
3
- import { posix } from 'path';
1
+ import { ensureDir, writeFile, remove, pathExists, stat, readdir, copyFile, resolveOutDir, resolveStaticDir, resolveCacheDir, enableInventoryTracking, disableInventoryTracking, clearInventory, writeTailwindClassInventory, getInventorySize, isTailwindUsed, loadPreviousInventory, compileTypeScript, autoInjectBundle, } from './utils/index.js';
2
+ import { join, dirname, relative, posix } from 'node:path';
4
3
  import { loadConfig } from '../config/loader.js';
5
4
  import { loadContent } from './content.js';
6
5
  import { createMarkdownProcessor, renderMarkdown } from './markdown.js';
@@ -10,6 +9,7 @@ import { loadCacheManifest, saveCacheManifest, shouldRebuildPage, createCacheEnt
10
9
  import { generateSitemap, generateRobotsTxtFromConfig, autoInjectSEO, } from '../seo/index.js';
11
10
  import { generateRSSFeeds, validateRSSConfig } from '../rss/index.js';
12
11
  import { getEnv } from '../env.js';
12
+ import { DEFAULT_TS_OUT_DIR, DEFAULT_OUT_DIR } from '../constants.js';
13
13
  /**
14
14
  * Recursively calculates the total size of a directory in bytes.
15
15
  * Used for build statistics.
@@ -184,7 +184,7 @@ async function loadContentAndBuildNavigation(config, options, logger) {
184
184
  /**
185
185
  * Processes pages with ISG caching logic.
186
186
  */
187
- async function processPagesWithCache(pages, manifest, config, outDir, md, eta, navigation, buildTime, options, logger) {
187
+ async function processPagesWithCache(pages, manifest, config, outDir, md, eta, navigation, buildTime, options, logger, assets) {
188
188
  let cacheHits = 0;
189
189
  let cacheMisses = 0;
190
190
  // Build context
@@ -244,25 +244,14 @@ async function processPagesWithCache(pages, manifest, config, outDir, md, eta, n
244
244
  // Cache miss - need to rebuild
245
245
  cacheMisses++;
246
246
  const startTime = Date.now();
247
- // Add rendering substeps to tree
248
- const markdownId = `${pageId}-markdown`;
249
- const templateId = `${pageId}-template`;
250
- if (logger.addTreeNode) {
251
- logger.addTreeNode(pageId, markdownId, 'Processing Markdown', 'running');
252
- logger.addTreeNode(pageId, templateId, 'Applying Template', 'pending');
253
- }
254
247
  // Run beforeRender hook
255
248
  if (config.hooks?.beforeRender) {
256
249
  await config.hooks.beforeRender({ page, config });
257
250
  }
258
251
  // Render markdown to HTML
259
252
  const htmlContent = renderMarkdown(page.content, md);
260
- if (logger.updateTreeNode) {
261
- logger.updateTreeNode(markdownId, 'completed');
262
- logger.updateTreeNode(templateId, 'running');
263
- }
264
253
  // Render with template
265
- let finalHtml = await renderPage(page, htmlContent, config, eta, navigation, pages);
254
+ let finalHtml = await renderPage(page, htmlContent, config, eta, navigation, pages, assets);
266
255
  // Auto-inject SEO tags if enabled
267
256
  if (config.seo?.autoInject !== false) {
268
257
  const injectOptions = {
@@ -276,9 +265,12 @@ async function processPagesWithCache(pages, manifest, config, outDir, md, eta, n
276
265
  }
277
266
  finalHtml = autoInjectSEO(finalHtml, injectOptions);
278
267
  }
268
+ // Auto-inject TypeScript bundle script tag if available
269
+ if (assets?.bundlePath) {
270
+ finalHtml = autoInjectBundle(finalHtml, assets.bundlePath);
271
+ }
279
272
  const renderTime = Date.now() - startTime;
280
273
  if (logger.updateTreeNode) {
281
- logger.updateTreeNode(templateId, 'completed');
282
274
  logger.updateTreeNode(pageId, 'completed', {
283
275
  timing: renderTime,
284
276
  url: page.url,
@@ -396,12 +388,31 @@ async function buildInternal(options = {}) {
396
388
  const { pages, navigation, md, eta, navigationHash } = await loadContentAndBuildNavigation(config, options, logger);
397
389
  // Store navigation hash in manifest for change detection in dev server
398
390
  manifest.navigationHash = navigationHash;
391
+ // Compile TypeScript if enabled
392
+ let tsResult;
393
+ let assets;
394
+ if (config.typescript?.enabled) {
395
+ tsResult = await compileTypeScript({
396
+ projectRoot: process.cwd(),
397
+ config: config.typescript,
398
+ outDir: config.outDir || DEFAULT_OUT_DIR,
399
+ mode: getEnv() === 'production' ? 'production' : 'development',
400
+ logger,
401
+ });
402
+ if (tsResult?.bundleFilename) {
403
+ const assetsDir = config.typescript.outDir || DEFAULT_TS_OUT_DIR;
404
+ assets = {
405
+ bundleName: tsResult.bundleFilename,
406
+ bundlePath: posix.join('/', assetsDir, tsResult.bundleFilename),
407
+ };
408
+ }
409
+ }
399
410
  // Process pages with ISG caching logic
400
411
  if (logger.step) {
401
412
  console.log(); // Add spacing before page processing
402
413
  }
403
414
  const buildTime = new Date();
404
- const pageProcessingResult = await processPagesWithCache(pages, manifest, config, outDir, md, eta, navigation, buildTime, options, logger);
415
+ const pageProcessingResult = await processPagesWithCache(pages, manifest, config, outDir, md, eta, navigation, buildTime, options, logger, assets);
405
416
  cacheHits = pageProcessingResult.cacheHits;
406
417
  cacheMisses = pageProcessingResult.cacheMisses;
407
418
  // Write Tailwind class inventory after all templates have been rendered (if Tailwind is used)
@@ -409,6 +420,7 @@ async function buildInternal(options = {}) {
409
420
  const inventorySize = getInventorySize();
410
421
  if (inventorySize > 0) {
411
422
  await writeTailwindClassInventory(cacheDir);
423
+ logger.info('');
412
424
  logger.info(`📝 Generated Tailwind class inventory (${inventorySize} classes tracked)`);
413
425
  }
414
426
  // Disable inventory tracking after build
@@ -1,7 +1,7 @@
1
1
  import glob from 'fast-glob';
2
2
  import { readFile, resolveSrcDir } from './utils/index.js';
3
3
  import matter from 'gray-matter';
4
- import { relative, dirname, basename } from 'path';
4
+ import { relative, dirname, basename } from 'node:path';
5
5
  import { MARKDOWN_EXTENSION } from '../constants.js';
6
6
  /**
7
7
  * Loads and parses all content files from the configured source directory.
@@ -1 +1 @@
1
- {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/core/dev.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAe,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAqB7D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;CACb;AA4SD,wBAAsB,eAAe,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,SAAS,CAAC,CAyXxF"}
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/core/dev.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAe,MAAM,EAAE,MAAM,mBAAmB,CAAC;AA2B7D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;CACb;AA4SD,wBAAsB,eAAe,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,SAAS,CAAC,CAwaxF"}
package/dist/core/dev.js CHANGED
@@ -1,7 +1,6 @@
1
- import { createServer } from 'http';
2
- import { join, extname } from 'path';
3
- import { posix } from 'path';
4
- import { readFile } from 'fs/promises';
1
+ import { createServer } from 'node:http';
2
+ import { join, extname, posix } from 'node:path';
3
+ import { readFile } from 'node:fs/promises';
5
4
  import { WebSocketServer } from 'ws';
6
5
  import chokidar from 'chokidar';
7
6
  import { build } from './build.js';
@@ -10,9 +9,9 @@ import { loadConfig } from '../config/loader.js';
10
9
  import { loadCacheManifest, saveCacheManifest, computeNavigationHash } from './isg/index.js';
11
10
  import { loadContent } from './content.js';
12
11
  import { buildNavigation } from './navigation.js';
13
- import { resolveDevPaths, resolveCacheDir, resolvePrettyUrl, createErrorOverlay, parseErrorDetails, TemplateError, createFallbackLogger, mergeServerOptions, } from './utils/index.js';
12
+ import { resolveDevPaths, resolveCacheDir, resolvePrettyUrl, createErrorOverlay, parseErrorDetails, TemplateError, createFallbackLogger, mergeServerOptions, createTypeScriptWatcher, } from './utils/index.js';
14
13
  import { setEnv, getEnv } from '../env.js';
15
- import { DEFAULT_DEV_PORT, DEFAULT_DEV_HOST, TEMPLATE_EXTENSION } from '../constants.js';
14
+ import { DEFAULT_DEV_PORT, DEFAULT_DEV_HOST, TEMPLATE_EXTENSION, DEFAULT_OUT_DIR, } from '../constants.js';
16
15
  /**
17
16
  * Loads and validates configuration for the dev server.
18
17
  */
@@ -292,6 +291,7 @@ export async function createDevServer(options = {}) {
292
291
  lastBuildError = error;
293
292
  };
294
293
  let watcher = null;
294
+ let tsWatcher = null;
295
295
  const isBuildingRef = { value: false };
296
296
  let isStopping = false;
297
297
  /**
@@ -520,6 +520,44 @@ export async function createDevServer(options = {}) {
520
520
  reject(error);
521
521
  });
522
522
  });
523
+ // TypeScript watcher setup (initial compilation is handled by performInitialBuild)
524
+ if (config.typescript?.enabled) {
525
+ try {
526
+ // Start TypeScript watcher for hot reload
527
+ tsWatcher = await createTypeScriptWatcher({
528
+ projectRoot: process.cwd(),
529
+ config: config.typescript,
530
+ outDir: config.outDir || DEFAULT_OUT_DIR,
531
+ mode: 'development',
532
+ logger,
533
+ onRebuild: (bundlePath, compileTimeMs) => {
534
+ logger.info?.(`⚡ ${bundlePath} recompiled in ${compileTimeMs}ms`);
535
+ // Broadcast reload to WebSocket clients
536
+ if (wsServer) {
537
+ wsServer.clients.forEach((client) => {
538
+ const ws = client;
539
+ if (ws.readyState === 1) {
540
+ // WebSocket.OPEN
541
+ ws.send(JSON.stringify({ type: 'reload' }));
542
+ }
543
+ });
544
+ }
545
+ },
546
+ });
547
+ }
548
+ catch (error) {
549
+ const tsError = error instanceof Error ? error : new Error(String(error));
550
+ // Prominent notification for TypeScript setup failure
551
+ console.log();
552
+ logger.error?.(`TypeScript setup failed: ${tsError.message}`);
553
+ logger.warning?.('──────────────────────────────────────────────────────────────');
554
+ logger.warning?.('⚠️ TypeScript hot reload is DISABLED for this session.');
555
+ logger.warning?.(" Dev server will continue, but TypeScript changes won't auto-reload.");
556
+ logger.warning?.(' Fix your TypeScript configuration and restart the dev server.');
557
+ logger.warning?.('──────────────────────────────────────────────────────────────');
558
+ console.log();
559
+ }
560
+ }
523
561
  // Set up file watching
524
562
  const watchPaths = [srcDir, staticDir].filter(Boolean);
525
563
  watcher = chokidar.watch(watchPaths, {
@@ -561,6 +599,11 @@ export async function createDevServer(options = {}) {
561
599
  await watcher.close();
562
600
  watcher = null;
563
601
  }
602
+ // Clean up TypeScript watcher
603
+ if (tsWatcher) {
604
+ await tsWatcher.dispose();
605
+ tsWatcher = null;
606
+ }
564
607
  if (wsServer) {
565
608
  wsServer.close();
566
609
  wsServer = null;
@@ -1,6 +1,6 @@
1
1
  import { writeFile, readFile, pathExists, remove, ensureDir } from '../utils/index.js';
2
- import { join, dirname } from 'path';
3
- import { hostname } from 'os';
2
+ import { join, dirname } from 'node:path';
3
+ import { hostname } from 'node:os';
4
4
  /**
5
5
  * Manages build process locking to prevent concurrent Stati builds from corrupting cache.
6
6
  * Uses a simple file-based locking mechanism with process ID tracking.
@@ -1,4 +1,4 @@
1
- import { join, dirname, relative, posix } from 'path';
1
+ import { join, dirname, relative, posix } from 'node:path';
2
2
  import { pathExists, readFile, isCollectionIndexPage, discoverLayout, resolveSrcDir, } from '../utils/index.js';
3
3
  import glob from 'fast-glob';
4
4
  import { TEMPLATE_EXTENSION } from '../../constants.js';
@@ -1,4 +1,4 @@
1
- import { createHash } from 'crypto';
1
+ import { createHash } from 'node:crypto';
2
2
  import { readFile, pathExists } from '../utils/index.js';
3
3
  /**
4
4
  * Creates a SHA-256 hash instance, updates it with data, and returns the hex digest.
@@ -1,5 +1,5 @@
1
1
  import { readFile, writeFile, pathExists, ensureDir } from '../utils/index.js';
2
- import { join } from 'path';
2
+ import { join } from 'node:path';
3
3
  import { MANIFEST_FILENAME } from '../../constants.js';
4
4
  /**
5
5
  * Loads the ISG cache manifest from the cache directory.
@@ -1,7 +1,7 @@
1
1
  import MarkdownIt from 'markdown-it';
2
- import { createRequire } from 'module';
3
- import { pathToFileURL } from 'url';
4
- import path from 'path';
2
+ import { createRequire } from 'node:module';
3
+ import { pathToFileURL } from 'node:url';
4
+ import path from 'node:path';
5
5
  /**
6
6
  * Load a markdown plugin, trying different resolution strategies
7
7
  */
@@ -1,4 +1,4 @@
1
- import { basename } from 'path';
1
+ import { basename } from 'node:path';
2
2
  /**
3
3
  * Builds a hierarchical navigation structure from pages.
4
4
  * Groups pages by directory structure and sorts them appropriately.
@@ -1,6 +1,6 @@
1
- import { createServer } from 'http';
2
- import { join, extname } from 'path';
3
- import { readFile } from 'fs/promises';
1
+ import { createServer } from 'node:http';
2
+ import { join, extname } from 'node:path';
3
+ import { readFile } from 'node:fs/promises';
4
4
  import { loadConfig } from '../config/loader.js';
5
5
  import { resolveDevPaths, resolvePrettyUrl, createFallbackLogger, mergeServerOptions, } from './utils/index.js';
6
6
  import { DEFAULT_PREVIEW_PORT, DEFAULT_DEV_HOST } from '../constants.js';
@@ -1,5 +1,5 @@
1
1
  import { Eta } from 'eta';
2
2
  import type { StatiConfig, PageModel, NavNode } from '../types/index.js';
3
3
  export declare function createTemplateEngine(config: StatiConfig): Eta;
4
- export declare function renderPage(page: PageModel, body: string, config: StatiConfig, eta: Eta, navigation?: NavNode[], allPages?: PageModel[]): Promise<string>;
4
+ export declare function renderPage(page: PageModel, body: string, config: StatiConfig, eta: Eta, navigation?: NavNode[], allPages?: PageModel[], assets?: import('../types/index.js').StatiAssets): Promise<string>;
5
5
  //# sourceMappingURL=templates.d.ts.map
@@ -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;AAG1B,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAkB,MAAM,mBAAmB,CAAC;AAmNzF,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,GAAG,CAW7D;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,CAsLjB"}
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/core/templates.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAG1B,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAkB,MAAM,mBAAmB,CAAC;AAmNzF,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,GAAG,GAAG,CAW7D;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,EACtB,MAAM,CAAC,EAAE,OAAO,mBAAmB,EAAE,WAAW,GAC/C,OAAO,CAAC,MAAM,CAAC,CAuLjB"}
@@ -1,5 +1,5 @@
1
1
  import { Eta } from 'eta';
2
- import { join, dirname, relative, basename, posix } from 'path';
2
+ import { join, dirname, relative, basename, posix } from 'node:path';
3
3
  import glob from 'fast-glob';
4
4
  import { TEMPLATE_EXTENSION } from '../constants.js';
5
5
  import { getStatiVersion, isCollectionIndexPage, discoverLayout, getCollectionPathForPage, resolveSrcDir, createTemplateError, createValidatingPartialsProxy, propValue, wrapPartialsAsCallable, createNavigationHelpers, } from './utils/index.js';
@@ -182,7 +182,7 @@ export function createTemplateEngine(config) {
182
182
  });
183
183
  return eta;
184
184
  }
185
- export async function renderPage(page, body, config, eta, navigation, allPages) {
185
+ export async function renderPage(page, body, config, eta, navigation, allPages, assets) {
186
186
  // Discover partials for this page's directory hierarchy
187
187
  const srcDir = resolveSrcDir(config);
188
188
  const relativePath = relative(srcDir, page.sourcePath);
@@ -228,6 +228,7 @@ export async function renderPage(page, body, config, eta, navigation, allPages)
228
228
  // Stati utilities object with helper functions
229
229
  generateSEO: (tags) => generateSEO({ page, config, site: config.site }, tags),
230
230
  propValue,
231
+ assets, // TypeScript bundle assets (available when typescript.enabled is true)
231
232
  };
232
233
  // Render partials and store their content
233
234
  // Use multiple passes to allow partials to reference other partials
@@ -1,5 +1,5 @@
1
1
  import fse from 'fs-extra';
2
- import type { WriteFileOptions } from 'fs';
2
+ import type { WriteFileOptions } from 'node:fs';
3
3
  /**
4
4
  * Safely reads a file with consistent error handling.
5
5
  */
@@ -1 +1 @@
1
- {"version":3,"file":"fs.utils.d.ts","sourceRoot":"","sources":["../../../src/core/utils/fs.utils.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,IAAI,CAAC;AAkD3C;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,OAAO,GAAG,MAAgB,GACnC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAExB;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,IAAI,CAAC,CAEf;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEnE;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9D;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAExD;AAED;;GAEG;AACH,wBAAsB,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAE/D;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,CAAC,SAAS,OAAO,GAAG,KAAK,EACrD,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,CAAC,CAAA;CAAE,GAC9B,OAAO,CAAC,CAAC,SAAS,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAYnD;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvE"}
1
+ {"version":3,"file":"fs.utils.d.ts","sourceRoot":"","sources":["../../../src/core/utils/fs.utils.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAkDhD;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,OAAO,GAAG,MAAgB,GACnC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAExB;AAED;;GAEG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,IAAI,CAAC,CAEf;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAEnE;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9D;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAExD;AAED;;GAEG;AACH,wBAAsB,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAE/D;AAED;;GAEG;AACH,wBAAsB,OAAO,CAAC,CAAC,SAAS,OAAO,GAAG,KAAK,EACrD,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,CAAC,CAAA;CAAE,GAC9B,OAAO,CAAC,CAAC,SAAS,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAYnD;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvE"}
@@ -19,4 +19,6 @@ export type { ErrorDetails } from './error-overlay.utils.js';
19
19
  export { getStatiVersion } from './version.utils.js';
20
20
  export { globToRegex, matchesGlob } from './glob-patterns.utils.js';
21
21
  export { createFallbackLogger } from './logger.utils.js';
22
+ export { compileTypeScript, createTypeScriptWatcher, compileStatiConfig, cleanupCompiledConfig, autoInjectBundle, } from './typescript.utils.js';
23
+ export type { CompileOptions, CompileResult, WatchOptions } from './typescript.utils.js';
22
24
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/utils/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,QAAQ,EACR,SAAS,EACT,UAAU,EACV,SAAS,EACT,MAAM,EACN,QAAQ,EACR,OAAO,EACP,IAAI,GACL,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,qBAAqB,EACrB,cAAc,EACd,cAAc,EACd,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,+BAA+B,CAAC;AAGvC,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGhD,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,wBAAwB,EACxB,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,2BAA2B,EAC3B,cAAc,EACd,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,+BAA+B,CAAC;AAGvC,OAAO,EAAE,6BAA6B,EAAE,MAAM,+BAA+B,CAAC;AAG9E,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAC3F,YAAY,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAGpE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAG/F,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAGxE,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACzE,YAAY,EACV,eAAe,EACf,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACjF,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAG7D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/utils/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EACL,QAAQ,EACR,SAAS,EACT,UAAU,EACV,SAAS,EACT,MAAM,EACN,QAAQ,EACR,OAAO,EACP,IAAI,GACL,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,qBAAqB,EACrB,cAAc,EACd,cAAc,EACd,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,+BAA+B,CAAC;AAGvC,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGhD,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,wBAAwB,EACxB,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,2BAA2B,EAC3B,cAAc,EACd,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,+BAA+B,CAAC;AAGvC,OAAO,EAAE,6BAA6B,EAAE,MAAM,+BAA+B,CAAC;AAG9E,OAAO,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAC3F,YAAY,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAGpE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAG/F,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAGxE,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACzE,YAAY,EACV,eAAe,EACf,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AACjF,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAG7D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAGzD,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC"}
@@ -30,3 +30,5 @@ export { getStatiVersion } from './version.utils.js';
30
30
  export { globToRegex, matchesGlob } from './glob-patterns.utils.js';
31
31
  // Logger utilities
32
32
  export { createFallbackLogger } from './logger.utils.js';
33
+ // TypeScript compilation utilities
34
+ export { compileTypeScript, createTypeScriptWatcher, compileStatiConfig, cleanupCompiledConfig, autoInjectBundle, } from './typescript.utils.js';
@@ -1 +1 @@
1
- {"version":3,"file":"paths.utils.d.ts","sourceRoot":"","sources":["../../../src/core/utils/paths.utils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAQxD;;;GAGG;AAEH;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAEzD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAEzD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAE5D;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW;;;;EAMlD;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAElE;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAEhF;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAEhF;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAEnF"}
1
+ {"version":3,"file":"paths.utils.d.ts","sourceRoot":"","sources":["../../../src/core/utils/paths.utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAQxD;;;GAGG;AAEH;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAEzD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAEzD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAE5D;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW;;;;EAMlD;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAElE;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAEhF;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAEhF;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAEnF"}
@@ -1,5 +1,4 @@
1
- import { join } from 'path';
2
- import { posix } from 'path';
1
+ import { join, posix } from 'node:path';
3
2
  import { DEFAULT_SRC_DIR, DEFAULT_OUT_DIR, DEFAULT_STATIC_DIR, CACHE_DIR_NAME, } from '../../constants.js';
4
3
  /**
5
4
  * File system path resolution utilities for Stati core.
@@ -1,5 +1,5 @@
1
- import { join } from 'path';
2
- import { stat } from 'fs/promises';
1
+ import { join } from 'node:path';
2
+ import { stat } from 'node:fs/promises';
3
3
  /**
4
4
  * Attempts to resolve pretty URL paths by trying various fallback strategies.
5
5
  * This handles common patterns like:
@@ -7,7 +7,7 @@
7
7
  * final CSS output.
8
8
  */
9
9
  import { writeFile, ensureDir, pathExists, readFile } from './fs.utils.js';
10
- import { join } from 'path';
10
+ import { join } from 'node:path';
11
11
  /**
12
12
  * Module-level Set to track Tailwind classes across template renders.
13
13
  * Cleared at the start of each full build.
@@ -1 +1 @@
1
- {"version":3,"file":"template-discovery.utils.d.ts","sourceRoot":"","sources":["../../../src/core/utils/template-discovery.utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAInE;;;GAGG;AAEH;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,OAAO,CAkBtF;AAED;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,WAAW,EACnB,cAAc,CAAC,EAAE,MAAM,EACvB,WAAW,CAAC,EAAE,OAAO,GACpB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsDxB;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAkBhE"}
1
+ {"version":3,"file":"template-discovery.utils.d.ts","sourceRoot":"","sources":["../../../src/core/utils/template-discovery.utils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAInE;;;GAGG;AAEH;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,GAAG,OAAO,CAkBtF;AAED;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,WAAW,EACnB,cAAc,CAAC,EAAE,MAAM,EACvB,WAAW,CAAC,EAAE,OAAO,GACpB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsDxB;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAkBhE"}
@@ -1,5 +1,4 @@
1
- import { join, dirname } from 'path';
2
- import { posix } from 'path';
1
+ import { join, dirname, posix } from 'node:path';
3
2
  import { pathExists } from './fs.utils.js';
4
3
  import { LAYOUT_TEMPLATE } from '../../constants.js';
5
4
  import { resolveSrcDir } from './paths.utils.js';
@@ -0,0 +1,127 @@
1
+ /**
2
+ * TypeScript compilation utilities using esbuild.
3
+ * Provides functions for compiling TypeScript files and watching for changes.
4
+ * @module core/utils/typescript
5
+ */
6
+ import * as esbuild from 'esbuild';
7
+ import type { TypeScriptConfig } from '../../types/config.js';
8
+ import type { Logger } from '../../types/logging.js';
9
+ /**
10
+ * Options for TypeScript compilation.
11
+ */
12
+ export interface CompileOptions {
13
+ /** Root directory of the project */
14
+ projectRoot: string;
15
+ /** TypeScript configuration */
16
+ config: TypeScriptConfig;
17
+ /** Output directory (defaults to 'dist') */
18
+ outDir?: string;
19
+ /** Compilation mode */
20
+ mode: 'development' | 'production';
21
+ /** Logger instance for output */
22
+ logger: Logger;
23
+ }
24
+ /**
25
+ * Result of TypeScript compilation.
26
+ */
27
+ export interface CompileResult {
28
+ /** The generated bundle filename (e.g., 'bundle-a1b2c3d4.js'), or undefined if compilation was skipped */
29
+ bundleFilename?: string;
30
+ }
31
+ /**
32
+ * Options for TypeScript file watcher.
33
+ */
34
+ export interface WatchOptions {
35
+ /** Project root directory */
36
+ projectRoot: string;
37
+ /** TypeScript configuration */
38
+ config: TypeScriptConfig;
39
+ /** Output directory for the build */
40
+ outDir?: string;
41
+ /** Build mode */
42
+ mode: 'development' | 'production';
43
+ /** Logger instance */
44
+ logger: Logger;
45
+ /** Callback when rebuild completes, receives bundle path and compile time in ms */
46
+ onRebuild: (bundlePath: string, compileTimeMs: number) => void;
47
+ }
48
+ /**
49
+ * Compile TypeScript files using esbuild.
50
+ * Returns the generated bundle filename for template injection.
51
+ *
52
+ * @param options - Compilation options
53
+ * @returns The compilation result with bundle filename
54
+ *
55
+ * @example
56
+ * ```typescript
57
+ * const result = await compileTypeScript({
58
+ * projectRoot: process.cwd(),
59
+ * config: { enabled: true },
60
+ * mode: 'production',
61
+ * logger: console,
62
+ * });
63
+ * console.log(result.bundleFilename); // 'bundle-a1b2c3d4.js'
64
+ * ```
65
+ */
66
+ export declare function compileTypeScript(options: CompileOptions): Promise<CompileResult>;
67
+ /**
68
+ * Create an esbuild watch context for development.
69
+ * Watches for TypeScript file changes and recompiles automatically.
70
+ *
71
+ * @param options - Watch options including rebuild callback
72
+ * @returns The esbuild build context for cleanup
73
+ *
74
+ * @example
75
+ * ```typescript
76
+ * const watcher = await createTypeScriptWatcher({
77
+ * projectRoot: process.cwd(),
78
+ * config: { enabled: true },
79
+ * mode: 'development',
80
+ * logger: console,
81
+ * onRebuild: () => console.log('Rebuilt!'),
82
+ * });
83
+ *
84
+ * // Later, cleanup:
85
+ * await watcher.dispose();
86
+ * ```
87
+ */
88
+ export declare function createTypeScriptWatcher(options: WatchOptions): Promise<esbuild.BuildContext>;
89
+ /**
90
+ * Compile stati.config.ts to a temporary JS file for import.
91
+ * Returns the path to the compiled file.
92
+ *
93
+ * @param configPath - Path to the TypeScript config file
94
+ * @returns Path to the compiled JavaScript module
95
+ *
96
+ * @example
97
+ * ```typescript
98
+ * const compiledPath = await compileStatiConfig('/path/to/stati.config.ts');
99
+ * const config = await import(compiledPath);
100
+ * await cleanupCompiledConfig(compiledPath);
101
+ * ```
102
+ */
103
+ export declare function compileStatiConfig(configPath: string): Promise<string>;
104
+ /**
105
+ * Clean up compiled config file.
106
+ *
107
+ * @param compiledPath - Path to the compiled config file to remove
108
+ */
109
+ export declare function cleanupCompiledConfig(compiledPath: string): Promise<void>;
110
+ /**
111
+ * Auto-inject TypeScript bundle script tag into HTML before </body>.
112
+ * Similar to SEO auto-injection, this adds the script tag automatically
113
+ * so users don't need to modify their templates.
114
+ *
115
+ * @param html - Rendered HTML content
116
+ * @param bundlePath - Path to the compiled bundle (e.g., '/_assets/bundle-a1b2c3d4.js')
117
+ * @returns HTML with injected script tag
118
+ *
119
+ * @example
120
+ * ```typescript
121
+ * const html = '<html><body>Content</body></html>';
122
+ * const enhanced = autoInjectBundle(html, '/_assets/bundle.js');
123
+ * // Returns: '<html><body>Content\n <script type="module" src="/_assets/bundle.js"></script>\n</body></html>'
124
+ * ```
125
+ */
126
+ export declare function autoInjectBundle(html: string, bundlePath: string): string;
127
+ //# sourceMappingURL=typescript.utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescript.utils.d.ts","sourceRoot":"","sources":["../../../src/core/utils/typescript.utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAInC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AASrD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,oCAAoC;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,+BAA+B;IAC/B,MAAM,EAAE,gBAAgB,CAAC;IACzB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,uBAAuB;IACvB,IAAI,EAAE,aAAa,GAAG,YAAY,CAAC;IACnC,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,0GAA0G;IAC1G,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,6BAA6B;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,+BAA+B;IAC/B,MAAM,EAAE,gBAAgB,CAAC;IACzB,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iBAAiB;IACjB,IAAI,EAAE,aAAa,GAAG,YAAY,CAAC;IACnC,sBAAsB;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,mFAAmF;IACnF,SAAS,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,KAAK,IAAI,CAAC;CAChE;AAiCD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CA+CvF;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAsD/B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB5E;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAM/E;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAsCzE"}
@@ -0,0 +1,246 @@
1
+ /**
2
+ * TypeScript compilation utilities using esbuild.
3
+ * Provides functions for compiling TypeScript files and watching for changes.
4
+ * @module core/utils/typescript
5
+ */
6
+ import * as esbuild from 'esbuild';
7
+ import * as path from 'node:path';
8
+ import * as fs from 'node:fs/promises';
9
+ import { pathExists } from './fs.utils.js';
10
+ import { DEFAULT_TS_SRC_DIR, DEFAULT_TS_OUT_DIR, DEFAULT_TS_ENTRY_POINT, DEFAULT_TS_BUNDLE_NAME, DEFAULT_OUT_DIR, } from '../../constants.js';
11
+ function resolveConfig(config, mode) {
12
+ const isProduction = mode === 'production';
13
+ return {
14
+ enabled: config.enabled,
15
+ srcDir: config.srcDir ?? DEFAULT_TS_SRC_DIR,
16
+ outDir: config.outDir ?? DEFAULT_TS_OUT_DIR,
17
+ entryPoint: config.entryPoint ?? DEFAULT_TS_ENTRY_POINT,
18
+ bundleName: config.bundleName ?? DEFAULT_TS_BUNDLE_NAME,
19
+ // hash/minify: always false in dev (config ignored), configurable in prod (default true)
20
+ hash: isProduction && (config.hash ?? true),
21
+ minify: isProduction && (config.minify ?? true),
22
+ // Source maps: always enabled in dev for debugging, always disabled in prod for security/size
23
+ sourceMaps: !isProduction,
24
+ };
25
+ }
26
+ /**
27
+ * Compile TypeScript files using esbuild.
28
+ * Returns the generated bundle filename for template injection.
29
+ *
30
+ * @param options - Compilation options
31
+ * @returns The compilation result with bundle filename
32
+ *
33
+ * @example
34
+ * ```typescript
35
+ * const result = await compileTypeScript({
36
+ * projectRoot: process.cwd(),
37
+ * config: { enabled: true },
38
+ * mode: 'production',
39
+ * logger: console,
40
+ * });
41
+ * console.log(result.bundleFilename); // 'bundle-a1b2c3d4.js'
42
+ * ```
43
+ */
44
+ export async function compileTypeScript(options) {
45
+ const { projectRoot, config, mode, logger, outDir: globalOutDir } = options;
46
+ const resolved = resolveConfig(config, mode);
47
+ const entryPath = path.join(projectRoot, resolved.srcDir, resolved.entryPoint);
48
+ // Output to configured build output directory (default: dist)
49
+ const outDir = path.join(projectRoot, globalOutDir || DEFAULT_OUT_DIR, resolved.outDir);
50
+ // Validate entry point exists
51
+ if (!(await pathExists(entryPath))) {
52
+ logger.warning(`TypeScript entry point not found: ${entryPath}`);
53
+ logger.warning('Skipping TypeScript compilation.');
54
+ return {};
55
+ }
56
+ logger.info(''); // Add empty line before TypeScript compilation
57
+ logger.info('Compiling TypeScript...');
58
+ try {
59
+ const result = await esbuild.build({
60
+ entryPoints: [entryPath],
61
+ bundle: true,
62
+ outdir: outDir,
63
+ entryNames: resolved.hash ? `${resolved.bundleName}-[hash]` : resolved.bundleName,
64
+ minify: resolved.minify,
65
+ sourcemap: resolved.sourceMaps,
66
+ target: 'es2022',
67
+ format: 'esm',
68
+ platform: 'browser',
69
+ logLevel: 'silent',
70
+ metafile: true,
71
+ });
72
+ // Extract the generated filename for template injection
73
+ const outputs = Object.keys(result.metafile?.outputs ?? {});
74
+ const bundleFile = outputs.find((f) => f.endsWith('.js'));
75
+ const bundleFilename = bundleFile ? path.basename(bundleFile) : `${resolved.bundleName}.js`;
76
+ logger.success(`TypeScript compiled: ${bundleFilename}`);
77
+ return { bundleFilename };
78
+ }
79
+ catch (error) {
80
+ if (error instanceof Error) {
81
+ logger.error(`TypeScript compilation failed: ${error.message}`);
82
+ }
83
+ throw error;
84
+ }
85
+ }
86
+ /**
87
+ * Create an esbuild watch context for development.
88
+ * Watches for TypeScript file changes and recompiles automatically.
89
+ *
90
+ * @param options - Watch options including rebuild callback
91
+ * @returns The esbuild build context for cleanup
92
+ *
93
+ * @example
94
+ * ```typescript
95
+ * const watcher = await createTypeScriptWatcher({
96
+ * projectRoot: process.cwd(),
97
+ * config: { enabled: true },
98
+ * mode: 'development',
99
+ * logger: console,
100
+ * onRebuild: () => console.log('Rebuilt!'),
101
+ * });
102
+ *
103
+ * // Later, cleanup:
104
+ * await watcher.dispose();
105
+ * ```
106
+ */
107
+ export async function createTypeScriptWatcher(options) {
108
+ const { projectRoot, config, mode, logger, onRebuild, outDir: globalOutDir } = options;
109
+ const resolved = resolveConfig(config, mode);
110
+ const entryPath = path.join(projectRoot, resolved.srcDir, resolved.entryPoint);
111
+ // Output to configured build output directory (default: dist)
112
+ const outDir = path.join(projectRoot, globalOutDir || DEFAULT_OUT_DIR, resolved.outDir);
113
+ // Validate entry point exists
114
+ if (!(await pathExists(entryPath))) {
115
+ logger.warning(`TypeScript entry point not found: ${entryPath}`);
116
+ throw new Error(`Entry point not found: ${entryPath}`);
117
+ }
118
+ const context = await esbuild.context({
119
+ entryPoints: [entryPath],
120
+ bundle: true,
121
+ outdir: outDir,
122
+ entryNames: resolved.bundleName, // Stable filename in dev mode (no hash)
123
+ minify: resolved.minify,
124
+ sourcemap: resolved.sourceMaps,
125
+ target: 'es2022',
126
+ format: 'esm',
127
+ platform: 'browser',
128
+ logLevel: 'silent',
129
+ plugins: [
130
+ {
131
+ name: 'stati-rebuild-notify',
132
+ setup(build) {
133
+ let startTime;
134
+ build.onStart(() => {
135
+ startTime = Date.now();
136
+ });
137
+ build.onEnd((result) => {
138
+ const compileTime = Date.now() - startTime;
139
+ if (result.errors.length > 0) {
140
+ result.errors.forEach((err) => {
141
+ logger.error(`TypeScript error: ${err.text}`);
142
+ });
143
+ }
144
+ else {
145
+ const bundlePath = `${globalOutDir || DEFAULT_OUT_DIR}/${resolved.outDir}/${resolved.bundleName}.js`;
146
+ onRebuild(bundlePath, compileTime);
147
+ }
148
+ });
149
+ },
150
+ },
151
+ ],
152
+ });
153
+ // Start watching
154
+ await context.watch();
155
+ logger.info(`Watching TypeScript files in ${resolved.srcDir}/`);
156
+ return context;
157
+ }
158
+ /**
159
+ * Compile stati.config.ts to a temporary JS file for import.
160
+ * Returns the path to the compiled file.
161
+ *
162
+ * @param configPath - Path to the TypeScript config file
163
+ * @returns Path to the compiled JavaScript module
164
+ *
165
+ * @example
166
+ * ```typescript
167
+ * const compiledPath = await compileStatiConfig('/path/to/stati.config.ts');
168
+ * const config = await import(compiledPath);
169
+ * await cleanupCompiledConfig(compiledPath);
170
+ * ```
171
+ */
172
+ export async function compileStatiConfig(configPath) {
173
+ const outfile = configPath.replace(/\.ts$/, '.compiled.mjs');
174
+ await esbuild.build({
175
+ entryPoints: [configPath],
176
+ bundle: true,
177
+ outfile,
178
+ format: 'esm',
179
+ platform: 'node',
180
+ target: 'node22',
181
+ logLevel: 'silent',
182
+ // Mark @stati/core as external to avoid bundling it
183
+ external: ['@stati/core'],
184
+ });
185
+ return outfile;
186
+ }
187
+ /**
188
+ * Clean up compiled config file.
189
+ *
190
+ * @param compiledPath - Path to the compiled config file to remove
191
+ */
192
+ export async function cleanupCompiledConfig(compiledPath) {
193
+ try {
194
+ await fs.unlink(compiledPath);
195
+ }
196
+ catch {
197
+ // Ignore if file doesn't exist
198
+ }
199
+ }
200
+ /**
201
+ * Auto-inject TypeScript bundle script tag into HTML before </body>.
202
+ * Similar to SEO auto-injection, this adds the script tag automatically
203
+ * so users don't need to modify their templates.
204
+ *
205
+ * @param html - Rendered HTML content
206
+ * @param bundlePath - Path to the compiled bundle (e.g., '/_assets/bundle-a1b2c3d4.js')
207
+ * @returns HTML with injected script tag
208
+ *
209
+ * @example
210
+ * ```typescript
211
+ * const html = '<html><body>Content</body></html>';
212
+ * const enhanced = autoInjectBundle(html, '/_assets/bundle.js');
213
+ * // Returns: '<html><body>Content\n <script type="module" src="/_assets/bundle.js"></script>\n</body></html>'
214
+ * ```
215
+ */
216
+ export function autoInjectBundle(html, bundlePath) {
217
+ if (!bundlePath) {
218
+ return html;
219
+ }
220
+ // Sanitize bundlePath to prevent XSS attacks
221
+ // Only allow safe characters: alphanumeric, hyphens, underscores, dots, and forward slashes
222
+ // Must start with / and end with .js
223
+ const safePathPattern = /^\/[\w\-./]+\.js$/;
224
+ if (!safePathPattern.test(bundlePath)) {
225
+ // Invalid path format, skip injection to prevent potential XSS
226
+ return html;
227
+ }
228
+ // Check if the bundle script tag is already included (avoid duplicate injection)
229
+ // Must check for actual script tag, not just any occurrence of the path
230
+ // (e.g., modulepreload links should not prevent script injection)
231
+ const scriptTagPattern = new RegExp(`<script[^>]*\\ssrc=["']${bundlePath.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}["'][^>]*>`, 'i');
232
+ if (scriptTagPattern.test(html)) {
233
+ return html;
234
+ }
235
+ // Find </body> tag (case-insensitive)
236
+ const bodyCloseMatch = html.match(/<\/body>/i);
237
+ if (!bodyCloseMatch || bodyCloseMatch.index === undefined) {
238
+ return html;
239
+ }
240
+ const bodyClosePos = bodyCloseMatch.index;
241
+ const before = html.substring(0, bodyClosePos);
242
+ const after = html.substring(bodyClosePos);
243
+ // Inject script tag before </body> with proper indentation
244
+ const scriptTag = ` <script type="module" src="${bundlePath}"></script>\n`;
245
+ return `${before}${scriptTag}${after}`;
246
+ }
@@ -1,6 +1,6 @@
1
- import { readFileSync } from 'fs';
2
- import { join, dirname } from 'path';
3
- import { fileURLToPath } from 'url';
1
+ import { readFileSync } from 'node:fs';
2
+ import { join, dirname } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
4
  /**
5
5
  * Gets the current version of Stati core from package.json
6
6
  * @returns The version string
package/dist/env.d.ts CHANGED
@@ -1,3 +1,5 @@
1
- export declare function setEnv(env: 'development' | 'production' | 'test'): void;
2
- export declare function getEnv(): string;
1
+ type Env = 'development' | 'production' | 'test';
2
+ export declare function setEnv(env: Env): void;
3
+ export declare function getEnv(): Env;
4
+ export {};
3
5
  //# sourceMappingURL=env.d.ts.map
package/dist/env.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAEA,wBAAgB,MAAM,CAAC,GAAG,EAAE,aAAa,GAAG,YAAY,GAAG,MAAM,QAEhE;AAED,wBAAgB,MAAM,WAErB"}
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,KAAK,GAAG,GAAG,aAAa,GAAG,YAAY,GAAG,MAAM,CAAC;AAIjD,wBAAgB,MAAM,CAAC,GAAG,EAAE,GAAG,QAE9B;AAED,wBAAgB,MAAM,IAAI,GAAG,CAE5B"}
@@ -76,6 +76,8 @@ export interface StatiConfig {
76
76
  robots?: RobotsTxtConfig;
77
77
  /** RSS feed generation configuration */
78
78
  rss?: import('./rss.js').RSSConfig;
79
+ /** TypeScript compilation settings */
80
+ typescript?: TypeScriptConfig;
79
81
  /** Development server configuration */
80
82
  dev?: {
81
83
  /** Port for development server (default: 3000) */
@@ -109,6 +111,71 @@ export interface SEOConfig {
109
111
  /** Enable debug logging for SEO generation (default: false) */
110
112
  debug?: boolean;
111
113
  }
114
+ /**
115
+ * TypeScript compilation configuration.
116
+ * Controls how Stati compiles TypeScript files using esbuild.
117
+ *
118
+ * In development mode, source maps are always enabled and hash/minify are always disabled.
119
+ * In production mode, source maps are always disabled and hash/minify default to true.
120
+ *
121
+ * @example
122
+ * ```typescript
123
+ * const config: StatiConfig = {
124
+ * typescript: {
125
+ * enabled: true,
126
+ * srcDir: 'src',
127
+ * outDir: '_assets',
128
+ * entryPoint: 'main.ts',
129
+ * bundleName: 'bundle',
130
+ * // hash and minify default to true in production
131
+ * // set to false only if you need to debug production builds
132
+ * }
133
+ * };
134
+ * ```
135
+ */
136
+ export interface TypeScriptConfig {
137
+ /**
138
+ * Enable TypeScript compilation.
139
+ * @default false
140
+ */
141
+ enabled: boolean;
142
+ /**
143
+ * Source directory containing TypeScript files.
144
+ * Relative to site root.
145
+ * @default 'src'
146
+ */
147
+ srcDir?: string;
148
+ /**
149
+ * Output directory for compiled JavaScript.
150
+ * Relative to build output directory (dist/).
151
+ * @default '_assets'
152
+ */
153
+ outDir?: string;
154
+ /**
155
+ * Entry point file name (without path).
156
+ * @default 'main.ts'
157
+ */
158
+ entryPoint?: string;
159
+ /**
160
+ * Output bundle file name (without extension).
161
+ * The final filename will include a content hash: `[bundleName]-[hash].js`
162
+ * @default 'bundle'
163
+ */
164
+ bundleName?: string;
165
+ /**
166
+ * Include content hash in bundle filename for cache busting in production.
167
+ * When true, outputs `bundle-a1b2c3d4.js`. When false, outputs `bundle.js`.
168
+ * This option only applies to production builds; development always uses stable filenames.
169
+ * @default true
170
+ */
171
+ hash?: boolean;
172
+ /**
173
+ * Minify JavaScript output in production builds.
174
+ * This option only applies to production builds; development output is never minified.
175
+ * @default true
176
+ */
177
+ minify?: boolean;
178
+ }
112
179
  /**
113
180
  * Robots.txt generation configuration.
114
181
  * Controls how the robots.txt file is generated.
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,22 @@
1
1
  /**
2
2
  * Content related type definitions
3
3
  */
4
+ /**
5
+ * TypeScript bundle asset information.
6
+ * Available when TypeScript compilation is enabled.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * // In Eta templates, access via stati.assets
11
+ * <script type="module" src="<%= stati.assets.bundlePath %>"></script>
12
+ * ```
13
+ */
14
+ export interface StatiAssets {
15
+ /** Bundle filename only (e.g., 'bundle-a1b2c3d4.js') */
16
+ bundleName?: string;
17
+ /** Full path to bundle (e.g., '/_assets/bundle-a1b2c3d4.js') */
18
+ bundlePath?: string;
19
+ }
4
20
  /**
5
21
  * Front matter metadata extracted from content files.
6
22
  * Contains page-specific configuration and metadata in YAML format.
@@ -320,6 +336,8 @@ export interface TemplateContext {
320
336
  partials: Record<string, string>;
321
337
  /** Collection data (available on index pages and child pages showing parent collection) */
322
338
  collection?: CollectionData;
339
+ /** TypeScript bundle assets (available when typescript.enabled is true) */
340
+ assets?: StatiAssets;
323
341
  /** Additional properties that may be added dynamically (e.g., custom filters, helpers) */
324
342
  [key: string]: unknown;
325
343
  }
@@ -1 +1 @@
1
- {"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../src/types/content.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../../src/types/content.ts"],"names":[],"mappings":"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"}
@@ -3,8 +3,8 @@
3
3
  * This file provides a single entry point for importing types
4
4
  */
5
5
  export type { AgingRule, ISGConfig, CacheEntry, CacheManifest } from './isg.js';
6
- export type { SiteConfig, StatiConfig, BuildContext, PageContext, BuildHooks, BuildStats, SEOConfig, RobotsTxtConfig, } from './config.js';
7
- export type { FrontMatter, PageModel, CollectionData, TemplateContext, SEOMetadata, SitemapMetadata, RobotsConfig, OpenGraphConfig, OpenGraphImage, OpenGraphArticle, TwitterCardConfig, AuthorConfig, } from './content.js';
6
+ export type { SiteConfig, StatiConfig, BuildContext, PageContext, BuildHooks, BuildStats, SEOConfig, RobotsTxtConfig, TypeScriptConfig, } from './config.js';
7
+ export type { FrontMatter, PageModel, CollectionData, TemplateContext, SEOMetadata, SitemapMetadata, RobotsConfig, OpenGraphConfig, OpenGraphImage, OpenGraphArticle, TwitterCardConfig, AuthorConfig, StatiAssets, } from './content.js';
8
8
  export type { SEOContext, SEOValidationResult } from './seo.js';
9
9
  export { SEOTagType } from './seo.js';
10
10
  export type { ChangeFrequency, SitemapEntry, SitemapConfig, SitemapGenerationResult, } from './sitemap.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGhF,YAAY,EACV,UAAU,EACV,WAAW,EACX,YAAY,EACZ,WAAW,EACX,UAAU,EACV,UAAU,EACV,SAAS,EACT,eAAe,GAChB,MAAM,aAAa,CAAC;AAGrB,YAAY,EACV,WAAW,EACX,SAAS,EACT,cAAc,EACd,eAAe,EACf,WAAW,EACX,eAAe,EACf,YAAY,EACZ,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,GACb,MAAM,cAAc,CAAC;AAGtB,YAAY,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGtC,YAAY,EACV,eAAe,EACf,YAAY,EACZ,aAAa,EACb,uBAAuB,GACxB,MAAM,cAAc,CAAC;AAGtB,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAG9E,YAAY,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAG/C,YAAY,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGhF,YAAY,EACV,UAAU,EACV,WAAW,EACX,YAAY,EACZ,WAAW,EACX,UAAU,EACV,UAAU,EACV,SAAS,EACT,eAAe,EACf,gBAAgB,GACjB,MAAM,aAAa,CAAC;AAGrB,YAAY,EACV,WAAW,EACX,SAAS,EACT,cAAc,EACd,eAAe,EACf,WAAW,EACX,eAAe,EACf,YAAY,EACZ,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,WAAW,GACZ,MAAM,cAAc,CAAC;AAGtB,YAAY,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGtC,YAAY,EACV,eAAe,EACf,YAAY,EACZ,aAAa,EACb,uBAAuB,GACxB,MAAM,cAAc,CAAC;AAGtB,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAG9E,YAAY,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAG/C,YAAY,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stati/core",
3
- "version": "1.12.5",
3
+ "version": "1.14.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -39,6 +39,7 @@
39
39
  },
40
40
  "dependencies": {
41
41
  "chokidar": "^3.6.0",
42
+ "esbuild": "^0.27.0",
42
43
  "eta": "^3.5.0",
43
44
  "fast-glob": "^3.3.3",
44
45
  "fs-extra": "^11.2.0",