@wizzlethorpe/vaults 0.14.0 → 0.15.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 (67) hide show
  1. package/README.md +2 -2
  2. package/dist/asset-refs.js +18 -10
  3. package/dist/asset-refs.js.map +1 -1
  4. package/dist/build.js +159 -70
  5. package/dist/build.js.map +1 -1
  6. package/dist/commands/build.js +1 -54
  7. package/dist/commands/build.js.map +1 -1
  8. package/dist/config.js.map +1 -1
  9. package/dist/escape.js +20 -0
  10. package/dist/escape.js.map +1 -1
  11. package/dist/foundry-adventure.js +86 -0
  12. package/dist/foundry-adventure.js.map +1 -0
  13. package/dist/foundry-defaults.js +65 -0
  14. package/dist/foundry-defaults.js.map +1 -0
  15. package/dist/foundry-grafts.js +610 -0
  16. package/dist/foundry-grafts.js.map +1 -0
  17. package/dist/foundry-html.js +196 -0
  18. package/dist/foundry-html.js.map +1 -0
  19. package/dist/foundry-importer.bundle.js +39 -3
  20. package/dist/foundry-meta.js +15 -243
  21. package/dist/foundry-meta.js.map +1 -1
  22. package/dist/foundry-module-journal.js +24 -3
  23. package/dist/foundry-module-journal.js.map +1 -1
  24. package/dist/foundry-module.js +19 -12
  25. package/dist/foundry-module.js.map +1 -1
  26. package/dist/foundry-types.js +28 -0
  27. package/dist/foundry-types.js.map +1 -0
  28. package/dist/foundry-version.js +30 -0
  29. package/dist/foundry-version.js.map +1 -0
  30. package/dist/frontmatter-defaults.js +1 -1
  31. package/dist/frontmatter-defaults.js.map +1 -1
  32. package/dist/index.js +0 -4
  33. package/dist/index.js.map +1 -1
  34. package/dist/manifest.js +1 -1
  35. package/dist/manifest.js.map +1 -1
  36. package/dist/migrate/0.15-foundry-patch-keys.js +51 -0
  37. package/dist/migrate/0.15-foundry-patch-keys.js.map +1 -0
  38. package/dist/migrate/0.15-foundry-pinned-id.js +68 -0
  39. package/dist/migrate/0.15-foundry-pinned-id.js.map +1 -0
  40. package/dist/migrate/files.js +66 -0
  41. package/dist/migrate/files.js.map +1 -0
  42. package/dist/migrate/registry.js +4 -0
  43. package/dist/migrate/registry.js.map +1 -1
  44. package/dist/migrate/run.js +36 -2
  45. package/dist/migrate/run.js.map +1 -1
  46. package/dist/render/auth-template.js +9 -8
  47. package/dist/render/auth-template.js.map +1 -1
  48. package/dist/render/handlers/assets.js +5 -34
  49. package/dist/render/handlers/assets.js.map +1 -1
  50. package/dist/render/handlers/builtin/battlemap.js +4 -1
  51. package/dist/render/handlers/builtin/battlemap.js.map +1 -1
  52. package/dist/render/handlers/builtin/fm-code.js +2 -2
  53. package/dist/render/handlers/builtin/fm-code.js.map +1 -1
  54. package/dist/render/handlers/builtin/fvtt-link.js +39 -0
  55. package/dist/render/handlers/builtin/fvtt-link.js.map +1 -0
  56. package/dist/render/handlers/builtin/index.js +2 -1
  57. package/dist/render/handlers/builtin/index.js.map +1 -1
  58. package/dist/render/handlers/builtin/statblock.js +0 -4
  59. package/dist/render/handlers/builtin/statblock.js.map +1 -1
  60. package/dist/render/handlers/types.js.map +1 -1
  61. package/dist/scan.js +0 -8
  62. package/dist/scan.js.map +1 -1
  63. package/dist/settings.js +57 -28
  64. package/dist/settings.js.map +1 -1
  65. package/dist/zip.js +78 -0
  66. package/dist/zip.js.map +1 -0
  67. package/package.json +3 -3
