@haverstack/eleventy 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +91 -0
  3. package/dist/assets.d.ts +52 -0
  4. package/dist/assets.d.ts.map +1 -0
  5. package/dist/assets.js +148 -0
  6. package/dist/assets.js.map +1 -0
  7. package/dist/check.d.ts +35 -0
  8. package/dist/check.d.ts.map +1 -0
  9. package/dist/check.js +141 -0
  10. package/dist/check.js.map +1 -0
  11. package/dist/cli.d.ts +15 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +122 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/emit.d.ts +72 -0
  16. package/dist/emit.d.ts.map +1 -0
  17. package/dist/emit.js +147 -0
  18. package/dist/emit.js.map +1 -0
  19. package/dist/errors.d.ts +12 -0
  20. package/dist/errors.d.ts.map +1 -0
  21. package/dist/errors.js +15 -0
  22. package/dist/errors.js.map +1 -0
  23. package/dist/feeds.d.ts +24 -0
  24. package/dist/feeds.d.ts.map +1 -0
  25. package/dist/feeds.js +103 -0
  26. package/dist/feeds.js.map +1 -0
  27. package/dist/index.d.ts +94 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +73 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/load.d.ts +86 -0
  32. package/dist/load.d.ts.map +1 -0
  33. package/dist/load.js +258 -0
  34. package/dist/load.js.map +1 -0
  35. package/dist/markdown.d.ts +23 -0
  36. package/dist/markdown.d.ts.map +1 -0
  37. package/dist/markdown.js +81 -0
  38. package/dist/markdown.js.map +1 -0
  39. package/dist/publish.d.ts +45 -0
  40. package/dist/publish.d.ts.map +1 -0
  41. package/dist/publish.js +79 -0
  42. package/dist/publish.js.map +1 -0
  43. package/dist/resolve.d.ts +119 -0
  44. package/dist/resolve.d.ts.map +1 -0
  45. package/dist/resolve.js +411 -0
  46. package/dist/resolve.js.map +1 -0
  47. package/dist/scaffold.d.ts +22 -0
  48. package/dist/scaffold.d.ts.map +1 -0
  49. package/dist/scaffold.js +98 -0
  50. package/dist/scaffold.js.map +1 -0
  51. package/dist/templates.d.ts +34 -0
  52. package/dist/templates.d.ts.map +1 -0
  53. package/dist/templates.js +171 -0
  54. package/dist/templates.js.map +1 -0
  55. package/dist/types.d.ts +96 -0
  56. package/dist/types.d.ts.map +1 -0
  57. package/dist/types.js +123 -0
  58. package/dist/types.js.map +1 -0
  59. package/package.json +72 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/emit.d.ts ADDED
