@wizzlethorpe/vaults 0.9.4 → 0.9.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/foundry-importer.js
CHANGED
|
@@ -1,50 +1,23 @@
|
|
|
1
|
-
// Build helper:
|
|
2
|
-
//
|
|
3
|
-
//
|
|
1
|
+
// Build helper: the Foundry-side importer is pre-bundled at CLI build time
|
|
2
|
+
// (see scripts/bundle-importer.mjs) into `dist/foundry-importer.bundle.js`,
|
|
3
|
+
// which ships inside the npm package. At deploy time we copy that bundle to
|
|
4
|
+
// `_foundry/importer.js` and emit a `_foundry/version.json` sidecar carrying
|
|
5
|
+
// `{ version, sha256 }` so the Foundry host can detect skew before evaluating.
|
|
4
6
|
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
// so the host can detect skew before evaluating.
|
|
9
|
-
import { build } from "esbuild";
|
|
7
|
+
// Bundling ahead of publish (not here) means the installed CLI never runs
|
|
8
|
+
// esbuild on the user's machine and doesn't need the foundry/ source tree,
|
|
9
|
+
// which isn't part of the npm package.
|
|
10
10
|
import { createHash } from "node:crypto";
|
|
11
|
-
import { mkdir, writeFile } from "node:fs/promises";
|
|
12
|
-
import { dirname, join
|
|
11
|
+
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
12
|
+
import { basename, dirname, join } from "node:path";
|
|
13
13
|
import { fileURLToPath } from "node:url";
|
|
14
14
|
import { CLI_VERSION } from "./version.js";
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
// dev: cli/src/ → cli → vaults/ → vaults/foundry/scripts/importer-entry.mjs
|
|
22
|
-
// installed: dist/ → cli → vaults/ → vaults/foundry/scripts/importer-entry.mjs (same)
|
|
23
|
-
return resolve(here, "..", "..", ENTRY_RELATIVE_TO_REPO);
|
|
24
|
-
}
|
|
25
|
-
async function bundleImporter() {
|
|
26
|
-
const entry = resolveEntry();
|
|
27
|
-
const result = await build({
|
|
28
|
-
entryPoints: [entry],
|
|
29
|
-
bundle: true,
|
|
30
|
-
format: "esm",
|
|
31
|
-
platform: "browser",
|
|
32
|
-
target: "es2022",
|
|
33
|
-
write: false,
|
|
34
|
-
// Foundry globals are present at runtime; esbuild treats them as
|
|
35
|
-
// externals automatically because they're not imported. No need to
|
|
36
|
-
// mark anything as external explicitly.
|
|
37
|
-
minify: false,
|
|
38
|
-
sourcemap: false,
|
|
39
|
-
legalComments: "none",
|
|
40
|
-
});
|
|
41
|
-
if (result.outputFiles.length !== 1) {
|
|
42
|
-
throw new Error(`expected 1 bundle output, got ${result.outputFiles.length}`);
|
|
43
|
-
}
|
|
44
|
-
const source = result.outputFiles[0].text;
|
|
45
|
-
const sha256 = createHash("sha256").update(source).digest("hex");
|
|
46
|
-
return { source, sha256 };
|
|
47
|
-
}
|
|
15
|
+
// scripts/bundle-importer.mjs always emits the bundle into dist/. This module
|
|
16
|
+
// runs from dist/ once published, but from src/ under tsx (tests) — resolve to
|
|
17
|
+
// dist/ either way.
|
|
18
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
19
|
+
const distDir = basename(here) === "src" ? join(here, "..", "dist") : here;
|
|
20
|
+
const BUNDLE_PATH = join(distDir, "foundry-importer.bundle.js");
|
|
48
21
|
/**
|
|
49
22
|
* Write `_foundry/importer.js` + `_foundry/version.json` into the deploy.
|
|
50
23
|
* Called from build.ts after the variant outputs are in place — the
|
|
@@ -52,7 +25,8 @@ async function bundleImporter() {
|
|
|
52
25
|
* no role-gated content.
|
|
53
26
|
*/
|
|
54
27
|
export async function writeFoundryImporter(outputDir) {
|
|
55
|
-
const
|
|
28
|
+
const source = await readFile(BUNDLE_PATH, "utf8");
|
|
29
|
+
const sha256 = createHash("sha256").update(source).digest("hex");
|
|
56
30
|
const dir = join(outputDir, "_foundry");
|
|
57
31
|
await mkdir(dir, { recursive: true });
|
|
58
32
|
await writeFile(join(dir, "importer.js"), source);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"foundry-importer.js","sourceRoot":"","sources":["../src/foundry-importer.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"foundry-importer.js","sourceRoot":"","sources":["../src/foundry-importer.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,4EAA4E;AAC5E,4EAA4E;AAC5E,6EAA6E;AAC7E,+EAA+E;AAC/E,EAAE;AACF,0EAA0E;AAC1E,2EAA2E;AAC3E,uCAAuC;AAEvC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,8EAA8E;AAC9E,+EAA+E;AAC/E,oBAAoB;AACpB,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACrD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3E,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,4BAA4B,CAAC,CAAC;AAEhE;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,SAAiB;IAC1D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjE,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACxC,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,CAAC;IAClD,MAAM,SAAS,CACb,IAAI,CAAC,GAAG,EAAE,cAAc,CAAC,EACzB,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAC1D,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wizzlethorpe/vaults",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.6",
|
|
4
4
|
"description": "Sync an Obsidian vault to a Cloudflare-hosted wiki with role-based access. Renders locally, deploys to Cloudflare Pages.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"obsidian",
|
|
@@ -61,7 +61,7 @@
|
|
|
61
61
|
"typescript": "^5.9.3"
|
|
62
62
|
},
|
|
63
63
|
"scripts": {
|
|
64
|
-
"build": "tsc",
|
|
64
|
+
"build": "tsc && node scripts/bundle-importer.mjs",
|
|
65
65
|
"start": "node dist/index.js",
|
|
66
66
|
"test": "node --import tsx --test test/*.test.ts",
|
|
67
67
|
"typecheck:test": "tsc -p tsconfig.test.json --noEmit"
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
// Migration: copy legacy auth fields out of settings.md frontmatter into
|
|
2
|
-
// the CLI-managed config (formerly .vaultrc.json, now .vaults/config.json).
|
|
3
|
-
//
|
|
4
|
-
// Earlier versions stored `roles`, `auth_type`, and `role_passwords` in
|
|
5
|
-
// settings.md. The settings canonicaliser strips unknown keys, so if we
|
|
6
|
-
// don't lift them out before settings.md is rewritten, they're silently
|
|
7
|
-
// dropped. This migration copies anything we still see in settings.md
|
|
8
|
-
// over to the config — but only when the destination is empty / default,
|
|
9
|
-
// so re-running on an already-migrated vault is a no-op.
|
|
10
|
-
//
|
|
11
|
-
// This was previously inline in build.ts as migrateLegacyAuthFromSettings();
|
|
12
|
-
// moved here so all migrations live in one registry.
|
|
13
|
-
import { readFile } from "node:fs/promises";
|
|
14
|
-
import { join } from "node:path";
|
|
15
|
-
import matter from "gray-matter";
|
|
16
|
-
import { loadConfig, saveConfig } from "../config.js";
|
|
17
|
-
import { SETTINGS_FILE } from "../paths.js";
|
|
18
|
-
export const legacyAuthSettingsMigration = {
|
|
19
|
-
id: "0.6-legacy-auth-settings",
|
|
20
|
-
description: "settings.md roles/auth_type/role_passwords → CLI-managed config",
|
|
21
|
-
async needs(vaultPath) {
|
|
22
|
-
const fm = await readSettingsFrontmatter(vaultPath);
|
|
23
|
-
if (!fm)
|
|
24
|
-
return false;
|
|
25
|
-
if (!hasAnyLegacyKey(fm))
|
|
26
|
-
return false;
|
|
27
|
-
const cfg = await loadConfig(vaultPath, {});
|
|
28
|
-
return liftLegacyAuth(fm, cfg, { dryRun: true }).length > 0;
|
|
29
|
-
},
|
|
30
|
-
async apply(vaultPath) {
|
|
31
|
-
const fm = await readSettingsFrontmatter(vaultPath);
|
|
32
|
-
if (!fm)
|
|
33
|
-
return;
|
|
34
|
-
const cfg = await loadConfig(vaultPath, {});
|
|
35
|
-
const moved = liftLegacyAuth(fm, cfg, { dryRun: false });
|
|
36
|
-
if (moved.length === 0)
|
|
37
|
-
return;
|
|
38
|
-
await saveConfig(vaultPath, cfg);
|
|
39
|
-
console.log(` moved ${moved.join(", ")} from settings.md → config`);
|
|
40
|
-
},
|
|
41
|
-
};
|
|
42
|
-
async function readSettingsFrontmatter(vaultPath) {
|
|
43
|
-
try {
|
|
44
|
-
const raw = await readFile(join(vaultPath, SETTINGS_FILE), "utf8");
|
|
45
|
-
return (matter(raw).data ?? {});
|
|
46
|
-
}
|
|
47
|
-
catch {
|
|
48
|
-
return null;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
function hasAnyLegacyKey(fm) {
|
|
52
|
-
return "roles" in fm || "auth_type" in fm || "role_passwords" in fm;
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Single source of truth for which legacy fields qualify for lift, what
|
|
56
|
-
* they get moved to, and (when `dryRun=false`) the actual mutation.
|
|
57
|
-
*
|
|
58
|
-
* Returns the names of fields that qualified (= would move when not a dry
|
|
59
|
-
* run). `needs()` runs this dry; `apply()` runs it for real.
|
|
60
|
-
*/
|
|
61
|
-
function liftLegacyAuth(fm, cfg, opts) {
|
|
62
|
-
const moved = [];
|
|
63
|
-
if (Array.isArray(fm.roles)) {
|
|
64
|
-
const list = fm.roles.filter((r) => typeof r === "string");
|
|
65
|
-
const isDefault = cfg.roles.length === 0 || (cfg.roles.length === 1 && cfg.roles[0] === "public");
|
|
66
|
-
if (list.length > 0 && isDefault && !arraysEqual(list, ["public"])) {
|
|
67
|
-
if (!opts.dryRun)
|
|
68
|
-
cfg.roles = list;
|
|
69
|
-
moved.push("roles");
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
// `auth_type` was a forward-looking knob (password vs cloudflare-access vs
|
|
73
|
-
// oauth-jwt) that nothing has ever read. The field was removed from
|
|
74
|
-
// VaultConfig; lifting it would be a no-op, so we don't bother.
|
|
75
|
-
if (fm.role_passwords && typeof fm.role_passwords === "object" && !Array.isArray(fm.role_passwords)
|
|
76
|
-
&& Object.keys(cfg.rolePasswords).length === 0) {
|
|
77
|
-
const cleaned = filterStringValues(fm.role_passwords);
|
|
78
|
-
if (Object.keys(cleaned).length > 0) {
|
|
79
|
-
if (!opts.dryRun)
|
|
80
|
-
cfg.rolePasswords = cleaned;
|
|
81
|
-
moved.push("role_passwords");
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
return moved;
|
|
85
|
-
}
|
|
86
|
-
function filterStringValues(map) {
|
|
87
|
-
const out = {};
|
|
88
|
-
for (const [k, v] of Object.entries(map))
|
|
89
|
-
if (typeof v === "string")
|
|
90
|
-
out[k] = v;
|
|
91
|
-
return out;
|
|
92
|
-
}
|
|
93
|
-
function arraysEqual(a, b) {
|
|
94
|
-
return a.length === b.length && a.every((x, i) => x === b[i]);
|
|
95
|
-
}
|
|
96
|
-
//# sourceMappingURL=0.6-legacy-auth-settings.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"0.6-legacy-auth-settings.js","sourceRoot":"","sources":["../../src/migrate/0.6-legacy-auth-settings.ts"],"names":[],"mappings":"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"}
|