@wizzlethorpe/vaults 0.13.5 → 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.
- package/README.md +2 -2
- package/dist/asset-refs.js +282 -0
- package/dist/asset-refs.js.map +1 -0
- package/dist/auth.js.map +1 -1
- package/dist/build.js +393 -544
- package/dist/build.js.map +1 -1
- package/dist/commands/build.js +0 -4
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/preview.js +0 -4
- package/dist/commands/preview.js.map +1 -1
- package/dist/commands/push.js +4 -9
- package/dist/commands/push.js.map +1 -1
- package/dist/commands/role.js +55 -14
- package/dist/commands/role.js.map +1 -1
- package/dist/config.js +25 -5
- package/dist/config.js.map +1 -1
- package/dist/escape.js +20 -0
- package/dist/escape.js.map +1 -1
- package/dist/foundry-adventure.js +86 -0
- package/dist/foundry-adventure.js.map +1 -0
- package/dist/foundry-defaults.js +65 -0
- package/dist/foundry-defaults.js.map +1 -0
- package/dist/foundry-grafts.js +610 -0
- package/dist/foundry-grafts.js.map +1 -0
- package/dist/foundry-html.js +196 -0
- package/dist/foundry-html.js.map +1 -0
- package/dist/foundry-importer.bundle.js +1192 -322
- package/dist/foundry-importer.js +2 -7
- package/dist/foundry-importer.js.map +1 -1
- package/dist/foundry-meta.js +56 -0
- package/dist/foundry-meta.js.map +1 -0
- package/dist/foundry-module-journal.js +133 -0
- package/dist/foundry-module-journal.js.map +1 -0
- package/dist/foundry-module-render.js +75 -0
- package/dist/foundry-module-render.js.map +1 -0
- package/dist/foundry-module.js +1082 -0
- package/dist/foundry-module.js.map +1 -0
- package/dist/foundry-types.js +28 -0
- package/dist/foundry-types.js.map +1 -0
- package/dist/foundry-version.js +30 -0
- package/dist/foundry-version.js.map +1 -0
- package/dist/frontmatter-defaults.js +68 -0
- package/dist/frontmatter-defaults.js.map +1 -0
- package/dist/index.js +5 -9
- package/dist/index.js.map +1 -1
- package/dist/manifest.js +115 -0
- package/dist/manifest.js.map +1 -0
- package/dist/migrate/0.15-foundry-patch-keys.js +51 -0
- package/dist/migrate/0.15-foundry-patch-keys.js.map +1 -0
- package/dist/migrate/0.15-foundry-pinned-id.js +68 -0
- package/dist/migrate/0.15-foundry-pinned-id.js.map +1 -0
- package/dist/migrate/files.js +66 -0
- package/dist/migrate/files.js.map +1 -0
- package/dist/migrate/registry.js +4 -0
- package/dist/migrate/registry.js.map +1 -1
- package/dist/migrate/run.js +36 -2
- package/dist/migrate/run.js.map +1 -1
- package/dist/render/auth-template.js +331 -42
- package/dist/render/auth-template.js.map +1 -1
- package/dist/render/bases.js +22 -38
- package/dist/render/bases.js.map +1 -1
- package/dist/render/cover.js +23 -1
- package/dist/render/cover.js.map +1 -1
- package/dist/render/handlers/assets.js +5 -34
- package/dist/render/handlers/assets.js.map +1 -1
- package/dist/render/handlers/builtin/battlemap.js +4 -1
- package/dist/render/handlers/builtin/battlemap.js.map +1 -1
- package/dist/render/handlers/builtin/download.js +90 -0
- package/dist/render/handlers/builtin/download.js.map +1 -0
- package/dist/render/handlers/builtin/fm-code.js +2 -2
- package/dist/render/handlers/builtin/fm-code.js.map +1 -1
- package/dist/render/handlers/builtin/foundry-manifest.js +158 -0
- package/dist/render/handlers/builtin/foundry-manifest.js.map +1 -0
- package/dist/render/handlers/builtin/fvtt-link.js +39 -0
- package/dist/render/handlers/builtin/fvtt-link.js.map +1 -0
- package/dist/render/handlers/builtin/index.js +4 -1
- package/dist/render/handlers/builtin/index.js.map +1 -1
- package/dist/render/handlers/builtin/statblock.js +0 -4
- package/dist/render/handlers/builtin/statblock.js.map +1 -1
- package/dist/render/handlers/types.js.map +1 -1
- package/dist/render/pipeline.js +4 -1
- package/dist/render/pipeline.js.map +1 -1
- package/dist/render/slug.js +0 -5
- package/dist/render/slug.js.map +1 -1
- package/dist/settings.js +156 -21
- package/dist/settings.js.map +1 -1
- package/dist/zip.js +78 -0
- package/dist/zip.js.map +1 -0
- package/package.json +4 -3
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// Every markdown file in a vault, for migrations that rewrite page content.
|
|
2
|
+
//
|
|
3
|
+
// Skips dot-directories: `.vaults/` holds the build cache, whose rendered
|
|
4
|
+
// copies are regenerated from the sources a migration is busy fixing.
|
|
5
|
+
import { readdir } from "node:fs/promises";
|
|
6
|
+
import { join } from "node:path";
|
|
7
|
+
export async function listMarkdownFiles(dir) {
|
|
8
|
+
const out = [];
|
|
9
|
+
for (const entry of await readdir(dir, { withFileTypes: true })) {
|
|
10
|
+
if (entry.name.startsWith("."))
|
|
11
|
+
continue;
|
|
12
|
+
const full = join(dir, entry.name);
|
|
13
|
+
if (entry.isDirectory())
|
|
14
|
+
out.push(...await listMarkdownFiles(full));
|
|
15
|
+
else if (entry.name.endsWith(".md"))
|
|
16
|
+
out.push(full);
|
|
17
|
+
}
|
|
18
|
+
return out;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* A file's frontmatter as lines, with what is needed to splice it back.
|
|
22
|
+
* CRLF files keep their `\r` on each line and get it back unchanged.
|
|
23
|
+
*/
|
|
24
|
+
export function frontmatter(text) {
|
|
25
|
+
const open = /^---\r?\n/.exec(text);
|
|
26
|
+
if (!open)
|
|
27
|
+
return null;
|
|
28
|
+
const close = /\r?\n---/.exec(text.slice(open[0].length));
|
|
29
|
+
if (!close)
|
|
30
|
+
return null;
|
|
31
|
+
const start = open[0].length;
|
|
32
|
+
const end = start + close.index;
|
|
33
|
+
return { lines: text.slice(start, end).split("\n"), start, end };
|
|
34
|
+
}
|
|
35
|
+
/** The edited frontmatter lines spliced back into the file. */
|
|
36
|
+
export function withFrontmatter(text, lines, start, end) {
|
|
37
|
+
return text.slice(0, start) + lines.join("\n") + text.slice(end);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* The direct children of a top-level `foundry:` block, at the block's own
|
|
41
|
+
* child indent. Blank and comment lines are skipped; a deeper-nested line is
|
|
42
|
+
* somebody's actual document field and never yielded. A `foundry: {}` on one
|
|
43
|
+
* line opens no block, and any other top-level key closes it.
|
|
44
|
+
*/
|
|
45
|
+
export function* foundryChildren(lines) {
|
|
46
|
+
let inBlock = false;
|
|
47
|
+
let childIndent = null;
|
|
48
|
+
for (let i = 0; i < lines.length; i++) {
|
|
49
|
+
const line = lines[i];
|
|
50
|
+
if (!line.trim() || line.trimStart().startsWith("#"))
|
|
51
|
+
continue;
|
|
52
|
+
const indent = line.length - line.trimStart().length;
|
|
53
|
+
if (!inBlock) {
|
|
54
|
+
if (indent === 0 && /^foundry:\s*$/.test(line))
|
|
55
|
+
inBlock = true;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (indent === 0)
|
|
59
|
+
return;
|
|
60
|
+
if (childIndent === null)
|
|
61
|
+
childIndent = indent;
|
|
62
|
+
if (indent === childIndent)
|
|
63
|
+
yield { i, line };
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/migrate/files.ts"],"names":[],"mappings":"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"}
|
package/dist/migrate/registry.js
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
// Ordered list of migrations. Newer migrations append at the end.
|
|
2
2
|
import { vaultsDirMigration } from "./0.7-vaults-dir.js";
|
|
3
|
+
import { foundryPatchKeysMigration } from "./0.15-foundry-patch-keys.js";
|
|
4
|
+
import { foundryPinnedIdMigration } from "./0.15-foundry-pinned-id.js";
|
|
3
5
|
export const MIGRATIONS = [
|
|
4
6
|
vaultsDirMigration,
|
|
7
|
+
foundryPatchKeysMigration,
|
|
8
|
+
foundryPinnedIdMigration,
|
|
5
9
|
];
|
|
6
10
|
//# sourceMappingURL=registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/migrate/registry.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAGlE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/migrate/registry.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAGlE,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAEvE,MAAM,CAAC,MAAM,UAAU,GAA6B;IAClD,kBAAkB;IAClB,yBAAyB;IACzB,wBAAwB;CACzB,CAAC"}
|
package/dist/migrate/run.js
CHANGED
|
@@ -2,9 +2,26 @@
|
|
|
2
2
|
// needs() returns true, and reports what happened.
|
|
3
3
|
//
|
|
4
4
|
// Called automatically at the top of every command that touches a vault.
|
|
5
|
-
//
|
|
6
|
-
//
|
|
5
|
+
// A settled migration is recorded in .vaults/migrations.json and never
|
|
6
|
+
// consulted again: needs() may read the whole vault to answer, and paying
|
|
7
|
+
// that on every command forever is the wrong price for a one-shot rewrite.
|
|
8
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
9
|
+
import { join } from "node:path";
|
|
7
10
|
import { MIGRATIONS } from "./registry.js";
|
|
11
|
+
const MARKER = ".vaults/migrations.json";
|
|
12
|
+
async function readSettled(vaultPath) {
|
|
13
|
+
try {
|
|
14
|
+
const ids = JSON.parse(await readFile(join(vaultPath, MARKER), "utf8"));
|
|
15
|
+
return new Set(Array.isArray(ids) ? ids.filter((x) => typeof x === "string") : []);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
return new Set();
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
async function writeSettled(vaultPath, ids) {
|
|
22
|
+
await mkdir(join(vaultPath, ".vaults"), { recursive: true });
|
|
23
|
+
await writeFile(join(vaultPath, MARKER), JSON.stringify([...ids].sort()) + "\n");
|
|
24
|
+
}
|
|
8
25
|
export async function runMigrations(vaultPath, opts = {}) {
|
|
9
26
|
const candidates = opts.only
|
|
10
27
|
? MIGRATIONS.filter((m) => m.id === opts.only)
|
|
@@ -14,9 +31,20 @@ export async function runMigrations(vaultPath, opts = {}) {
|
|
|
14
31
|
}
|
|
15
32
|
const applied = [];
|
|
16
33
|
const skipped = [];
|
|
34
|
+
// `only` is a hand-run and ignores the record, so a migration can be forced.
|
|
35
|
+
const settled = opts.only ? new Set() : await readSettled(vaultPath);
|
|
36
|
+
let recorded = false;
|
|
17
37
|
for (const m of candidates) {
|
|
38
|
+
if (settled.has(m.id)) {
|
|
39
|
+
skipped.push(m.id);
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
18
42
|
if (!(await m.needs(vaultPath))) {
|
|
19
43
|
skipped.push(m.id);
|
|
44
|
+
if (!opts.dryRun && !opts.only) {
|
|
45
|
+
settled.add(m.id);
|
|
46
|
+
recorded = true;
|
|
47
|
+
}
|
|
20
48
|
continue;
|
|
21
49
|
}
|
|
22
50
|
if (opts.dryRun) {
|
|
@@ -29,7 +57,13 @@ export async function runMigrations(vaultPath, opts = {}) {
|
|
|
29
57
|
console.log(` migrating: ${m.id} — ${m.description}`);
|
|
30
58
|
await m.apply(vaultPath);
|
|
31
59
|
applied.push(m.id);
|
|
60
|
+
if (!opts.only) {
|
|
61
|
+
settled.add(m.id);
|
|
62
|
+
recorded = true;
|
|
63
|
+
}
|
|
32
64
|
}
|
|
65
|
+
if (recorded)
|
|
66
|
+
await writeSettled(vaultPath, settled);
|
|
33
67
|
return { applied, skipped };
|
|
34
68
|
}
|
|
35
69
|
export function listMigrations() {
|
package/dist/migrate/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/migrate/run.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,mDAAmD;AACnD,EAAE;AACF,yEAAyE;AACzE,
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/migrate/run.ts"],"names":[],"mappings":"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"}
|