@@ -0,0 +1,72 @@
1
+ /**
2
+ * @haverstack/eleventy — emit phase
3
+ * -------------------------------------------------------
4
+ * Turn a `ResolvedSite` into Eleventy virtual templates: one per page and
5
+ * per member, plus the feeds and the sitemap. Attachment bytes are staged
6
+ * to disk first and passed through. Global data exposes the resolved
7
+ * structures so a site that brings its own templates can iterate them.
8
+ *
9
+ * See docs/design.md § Emit.
10
+ */
11
+ import type { StackClient, StackRecord } from '@haverstack/core';
12
+ import { type AssetPlan } from './assets.js';
13
+ import type { StackIndex } from './load.js';
14
+ import type { ResolvedMeta, ResolvedSite } from './resolve.js';
15
+ /**
16
+ * Maps a `template` name to a layout the site provides in its own
17
+ * `_includes`. A mapped page emits its content fragment plus that
18
+ * `layout`; an unmapped one keeps the self-contained built-in render.
19
+ * `base` is the fallback for any name not otherwise listed.
20
+ */
21
+ export type TemplateOverrides = {
22
+ base?: string;
23
+ } & Record<string, string | undefined>;
24
+ /** Passed to a `pageData` hook so it can compute extra template data per record. */
25
+ export interface PageDataContext {
26
+ kind: 'page' | 'member';
27
+ record: StackRecord;
28
+ meta: ResolvedMeta;
29
+ url: string;
30
+ template: string;
31
+ canonical: string | null;
32
+ unlisted: boolean;
33
+ resolved: ResolvedSite;
34
+ }
35
+ export type PageDataHook = (ctx: PageDataContext) => Record<string, unknown>;
36
+ export interface EmitEleventyConfig {
37
+ addTemplate(virtualPath: string, content: string, data?: Record<string, unknown>): unknown;
38
+ addPassthroughCopy(path: string | Record<string, string>): unknown;
39
+ addGlobalData(name: string, value: unknown): unknown;
40
+ }
41
+ export interface EmitOptions {
42
+ eleventyConfig: EmitEleventyConfig;
43
+ stack: StackClient;
44
+ resolved: ResolvedSite;
45
+ index: StackIndex;
46
+ assetDir: string;
47
+ /** Maximum entries per feed. */
48
+ feedLimit: number;
49
+ /** Directory `assetDir` is resolved against when staging bytes. Default `process.cwd()`. */
50
+ cwd?: string;
51
+ /** Per-template-name layout overrides. Unmapped names use the built-in render. */
52
+ templates?: TemplateOverrides;
53
+ /**
54
+ * `false` keeps the plugin's pages out of Eleventy's `collections` and
55
+ * `eleventyNavigation` entirely. Default `true`.
56
+ */
57
+ eleventyCollections?: boolean;
58
+ /** Extra data merged into every page/member template, last (so it can override). */
59
+ pageData?: PageDataHook;
60
+ }
61
+ export interface EmitResult {
62
+ pages: number;
63
+ members: number;
64
+ feeds: number;
65
+ assets: {
66
+ written: number;
67
+ skipped: number;
68
+ };
69
+ }
70
+ export declare function emit(opts: EmitOptions): Promise<EmitResult>;
71
+ export type { AssetPlan };
72
+ //# sourceMappingURL=emit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../src/emit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAY,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAA8B,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAUzE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAgB,YAAY,EAAE,MAAM,cAAc,CAAC;AAE7E;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAEvF,oFAAoF;AACpF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC;IACxB,MAAM,EAAE,WAAW,CAAC;IACpB,IAAI,EAAE,YAAY,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,YAAY,CAAC;CACxB;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,eAAe,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE7E,MAAM,WAAW,kBAAkB;IACjC,WAAW,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC;IAC3F,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;IACnE,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;CACtD;AAED,MAAM,WAAW,WAAW;IAC1B,cAAc,EAAE,kBAAkB,CAAC;IACnC,KAAK,EAAE,WAAW,CAAC;IACnB,QAAQ,EAAE,YAAY,CAAC;IACvB,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,gCAAgC;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,4FAA4F;IAC5F,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,kFAAkF;IAClF,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,oFAAoF;IACpF,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9C;AAuBD,wBAAsB,IAAI,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAmKjE;AAED,YAAY,EAAE,SAAS,EAAE,CAAC"}
package/dist/emit.js ADDED
@@ -0,0 +1,147 @@
1
+ /**
2
+ * @haverstack/eleventy — emit phase
3
+ * -------------------------------------------------------
4
+ * Turn a `ResolvedSite` into Eleventy virtual templates: one per page and
5
+ * per member, plus the feeds and the sitemap. Attachment bytes are staged
6
+ * to disk first and passed through. Global data exposes the resolved
7
+ * structures so a site that brings its own templates can iterate them.
8
+ *
9
+ * See docs/design.md § Emit.
10
+ */
11
+ import { resolve as resolvePath } from 'node:path';
12
+ import { collectAssets, stageAssets } from './assets.js';
13
+ import { atomFeed, feedSpecs, sitemapXml } from './feeds.js';
14
+ import { renderMember, renderMemberFragment, renderPage, renderPageFragment, } from './templates.js';
15
+ import { renderBody, substituteEmbeds } from './markdown.js';
16
+ const flattenWithParent = (pages, parentId) => pages.flatMap((page) => [
17
+ { page, parentId },
18
+ ...flattenWithParent(page.children, page.record.id),
19
+ ]);
20
+ /** Content is verbatim (already HTML); layouts and transforms still apply. */
21
+ const CONTENT_VERBATIM = { templateEngineOverride: false };
22
+ /** Feeds and the sitemap are output, never content — keep them out of collections. */
23
+ const OUTPUT_FILE = { ...CONTENT_VERBATIM, eleventyExcludeFromCollections: true };
24
+ const typeSlug = (typeId) => typeId.split('@')[0].split('/').pop() ?? 'record';
25
+ const tagAssociations = (record) => (record.associations ?? []).flatMap((a) => (a.kind === 'tag' ? [a.label] : []));
26
+ export async function emit(opts) {
27
+ const { eleventyConfig, stack, resolved, index, assetDir, feedLimit } = opts;
28
+ const assets = collectAssets(resolved, index, assetDir);
29
+ const staged = await stageAssets(stack, assets, resolvePath(opts.cwd ?? process.cwd(), assets.assetDir));
30
+ eleventyConfig.addPassthroughCopy(assets.assetDir);
31
+ const flatPages = flattenWithParent(resolved.pages);
32
+ const rawBody = (record) => substituteEmbeds(String(record.content.text ?? ''), assets.embedsByRecord.get(record.id) ?? new Map());
33
+ const bodyByRecord = new Map();
34
+ for (const record of [
35
+ ...flatPages.map((f) => f.page.record),
36
+ ...resolved.members.map((m) => m.record),
37
+ ]) {
38
+ bodyByRecord.set(record.id, renderBody(String(record.content.text ?? ''), record.content.format, assets.embedsByRecord.get(record.id)));
39
+ }
40
+ const feeds = feedSpecs(resolved);
41
+ const ctx = { resolved, assets, feeds, bodyByRecord };
42
+ const overrides = opts.templates;
43
+ const layoutFor = (name) => overrides?.[name] ?? overrides?.base;
44
+ const collectionsOn = opts.eleventyCollections !== false;
45
+ /** Collection membership + the exclude flag for one record. */
46
+ const graphData = (record, unlisted) => {
47
+ if (!collectionsOn || unlisted)
48
+ return { eleventyExcludeFromCollections: true };
49
+ return { tags: ['haverstack', typeSlug(record.typeId), ...tagAssociations(record)] };
50
+ };
51
+ for (const { page, parentId } of flatPages) {
52
+ const layout = layoutFor(page.template);
53
+ const collection = resolved.collections.get(String(page.record.content.slug));
54
+ const nav = collectionsOn && !page.unlisted
55
+ ? {
56
+ eleventyNavigation: {
57
+ key: page.record.id,
58
+ ...(parentId ? { parent: parentId } : {}),
59
+ title: page.record.content.title ?? page.record.content.slug,
60
+ ...(typeof page.meta.order === 'number' ? { order: page.meta.order } : {}),
61
+ },
62
+ }
63
+ : {};
64
+ const hookData = opts.pageData?.({
65
+ kind: 'page',
66
+ record: page.record,
67
+ meta: page.meta,
68
+ url: page.url,
69
+ template: page.template,
70
+ canonical: null,
71
+ unlisted: page.unlisted,
72
+ resolved,
73
+ }) ?? {};
74
+ eleventyConfig.addTemplate(`haverstack/page-${page.record.id}.html`, layout ? renderPageFragment(page, ctx) : renderPage(page, ctx), {
75
+ ...CONTENT_VERBATIM,
76
+ ...graphData(page.record, page.unlisted),
77
+ ...nav,
78
+ ...(layout ? { layout } : {}),
79
+ permalink: page.url,
80
+ title: page.record.content.title ?? null,
81
+ record: page.record,
82
+ meta: page.meta,
83
+ url: page.url,
84
+ body: bodyByRecord.get(page.record.id) ?? '',
85
+ bodyRaw: rawBody(page.record),
86
+ unlisted: page.unlisted,
87
+ haverstackTemplate: page.template,
88
+ ...(collection ? { collection } : {}),
89
+ ...hookData,
90
+ });
91
+ }
92
+ for (const member of resolved.members) {
93
+ const layout = layoutFor(member.template);
94
+ const hookData = opts.pageData?.({
95
+ kind: 'member',
96
+ record: member.record,
97
+ meta: member.meta,
98
+ url: member.url,
99
+ template: member.template,
100
+ canonical: member.canonical,
101
+ unlisted: member.unlisted,
102
+ resolved,
103
+ }) ?? {};
104
+ eleventyConfig.addTemplate(`haverstack/member-${member.record.id}.html`, layout ? renderMemberFragment(member, ctx) : renderMember(member, ctx), {
105
+ ...CONTENT_VERBATIM,
106
+ ...graphData(member.record, member.unlisted),
107
+ ...(layout ? { layout } : {}),
108
+ permalink: member.url,
109
+ title: member.record.content.title ?? member.record.content.caption ?? null,
110
+ record: member.record,
111
+ meta: member.meta,
112
+ url: member.url,
113
+ body: bodyByRecord.get(member.record.id) ?? '',
114
+ bodyRaw: rawBody(member.record),
115
+ canonical: member.canonical,
116
+ unlisted: member.unlisted,
117
+ haverstackTemplate: member.template,
118
+ ...hookData,
119
+ });
120
+ }
121
+ for (const spec of feeds) {
122
+ eleventyConfig.addTemplate(`haverstack/feed-${spec.path.replace(/[^a-z0-9]+/gi, '-')}.html`, atomFeed(spec, resolved, feedLimit), { ...OUTPUT_FILE, permalink: spec.path });
123
+ }
124
+ const sitemap = sitemapXml(resolved);
125
+ if (sitemap) {
126
+ eleventyConfig.addTemplate('haverstack/sitemap.html', sitemap, {
127
+ ...OUTPUT_FILE,
128
+ permalink: '/sitemap.xml',
129
+ });
130
+ }
131
+ eleventyConfig.addGlobalData('haverstack', {
132
+ site: resolved.site,
133
+ sites: Object.fromEntries(resolved.sites),
134
+ owner: resolved.owner,
135
+ pages: resolved.pages,
136
+ menus: Object.fromEntries(resolved.menus),
137
+ collections: Object.fromEntries(resolved.collections),
138
+ assetDir: assets.assetDir,
139
+ });
140
+ return {
141
+ pages: flatPages.length,
142
+ members: resolved.members.length,
143
+ feeds: feeds.length,
144
+ assets: staged,
145
+ };
146
+ }
147
+ //# sourceMappingURL=emit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit.js","sourceRoot":"","sources":["../src/emit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @haverstack/eleventy — build errors
3
+ * -------------------------------------------------------
4
+ * One error type for every structural fault that fails a build: an
5
+ * unresolvable site, a path collision, conflicting sidecars. The `check`
6
+ * command catches these to report them without emitting; a plain build
7
+ * lets them throw.
8
+ */
9
+ export declare class HaverstackEleventyError extends Error {
10
+ constructor(message: string);
11
+ }
12
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,qBAAa,uBAAwB,SAAQ,KAAK;gBACpC,OAAO,EAAE,MAAM;CAI5B"}
package/dist/errors.js ADDED
@@ -0,0 +1,15 @@
1
+ /**
2
+ * @haverstack/eleventy — build errors
3
+ * -------------------------------------------------------
4
+ * One error type for every structural fault that fails a build: an
5
+ * unresolvable site, a path collision, conflicting sidecars. The `check`
6
+ * command catches these to report them without emitting; a plain build
7
+ * lets them throw.
8
+ */
9
+ export class HaverstackEleventyError extends Error {
10
+ constructor(message) {
11
+ super(message);
12
+ this.name = 'HaverstackEleventyError';
13
+ }
14
+ }
15
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAChD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * @haverstack/eleventy — feeds and the sitemap
3
+ * -------------------------------------------------------
4
+ * Output, not records: renderings of the collections the page tree already
5
+ * describes, one set per site. A feed per listing root plus a combined
6
+ * one; the sitemap is every resolved permalink minus the unlisted ones.
7
+ * Absolute URLs come from the site record's `baseUrl`, so these need a
8
+ * site record — a single-site stack with none gets neither.
9
+ *
10
+ * See docs/design.md § Feeds and the sitemap.
11
+ */
12
+ import type { ResolvedMember, ResolvedSite } from './resolve.js';
13
+ export interface FeedSpec {
14
+ /** Output path, e.g. `/feeds/articles.xml`. */
15
+ path: string;
16
+ /** Feed `<title>`. */
17
+ title: string;
18
+ members: ResolvedMember[];
19
+ }
20
+ /** One Atom feed per listing root, plus a combined `/feeds/all.xml`. */
21
+ export declare function feedSpecs(resolved: ResolvedSite): FeedSpec[];
22
+ export declare function atomFeed(spec: FeedSpec, resolved: ResolvedSite, limit: number): string;
23
+ export declare function sitemapXml(resolved: ResolvedSite): string | null;
24
+ //# sourceMappingURL=feeds.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feeds.d.ts","sourceRoot":"","sources":["../src/feeds.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAsB,cAAc,EAAgB,YAAY,EAAE,MAAM,cAAc,CAAC;AAuBnG,MAAM,WAAW,QAAQ;IACvB,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,cAAc,EAAE,CAAC;CAC3B;AAED,wEAAwE;AACxE,wBAAgB,SAAS,CAAC,QAAQ,EAAE,YAAY,GAAG,QAAQ,EAAE,CAyB5D;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAyCtF;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI,CAoBhE"}
package/dist/feeds.js ADDED
@@ -0,0 +1,103 @@
1
+ /**
2
+ * @haverstack/eleventy — feeds and the sitemap
3
+ * -------------------------------------------------------
4
+ * Output, not records: renderings of the collections the page tree already
5
+ * describes, one set per site. A feed per listing root plus a combined
6
+ * one; the sitemap is every resolved permalink minus the unlisted ones.
7
+ * Absolute URLs come from the site record's `baseUrl`, so these need a
8
+ * site record — a single-site stack with none gets neither.
9
+ *
10
+ * See docs/design.md § Feeds and the sitemap.
11
+ */
12
+ const xmlEscape = (s) => s.replace(/[<>&'"]/g, (c) => ({ '<': '&lt;', '>': '&gt;', '&': '&amp;', "'": '&apos;', '"': '&quot;' })[c]);
13
+ const absolute = (baseUrl, path) => `${baseUrl.replace(/\/+$/, '')}${path.startsWith('/') ? path : `/${path}`}`;
14
+ function memberDate(record) {
15
+ const publishedAt = record.content.publishedAt;
16
+ const ms = typeof publishedAt === 'string' ? Date.parse(publishedAt) : NaN;
17
+ return new Date(Number.isNaN(ms) ? record.createdAt.getTime() : ms).toISOString();
18
+ }
19
+ const memberTitle = (record) => String(record.content.title ?? record.content.caption ?? record.content.text ?? record.id).slice(0, 200);
20
+ /** One Atom feed per listing root, plus a combined `/feeds/all.xml`. */
21
+ export function feedSpecs(resolved) {
22
+ if (!resolved.site)
23
+ return [];
24
+ const siteTitle = String(resolved.site.content.title ?? 'Feed');
25
+ const specs = [];
26
+ const seen = new Set();
27
+ const combined = [];
28
+ for (const [slug, collection] of resolved.collections) {
29
+ specs.push({
30
+ path: `/feeds/${slug}.xml`,
31
+ title: `${siteTitle} — ${slug}`,
32
+ members: collection.members,
33
+ });
34
+ for (const member of collection.members) {
35
+ if (seen.has(member.record.id))
36
+ continue;
37
+ seen.add(member.record.id);
38
+ combined.push(member);
39
+ }
40
+ }
41
+ if (specs.length > 1) {
42
+ combined.sort((a, b) => memberDate(b.record).localeCompare(memberDate(a.record)));
43
+ specs.push({ path: '/feeds/all.xml', title: siteTitle, members: combined });
44
+ }
45
+ return specs;
46
+ }
47
+ export function atomFeed(spec, resolved, limit) {
48
+ const site = resolved.site;
49
+ const baseUrl = String(site.content.baseUrl ?? '');
50
+ const self = absolute(baseUrl, spec.path);
51
+ const updated = spec.members.length > 0 ? memberDate(spec.members[0].record) : new Date().toISOString();
52
+ const author = resolved.owner?.content.name;
53
+ const entries = spec.members
54
+ .slice(0, limit)
55
+ .map((member) => {
56
+ const link = member.canonical ?? absolute(baseUrl, member.url);
57
+ const summary = member.record.content.summary;
58
+ return (` <entry>\n` +
59
+ ` <title>${xmlEscape(memberTitle(member.record))}</title>\n` +
60
+ ` <link href="${xmlEscape(link)}"/>\n` +
61
+ ` <id>${xmlEscape(link)}</id>\n` +
62
+ ` <updated>${memberDate(member.record)}</updated>\n` +
63
+ (typeof summary === 'string' && summary
64
+ ? ` <summary>${xmlEscape(summary)}</summary>\n`
65
+ : '') +
66
+ ` </entry>`);
67
+ })
68
+ .join('\n');
69
+ return (`<?xml version="1.0" encoding="UTF-8"?>\n` +
70
+ `<feed xmlns="http://www.w3.org/2005/Atom">\n` +
71
+ ` <title>${xmlEscape(spec.title)}</title>\n` +
72
+ ` <link href="${xmlEscape(absolute(baseUrl, '/'))}"/>\n` +
73
+ ` <link rel="self" href="${xmlEscape(self)}"/>\n` +
74
+ ` <id>${xmlEscape(self)}</id>\n` +
75
+ ` <updated>${updated}</updated>\n` +
76
+ (typeof author === 'string' && author
77
+ ? ` <author><name>${xmlEscape(author)}</name></author>\n`
78
+ : '') +
79
+ `${entries}${entries ? '\n' : ''}` +
80
+ `</feed>\n`);
81
+ }
82
+ export function sitemapXml(resolved) {
83
+ if (!resolved.site)
84
+ return null;
85
+ const baseUrl = String(resolved.site.content.baseUrl ?? '');
86
+ const locs = [];
87
+ const walk = (pages) => {
88
+ for (const page of pages) {
89
+ if (!page.unlisted)
90
+ locs.push(absolute(baseUrl, page.url));
91
+ walk(page.children);
92
+ }
93
+ };
94
+ walk(resolved.pages);
95
+ for (const member of resolved.members) {
96
+ if (!member.unlisted)
97
+ locs.push(absolute(baseUrl, member.url));
98
+ }
99
+ const body = locs.map((loc) => ` <url><loc>${xmlEscape(loc)}</loc></url>`).join('\n');
100
+ return (`<?xml version="1.0" encoding="UTF-8"?>\n` +
101
+ `<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n${body}\n</urlset>\n`);
102
+ }
103
+ //# sourceMappingURL=feeds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feeds.js","sourceRoot":"","sources":["../src/feeds.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * @haverstack/eleventy
3
+ * -------------------------------------------------------
4
+ * An Eleventy plugin that builds a static site from a Haverstack stack.
5
+ * Records are the content source; there are no content files on disk.
6
+ *
7
+ * ```js
8
+ * import { haverstack } from '@haverstack/eleventy';
9
+ * import { LocalAdapter } from '@haverstack/adapter-local';
10
+ * import { Stack } from '@haverstack/core';
11
+ *
12
+ * export default async function (eleventyConfig) {
13
+ * const stack = await Stack.create(await LocalAdapter.open({ path: './stack.db' }));
14
+ * eleventyConfig.addPlugin(haverstack, { stack, site: 'personal' });
15
+ * }
16
+ * ```
17
+ *
18
+ * See docs/design.md for the design. Load → resolve → emit run at
19
+ * plugin-init time; the plugin adds one virtual template per page and
20
+ * member, the feeds, the sitemap, and `haverstack` global data.
21
+ */
22
+ import type { Stack } from '@haverstack/core';
23
+ import { type SlugStrategy } from './resolve.js';
24
+ import { type EmitEleventyConfig, type PageDataHook, type TemplateOverrides } from './emit.js';
25
+ export * from './types.js';
26
+ export * from './errors.js';
27
+ export * from './load.js';
28
+ export * from './resolve.js';
29
+ export * from './assets.js';
30
+ export * from './markdown.js';
31
+ export * from './feeds.js';
32
+ export * from './templates.js';
33
+ export * from './emit.js';
34
+ export * from './check.js';
35
+ export * from './publish.js';
36
+ export * from './scaffold.js';
37
+ export interface HaverstackPluginOptions {
38
+ /**
39
+ * The stack to build from. Backed by any adapter — `APIAdapter` for a
40
+ * remote server, `LocalAdapter` for an offline or CI build, `MemoryAdapter`
41
+ * for tests. The plugin never writes through it; that discipline is a
42
+ * rule, not a guarantee. See docs/design.md § It takes a Stack, not a URL.
43
+ */
44
+ stack: Stack;
45
+ /**
46
+ * Names the `site@1` record to build, by `handle` or by record ID.
47
+ * Resolving to zero or several records fails the build. Omit on a stack
48
+ * with no `site@1` records — the single-site case.
49
+ */
50
+ site?: string;
51
+ /** Directory the staged attachment bytes are written to and passed through. Default `_stack-assets`. */
52
+ assetDir?: string;
53
+ /** This site's permalink-derivation policy for listing members. Default `'title'`. */
54
+ slugStrategy?: SlugStrategy;
55
+ /** Maximum entries per Atom feed. Default 20. */
56
+ feedLimit?: number;
57
+ /**
58
+ * Replace the built-in templates with the site's own. Maps a `template`
59
+ * name (`home`, `content`, `listing`, `listing-inline`, `article`,
60
+ * `post`, `photo`, `bookmark`, or a custom name from a sidecar) to a
61
+ * layout the site provides in its `_includes`. A mapped page emits its
62
+ * content fragment plus that `layout`; the layout receives `content`
63
+ * plus `record`, `meta`, `url`, `collection`, and the `haverstack`
64
+ * globals, and may chain to another layout. `base` catches every
65
+ * unmapped name; anything still unmapped uses the built-in render. Run
66
+ * `haverstack-eleventy eject` for a starter `haverstack-base` layout.
67
+ */
68
+ templates?: TemplateOverrides;
69
+ /**
70
+ * `false` keeps the plugin's pages out of Eleventy's `collections` and
71
+ * `eleventyNavigation` — full isolation from the host's content graph.
72
+ * Default `true`: pages carry `tags` (`haverstack`, the record's type,
73
+ * its tag associations) and root-to-leaf `eleventyNavigation`, so
74
+ * `collections.*`, navigation plugins and anything reading
75
+ * `collections.all` see them. Unlisted records are excluded regardless.
76
+ */
77
+ eleventyCollections?: boolean;
78
+ /**
79
+ * Extra data merged into every page/member template, computed per
80
+ * record. Merged last, so it can override anything the plugin set —
81
+ * the substitute for directory data files, which virtual templates
82
+ * cannot have.
83
+ */
84
+ pageData?: PageDataHook;
85
+ }
86
+ /** The subset of Eleventy's config object this plugin uses. */
87
+ export type EleventyConfig = EmitEleventyConfig;
88
+ /**
89
+ * The Eleventy plugin. Registered the ordinary way with
90
+ * `eleventyConfig.addPlugin(haverstack, options)`.
91
+ */
92
+ export declare function haverstack(eleventyConfig: EleventyConfig, options: HaverstackPluginOptions): Promise<void>;
93
+ export default haverstack;
94
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAG9C,OAAO,EAAW,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACvB,MAAM,WAAW,CAAC;AAEnB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAK9B,MAAM,WAAW,uBAAuB;IACtC;;;;;OAKG;IACH,KAAK,EAAE,KAAK,CAAC;IACb;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wGAAwG;IACxG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sFAAsF;IACtF,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;;;;OAUG;IACH,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B;;;;;;;OAOG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AAED,+DAA+D;AAC/D,MAAM,MAAM,cAAc,GAAG,kBAAkB,CAAC;AAEhD;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,uBAAuB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAiCf;AAED,eAAe,UAAU,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,73 @@
1
+ /**
2
+ * @haverstack/eleventy
3
+ * -------------------------------------------------------
4
+ * An Eleventy plugin that builds a static site from a Haverstack stack.
5
+ * Records are the content source; there are no content files on disk.
6
+ *
7
+ * ```js
8
+ * import { haverstack } from '@haverstack/eleventy';
9
+ * import { LocalAdapter } from '@haverstack/adapter-local';
10
+ * import { Stack } from '@haverstack/core';
11
+ *
12
+ * export default async function (eleventyConfig) {
13
+ * const stack = await Stack.create(await LocalAdapter.open({ path: './stack.db' }));
14
+ * eleventyConfig.addPlugin(haverstack, { stack, site: 'personal' });
15
+ * }
16
+ * ```
17
+ *
18
+ * See docs/design.md for the design. Load → resolve → emit run at
19
+ * plugin-init time; the plugin adds one virtual template per page and
20
+ * member, the feeds, the sitemap, and `haverstack` global data.
21
+ */
22
+ import { defineEleventyTypes } from './types.js';
23
+ import { load } from './load.js';
24
+ import { resolve } from './resolve.js';
25
+ import { emit, } from './emit.js';
26
+ export * from './types.js';
27
+ export * from './errors.js';
28
+ export * from './load.js';
29
+ export * from './resolve.js';
30
+ export * from './assets.js';
31
+ export * from './markdown.js';
32
+ export * from './feeds.js';
33
+ export * from './templates.js';
34
+ export * from './emit.js';
35
+ export * from './check.js';
36
+ export * from './publish.js';
37
+ export * from './scaffold.js';
38
+ const DEFAULT_ASSET_DIR = '_stack-assets';
39
+ const DEFAULT_FEED_LIMIT = 20;
40
+ /**
41
+ * The Eleventy plugin. Registered the ordinary way with
42
+ * `eleventyConfig.addPlugin(haverstack, options)`.
43
+ */
44
+ export async function haverstack(eleventyConfig, options) {
45
+ if (!options || !options.stack) {
46
+ throw new Error('@haverstack/eleventy: the `stack` option is required.');
47
+ }
48
+ await defineEleventyTypes(options.stack);
49
+ const index = await load(options.stack, { site: options.site });
50
+ const resolved = resolve(index, { slugStrategy: options.slugStrategy ?? 'title' });
51
+ const name = resolved.site ? `"${resolved.site.content.title}"` : 'the single site';
52
+ const unlisted = index.unlistedVisible
53
+ ? ''
54
+ : ' — unlisted records not visible under this credential';
55
+ for (const w of resolved.warnings)
56
+ console.warn(`[haverstack] ! ${w.message}`);
57
+ const result = await emit({
58
+ eleventyConfig,
59
+ stack: options.stack,
60
+ resolved,
61
+ index,
62
+ assetDir: options.assetDir ?? DEFAULT_ASSET_DIR,
63
+ feedLimit: options.feedLimit ?? DEFAULT_FEED_LIMIT,
64
+ templates: options.templates,
65
+ eleventyCollections: options.eleventyCollections,
66
+ pageData: options.pageData,
67
+ });
68
+ console.info(`[haverstack] ${name}: ${result.pages} pages, ${result.members} members, ` +
69
+ `${result.feeds} feeds, assets ${result.assets.written} written / ${result.assets.skipped} cached` +
70
+ `${resolved.warnings.length ? `, ${resolved.warnings.length} warning(s)` : ''}${unlisted}`);
71
+ }
72
+ export default haverstack;
73
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAqB,MAAM,cAAc,CAAC;AAC1D,OAAO,EACL,IAAI,GAIL,MAAM,WAAW,CAAC;AAEnB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAE9B,MAAM,iBAAiB,GAAG,eAAe,CAAC;AAC1C,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAuD9B;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,cAA8B,EAC9B,OAAgC;IAEhC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,mBAAmB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAEzC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,EAAE,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,OAAO,EAAE,CAAC,CAAC;IAEnF,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAe,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC;IAC9F,MAAM,QAAQ,GAAG,KAAK,CAAC,eAAe;QACpC,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,uDAAuD,CAAC;IAC5D,KAAK,MAAM,CAAC,IAAI,QAAQ,CAAC,QAAQ;QAAE,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAEhF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC;QACxB,cAAc;QACd,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,QAAQ;QACR,KAAK;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,iBAAiB;QAC/C,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,kBAAkB;QAClD,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,mBAAmB,EAAE,OAAO,CAAC,mBAAmB;QAChD,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC3B,CAAC,CAAC;IAEH,OAAO,CAAC,IAAI,CACV,gBAAgB,IAAI,KAAK,MAAM,CAAC,KAAK,WAAW,MAAM,CAAC,OAAO,YAAY;QACxE,GAAG,MAAM,CAAC,KAAK,kBAAkB,MAAM,CAAC,MAAM,CAAC,OAAO,cAAc,MAAM,CAAC,MAAM,CAAC,OAAO,SAAS;QAClG,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,QAAQ,CAAC,MAAM,aAAa,CAAC,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,CAC7F,CAAC;AACJ,CAAC;AAED,eAAe,UAAU,CAAC"}