@refrakt-md/content 0.9.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -6,6 +6,7 @@ export { buildNavigation, type NavTree, type NavGroup, type NavItem } from './na
6
6
  export { loadContent, type Site, type SitePage } from './site.js';
7
7
  export { generateSitemap, type SitemapEntry } from './sitemap.js';
8
8
  export { collectRuneTypes, analyzeRuneUsage, type RuneUsageReport } from './analyze.js';
9
+ export { getGitTimestamps, getStatTimestamps, resolveTimestamps, type FileTimestamps } from './timestamps.js';
9
10
  export { EntityRegistryImpl } from './registry.js';
10
11
  export { runPipeline, type HookSet, type PipelineResult, type PipelineStats } from './pipeline.js';
11
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC7H,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC5F,OAAO,EAAE,MAAM,EAAE,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,KAAK,IAAI,EAAE,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AACxF,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,KAAK,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC7H,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC5F,OAAO,EAAE,MAAM,EAAE,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,KAAK,IAAI,EAAE,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AACxF,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC9G,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,KAAK,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,eAAe,CAAC"}
package/dist/index.js CHANGED
@@ -6,6 +6,7 @@ export { buildNavigation } from './navigation.js';
6
6
  export { loadContent } from './site.js';
7
7
  export { generateSitemap } from './sitemap.js';
8
8
  export { collectRuneTypes, analyzeRuneUsage } from './analyze.js';
9
+ export { getGitTimestamps, getStatTimestamps, resolveTimestamps } from './timestamps.js';
9
10
  export { EntityRegistryImpl } from './registry.js';
10
11
  export { runPipeline } from './pipeline.js';
