@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,119 @@
1
+ /**
2
+ * @haverstack/eleventy — resolve phase
3
+ * -------------------------------------------------------
4
+ * Turn a `StackIndex` into a site: one URL per record, the sidecar
5
+ * cascade applied, collections filtered and sorted, menus pointed at real
6
+ * URLs. A pure function of the index and this build's config — it runs no
7
+ * queries.
8
+ *
9
+ * Fatal faults throw `HaverstackEleventyError` (the `check` command
10
+ * catches them): two sidecars at the same scope for one record, and two
11
+ * records resolving to the same path. Softer problems — a dangling menu
12
+ * target, an item that names both `url` and `recordId` — are collected in
13
+ * `warnings` and the build continues.
14
+ *
15
+ * See docs/design.md § Resolve.
16
+ */
17
+ import type { RecordId, StackRecord } from '@haverstack/core';
18
+ import type { StackIndex } from './load.js';
19
+ /**
20
+ * How this site derives a permalink for a listing member when no sidecar
21
+ * overrides it. `'title'` slugifies the record's `title` (default);
22
+ * `'recordId'` publishes under the opaque record id; a function lets the
23
+ * site decide. See docs/design.md § slugStrategy.
24
+ */
25
+ export type SlugStrategy = 'title' | 'recordId' | ((record: StackRecord) => string);
26
+ export interface ResolveConfig {
27
+ slugStrategy: SlugStrategy;
28
+ /**
29
+ * `true` (default): throw `HaverstackEleventyError` listing every fatal
30
+ * fault. `false`: collect them in `ResolvedSite.errors` and resolve
31
+ * best-effort — what the `check` command uses to report them all.
32
+ */
33
+ strict?: boolean;
34
+ }
35
+ /** A fault that fails a build: conflicting sidecars, or a path two records share. */
36
+ export interface ResolveError {
37
+ kind: 'sidecar-conflict' | 'path-collision';
38
+ message: string;
39
+ recordIds: RecordId[];
40
+ /** Present on a collision. */
41
+ path?: string;
42
+ }
43
+ /** The sidecar cascade's result for one record — never a raw sidecar. */
44
+ export interface ResolvedMeta {
45
+ slug?: string;
46
+ template?: string;
47
+ /** Reserved for curated collections; not read until they land. */
48
+ order?: number;
49
+ hidden?: boolean;
50
+ draft?: boolean;
51
+ }
52
+ export interface ResolvedPage {
53
+ record: StackRecord;
54
+ /** Site-root-relative path, e.g. `/about/history/`. */
55
+ url: string;
56
+ meta: ResolvedMeta;
57
+ /** Explicit `meta.template`, or inferred from the page's shape. */
58
+ template: string;
59
+ /** `unlistedAt` set, or the cascade set `hidden` — out of nav, feeds and the sitemap. */
60
+ unlisted: boolean;
61
+ children: ResolvedPage[];
62
+ }
63
+ export interface ResolvedMember {
64
+ record: StackRecord;
65
+ url: string;
66
+ meta: ResolvedMeta;
67
+ template: string;
68
+ unlisted: boolean;
69
+ /** `true` when `url` came from a sidecar `slug` rather than `slugStrategy`. */
70
+ slugExplicit: boolean;
71
+ /** The record's canonical URL when it lives on another site; else `null`. */
72
+ canonical: string | null;
73
+ }
74
+ export interface ResolvedCollection {
75
+ /** The listing root's slug — the key in `collections`. */
76
+ slug: string;
77
+ rootUrl: string;
78
+ /** Listed members only (drafts and unlisted excluded), sorted. */
79
+ members: ResolvedMember[];
80
+ }
81
+ export interface ResolvedMenuItem {
82
+ label: string;
83
+ order: number;
84
+ /** External/absolute URL as written, or a resolved permalink. `#` when dangling. */
85
+ url: string;
86
+ rel?: string;
87
+ dangling: boolean;
88
+ }
89
+ export interface ResolvedMenu {
90
+ handle: string;
91
+ label?: string;
92
+ items: ResolvedMenuItem[];
93
+ }
94
+ export interface ResolveWarning {
95
+ kind: string;
96
+ message: string;
97
+ recordId?: RecordId;
98
+ }
99
+ export interface ResolvedSite {
100
+ site: StackRecord | null;
101
+ /** Every `site@1` record by handle — for cross-site links in templates. */
102
+ sites: Map<string, StackRecord>;
103
+ owner: StackRecord | null;
104
+ /** Root pages, each carrying its resolved subtree. Drafts pruned. */
105
+ pages: ResolvedPage[];
106
+ pagesByUrl: Map<string, ResolvedPage>;
107
+ /** Every built member, deduped, including unlisted ones. */
108
+ members: ResolvedMember[];
109
+ /** By listing-root slug. */
110
+ collections: Map<string, ResolvedCollection>;
111
+ /** By handle. */
112
+ menus: Map<string, ResolvedMenu>;
113
+ /** Fatal faults, collected rather than thrown when `strict` is `false`. */
114
+ errors: ResolveError[];
115
+ warnings: ResolveWarning[];
116
+ }
117
+ export declare function slugify(input: string): string;
118
+ export declare function resolve(index: StackIndex, config: ResolveConfig): ResolvedSite;
119
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,411 @@
1
+ /**
2
+ * @haverstack/eleventy — resolve phase
3
+ * -------------------------------------------------------
4
+ * Turn a `StackIndex` into a site: one URL per record, the sidecar
5
+ * cascade applied, collections filtered and sorted, menus pointed at real
6
+ * URLs. A pure function of the index and this build's config — it runs no
7
+ * queries.
8
+ *
9
+ * Fatal faults throw `HaverstackEleventyError` (the `check` command
10
+ * catches them): two sidecars at the same scope for one record, and two
11
+ * records resolving to the same path. Softer problems — a dangling menu
12
+ * target, an item that names both `url` and `recordId` — are collected in
13
+ * `warnings` and the build continues.
14
+ *
15
+ * See docs/design.md § Resolve.
16
+ */
17
+ import { ARTICLE, BOOKMARK, PAGE, PHOTO, POST } from '@haverstack/commons';
18
+ import { SITE_MEMBERSHIP_LABEL } from './types.js';
19
+ import { HaverstackEleventyError } from './errors.js';
20
+ // -------------------------------------------------------
21
+ // Type-keyed lookups — by baseId, so a future @2 still matches.
22
+ // -------------------------------------------------------
23
+ const baseId = (typeId) => typeId.split('@')[0];
24
+ const MEMBER_TEMPLATE = {
25
+ [baseId(ARTICLE.id)]: 'article',
26
+ [baseId(POST.id)]: 'post',
27
+ [baseId(PHOTO.id)]: 'photo',
28
+ [baseId(BOOKMARK.id)]: 'bookmark',
29
+ };
30
+ /**
31
+ * Types whose own draft convention is "`publishedAt` present". Others
32
+ * build every record. A custom member type that declares its own
33
+ * `publishedAt` is not detected here yet — it would need the registered
34
+ * schema, which this phase deliberately does not fetch.
35
+ */
36
+ const TYPE_HAS_PUBLISHED_AT = new Set([baseId(ARTICLE.id), baseId(PAGE.id)]);
37
+ // -------------------------------------------------------
38
+ // Small helpers
39
+ // -------------------------------------------------------
40
+ export function slugify(input) {
41
+ return input
42
+ .normalize('NFKD')
43
+ .replace(/[\u0300-\u036f]/g, '')
44
+ .toLowerCase()
45
+ .replace(/[^a-z0-9]+/g, '-')
46
+ .replace(/^-+|-+$/g, '');
47
+ }
48
+ function pushInto(map, key, value) {
49
+ const list = map.get(key);
50
+ if (list)
51
+ list.push(value);
52
+ else
53
+ map.set(key, [value]);
54
+ }
55
+ function pickMeta(record) {
56
+ if (!record)
57
+ return {};
58
+ const c = record.content;
59
+ const meta = {};
60
+ if (typeof c.slug === 'string')
61
+ meta.slug = c.slug;
62
+ if (typeof c.template === 'string')
63
+ meta.template = c.template;
64
+ if (typeof c.order === 'number')
65
+ meta.order = c.order;
66
+ if (typeof c.hidden === 'boolean')
67
+ meta.hidden = c.hidden;
68
+ if (typeof c.draft === 'boolean')
69
+ meta.draft = c.draft;
70
+ return meta;
71
+ }
72
+ /** Collects sidecar-cascade errors; returns the merged meta best-effort (first of each scope). */
73
+ class MetaResolver {
74
+ index;
75
+ errors = [];
76
+ reported = new Set();
77
+ constructor(index) {
78
+ this.index = index;
79
+ }
80
+ resolve(recordId) {
81
+ const set = this.index.sidecarsByParent.get(recordId);
82
+ if (!set)
83
+ return {};
84
+ for (const [list, scope] of [
85
+ [set.unscoped, 'with no for-site scope'],
86
+ [set.thisSite, 'scoped to this site'],
87
+ ]) {
88
+ if (list.length > 1 && !this.reported.has(recordId)) {
89
+ this.reported.add(recordId);
90
+ this.errors.push({
91
+ kind: 'sidecar-conflict',
92
+ recordIds: [recordId, ...list.map((r) => r.id)],
93
+ message: `Record ${recordId} has ${list.length} page-meta sidecars ${scope} ` +
94
+ `(${list.map((r) => r.id).join(', ')}). Picking one silently produces a site that ` +
95
+ `differs between runs — remove the extra.`,
96
+ });
97
+ }
98
+ }
99
+ return { ...pickMeta(set.unscoped[0]), ...pickMeta(set.thisSite[0]) };
100
+ }
101
+ }
102
+ function isDraft(record, meta) {
103
+ if (meta.draft)
104
+ return true;
105
+ return TYPE_HAS_PUBLISHED_AT.has(baseId(record.typeId)) && !record.content.publishedAt;
106
+ }
107
+ const isUnlisted = (record, meta) => Boolean(record.unlistedAt) || meta.hidden === true;
108
+ /** Path for a page: its ancestor slugs, `index` dropped, wrapped in slashes. */
109
+ function pagePath(node) {
110
+ const segments = [];
111
+ for (let cur = node; cur; cur = cur.parent) {
112
+ const slug = cur.record.content.slug;
113
+ if (typeof slug === 'string' && slug && slug !== 'index')
114
+ segments.unshift(slug);
115
+ }
116
+ return segments.length ? `/${segments.join('/')}/` : '/';
117
+ }
118
+ /** Path for a page reached only through the raw record graph — a cross-site link target. */
119
+ function rawPagePath(index, pageId) {
120
+ const segments = [];
121
+ const seen = new Set();
122
+ let current = index.byId.get(pageId);
123
+ while (current && baseId(current.typeId) === baseId(PAGE.id)) {
124
+ if (seen.has(current.id))
125
+ break;
126
+ seen.add(current.id);
127
+ const slug = current.content.slug;
128
+ if (typeof slug === 'string' && slug && slug !== 'index')
129
+ segments.unshift(slug);
130
+ const parentId = current.parentId;
131
+ current = parentId ? index.byId.get(parentId) : undefined;
132
+ }
133
+ const siteId = current && index.sitesById.has(current.id) ? current.id : null;
134
+ return { path: segments.length ? `/${segments.join('/')}/` : '/', siteId };
135
+ }
136
+ function memberSlug(record, meta, config) {
137
+ if (meta.slug)
138
+ return { slug: meta.slug, explicit: true };
139
+ const strategy = config.slugStrategy;
140
+ if (typeof strategy === 'function')
141
+ return { slug: strategy(record) || record.id, explicit: false };
142
+ if (strategy === 'recordId')
143
+ return { slug: record.id, explicit: false };
144
+ const title = record.content.title;
145
+ const fromTitle = typeof title === 'string' ? slugify(title) : '';
146
+ return { slug: fromTitle || record.id, explicit: false };
147
+ }
148
+ function pageTemplate(node, meta) {
149
+ if (meta.template)
150
+ return meta.template;
151
+ if (node.record.content.collection)
152
+ return 'listing';
153
+ if (node.record.content.slug === 'index' && node.parent === null)
154
+ return 'home';
155
+ return 'content';
156
+ }
157
+ const memberTemplate = (record, meta) => meta.template ?? MEMBER_TEMPLATE[baseId(record.typeId)] ?? 'content';
158
+ function memberCanonical(record, site) {
159
+ const url = record.content.url;
160
+ if (typeof url !== 'string' || !url || !site)
161
+ return null;
162
+ const base = String(site.content.baseUrl ?? '').replace(/\/+$/, '');
163
+ return base && url.startsWith(base) ? null : url;
164
+ }
165
+ function meaningfulDate(record) {
166
+ const publishedAt = record.content.publishedAt;
167
+ const parsed = typeof publishedAt === 'string' ? Date.parse(publishedAt) : NaN;
168
+ return Number.isNaN(parsed) ? record.createdAt.getTime() : parsed;
169
+ }
170
+ function sortMembers(members, order) {
171
+ const sorted = [...members];
172
+ if (order === 'oldest') {
173
+ sorted.sort((a, b) => meaningfulDate(a.record) - meaningfulDate(b.record));
174
+ }
175
+ else if (order === 'title') {
176
+ sorted.sort((a, b) => String(a.record.content.title ?? '').localeCompare(String(b.record.content.title ?? '')));
177
+ }
178
+ else {
179
+ sorted.sort((a, b) => meaningfulDate(b.record) - meaningfulDate(a.record));
180
+ }
181
+ return sorted;
182
+ }
183
+ function siteMembership(record) {
184
+ const out = [];
185
+ for (const a of record.associations ?? []) {
186
+ if (a.kind === 'relationship' &&
187
+ a.label === SITE_MEMBERSHIP_LABEL &&
188
+ a.target.scope === 'record') {
189
+ out.push(a.target.recordId);
190
+ }
191
+ }
192
+ return out;
193
+ }
194
+ // -------------------------------------------------------
195
+ // resolve
196
+ // -------------------------------------------------------
197
+ export function resolve(index, config) {
198
+ const { site } = index;
199
+ const warnings = [];
200
+ const metaResolver = new MetaResolver(index);
201
+ // 1. Pages — recurse the tree, dropping draft subtrees.
202
+ const pagesById = new Map();
203
+ const pages = [];
204
+ const walk = (node, parent) => {
205
+ const meta = metaResolver.resolve(node.record.id);
206
+ if (isDraft(node.record, meta)) {
207
+ if (node.children.length > 0) {
208
+ warnings.push({
209
+ kind: 'draft-page-subtree',
210
+ recordId: node.record.id,
211
+ message: `Page ${node.record.id} is a draft; ${node.children.length} descendant page(s) are excluded with it.`,
212
+ });
213
+ }
214
+ return;
215
+ }
216
+ const resolvedPage = {
217
+ record: node.record,
218
+ url: pagePath(node),
219
+ meta,
220
+ template: pageTemplate(node, meta),
221
+ unlisted: isUnlisted(node.record, meta),
222
+ children: [],
223
+ };
224
+ pagesById.set(node.record.id, resolvedPage);
225
+ if (parent)
226
+ parent.children.push(resolvedPage);
227
+ else
228
+ pages.push(resolvedPage);
229
+ for (const child of node.children)
230
+ walk(child, resolvedPage);
231
+ };
232
+ for (const root of index.pageRoots)
233
+ walk(root, null);
234
+ // 2. Members — one ResolvedMember per record, shared across collections.
235
+ const membersById = new Map();
236
+ const collections = new Map();
237
+ for (const [rootId, candidates] of index.membersByListingRoot) {
238
+ const root = pagesById.get(rootId);
239
+ if (!root)
240
+ continue; // listing page was a draft
241
+ const spec = index.pagesById.get(rootId)?.record.content.collection;
242
+ const listed = [];
243
+ for (const candidate of candidates) {
244
+ const meta = metaResolver.resolve(candidate.id);
245
+ if (isDraft(candidate, meta))
246
+ continue; // not built at all
247
+ let member = membersById.get(candidate.id);
248
+ if (!member) {
249
+ const { slug, explicit } = memberSlug(candidate, meta, config);
250
+ member = {
251
+ record: candidate,
252
+ url: `${root.url}${slug}/`,
253
+ meta,
254
+ template: memberTemplate(candidate, meta),
255
+ unlisted: isUnlisted(candidate, meta),
256
+ slugExplicit: explicit,
257
+ canonical: memberCanonical(candidate, site),
258
+ };
259
+ membersById.set(candidate.id, member);
260
+ }
261
+ if (!member.unlisted)
262
+ listed.push(member);
263
+ }
264
+ collections.set(root.record.content.slug, {
265
+ slug: root.record.content.slug,
266
+ rootUrl: root.url,
267
+ members: sortMembers(listed, spec?.order),
268
+ });
269
+ }
270
+ // 3. Collision detection — pages and built members, per site.
271
+ const byUrl = new Map();
272
+ for (const page of pagesById.values()) {
273
+ pushInto(byUrl, page.url, { recordId: page.record.id, kind: 'page', explicit: true });
274
+ }
275
+ for (const member of membersById.values()) {
276
+ pushInto(byUrl, member.url, {
277
+ recordId: member.record.id,
278
+ kind: 'member',
279
+ explicit: member.slugExplicit,
280
+ });
281
+ }
282
+ const errors = [...metaResolver.errors];
283
+ for (const [url, entries] of byUrl) {
284
+ if (entries.length < 2)
285
+ continue;
286
+ errors.push({
287
+ kind: 'path-collision',
288
+ path: url,
289
+ recordIds: entries.map((e) => e.recordId),
290
+ message: `Path collision at ${url}:\n` +
291
+ entries
292
+ .map((e) => ` - ${e.recordId} (${e.kind}, slug ${e.explicit ? 'explicit' : 'derived'})`)
293
+ .join('\n'),
294
+ });
295
+ }
296
+ // 4. Menus — resolve every recordId to a URL.
297
+ const resolveLink = (recordId) => {
298
+ const localPage = pagesById.get(recordId);
299
+ if (localPage)
300
+ return localPage.url;
301
+ const localMember = membersById.get(recordId);
302
+ if (localMember)
303
+ return localMember.url;
304
+ const record = index.byId.get(recordId);
305
+ if (!record)
306
+ return null;
307
+ if (baseId(record.typeId) === baseId(PAGE.id)) {
308
+ const { path, siteId } = rawPagePath(index, recordId);
309
+ const target = siteId ? index.sitesById.get(siteId) : undefined;
310
+ if (target && target.id !== site?.id) {
311
+ return `${String(target.content.baseUrl ?? '').replace(/\/+$/, '')}${path}`;
312
+ }
313
+ return path;
314
+ }
315
+ // A member on another site: link to that site, best effort.
316
+ const otherSiteId = siteMembership(record).find((id) => id !== site?.id && index.sitesById.has(id));
317
+ if (otherSiteId) {
318
+ const target = index.sitesById.get(otherSiteId);
319
+ warnings.push({
320
+ kind: 'cross-site-member-approx',
321
+ recordId,
322
+ message: `Menu link to ${recordId} on site "${target.content.handle}" resolves only to that site's root; cross-site member permalinks are not derivable here.`,
323
+ });
324
+ return `${String(target.content.baseUrl ?? '').replace(/\/+$/, '')}/`;
325
+ }
326
+ return null;
327
+ };
328
+ const menus = new Map();
329
+ for (const [handle, menuRecords] of index.menusByHandle) {
330
+ if (menuRecords.length > 1) {
331
+ warnings.push({
332
+ kind: 'duplicate-menu-handle',
333
+ message: `Handle "${handle}" names ${menuRecords.length} menus on this site; using ${menuRecords[0].id}.`,
334
+ });
335
+ }
336
+ const menu = menuRecords[0];
337
+ const rawItems = menu.content.items ?? [];
338
+ const items = [];
339
+ for (const item of [...rawItems].sort((a, b) => Number(a.order) - Number(b.order))) {
340
+ const label = String(item.label ?? '');
341
+ const hasUrl = typeof item.url === 'string' && item.url.length > 0;
342
+ const hasRecordId = typeof item.recordId === 'string' && item.recordId.length > 0;
343
+ if (hasUrl && hasRecordId) {
344
+ warnings.push({
345
+ kind: 'menu-item-ambiguous',
346
+ message: `Menu "${handle}" item "${label}" sets both url and recordId; using url.`,
347
+ });
348
+ }
349
+ if (!hasUrl && !hasRecordId) {
350
+ warnings.push({
351
+ kind: 'menu-item-empty',
352
+ message: `Menu "${handle}" item "${label}" sets neither url nor recordId; skipped.`,
353
+ });
354
+ continue;
355
+ }
356
+ let url;
357
+ let dangling = false;
358
+ if (hasUrl) {
359
+ url = item.url;
360
+ }
361
+ else {
362
+ const resolved = resolveLink(item.recordId);
363
+ if (resolved === null) {
364
+ dangling = true;
365
+ url = '#';
366
+ warnings.push({
367
+ kind: 'menu-dangling',
368
+ recordId: item.recordId,
369
+ message: `Menu "${handle}" item "${label}" points at ${item.recordId}, which did not resolve.`,
370
+ });
371
+ }
372
+ else {
373
+ url = resolved;
374
+ }
375
+ }
376
+ items.push({
377
+ label,
378
+ order: Number(item.order),
379
+ url,
380
+ rel: typeof item.rel === 'string' ? item.rel : undefined,
381
+ dangling,
382
+ });
383
+ }
384
+ menus.set(handle, {
385
+ handle,
386
+ label: typeof menu.content.label === 'string' ? menu.content.label : undefined,
387
+ items,
388
+ });
389
+ }
390
+ const pagesByUrl = new Map();
391
+ for (const page of pagesById.values())
392
+ pagesByUrl.set(page.url, page);
393
+ if (config.strict !== false && errors.length > 0) {
394
+ const where = site ? `site "${site.content.handle}"` : 'the site';
395
+ throw new HaverstackEleventyError(`${errors.length} fatal fault${errors.length > 1 ? 's' : ''} resolving ${where}:\n\n` +
396
+ errors.map((e) => e.message).join('\n\n'));
397
+ }
398
+ return {
399
+ site,
400
+ sites: index.sitesByHandle,
401
+ owner: index.owner,
402
+ pages,
403
+ pagesByUrl,
404
+ members: [...membersById.values()],
405
+ collections,
406
+ menus,
407
+ errors,
408
+ warnings,
409
+ };
410
+ }
411
+ //# sourceMappingURL=resolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.js","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * @haverstack/eleventy — `eject`
3
+ * -------------------------------------------------------
4
+ * Writes a starter `haverstack-base` layout into the site's `_includes`
5
+ * so the whole build can flow through an editable Eleventy layout. The
6
+ * build never writes here — ejecting is a deliberate one-off.
7
+ */
8
+ export interface EjectableTemplate {
9
+ filename: string;
10
+ contents: string;
11
+ }
12
+ export declare const EJECTABLE_TEMPLATES: EjectableTemplate[];
13
+ export interface EjectResult {
14
+ written: string[];
15
+ skipped: string[];
16
+ }
17
+ /** Write each ejectable template into `includesDir`, skipping existing files unless `force`. */
18
+ export declare function runEject(includesDir: string, opts?: {
19
+ force?: boolean;
20
+ }): Promise<EjectResult>;
21
+ export declare function formatEjectResult(result: EjectResult, includesDir: string): string;
22
+ //# sourceMappingURL=scaffold.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AA0DD,eAAO,MAAM,mBAAmB,EAAE,iBAAiB,EAElD,CAAC;AAEF,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,gGAAgG;AAChG,wBAAsB,QAAQ,CAC5B,WAAW,EAAE,MAAM,EACnB,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAC7B,OAAO,CAAC,WAAW,CAAC,CAgBtB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAUlF"}