@@ -0,0 +1,610 @@
1
+ // Compile a vault into a grafts.json: the entry list graft builds from.
2
+ // Nothing here touches Foundry or the filesystem, so the whole mapping is
3
+ // testable on its own.
4
+ import { createHash } from "node:crypto";
5
+ import { DOC_TYPES, canonicalType } from "./foundry-types.js";
6
+ import { rewriteVaultRefs } from "./foundry-html.js";
7
+ import { defaultsFor, resolvePageRefs } from "./foundry-defaults.js";
8
+ import { asAdventure } from "./foundry-adventure.js";
9
+ import { mergeDefaults } from "./frontmatter-defaults.js";
10
+ /**
11
+ * The one definition of "the content changed".
12
+ *
13
+ * A build consumes three things, and each is hashed by value: the entries
14
+ * (patches, sidecars, ids), every page body the entries reference, and the
15
+ * bytes of every asset those bodies and entries reference (the assets map
16
+ * already carries a content hash per file). That is the provider's whole
17
+ * fixed point, so anything it would fetch differently moves this.
18
+ */
19
+ export function contentHash(entries, assets, bodies) {
20
+ const sortedBodies = [...bodies].sort(([a], [b]) => a.localeCompare(b));
21
+ return createHash("md5")
22
+ .update(JSON.stringify({ entries, assets, bodies: sortedBodies }))
23
+ .digest("hex").slice(0, 16);
24
+ }
25
+ /**
26
+ * The page's patch with the defaults for its type filled in underneath.
27
+ *
28
+ * Least specific first, so a more specific default beats a broader one and the
29
+ * page beats both. `mergeDefaults` never reaches past a value that is already
30
+ * there, which is what makes "the page wins" true at every depth — including
31
+ * when the value it states is `null`.
32
+ */
33
+ function defaulted(patch, type, page, variant, system) {
34
+ // `embed: false` opts the page's prose out of the document's description.
35
+ // An unsatisfied `@page/body` reference takes its key with it, so nothing
36
+ // else is needed to suppress the default.
37
+ const body = page.foundry?.embed === false
38
+ ? undefined
39
+ : `@vaults/${variant}/${page.path.replace(/\.md$/i, "")}.foundry.html`;
40
+ const out = structuredClone(patch);
41
+ // Most specific first: each merge fills only what is still unsaid, so the
42
+ // earlier a layer is applied the more it wins.
43
+ const layers = [page.sidecar, ...defaultsFor(type, system).reverse()];
44
+ for (const layer of layers) {
45
+ if (!layer)
46
+ continue;
47
+ const resolved = resolvePageRefs(layer, { image: page.image, body });
48
+ if (resolved)
49
+ mergeDefaults(out, resolved);
50
+ }
51
+ // After the merge, not before: an exported sidecar carries the `_id` it had
52
+ // in the world it came from, and it would otherwise refill the key.
53
+ delete out["_id"];
54
+ return out;
55
+ }
56
+ /**
57
+ * A document id the page pinned for itself, as `patch._id`.
58
+ *
59
+ * Otherwise the id comes from the page's path, which is stable until the page
60
+ * moves — and a move then orphans everything the reader had built under the old
61
+ * id. Pinning is how a page survives being renamed, and it belongs in the patch
62
+ * because `_id` is a field of the document, not a fact about the vault.
63
+ *
64
+ * Foundry ids are exactly 16 characters of [A-Za-z0-9]. A malformed one is
65
+ * reported and ignored rather than passed on: Foundry would refuse the document
66
+ * and the page would simply not appear.
67
+ */
68
+ function pinnedId(patch, report) {
69
+ const id = patch?.["_id"];
70
+ if (typeof id === "string" && /^[A-Za-z0-9]{16}$/.test(id))
71
+ return id;
72
+ if (id !== undefined && id !== null) {
73
+ report?.warnings.push(`${report.path}: foundry.patch._id must be 16 letters or digits, got ${JSON.stringify(id)}; using the derived id`);
74
+ }
75
+ return null;
76
+ }
77
+ /** Every usable UUID in a `foundry.source`, which may be a list, in order. */
78
+ export function basesOf(base) {
79
+ if (typeof base === "string")
80
+ return base.trim() ? [base.trim()] : [];
81
+ if (Array.isArray(base)) {
82
+ return base.filter((b) => typeof b === "string" && !!b.trim()).map((b) => b.trim());
83
+ }
84
+ return [];
85
+ }
86
+ /** The first usable UUID, which decides the document type and the pack. */
87
+ export const firstBase = (base) => basesOf(base)[0] ?? null;
88
+ const OBSERVER = 2;
89
+ const NONE = 0;
90
+ /**
91
+ * Deterministic 16-character Foundry ids.
92
+ *
93
+ * Stable across pushes, because an id that moved would orphan what it built:
94
+ * pruning deletes the old document and hydration creates a new one, breaking
95
+ * every link a reader had to it. Derived from the path, never the content.
96
+ */
97
+ const det = (kind, key) => createHash("sha1").update(`vaults:${kind}:${key}`).digest("hex").slice(0, 16);
98
+ export const entryId = (vaultId, folder) => det("entry", `${vaultId}:${folder}`);
99
+ export const pageId = (vaultId, path) => det("page", `${vaultId}:${path}`);
100
+ export const instanceId = (vaultId, path) => det("instance", `${vaultId}:${path}`);
101
+ export const itemId = (vaultId, path, key) => det("item", `${vaultId}:${path}:${key}`);
102
+ /**
103
+ * Give every `uuid` item in a patch an `_id`.
104
+ *
105
+ * graft merges an items array by `_id` only when every member carries one, so
106
+ * one reference without one makes the array replace the source's items instead
107
+ * — taking the entries that only patch a source item down with it. The id is
108
+ * also what marks a reference as an item to place rather than a grant to leave
109
+ * alone. Keyed by uuid, not position, so reordering the list moves nothing.
110
+ */
111
+ export function withItemIds(patch, vaultId, path) {
112
+ const items = patch["items"];
113
+ if (!Array.isArray(items))
114
+ return patch;
115
+ const seen = new Map();
116
+ return {
117
+ ...patch,
118
+ items: items.map((item) => {
119
+ if (!item || typeof item !== "object" || Array.isArray(item))
120
+ return item;
121
+ const row = item;
122
+ if (typeof row["uuid"] !== "string" || typeof row["_id"] === "string")
123
+ return item;
124
+ const uuid = row["uuid"];
125
+ const n = seen.get(uuid) ?? 0;
126
+ seen.set(uuid, n + 1);
127
+ return { _id: itemId(vaultId, path, `${uuid}:${n}`), ...row };
128
+ }),
129
+ };
130
+ }
131
+ export const folderOf = (path) => {
132
+ const i = path.lastIndexOf("/");
133
+ return i < 0 ? "" : path.slice(0, i);
134
+ };
135
+ /**
136
+ * Whether players may see a page's document. An unknown role fails closed.
137
+ * The body is always the build role's own rendering — the reader of this
138
+ * file cannot fetch any other; a player-visible page's body carries the
139
+ * player render alongside it, inside the file (see dualVariantBody).
140
+ */
141
+ export function observable(page, opts) {
142
+ const rank = (role) => opts.roles.indexOf(role);
143
+ const ceiling = rank(opts.playerRole);
144
+ return ceiling >= 0 && rank(page.role) >= 0 && rank(page.role) <= ceiling;
145
+ }
146
+ /**
147
+ * Resolve page-path references inside a patch to this build's ids.
148
+ *
149
+ * A map note names its page — `"entryId": "@vault/Places/Arlanton"` — and a
150
+ * token names its actor's page — `"actorId": "@vault/Actors/Macy Arla"` —
151
+ * because document ids are this build's to assign, and the ids an export
152
+ * carries point at whatever world it came from. Returns a new value: the
153
+ * patch is the page's own frontmatter, shared by every variant's build.
154
+ */
155
+ export function resolveVaultIds(value, opts, targets, warnings, path) {
156
+ const pageOf = (ref) => {
157
+ const target = ref.slice("@vault/".length).replace(/^\/+/, "");
158
+ return /\.md$/i.test(target) ? target : `${target}.md`;
159
+ };
160
+ const walk = (v) => {
161
+ if (Array.isArray(v))
162
+ return v.map(walk);
163
+ if (!v || typeof v !== "object")
164
+ return v;
165
+ const out = {};
166
+ for (const [k, x] of Object.entries(v))
167
+ out[k] = walk(x);
168
+ const entry = out["entryId"];
169
+ if (typeof entry === "string" && entry.startsWith("@vault/")) {
170
+ const page = pageOf(entry);
171
+ if (!targets.journals.has(page)) {
172
+ warnings.push(`${path}: a map note points at "${page}", which makes no journal page in this build`);
173
+ }
174
+ out["entryId"] = entryId(opts.vaultId, folderOf(page));
175
+ out["pageId"] = pageId(opts.vaultId, page);
176
+ }
177
+ const actor = out["actorId"];
178
+ if (typeof actor === "string" && actor.startsWith("@vault/")) {
179
+ const page = pageOf(actor);
180
+ const id = targets.docs.get(page);
181
+ if (!id)
182
+ warnings.push(`${path}: a token points at "${page}", which makes no document in this build`);
183
+ out["actorId"] = id ?? instanceId(opts.vaultId, page);
184
+ }
185
+ return out;
186
+ };
187
+ return walk(value);
188
+ }
189
+ /** Which of these pages make a document, and which a journal page. */
190
+ function vaultIdTargets(pages, opts) {
191
+ const docs = new Map();
192
+ const journals = new Set();
193
+ for (const p of pages) {
194
+ if (p.foundry?.sync === false)
195
+ continue;
196
+ if (p.foundry?.journal !== false)
197
+ journals.add(p.path);
198
+ const base = firstBase(p.foundry?.source);
199
+ const type = base ? documentTypeOf(base) : null;
200
+ if (type && opts.packs[type]) {
201
+ docs.set(p.path, pinnedId(p.foundry?.patch) ?? instanceId(opts.vaultId, p.path));
202
+ }
203
+ }
204
+ return { docs, journals };
205
+ }
206
+ /** Where a page's document files: its foundry.folder override, or its own directory. */
207
+ export function documentFolder(page) {
208
+ const override = page.foundry?.folder;
209
+ return typeof override === "string" && override.trim()
210
+ ? override.trim().replace(/^\/+|\/+$/g, "")
211
+ : folderOf(page.path);
212
+ }
213
+ /** `"Characters/Nobles/Marlo.md"` to `"Characters/Nobles"`, or undefined at the root. */
214
+ const graftFolder = (folder) => folder || undefined;
215
+ /**
216
+ * One JournalEntry per directory, every `.md` in it an embedded page.
217
+ *
218
+ * The folder-as-entry model the sync already used: a directory of notes reads
219
+ * as one journal a GM can page through, rather than fifty entries in a list.
220
+ *
221
+ * Bodies are references, not content. Inlining them would make this file
222
+ * megabytes for a large vault and re-download every page on every build; a
223
+ * reference lets the provider batch them through `/_batch` and skip what has
224
+ * not changed.
225
+ */
226
+ export function journalEntries(pages, opts) {
227
+ const pack = opts.packs["JournalEntry"];
228
+ if (!pack)
229
+ return [];
230
+ const byFolder = new Map();
231
+ for (const page of pages) {
232
+ if (page.foundry?.sync === false || page.foundry?.journal === false)
233
+ continue;
234
+ const folder = folderOf(page.path);
235
+ if (!byFolder.has(folder))
236
+ byFolder.set(folder, []);
237
+ byFolder.get(folder).push(page);
238
+ }
239
+ const entries = [];
240
+ for (const [folder, group] of [...byFolder].sort(([a], [b]) => a.localeCompare(b))) {
241
+ // The folder's index page reads first; the rest alphabetically.
242
+ const isIndex = (p) => /(^|\/)index\.md$/i.test(p.path);
243
+ const sorted = [...group].sort((a, b) => Number(isIndex(b)) - Number(isIndex(a)) || a.path.localeCompare(b.path));
244
+ const journalPages = sorted.map((page, i) => {
245
+ const ownership = observable(page, opts) ? OBSERVER : NONE;
246
+ return {
247
+ _id: pageId(opts.vaultId, page.path),
248
+ name: page.title,
249
+ type: "text",
250
+ sort: (i + 1) * 100,
251
+ title: { show: false, level: 1 },
252
+ text: { format: 1, content: `@vaults/${opts.buildRole}/${page.path.replace(/\.md$/i, "")}.foundry.html` },
253
+ ownership: { default: ownership },
254
+ };
255
+ });
256
+ // A player needs to see the entry before per-page ownership can matter, so
257
+ // an entry holding anything visible is observable and hides the rest.
258
+ const anyVisible = journalPages.some((p) => p.ownership.default === OBSERVER);
259
+ entries.push({
260
+ id: entryId(opts.vaultId, folder),
261
+ type: "JournalEntry",
262
+ pack,
263
+ ...(graftFolder(folderOf(folder)) ? { folder: folderOf(folder) } : {}),
264
+ patch: {
265
+ name: folder ? folder.split("/").pop() : "Home",
266
+ ownership: { default: anyVisible ? OBSERVER : NONE },
267
+ pages: journalPages,
268
+ },
269
+ });
270
+ }
271
+ return entries;
272
+ }
273
+ /**
274
+ * A page's `foundry.source` becomes a graft of that document.
275
+ *
276
+ * This is the whole of what `instance.mjs` did at runtime — clone a compendium
277
+ * document, apply the page's overrides, keep a deterministic id — expressed as
278
+ * the thing graft already builds. A base that names a UUID is a source; a page
279
+ * with only `foundry.patch` carries its own content and has none.
280
+ */
281
+ export function documentEntries(pages, opts) {
282
+ const entries = [];
283
+ const warnings = [];
284
+ const sourcedBy = new Map();
285
+ const targets = vaultIdTargets(pages, opts);
286
+ for (const page of pages) {
287
+ const spec = page.foundry;
288
+ if (!spec?.source || spec.sync === false)
289
+ continue;
290
+ const bases = basesOf(spec.source);
291
+ const base = bases[0];
292
+ if (!base) {
293
+ warnings.push(`${page.path}: foundry.source should be a UUID or a list of them`);
294
+ continue;
295
+ }
296
+ const type = documentTypeOf(base);
297
+ if (!type) {
298
+ warnings.push(`${page.path}: cannot tell what kind of document "${base}" is`);
299
+ continue;
300
+ }
301
+ const pack = opts.packs[type];
302
+ if (!pack) {
303
+ warnings.push(`${page.path}: no pack declared for ${type}`);
304
+ continue;
305
+ }
306
+ const ownership = observable(page, opts) ? OBSERVER : NONE;
307
+ const subtype = subtypeOf(base);
308
+ const resolved = {
309
+ ...page,
310
+ sidecar: resolveVaultIds(page.sidecar, opts, targets, warnings, page.path),
311
+ };
312
+ const patch = rewriteVaultRefs({
313
+ name: page.title,
314
+ ...(subtype ? { type: subtype } : {}),
315
+ ...defaulted(withItemIds(resolveVaultIds(spec.patch ?? {}, opts, targets, warnings, page.path), opts.vaultId, page.path), type, resolved, opts.buildRole, opts.system ?? "dnd5e"),
316
+ // Over the patch, not under it: ownership is role gating, and a page that
317
+ // could overrule its own would be a page that could publish itself.
318
+ ownership: { default: ownership },
319
+ }, opts.buildRole);
320
+ const folder = documentFolder(page);
321
+ entries.push({
322
+ id: pinnedId(spec.patch, { warnings, path: page.path }) ?? instanceId(opts.vaultId, page.path),
323
+ type,
324
+ pack,
325
+ ...(graftFolder(folder) ? { folder } : {}),
326
+ // A list travels whole: graft tries each in order and takes the first
327
+ // that resolves, so a page can prefer better content without demanding
328
+ // the reader own it.
329
+ ...(base.startsWith("Compendium.")
330
+ ? { source: bases.length > 1 ? bases : base }
331
+ : {}),
332
+ patch,
333
+ });
334
+ sourcedBy.set(entries[entries.length - 1].id, { path: page.path, bases });
335
+ }
336
+ warnMissingSiblings(entries, sourcedBy, opts, warnings);
337
+ return { entries, warnings };
338
+ }
339
+ /**
340
+ * A source naming another entry of this vault that this variant does not build.
341
+ *
342
+ * graft orders siblings so one can graft onto another, but role gating decides
343
+ * membership per variant: a public page grafting onto a dm-only one resolves
344
+ * for the GM and silently skips for everyone else.
345
+ */
346
+ function warnMissingSiblings(entries, sourcedBy, opts, warnings) {
347
+ const built = new Set(entries.map((e) => e.id));
348
+ const mine = `Compendium.${opts.vaultId}.`;
349
+ for (const [id, { path, bases }] of sourcedBy) {
350
+ if (!built.has(id))
351
+ continue;
352
+ for (const base of bases) {
353
+ if (!base.startsWith(mine))
354
+ continue;
355
+ const target = base.split(".").pop();
356
+ if (built.has(target))
357
+ continue;
358
+ warnings.push(`${path}: grafts onto "${base}", which this build does not make`
359
+ + ` — check the page it names is visible at this role`);
360
+ }
361
+ }
362
+ }
363
+ /**
364
+ * The document type a `foundry.source` names.
365
+ *
366
+ * A compendium UUID carries it (`Compendium.<mod>.<pack>.<Type>.<id>`); a bare
367
+ * type name is a page inventing its own content.
368
+ */
369
+ export function documentTypeOf(base) {
370
+ if (base.startsWith("Compendium.")) {
371
+ const parts = base.split(".");
372
+ return parts.length >= 5 ? parts[parts.length - 2] : null;
373
+ }
374
+ return canonicalType(base.split(":")[0]);
375
+ }
376
+ /**
377
+ * The system subtype in a bare base, if it names one.
378
+ *
379
+ * `Actor:npc` is a page inventing an NPC rather than grafting one: the
380
+ * document type is the schema, the subtype is what kind of it this is, and
381
+ * Foundry needs the second as a `type` field on the document itself.
382
+ */
383
+ export function subtypeOf(base) {
384
+ if (base.startsWith("Compendium."))
385
+ return null;
386
+ const [, subtype] = base.split(":");
387
+ return subtype?.trim() || null;
388
+ }
389
+ /** Where a link to each page should land, from the same ids the entries carry. */
390
+ export function linkIndex(pages, opts) {
391
+ const targets = new Map();
392
+ for (const page of pages) {
393
+ if (page.foundry?.sync === false)
394
+ continue;
395
+ const target = {};
396
+ const base = firstBase(page.foundry?.source);
397
+ const type = base ? documentTypeOf(base) : null;
398
+ const pack = type ? opts.packs[type] : undefined;
399
+ if (type && pack) {
400
+ target.doc = {
401
+ type, pack,
402
+ id: pinnedId(page.foundry?.patch) ?? instanceId(opts.vaultId, page.path),
403
+ };
404
+ }
405
+ if (page.foundry?.journal !== false) {
406
+ target.entry = entryId(opts.vaultId, folderOf(page.path));
407
+ target.page = pageId(opts.vaultId, page.path);
408
+ }
409
+ if (target.doc || target.page)
410
+ targets.set(page.path, target);
411
+ }
412
+ return {
413
+ targets,
414
+ moduleId: opts.vaultId,
415
+ journalPack: opts.packs["JournalEntry"] ?? "",
416
+ packaging: opts.packaging ?? "compendium",
417
+ };
418
+ }
419
+ /**
420
+ * Stamp `_stats.coreVersion`: Foundry's import refuses a document without one
421
+ * and graft then builds a degraded copy (a Scene loses its levels, silently).
422
+ * A sidecar's own value survives; sourced entries are left alone, since the
423
+ * reader's compendium copy records its own generation.
424
+ */
425
+ function stampCoreVersion(entries, coreVersion) {
426
+ if (!coreVersion)
427
+ return entries;
428
+ return entries.map((entry) => {
429
+ if (entry.source)
430
+ return entry;
431
+ const stats = entry.patch["_stats"];
432
+ const existing = stats && typeof stats === "object" && !Array.isArray(stats)
433
+ ? stats
434
+ : {};
435
+ if (typeof existing["coreVersion"] === "string" && existing["coreVersion"])
436
+ return entry;
437
+ return { ...entry, patch: { ...entry.patch, _stats: { ...existing, coreVersion } } };
438
+ });
439
+ }
440
+ export function buildGrafts(pages, opts) {
441
+ const docs = documentEntries(pages, opts);
442
+ // Stamped before folding: inside an Adventure the documents that need a
443
+ // `coreVersion` are nested, and nothing reaches them afterwards.
444
+ const typed = stampCoreVersion([...journalEntries(pages, opts), ...docs.entries], opts.coreVersion ?? "");
445
+ const shaped = opts.packaging === "adventure"
446
+ ? asAdventure(typed, {
447
+ id: instanceId(opts.vaultId, "\u0000adventure"),
448
+ pack: opts.packs["Adventure"],
449
+ name: opts.title ?? opts.vaultId,
450
+ coreVersion: opts.coreVersion,
451
+ folderId: (type, path) => det("folder", `${opts.vaultId}:${type}:${path}`),
452
+ })
453
+ : { entries: typed, warnings: [] };
454
+ const entries = shaped.entries;
455
+ const assets = opts.assets && Object.keys(opts.assets).length ? opts.assets : undefined;
456
+ return {
457
+ file: {
458
+ format: 1,
459
+ ...(assets ? { assets } : {}),
460
+ // Finished by the caller once the bodies exist; see contentHash().
461
+ contentHash: "",
462
+ entries,
463
+ },
464
+ warnings: [...docs.warnings, ...shaped.warnings],
465
+ links: linkIndex(pages, opts),
466
+ };
467
+ }
468
+ // ── the module a vault ships ────────────────────────────────────────────────
469
+ //
470
+ // Generated once and then inert. It declares packs and dependencies and points
471
+ // at the vault; it holds no logic, so pushing content never means reinstalling
472
+ // it. That is the whole reason the provider lives in a shared module instead.
473
+ /** One pack per document type, declared up front. */
474
+ export const PACK_SUFFIX = Object.fromEntries(Object.entries(DOC_TYPES).map(([type, info]) => [type, info.packSuffix]));
475
+ export function packsFor(moduleId) {
476
+ return Object.fromEntries(Object.entries(PACK_SUFFIX).map(([type, suffix]) => [type, `${moduleId}-${suffix}`]));
477
+ }
478
+ /**
479
+ * The pack types a vault's module declares.
480
+ *
481
+ * Compendium packaging declares them all, used or not: packs are read when the
482
+ * server starts, so a vault that later gains its first Scene would otherwise
483
+ * need the module reinstalled and Foundry restarted before it could build.
484
+ *
485
+ * Adventure packaging needs exactly one, permanently. Everything the vault
486
+ * holds goes inside the Adventure, so gaining a new document type adds nothing
487
+ * to declare — and seven empty packs beside it are seven things a reader opens
488
+ * once to find out they are empty.
489
+ */
490
+ export function packTypesFor(packaging) {
491
+ return packaging === "adventure" ? ["Adventure"] : Object.keys(PACK_SUFFIX).filter((t) => t !== "Adventure");
492
+ }
493
+ /**
494
+ * The `module.json` a vault serves for itself.
495
+ *
496
+ * Every pack type is declared whether the vault uses it or not: packs are read
497
+ * when the server starts, so a vault that later gains its first Scene would
498
+ * otherwise need the module reinstalled and the server restarted before it
499
+ * could build. Declaring them all keeps the module genuinely permanent.
500
+ */
501
+ const label = (suffix) => `${suffix[0].toUpperCase()}${suffix.slice(1)}`;
502
+ export function moduleManifest(opts) {
503
+ const url = opts.vaultUrl.replace(/\/+$/, "");
504
+ return {
505
+ id: opts.moduleId,
506
+ title: opts.title,
507
+ description: `Content from ${url}, built on your machine from what you are entitled to read.`,
508
+ compatibility: { minimum: "14", verified: "14" },
509
+ url,
510
+ manifest: `${url}/_foundry/module.json`,
511
+ download: `${url}/_foundry/module.zip`,
512
+ packs: packTypesFor(opts.packaging ?? "compendium").map((type) => ({
513
+ name: `${opts.moduleId}-${PACK_SUFFIX[type]}`,
514
+ label: `${opts.title}: ${label(PACK_SUFFIX[type])}`,
515
+ path: `packs/${opts.moduleId}-${PACK_SUFFIX[type]}`,
516
+ type,
517
+ // Never player-browsable. A reader sees vault content because the GM
518
+ // imported it, and the entry itself says whether they may.
519
+ ownership: { PLAYER: "NONE", ASSISTANT: "OWNER" },
520
+ // The Adventure pack needs a system as much as the Actor pack does:
521
+ // Adventure.fromSource empties actors, items and their folders out of
522
+ // any adventure read from a systemless pack.
523
+ ...(type === "Actor" || type === "Item" || type === "Adventure"
524
+ ? { system: opts.systemId ?? "dnd5e" } : {}),
525
+ })),
526
+ packFolders: [{
527
+ name: opts.title, sorting: "m",
528
+ packs: packTypesFor(opts.packaging ?? "compendium").map((t) => `${opts.moduleId}-${PACK_SUFFIX[t]}`),
529
+ }],
530
+ relationships: {
531
+ requires: [
532
+ { id: "graft", type: "module" },
533
+ { id: "vaults", type: "module" },
534
+ ],
535
+ },
536
+ // How graft finds anything here. It reads a module's `flags.graft.entries`
537
+ // for the files to load; without this the module is a set of empty packs
538
+ // and a manifest, and nothing ever asks the vault for its contents.
539
+ flags: { graft: { entries: ["grafts.json"] } },
540
+ ...(opts.extra ?? {}),
541
+ };
542
+ }
543
+ /** The one-line grafts.json the module ships: a pointer, not a list. */
544
+ export function moduleGrafts(vaultUrl, gated) {
545
+ // `gated` is not a hint the provider could work out for itself. A single-role
546
+ // deploy collapses its one variant to the site root and ships no Pages
547
+ // Functions, so `/_batch` is not there and a reference's variant segment is
548
+ // not a directory. A gated deploy is the opposite on both counts. Probing for
549
+ // the difference means reading a 404 as "public", which is also what a
550
+ // misconfigured deploy looks like.
551
+ return [{ vault: vaultUrl.replace(/\/+$/, ""), gated }];
552
+ }
553
+ /**
554
+ * The folder-index pages the wiki synthesizes, as graft pages.
555
+ *
556
+ * The wiki gives every folder without an index.md a generated one, and its
557
+ * body is on disk per variant; without these the journal has no page for a
558
+ * folder to open at, and a note pointing at "Places/index" lands nowhere.
559
+ * Each takes the lowest role among the folder's pages, so a folder with any
560
+ * player-visible content gets a player-visible index.
561
+ */
562
+ export function withFolderIndexes(pages, roles) {
563
+ const rank = (r) => { const i = roles.indexOf(r); return i < 0 ? roles.length : i; };
564
+ const real = new Set(pages.map((p) => p.path));
565
+ const lowest = new Map();
566
+ for (const page of pages) {
567
+ const parts = page.path.split("/");
568
+ for (let i = 1; i < parts.length; i++) {
569
+ const folder = parts.slice(0, i).join("/");
570
+ const held = lowest.get(folder);
571
+ if (held === undefined || rank(page.role) < rank(held))
572
+ lowest.set(folder, page.role);
573
+ }
574
+ }
575
+ const synthetic = [];
576
+ for (const [folder, role] of lowest) {
577
+ const path = `${folder}/index.md`;
578
+ if (real.has(path))
579
+ continue;
580
+ synthetic.push({ path, title: folder.split("/").pop(), role });
581
+ }
582
+ return [...pages, ...synthetic];
583
+ }
584
+ /** Pages a role may see, in the shape the emitter wants. */ /** Pages a role may see, in the shape the emitter wants. */
585
+ export function pagesFrom(metas, visible,
586
+ /**
587
+ * Each page's `foundry.patch_json`, already read, by page path. That file is
588
+ * where a Scene's walls and tiles actually live, so a page with one and no
589
+ * entry here compiles to a name and nothing else. Reading it is the caller's
590
+ * job because this file touches no disk.
591
+ */
592
+ patches) {
593
+ const pages = [];
594
+ for (const meta of metas) {
595
+ if (!visible.has(meta.role))
596
+ continue;
597
+ const fo = meta.frontmatter?.["foundry"];
598
+ const block = fo && typeof fo === "object" && !Array.isArray(fo)
599
+ ? { ...fo }
600
+ : null;
601
+ const sidecar = patches?.get(meta.path);
602
+ pages.push({
603
+ path: meta.path, title: meta.title, role: meta.role, foundry: block,
604
+ ...(meta.coverImage ? { image: meta.coverImage } : {}),
605
+ ...(sidecar ? { sidecar } : {}),
606
+ });
607
+ }
608
+ return pages;
609
+ }
610
+ //# sourceMappingURL=foundry-grafts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foundry-grafts.js","sourceRoot":"","sources":["../src/foundry-grafts.ts"],"names":[],"mappings":"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"}