@bonginkan/maria-ext 0.0.1 → 0.0.2
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 +4 -5
- package/dist/postinstall.cjs +5 -110
- package/dist/postinstall.cjs.map +1 -1
- package/package.json +1 -1
- package/packs/aa-test/pack.json +1 -2
package/README.md
CHANGED
|
@@ -6,17 +6,16 @@ Enterprise extension packs installer for `@bonginkan/maria-lite`.
|
|
|
6
6
|
## Install
|
|
7
7
|
|
|
8
8
|
```shell
|
|
9
|
-
|
|
9
|
+
npm install -g @bonginkan/maria-ext;
|
|
10
10
|
```
|
|
11
11
|
|
|
12
12
|
## Update
|
|
13
13
|
|
|
14
14
|
```shell
|
|
15
|
-
|
|
15
|
+
npm update -g @bonginkan/maria-ext;
|
|
16
16
|
```
|
|
17
17
|
|
|
18
18
|
Notes:
|
|
19
|
-
- `
|
|
20
|
-
-
|
|
21
|
-
- The installer writes a deterministic manifest under `~/.maria/lite-ext/packs/` (or `MARIA_CONFIG_DIR`).
|
|
19
|
+
- `maria-lite` discovers installed packs dynamically at runtime.
|
|
20
|
+
- Pack authorization is controlled server-side (Firestore) and applied at runtime after login.
|
|
22
21
|
|
package/dist/postinstall.cjs
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
var fs = require('fs');
|
|
4
4
|
var fsp = require('fs/promises');
|
|
5
|
-
|
|
5
|
+
require('os');
|
|
6
6
|
var path = require('path');
|
|
7
7
|
|
|
8
8
|
function _interopNamespace(e) {
|
|
@@ -25,7 +25,6 @@ function _interopNamespace(e) {
|
|
|
25
25
|
|
|
26
26
|
var fs__namespace = /*#__PURE__*/_interopNamespace(fs);
|
|
27
27
|
var fsp__namespace = /*#__PURE__*/_interopNamespace(fsp);
|
|
28
|
-
var os__namespace = /*#__PURE__*/_interopNamespace(os);
|
|
29
28
|
var path__namespace = /*#__PURE__*/_interopNamespace(path);
|
|
30
29
|
|
|
31
30
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
@@ -39,37 +38,8 @@ var require_postinstall = __commonJS({
|
|
|
39
38
|
const s1 = s0.replace(/[^a-z0-9-]+/g, "-").replace(/-+/g, "-").replace(/^-+|-+$/g, "");
|
|
40
39
|
return s1 || "pack";
|
|
41
40
|
}
|
|
42
|
-
function resolveConfigDir() {
|
|
43
|
-
const env = String(process.env.MARIA_CONFIG_DIR || "").trim();
|
|
44
|
-
if (env) return env;
|
|
45
|
-
const sudoUser = String(process.env.SUDO_USER || "").trim();
|
|
46
|
-
if (sudoUser && sudoUser !== "root") {
|
|
47
|
-
const isPosix = process.platform !== "win32";
|
|
48
|
-
if (isPosix) {
|
|
49
|
-
try {
|
|
50
|
-
const passwd = fs__namespace.readFileSync("/etc/passwd", "utf8");
|
|
51
|
-
const line = passwd.split("\n").find((l) => l && !l.startsWith("#") && l.split(":")[0] === sudoUser);
|
|
52
|
-
if (line) {
|
|
53
|
-
const parts = line.split(":");
|
|
54
|
-
const home = parts.length >= 6 ? String(parts[5] || "").trim() : "";
|
|
55
|
-
if (home) return path__namespace.join(home, ".maria");
|
|
56
|
-
}
|
|
57
|
-
} catch {
|
|
58
|
-
}
|
|
59
|
-
if (process.platform === "darwin") return path__namespace.join("/Users", sudoUser, ".maria");
|
|
60
|
-
return path__namespace.join("/home", sudoUser, ".maria");
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
return path__namespace.join(os__namespace.homedir(), ".maria");
|
|
64
|
-
}
|
|
65
|
-
function normalizeEmail(s) {
|
|
66
|
-
return String(s || "").trim().toLowerCase();
|
|
67
|
-
}
|
|
68
|
-
function normalizePattern(p) {
|
|
69
|
-
return String(p || "").trim().toLowerCase();
|
|
70
|
-
}
|
|
71
41
|
function readArgValue(argv, flag) {
|
|
72
|
-
const f = String(flag
|
|
42
|
+
const f = String(flag).trim();
|
|
73
43
|
if (!f) return "";
|
|
74
44
|
for (let i = 0; i < argv.length; i++) {
|
|
75
45
|
const a = String(argv[i] || "");
|
|
@@ -83,34 +53,6 @@ var require_postinstall = __commonJS({
|
|
|
83
53
|
}
|
|
84
54
|
return "";
|
|
85
55
|
}
|
|
86
|
-
function normalizeEmailPatterns(raw) {
|
|
87
|
-
const out = [];
|
|
88
|
-
const seen = /* @__PURE__ */ new Set();
|
|
89
|
-
for (const p of raw) {
|
|
90
|
-
const n = normalizePattern(p);
|
|
91
|
-
if (!n) continue;
|
|
92
|
-
if (seen.has(n)) continue;
|
|
93
|
-
seen.add(n);
|
|
94
|
-
out.push(n);
|
|
95
|
-
}
|
|
96
|
-
return out.sort((a, b) => a.localeCompare(b));
|
|
97
|
-
}
|
|
98
|
-
function isEmailAllowed(emailRaw, patterns) {
|
|
99
|
-
const email = normalizeEmail(emailRaw);
|
|
100
|
-
if (!email) return false;
|
|
101
|
-
const pats = normalizeEmailPatterns(patterns);
|
|
102
|
-
for (const p of pats) {
|
|
103
|
-
if (!p) continue;
|
|
104
|
-
if (p.includes("*")) {
|
|
105
|
-
if (!p.startsWith("*@")) continue;
|
|
106
|
-
const suffix = p.slice(1);
|
|
107
|
-
if (suffix && email.endsWith(suffix)) return true;
|
|
108
|
-
continue;
|
|
109
|
-
}
|
|
110
|
-
if (email === p) return true;
|
|
111
|
-
}
|
|
112
|
-
return false;
|
|
113
|
-
}
|
|
114
56
|
async function loadPackConfigsFromDir(absDir) {
|
|
115
57
|
const ents = await fsp__namespace.readdir(absDir, { withFileTypes: true }).catch(() => []);
|
|
116
58
|
const packJsonAbs = [];
|
|
@@ -133,40 +75,19 @@ var require_postinstall = __commonJS({
|
|
|
133
75
|
const packId = String(rec.packId || "").trim();
|
|
134
76
|
const packName = String(rec.packName || "").trim();
|
|
135
77
|
const entryRelPath = String(rec.entryRelPath || "").trim();
|
|
136
|
-
const allowedEmailPatterns = Array.isArray(rec.allowedEmailPatterns) ? rec.allowedEmailPatterns.map((x) => String(x)) : [];
|
|
137
78
|
if (!packId || !packName || !entryRelPath) continue;
|
|
138
79
|
out.push({
|
|
139
80
|
packId,
|
|
140
81
|
packName,
|
|
141
|
-
entryRelPath
|
|
142
|
-
allowedEmailPatterns: normalizeEmailPatterns(allowedEmailPatterns)
|
|
82
|
+
entryRelPath
|
|
143
83
|
});
|
|
144
84
|
}
|
|
145
85
|
return out;
|
|
146
86
|
}
|
|
147
|
-
async function ensureFileMode600(abs) {
|
|
148
|
-
try {
|
|
149
|
-
if (process.platform === "win32") return;
|
|
150
|
-
await fsp__namespace.chmod(abs, 384);
|
|
151
|
-
} catch {
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
87
|
async function main() {
|
|
155
88
|
const argv = process.argv.slice(2);
|
|
156
89
|
const packNameRaw = readArgValue(argv, "--pack") || String(process.env.npm_config_pack || "").trim();
|
|
157
|
-
|
|
158
|
-
if (!packNameRaw) {
|
|
159
|
-
console.log("[maria-ext] Skipping: missing --pack");
|
|
160
|
-
return;
|
|
161
|
-
}
|
|
162
|
-
if (!emailRaw) {
|
|
163
|
-
console.log("[maria-ext] Skipping: missing --email");
|
|
164
|
-
return;
|
|
165
|
-
}
|
|
166
|
-
if (/[,\s]/.test(emailRaw)) {
|
|
167
|
-
console.log("[maria-ext] Invalid --email: must be a single email address (no spaces/commas)");
|
|
168
|
-
return;
|
|
169
|
-
}
|
|
90
|
+
if (!packNameRaw) return;
|
|
170
91
|
const packName = packNameRaw;
|
|
171
92
|
const packIdFromName = slugifyPackName(packName);
|
|
172
93
|
const pkgRoot = path__namespace.join(__dirname, "..");
|
|
@@ -177,34 +98,8 @@ var require_postinstall = __commonJS({
|
|
|
177
98
|
console.log(`[maria-ext] Unknown pack: '${packName}'. Available: ${configs.map((c) => c.packName).join(", ")}`);
|
|
178
99
|
return;
|
|
179
100
|
}
|
|
180
|
-
if (!isEmailAllowed(emailRaw, pick.allowedEmailPatterns)) {
|
|
181
|
-
console.log(`[maria-ext] Not authorized for pack '${pick.packName}' with email '${emailRaw}'`);
|
|
182
|
-
return;
|
|
183
|
-
}
|
|
184
101
|
const entryAbsPath = path__namespace.join(pkgRoot, pick.entryRelPath);
|
|
185
|
-
if (!fs__namespace.existsSync(entryAbsPath))
|
|
186
|
-
console.log(`[maria-ext] Pack entry missing (build required): ${entryAbsPath}`);
|
|
187
|
-
return;
|
|
188
|
-
}
|
|
189
|
-
const cfg = resolveConfigDir();
|
|
190
|
-
const manifestsDir = path__namespace.join(cfg, "lite-ext", "packs");
|
|
191
|
-
await fsp__namespace.mkdir(manifestsDir, { recursive: true });
|
|
192
|
-
const manifest = {
|
|
193
|
-
packId: pick.packId,
|
|
194
|
-
packName: pick.packName,
|
|
195
|
-
entryAbsPath,
|
|
196
|
-
allowedEmailPatterns: pick.allowedEmailPatterns,
|
|
197
|
-
installedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
198
|
-
};
|
|
199
|
-
const manifestAbs = path__namespace.join(manifestsDir, `${pick.packId}.json`);
|
|
200
|
-
const tmp = `${manifestAbs}.tmp`;
|
|
201
|
-
await fsp__namespace.writeFile(tmp, JSON.stringify(manifest, null, 2) + "\n", "utf8");
|
|
202
|
-
await ensureFileMode600(tmp);
|
|
203
|
-
await fsp__namespace.rename(tmp, manifestAbs);
|
|
204
|
-
await ensureFileMode600(manifestAbs);
|
|
205
|
-
console.log(`[maria-ext] Installed pack '${manifest.packName}' (packId=${manifest.packId})`);
|
|
206
|
-
console.log(`[maria-ext] Authorized email: ${emailRaw}`);
|
|
207
|
-
console.log(`[maria-ext] Manifest: ${manifestAbs}`);
|
|
102
|
+
if (!fs__namespace.existsSync(entryAbsPath)) return;
|
|
208
103
|
}
|
|
209
104
|
main().catch((e) => {
|
|
210
105
|
console.log("[maria-ext] postinstall failed:", e instanceof Error ? e.message : String(e));
|
package/dist/postinstall.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/postinstall.ts"],"names":["fs","path","os","fsp"],"mappings":"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","file":"postinstall.cjs","sourcesContent":["/* eslint-disable no-console */\nimport * as fs from \"node:fs\";\nimport * as fsp from \"node:fs/promises\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\n\ntype PackConfig = {\n packId: string;\n packName: string;\n entryRelPath: string;\n allowedEmailPatterns: string[];\n};\n\nfunction slugifyPackName(raw: string): string {\n const s0 = String(raw || \"\").trim().toLowerCase();\n const s1 = s0\n .replace(/[^a-z0-9-]+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n return s1 || \"pack\";\n}\n\nfunction resolveConfigDir(): string {\n const env = String(process.env.MARIA_CONFIG_DIR || \"\").trim();\n if (env) return env;\n\n // If postinstall is executed via `sudo`, `os.homedir()` points to root.\n // In that case, write manifests under the invoking user's home directory\n // so `maria-lite` (run as the user) can discover installed packs.\n const sudoUser = String(process.env.SUDO_USER || \"\").trim();\n if (sudoUser && sudoUser !== \"root\") {\n const isPosix = process.platform !== \"win32\";\n if (isPosix) {\n try {\n const passwd = fs.readFileSync(\"/etc/passwd\", \"utf8\");\n const line = passwd\n .split(\"\\n\")\n .find((l) => l && !l.startsWith(\"#\") && l.split(\":\")[0] === sudoUser);\n if (line) {\n const parts = line.split(\":\");\n const home = parts.length >= 6 ? String(parts[5] || \"\").trim() : \"\";\n if (home) return path.join(home, \".maria\");\n }\n } catch {\n // ignore\n }\n // Fallback for typical layouts (macOS/Linux).\n if (process.platform === \"darwin\") return path.join(\"/Users\", sudoUser, \".maria\");\n return path.join(\"/home\", sudoUser, \".maria\");\n }\n }\n\n return path.join(os.homedir(), \".maria\");\n}\n\nfunction normalizeEmail(s: string): string {\n return String(s || \"\").trim().toLowerCase();\n}\n\nfunction normalizePattern(p: string): string {\n return String(p || \"\").trim().toLowerCase();\n}\n\nfunction readArgValue(argv: string[], flag: string): string {\n const f = String(flag || \"\").trim();\n if (!f) return \"\";\n for (let i = 0; i < argv.length; i++) {\n const a = String(argv[i] || \"\");\n if (a === f) {\n const v = i + 1 < argv.length ? String(argv[i + 1] || \"\") : \"\";\n return v.trim();\n }\n if (a.startsWith(`${f}=`)) {\n return a.slice(f.length + 1).trim();\n }\n }\n return \"\";\n}\n\nfunction normalizeEmailPatterns(raw: string[]): string[] {\n const out: string[] = [];\n const seen = new Set<string>();\n for (const p of raw) {\n const n = normalizePattern(p);\n if (!n) continue;\n if (seen.has(n)) continue;\n seen.add(n);\n out.push(n);\n }\n return out.sort((a, b) => a.localeCompare(b));\n}\n\nfunction isEmailAllowed(emailRaw: string, patterns: string[]): boolean {\n const email = normalizeEmail(emailRaw);\n if (!email) return false;\n const pats = normalizeEmailPatterns(patterns);\n for (const p of pats) {\n if (!p) continue;\n if (p.includes(\"*\")) {\n // Only support \"*@domain\" suffix wildcard.\n if (!p.startsWith(\"*@\")) continue;\n const suffix = p.slice(1); // \"@domain\"\n if (suffix && email.endsWith(suffix)) return true;\n continue;\n }\n if (email === p) return true;\n }\n return false;\n}\n\nasync function loadPackConfigsFromDir(absDir: string): Promise<PackConfig[]> {\n const ents = await fsp.readdir(absDir, { withFileTypes: true }).catch((): any[] => []);\n const packJsonAbs: string[] = [];\n for (const e of ents) {\n if (!e.isDirectory()) continue;\n packJsonAbs.push(path.join(absDir, e.name, \"pack.json\"));\n }\n packJsonAbs.sort((a, b) => a.localeCompare(b));\n\n const out: PackConfig[] = [];\n for (const abs of packJsonAbs) {\n const raw = await fsp.readFile(abs, \"utf8\").catch((): string => \"\");\n if (!raw.trim()) continue;\n let obj: unknown = null;\n try {\n obj = JSON.parse(raw) as unknown;\n } catch {\n obj = null;\n }\n const rec = obj && typeof obj === \"object\" ? (obj as Record<string, unknown>) : {};\n const packId = String(rec.packId || \"\").trim();\n const packName = String(rec.packName || \"\").trim();\n const entryRelPath = String(rec.entryRelPath || \"\").trim();\n const allowedEmailPatterns = Array.isArray(rec.allowedEmailPatterns) ? rec.allowedEmailPatterns.map((x) => String(x)) : [];\n if (!packId || !packName || !entryRelPath) continue;\n out.push({\n packId,\n packName,\n entryRelPath,\n allowedEmailPatterns: normalizeEmailPatterns(allowedEmailPatterns),\n });\n }\n return out;\n}\n\nasync function ensureFileMode600(abs: string): Promise<void> {\n try {\n if (process.platform === \"win32\") return;\n await fsp.chmod(abs, 0o600);\n } catch {\n // ignore\n }\n}\n\nasync function main(): Promise<void> {\n // Source precedence:\n // - argv (developer/local invocation): node dist/postinstall.cjs --pack \"aa test\" --email \"user@...\"\n // - npm_config_* (npm postinstall): npm install ... --pack \"aa test\" --email \"user@...\"\n const argv = process.argv.slice(2);\n const packNameRaw = readArgValue(argv, \"--pack\") || String(process.env.npm_config_pack || \"\").trim();\n const emailRaw = readArgValue(argv, \"--email\") || String(process.env.npm_config_email || \"\").trim();\n\n if (!packNameRaw) {\n console.log(\"[maria-ext] Skipping: missing --pack\");\n return;\n }\n if (!emailRaw) {\n console.log(\"[maria-ext] Skipping: missing --email\");\n return;\n }\n // IMPORTANT: `--email` is a single email value (not a list).\n if (/[,\\s]/.test(emailRaw)) {\n console.log(\"[maria-ext] Invalid --email: must be a single email address (no spaces/commas)\");\n return;\n }\n\n const packName = packNameRaw;\n const packIdFromName = slugifyPackName(packName);\n\n const pkgRoot = path.join(__dirname, \"..\"); // dist/ -> package root\n const packsDir = path.join(pkgRoot, \"packs\");\n const configs = await loadPackConfigsFromDir(packsDir);\n const pick =\n configs.find((p) => p.packId === packIdFromName) ||\n configs.find((p) => p.packName.toLowerCase() === packName.toLowerCase());\n if (!pick) {\n console.log(`[maria-ext] Unknown pack: '${packName}'. Available: ${configs.map((c) => c.packName).join(\", \")}`);\n return;\n }\n\n if (!isEmailAllowed(emailRaw, pick.allowedEmailPatterns)) {\n console.log(`[maria-ext] Not authorized for pack '${pick.packName}' with email '${emailRaw}'`);\n return;\n }\n\n const entryAbsPath = path.join(pkgRoot, pick.entryRelPath);\n if (!fs.existsSync(entryAbsPath)) {\n console.log(`[maria-ext] Pack entry missing (build required): ${entryAbsPath}`);\n return;\n }\n\n const cfg = resolveConfigDir();\n const manifestsDir = path.join(cfg, \"lite-ext\", \"packs\");\n await fsp.mkdir(manifestsDir, { recursive: true });\n\n const manifest = {\n packId: pick.packId,\n packName: pick.packName,\n entryAbsPath,\n allowedEmailPatterns: pick.allowedEmailPatterns,\n installedAt: new Date().toISOString(),\n };\n\n const manifestAbs = path.join(manifestsDir, `${pick.packId}.json`);\n const tmp = `${manifestAbs}.tmp`;\n await fsp.writeFile(tmp, JSON.stringify(manifest, null, 2) + \"\\n\", \"utf8\");\n await ensureFileMode600(tmp);\n await fsp.rename(tmp, manifestAbs);\n await ensureFileMode600(manifestAbs);\n\n console.log(`[maria-ext] Installed pack '${manifest.packName}' (packId=${manifest.packId})`);\n console.log(`[maria-ext] Authorized email: ${emailRaw}`);\n console.log(`[maria-ext] Manifest: ${manifestAbs}`);\n}\n\nmain().catch((e: unknown) => {\n console.log(\"[maria-ext] postinstall failed:\", e instanceof Error ? e.message : String(e));\n});\n\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/postinstall.ts"],"names":["fsp","path","fs"],"mappings":"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","file":"postinstall.cjs","sourcesContent":["/* eslint-disable no-console */\nimport * as fs from \"node:fs\";\nimport * as fsp from \"node:fs/promises\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\n\ntype PackConfig = {\n packId: string;\n packName: string;\n entryRelPath: string;\n};\n\nfunction slugifyPackName(raw: string): string {\n const s0 = String(raw || \"\").trim().toLowerCase();\n const s1 = s0\n .replace(/[^a-z0-9-]+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n return s1 || \"pack\";\n}\n\nfunction resolveConfigDir(): string {\n const env = String(process.env.MARIA_CONFIG_DIR || \"\").trim();\n if (env) return env;\n\n // If postinstall is executed via `sudo`, `os.homedir()` points to root.\n // In that case, write manifests under the invoking user's home directory\n // so `maria-lite` (run as the user) can discover installed packs.\n const sudoUser = String(process.env.SUDO_USER || \"\").trim();\n if (sudoUser && sudoUser !== \"root\") {\n const isPosix = process.platform !== \"win32\";\n if (isPosix) {\n try {\n const passwd = fs.readFileSync(\"/etc/passwd\", \"utf8\");\n const line = passwd\n .split(\"\\n\")\n .find((l) => l && !l.startsWith(\"#\") && l.split(\":\")[0] === sudoUser);\n if (line) {\n const parts = line.split(\":\");\n const home = parts.length >= 6 ? String(parts[5] || \"\").trim() : \"\";\n if (home) return path.join(home, \".maria\");\n }\n } catch {\n // ignore\n }\n // Fallback for typical layouts (macOS/Linux).\n if (process.platform === \"darwin\") return path.join(\"/Users\", sudoUser, \".maria\");\n return path.join(\"/home\", sudoUser, \".maria\");\n }\n }\n\n return path.join(os.homedir(), \".maria\");\n}\n\nfunction readArgValue(argv: string[], flag: string): string {\n const f = String(flag || \"\").trim();\n if (!f) return \"\";\n for (let i = 0; i < argv.length; i++) {\n const a = String(argv[i] || \"\");\n if (a === f) {\n const v = i + 1 < argv.length ? String(argv[i + 1] || \"\") : \"\";\n return v.trim();\n }\n if (a.startsWith(`${f}=`)) {\n return a.slice(f.length + 1).trim();\n }\n }\n return \"\";\n}\n\nasync function loadPackConfigsFromDir(absDir: string): Promise<PackConfig[]> {\n const ents = await fsp.readdir(absDir, { withFileTypes: true }).catch((): any[] => []);\n const packJsonAbs: string[] = [];\n for (const e of ents) {\n if (!e.isDirectory()) continue;\n packJsonAbs.push(path.join(absDir, e.name, \"pack.json\"));\n }\n packJsonAbs.sort((a, b) => a.localeCompare(b));\n\n const out: PackConfig[] = [];\n for (const abs of packJsonAbs) {\n const raw = await fsp.readFile(abs, \"utf8\").catch((): string => \"\");\n if (!raw.trim()) continue;\n let obj: unknown = null;\n try {\n obj = JSON.parse(raw) as unknown;\n } catch {\n obj = null;\n }\n const rec = obj && typeof obj === \"object\" ? (obj as Record<string, unknown>) : {};\n const packId = String(rec.packId || \"\").trim();\n const packName = String(rec.packName || \"\").trim();\n const entryRelPath = String(rec.entryRelPath || \"\").trim();\n if (!packId || !packName || !entryRelPath) continue;\n out.push({\n packId,\n packName,\n entryRelPath,\n });\n }\n return out;\n}\n\nasync function ensureFileMode600(abs: string): Promise<void> {\n try {\n if (process.platform === \"win32\") return;\n await fsp.chmod(abs, 0o600);\n } catch {\n // ignore\n }\n}\n\nasync function main(): Promise<void> {\n // NOTE:\n // `@bonginkan/maria-ext` is now a pure pack bundle.\n // Authorization is controlled server-side (Firestore) and enforced by `maria-lite` at runtime.\n // Therefore postinstall is intentionally a silent no-op (no user data, no manifests).\n //\n // Keep a tiny stub so existing installations don't break.\n const argv = process.argv.slice(2);\n const packNameRaw = readArgValue(argv, \"--pack\") || String(process.env.npm_config_pack || \"\").trim();\n if (!packNameRaw) return;\n\n const packName = packNameRaw;\n const packIdFromName = slugifyPackName(packName);\n\n const pkgRoot = path.join(__dirname, \"..\"); // dist/ -> package root\n const packsDir = path.join(pkgRoot, \"packs\");\n const configs = await loadPackConfigsFromDir(packsDir);\n const pick =\n configs.find((p) => p.packId === packIdFromName) ||\n configs.find((p) => p.packName.toLowerCase() === packName.toLowerCase());\n if (!pick) {\n console.log(`[maria-ext] Unknown pack: '${packName}'. Available: ${configs.map((c) => c.packName).join(\", \")}`);\n return;\n }\n\n // Validate built entry exists (helpful for pack authors), but do not write anything.\n const entryAbsPath = path.join(pkgRoot, pick.entryRelPath);\n if (!fs.existsSync(entryAbsPath)) return;\n}\n\nmain().catch((e: unknown) => {\n console.log(\"[maria-ext] postinstall failed:\", e instanceof Error ? e.message : String(e));\n});\n\n"]}
|
package/package.json
CHANGED