11
12
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA+E,MAAM,mBAAmB,CAAC;AAC7H,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAoB,MAAM,kBAAkB,CAAC;AAC5F,OAAO,EAAE,MAAM,EAAc,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,cAAc,EAAoC,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,eAAe,EAA6C,MAAM,iBAAiB,CAAC;AAC7F,OAAO,EAAE,WAAW,EAA4B,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,eAAe,EAAqB,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAwB,MAAM,cAAc,CAAC;AACxF,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,WAAW,EAAyD,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA+E,MAAM,mBAAmB,CAAC;AAC7H,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAoB,MAAM,kBAAkB,CAAC;AAC5F,OAAO,EAAE,MAAM,EAAc,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,cAAc,EAAoC,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,eAAe,EAA6C,MAAM,iBAAiB,CAAC;AAC7F,OAAO,EAAE,WAAW,EAA4B,MAAM,WAAW,CAAC;AAClE,OAAO,EAAE,eAAe,EAAqB,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAwB,MAAM,cAAc,CAAC;AACxF,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,iBAAiB,EAAuB,MAAM,iBAAiB,CAAC;AAC9G,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,WAAW,EAAyD,MAAM,eAAe,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"site.d.ts","sourceRoot":"","sources":["../src/site.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAQ,mBAAmB,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1E,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACtF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAoB,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAU,KAAK,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAkB,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAG1C,MAAM,WAAW,IAAI;IACnB,uBAAuB;IACvB,IAAI,EAAE,WAAW,CAAC;IAClB,iDAAiD;IACjD,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,wCAAwC;IACxC,UAAU,EAAE,OAAO,EAAE,CAAC;IACtB,kFAAkF;IAClF,gBAAgB,EAAE,eAAe,EAAE,CAAC;IACpC,mDAAmD;IACnD,aAAa,EAAE,aAAa,CAAC;IAC7B,6EAA6E;IAC7E,UAAU,EAAE,cAAc,CAAC;IAC3B,sEAAsE;IACtE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,KAAK,CAAC;IACb,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,mBAAmB,CAAC;IAChC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,MAAM,EAAE,cAAc,CAAC;IACvB,GAAG,EAAE,OAAO,CAAC;CACd;AA0CD;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,MAAY,EACtB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC9C,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACvC,QAAQ,CAAC,EAAE,WAAW,EAAE,EACxB,kBAAkB,CAAC,EAAE,MAAM,GAC1B,OAAO,CAAC,IAAI,CAAC,CAyDf"}
1
+ {"version":3,"file":"site.d.ts","sourceRoot":"","sources":["../src/site.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAQ,mBAAmB,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE1E,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACtF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAoB,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAU,KAAK,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAkB,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAI1C,MAAM,WAAW,IAAI;IACnB,uBAAuB;IACvB,IAAI,EAAE,WAAW,CAAC;IAClB,iDAAiD;IACjD,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,wCAAwC;IACxC,UAAU,EAAE,OAAO,EAAE,CAAC;IACtB,kFAAkF;IAClF,gBAAgB,EAAE,eAAe,EAAE,CAAC;IACpC,mDAAmD;IACnD,aAAa,EAAE,aAAa,CAAC;IAC7B,6EAA6E;IAC7E,UAAU,EAAE,cAAc,CAAC;IAC3B,sEAAsE;IACtE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,KAAK,CAAC;IACb,WAAW,EAAE,WAAW,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,mBAAmB,CAAC;IAChC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,MAAM,EAAE,cAAc,CAAC;IACvB,GAAG,EAAE,OAAO,CAAC;CACd;AA0CD;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,MAAM,EACf,QAAQ,GAAE,MAAY,EACtB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAC9C,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACvC,QAAQ,CAAC,EAAE,WAAW,EAAE,EACxB,kBAAkB,CAAC,EAAE,MAAM,GAC1B,OAAO,CAAC,IAAI,CAAC,CAsEf"}
package/dist/site.js CHANGED
@@ -7,6 +7,7 @@ import { parseFrontmatter } from './frontmatter.js';
7
7
  import { Router } from './router.js';
8
8
  import { resolveLayouts } from './layout.js';
9
9
  import { runPipeline } from './pipeline.js';
10
+ import { getGitTimestamps, resolveTimestamps } from './timestamps.js';
10
11
  /** Synchronous file reader that returns null on failure. */
11
12
  function sandboxReadFile(p) {
12
13
  try {
@@ -75,13 +76,20 @@ export async function loadContent(dirPath, basePath = '/', icons, additionalTags
75
76
  parsedPartials[name] = Markdoc.parse(escapeFenceTags(partial.raw));
76
77
  }
77
78
  }
79
+ // Batch-collect git timestamps once before the page loop
80
+ const gitTimestamps = getGitTimestamps(dirPath);
78
81
  for (const page of tree.pages()) {
79
82
  const { frontmatter, content } = parseFrontmatter(page.raw);
80
83
  const route = router.resolve(page.relativePath, frontmatter);
81
84
  const layout = resolveLayouts(page, tree.root, icons);
85
+ const fileTimestamps = resolveTimestamps(page.relativePath, page.filePath, gitTimestamps, frontmatter);
82
86
  const contentVariables = {
83
87
  frontmatter,
84
88
  page: { url: route.url, filePath: route.filePath, draft: route.draft },
89
+ file: {
90
+ created: fileTimestamps.created,
91
+ modified: fileTimestamps.modified,
92
+ },
85
93
  __sandboxReadFile: sandboxReadFile,
86
94
  __sandboxListDir: sandboxListDir,
87
95
  __sandboxDirExists: sandboxDirExists,
package/dist/site.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"site.js","sourceRoot":"","sources":["../src/site.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAc,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,OAAO,MAAM,kBAAkB,CAAC;AAEvC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIjH,OAAO,EAAE,WAAW,EAAoB,MAAM,mBAAmB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAe,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,MAAM,EAAS,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAkB,MAAM,aAAa,CAAC;AAE7D,OAAO,EAAE,WAAW,EAAgB,MAAM,eAAe,CAAC;AA6B1D,4DAA4D;AAC5D,SAAS,eAAe,CAAC,CAAS;IAChC,IAAI,CAAC;QAAC,OAAO,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAAC,CAAC;IACxC,MAAM,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;AACxB,CAAC;AAED,yEAAyE;AACzE,SAAS,cAAc,CAAC,CAAS;IAC/B,IAAI,CAAC;QAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;IAC9B,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AACtB,CAAC;AAED,gDAAgD;AAChD,SAAS,gBAAgB,CAAC,CAAS;IACjC,IAAI,CAAC;QAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IAAC,CAAC;IACzC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAC;IAAC,CAAC;AACzB,CAAC;AAED,SAAS,gBAAgB,CACvB,OAAe,EACf,IAAY,EACZ,KAA8C,EAC9C,cAAuC,EACvC,gBAA0C,EAC1C,QAA+B;IAE/B,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,UAAU,GAAG,cAAc,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1E,MAAM,MAAM,GAA4B,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE;YAC5E,YAAY,EAAE,IAAI,GAAG,EAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO;YAClE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACpC,GAAG,gBAAgB;SACpB,EAAE,CAAC;IACJ,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,MAAa,CAAC,EAAE,QAAQ,EAAE,CAAC;AACzE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAe,EACf,WAAmB,GAAG,EACtB,KAA8C,EAC9C,cAAuC,EACvC,QAAwB,EACxB,kBAA2B;IAE3B,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC;IACpC,MAAM,KAAK,GAAe,EAAE,CAAC;IAE7B,qDAAqD;IACrD,MAAM,mBAAmB,GAAG,kBAAkB;QAC5C,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC;QAC7B,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IAEvC,gEAAgE;IAChE,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;IACrC,IAAI,cAAgD,CAAC;IACrD,IAAI,YAAY,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAC1B,cAAc,GAAG,EAAE,CAAC;QACpB,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,YAAY,EAAE,CAAC;YAC3C,cAAc,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;QAChC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACtD,MAAM,gBAAgB,GAA4B;YAChD,WAAW;YACX,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE;YACtE,iBAAiB,EAAE,eAAe;YAClC,gBAAgB,EAAE,cAAc;YAChC,kBAAkB,EAAE,gBAAgB;YACpC,oBAAoB,EAAE,mBAAmB;SAC1C,CAAC;QACF,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,gBAAgB,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,CAAC,CAAC;QAC/H,MAAM,GAAG,GAAG,UAAU,CAAC,UAAU,EAAE,WAAW,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QAE3D,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,mFAAmF;IACnF,MAAM,QAAQ,GAAc,CAAC,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;IACpF,KAAK,MAAM,GAAG,IAAI,QAAQ,IAAI,EAAE,EAAE,CAAC;QACjC,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;YACjB,QAAQ,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAEjG,OAAO;QACL,IAAI;QACJ,KAAK,EAAE,aAAa;QACpB,UAAU,EAAE,EAAE,EAAE,sCAAsC;QACtD,gBAAgB,EAAE,QAAQ;QAC1B,aAAa,EAAE,KAAK;QACpB,UAAU;QACV,QAAQ,EAAE,YAAY;KACvB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"site.js","sourceRoot":"","sources":["../src/site.ts"],"names":[],"mappings":"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"}
package/dist/sitemap.d.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  export interface SitemapEntry {
2
2
  url: string;
3
3
  draft: boolean;
4
+ /** ISO 8601 date string (YYYY-MM-DD) for the last modification date */
5
+ lastmod?: string;
4
6
  }
5
7
  /**
6
8
  * Generate a sitemap.xml string from a list of pages.
@@ -1 +1 @@
1
- {"version":3,"file":"sitemap.d.ts","sourceRoot":"","sources":["../src/sitemap.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;CACf;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAc9E"}
1
+ {"version":3,"file":"sitemap.d.ts","sourceRoot":"","sources":["../src/sitemap.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAe9E"}
package/dist/sitemap.js CHANGED
@@ -10,7 +10,8 @@ export function generateSitemap(pages, baseUrl) {
10
10
  const loc = `${baseUrl.replace(/\/$/, '')}${p.url}`;
11
11
  const depth = p.url === '/' ? 0 : p.url.split('/').filter(Boolean).length;
12
12
  const priority = depth === 0 ? '1.0' : depth <= 1 ? '0.8' : '0.6';
13
- return ` <url>\n <loc>${escapeXml(loc)}</loc>\n <priority>${priority}</priority>\n </url>`;
13
+ const lastmod = p.lastmod ? `\n <lastmod>${escapeXml(p.lastmod)}</lastmod>` : '';
14
+ return ` <url>\n <loc>${escapeXml(loc)}</loc>${lastmod}\n <priority>${priority}</priority>\n </url>`;
14
15
  });
15
16
  return `<?xml version="1.0" encoding="UTF-8"?>
16
17
  <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
@@ -1 +1 @@
1
- {"version":3,"file":"sitemap.js","sourceRoot":"","sources":["../src/sitemap.ts"],"names":[],"mappings":"AAAA,iCAAiC;AAOjC;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,KAAqB,EAAE,OAAe;IACrE,MAAM,IAAI,GAAG,KAAK;SAChB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;SACrB,GAAG,CAAC,CAAC,CAAC,EAAE;QACR,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;QAC1E,MAAM,QAAQ,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;QAClE,OAAO,qBAAqB,SAAS,CAAC,GAAG,CAAC,yBAAyB,QAAQ,uBAAuB,CAAC;IACpG,CAAC,CAAC,CAAC;IAEJ,OAAO;;EAEN,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;UACP,CAAC;AACX,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC7B,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC/E,CAAC"}
1
+ {"version":3,"file":"sitemap.js","sourceRoot":"","sources":["../src/sitemap.ts"],"names":[],"mappings":"AAAA,iCAAiC;AASjC;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,KAAqB,EAAE,OAAe;IACrE,MAAM,IAAI,GAAG,KAAK;SAChB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;SACrB,GAAG,CAAC,CAAC,CAAC,EAAE;QACR,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;QAC1E,MAAM,QAAQ,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;QAClE,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QACpF,OAAO,qBAAqB,SAAS,CAAC,GAAG,CAAC,SAAS,OAAO,mBAAmB,QAAQ,uBAAuB,CAAC;IAC9G,CAAC,CAAC,CAAC;IAEJ,OAAO;;EAEN,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;UACP,CAAC;AACX,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC7B,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC/E,CAAC"}
@@ -0,0 +1,34 @@
1
+ export interface FileTimestamps {
2
+ created: string | undefined;
3
+ modified: string | undefined;
4
+ }
5
+ /**
6
+ * Batch-collect git timestamps for all files in a content directory.
7
+ *
8
+ * Returns a `Map<string, FileTimestamps>` keyed by relative file path
9
+ * (relative to the provided `contentDir`).
10
+ *
11
+ * Resolution order per file:
12
+ * 1. Git history (created + modified from commit timestamps)
13
+ * 2. Filesystem stat fallback (birthtimeMs / mtimeMs)
14
+ *
15
+ * In shallow clones, `created` is omitted (unreliable) but `modified` is still provided.
16
+ *
17
+ * Frontmatter overrides are NOT applied here — that's the caller's responsibility
18
+ * (see `loadContent()` in site.ts).
19
+ */
20
+ export declare function getGitTimestamps(contentDir: string): Map<string, FileTimestamps>;
21
+ /**
22
+ * Get filesystem-based timestamps for a single file as a fallback.
23
+ * Returns ISO 8601 date strings (YYYY-MM-DD).
24
+ */
25
+ export declare function getStatTimestamps(filePath: string): FileTimestamps;
26
+ /**
27
+ * Resolve timestamps for a single file using the three-tier fallback:
28
+ * frontmatter override > git history > fs.stat.
29
+ *
30
+ * The `gitTimestamps` map should come from `getGitTimestamps()`.
31
+ * The `frontmatter` object may contain `created` and/or `modified` keys.
32
+ */
33
+ export declare function resolveTimestamps(relPath: string, absPath: string, gitTimestamps: Map<string, FileTimestamps>, frontmatter: Record<string, unknown>): FileTimestamps;
34
+ //# sourceMappingURL=timestamps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timestamps.d.ts","sourceRoot":"","sources":["../src/timestamps.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,cAAc;IAC9B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B;AA6HD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAoChF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAUlE;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAChC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,EAC1C,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,cAAc,CAehB"}
@@ -0,0 +1,204 @@
1
+ // ─── Git / Filesystem Timestamp Collection ───
2
+ import { execSync } from 'node:child_process';
3
+ import { statSync } from 'node:fs';
4
+ import { resolve } from 'node:path';
5
+ /**
6
+ * Format a Unix timestamp (seconds) as an ISO 8601 date string (YYYY-MM-DD).
7
+ */
8
+ function formatDate(unixSeconds) {
9
+ const d = new Date(unixSeconds * 1000);
10
+ const year = d.getUTCFullYear();
11
+ const month = String(d.getUTCMonth() + 1).padStart(2, '0');
12
+ const day = String(d.getUTCDate()).padStart(2, '0');
13
+ return `${year}-${month}-${day}`;
14
+ }
15
+ /**
16
+ * Format a millisecond timestamp as an ISO 8601 date string (YYYY-MM-DD).
17
+ */
18
+ function formatDateMs(ms) {
19
+ const d = new Date(ms);
20
+ const year = d.getUTCFullYear();
21
+ const month = String(d.getUTCMonth() + 1).padStart(2, '0');
22
+ const day = String(d.getUTCDate()).padStart(2, '0');
23
+ return `${year}-${month}-${day}`;
24
+ }
25
+ /**
26
+ * Detect whether the current repository is a shallow clone.
27
+ */
28
+ function isShallowClone(cwd) {
29
+ try {
30
+ const result = execSync('git rev-parse --is-shallow-repository', {
31
+ cwd,
32
+ encoding: 'utf-8',
33
+ stdio: ['pipe', 'pipe', 'pipe'],
34
+ }).trim();
35
+ return result === 'true';
36
+ }
37
+ catch {
38
+ return false;
39
+ }
40
+ }
41
+ /**
42
+ * Get the most recent commit timestamp (in unix seconds) for each file.
43
+ * Returns a Map keyed by file path relative to the git root.
44
+ * Only records the first (most recent) timestamp per file.
45
+ */
46
+ function getGitModifiedTimes(cwd) {
47
+ const mtimes = new Map();
48
+ try {
49
+ const output = execSync('git log --format="%at" --name-only --diff-filter=ACMR HEAD', { cwd, encoding: 'utf-8', maxBuffer: 10 * 1024 * 1024, stdio: ['pipe', 'pipe', 'pipe'] });
50
+ let currentTimestamp = 0;
51
+ for (const line of output.split('\n')) {
52
+ const trimmed = line.trim();
53
+ if (!trimmed)
54
+ continue;
55
+ if (/^\d+$/.test(trimmed)) {
56
+ currentTimestamp = parseInt(trimmed, 10);
57
+ continue;
58
+ }
59
+ // Only record the first (most recent) timestamp per file
60
+ if (currentTimestamp > 0 && !mtimes.has(trimmed)) {
61
+ mtimes.set(trimmed, currentTimestamp);
62
+ }
63
+ }
64
+ }
65
+ catch {
66
+ // Not a git repo or git not available
67
+ }
68
+ return mtimes;
69
+ }
70
+ /**
71
+ * Get the earliest commit timestamp (in unix seconds) for each file.
72
+ * Uses --diff-filter=A to find the commit that added each file.
73
+ * Returns a Map keyed by file path relative to the git root.
74
+ * The --reverse flag means first seen = earliest, so we only record the first per file.
75
+ */
76
+ function getGitCreatedTimes(cwd) {
77
+ const ctimes = new Map();
78
+ try {
79
+ const output = execSync('git log --format="%at" --name-only --diff-filter=A --reverse HEAD', { cwd, encoding: 'utf-8', maxBuffer: 10 * 1024 * 1024, stdio: ['pipe', 'pipe', 'pipe'] });
80
+ let currentTimestamp = 0;
81
+ for (const line of output.split('\n')) {
82
+ const trimmed = line.trim();
83
+ if (!trimmed)
84
+ continue;
85
+ if (/^\d+$/.test(trimmed)) {
86
+ currentTimestamp = parseInt(trimmed, 10);
87
+ continue;
88
+ }
89
+ // --reverse means first occurrence is the earliest — only record once
90
+ if (currentTimestamp > 0 && !ctimes.has(trimmed)) {
91
+ ctimes.set(trimmed, currentTimestamp);
92
+ }
93
+ }
94
+ }
95
+ catch {
96
+ // Not a git repo or git not available
97
+ }
98
+ return ctimes;
99
+ }
100
+ /**
101
+ * Resolve the git root directory relative path prefix for a given directory.
102
+ * Returns the relative path from the git root to `cwd`, or empty string if at root.
103
+ */
104
+ function getGitRelativePrefix(cwd) {
105
+ try {
106
+ const root = execSync('git rev-parse --show-toplevel', {
107
+ cwd,
108
+ encoding: 'utf-8',
109
+ stdio: ['pipe', 'pipe', 'pipe'],
110
+ }).trim();
111
+ const absDir = resolve(cwd);
112
+ if (absDir === root)
113
+ return '';
114
+ const rel = absDir.slice(root.length + 1);
115
+ return rel ? rel + '/' : '';
116
+ }
117
+ catch {
118
+ return null;
119
+ }
120
+ }
121
+ /**
122
+ * Batch-collect git timestamps for all files in a content directory.
123
+ *
124
+ * Returns a `Map<string, FileTimestamps>` keyed by relative file path
125
+ * (relative to the provided `contentDir`).
126
+ *
127
+ * Resolution order per file:
128
+ * 1. Git history (created + modified from commit timestamps)
129
+ * 2. Filesystem stat fallback (birthtimeMs / mtimeMs)
130
+ *
131
+ * In shallow clones, `created` is omitted (unreliable) but `modified` is still provided.
132
+ *
133
+ * Frontmatter overrides are NOT applied here — that's the caller's responsibility
134
+ * (see `loadContent()` in site.ts).
135
+ */
136
+ export function getGitTimestamps(contentDir) {
137
+ const absDir = resolve(contentDir);
138
+ const prefix = getGitRelativePrefix(absDir);
139
+ const hasGit = prefix !== null;
140
+ const shallow = hasGit && isShallowClone(absDir);
141
+ let modifiedMap = new Map();
142
+ let createdMap = new Map();
143
+ if (hasGit) {
144
+ modifiedMap = getGitModifiedTimes(absDir);
145
+ if (!shallow) {
146
+ createdMap = getGitCreatedTimes(absDir);
147
+ }
148
+ }
149
+ // Merge created + modified into a single map keyed by relative path (relative to contentDir)
150
+ const timestamps = new Map();
151
+ // Collect all known file paths from both maps
152
+ const allPaths = new Set([...modifiedMap.keys(), ...createdMap.keys()]);
153
+ for (const gitPath of allPaths) {
154
+ // Only include files under the content directory
155
+ if (prefix !== '' && !gitPath.startsWith(prefix))
156
+ continue;
157
+ const relPath = prefix ? gitPath.slice(prefix.length) : gitPath;
158
+ const modifiedTs = modifiedMap.get(gitPath);
159
+ const createdTs = createdMap.get(gitPath);
160
+ timestamps.set(relPath, {
161
+ created: createdTs ? formatDate(createdTs) : undefined,
162
+ modified: modifiedTs ? formatDate(modifiedTs) : undefined,
163
+ });
164
+ }
165
+ return timestamps;
166
+ }
167
+ /**
168
+ * Get filesystem-based timestamps for a single file as a fallback.
169
+ * Returns ISO 8601 date strings (YYYY-MM-DD).
170
+ */
171
+ export function getStatTimestamps(filePath) {
172
+ try {
173
+ const stat = statSync(filePath);
174
+ return {
175
+ created: stat.birthtimeMs > 0 ? formatDateMs(stat.birthtimeMs) : undefined,
176
+ modified: formatDateMs(stat.mtimeMs),
177
+ };
178
+ }
179
+ catch {
180
+ return { created: undefined, modified: undefined };
181
+ }
182
+ }
183
+ /**
184
+ * Resolve timestamps for a single file using the three-tier fallback:
185
+ * frontmatter override > git history > fs.stat.
186
+ *
187
+ * The `gitTimestamps` map should come from `getGitTimestamps()`.
188
+ * The `frontmatter` object may contain `created` and/or `modified` keys.
189
+ */
190
+ export function resolveTimestamps(relPath, absPath, gitTimestamps, frontmatter) {
191
+ const fm = {
192
+ created: typeof frontmatter.created === 'string' ? frontmatter.created : undefined,
193
+ modified: typeof frontmatter.modified === 'string' ? frontmatter.modified : undefined,
194
+ };
195
+ const git = gitTimestamps.get(relPath);
196
+ // Lazy fs.stat — only computed if needed
197
+ let stat;
198
+ const getStat = () => { stat ??= getStatTimestamps(absPath); return stat; };
199
+ return {
200
+ created: fm.created ?? git?.created ?? getStat().created,
201
+ modified: fm.modified ?? git?.modified ?? getStat().modified,
202
+ };
203
+ }
204
+ //# sourceMappingURL=timestamps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timestamps.js","sourceRoot":"","sources":["../src/timestamps.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@refrakt-md/content",
3
3
  "description": "Content loading and transformation pipeline",
4
- "version": "0.9.0",
4
+ "version": "0.9.1",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -23,8 +23,8 @@
23
23
  "build": "tsc"
24
24
  },
25
25
  "dependencies": {
26
- "@refrakt-md/runes": "0.9.0",
27
- "@refrakt-md/types": "0.9.0",
26
+ "@refrakt-md/runes": "0.9.1",
27
+ "@refrakt-md/types": "0.9.1",
28
28
  "@markdoc/markdoc": "0.4.0",
29
29
  "yaml": "^2.4.0"
30
30
  }