@bonginkan/maria-ext 0.0.0 → 0.0.1

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 CHANGED
@@ -6,16 +6,17 @@ Enterprise extension packs installer for `@bonginkan/maria-lite`.
6
6
  ## Install
7
7
 
8
8
  ```shell
9
- npm install @bonginkan/maria-ext --pack "{pack name}" --email "{authorized_email}";
9
+ sudo env npm_config_pack="{pack name}" npm_config_email="{authorized_email}" npm install -g @bonginkan/maria-ext;
10
10
  ```
11
11
 
12
12
  ## Update
13
13
 
14
14
  ```shell
15
- npm update @bonginkan/maria-ext --pack "{pack name}" --email "{authorized_email}";
15
+ sudo env npm_config_pack="{pack name}" npm_config_email="{authorized_email}" npm update -g @bonginkan/maria-ext;
16
16
  ```
17
17
 
18
18
  Notes:
19
- - `--pack` and `--email` can be passed via argv or npm config env vars (`npm_config_pack`, `npm_config_email`) to postinstall.
19
+ - `npm_config_pack` / `npm_config_email` are consumed by the installer's postinstall.
20
+ - `authorized_email` must be a **single** email address (no spaces/commas).
20
21
  - The installer writes a deterministic manifest under `~/.maria/lite-ext/packs/` (or `MARIA_CONFIG_DIR`).
21
22
 
@@ -42,6 +42,24 @@ var require_postinstall = __commonJS({
42
42
  function resolveConfigDir() {
43
43
  const env = String(process.env.MARIA_CONFIG_DIR || "").trim();
44
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
+ }
45
63
  return path__namespace.join(os__namespace.homedir(), ".maria");
46
64
  }
47
65
  function normalizeEmail(s) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/postinstall.ts"],"names":["path","os","fsp","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 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 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":["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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bonginkan/maria-ext",
3
- "version": "0.0.0",
3
+ "version": "0.0.1",
4
4
  "description": "MARIA-LITE extension installer and packs (enterprise/custom).",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "author": "Bonginkan Inc.",
@@ -13,7 +13,7 @@
13
13
  ],
14
14
  "scripts": {
15
15
  "build": "tsup && node scripts/postbuild-copy-pack-assets.cjs",
16
- "prepack": "pnpm -s build",
16
+ "prepack": "npm run build",
17
17
  "postinstall": "node dist/postinstall.cjs"
18
18
  },
19
19
  "dependencies": {