UNPKG

one

Version:

One is a React framework for web, iOS, and Android apps.

1 lines • 15.1 kB
{"version":3,"file":"updatesPublish.js","names":[],"sources":["esm/cli/updatesPublish.js"],"sourcesContent":["import { execFileSync } from \"node:child_process\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport {\n existsSync,\n mkdirSync,\n mkdtempSync,\n readdirSync,\n readFileSync,\n realpathSync,\n rmSync,\n writeFileSync\n} from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { tmpdir } from \"node:os\";\nimport { join, relative, resolve, sep } from \"node:path\";\nimport { validateNativeApp } from \"../native/appManifest\";\nimport { loadUserOneOptions } from \"../vite/loadConfig\";\nfunction lastValue(value) {\n return Array.isArray(value) ? value[value.length - 1] : value;\n}\nfunction allValues(value) {\n if (value === void 0) return [];\n return Array.isArray(value) ? value : [value];\n}\nfunction base64Url(bytes) {\n return bytes.toString(\"base64\").replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\nfunction sha256Base64Url(path) {\n return base64Url(createHash(\"sha256\").update(readFileSync(path)).digest());\n}\nfunction parseMetadata(entries) {\n const metadata = {};\n for (const entry of entries) {\n const equals = entry.indexOf(\"=\");\n if (equals <= 0) {\n throw new Error(`[one] --metadata must look like key=value, got \"${entry}\"`);\n }\n const key = entry.slice(0, equals);\n const raw = entry.slice(equals + 1);\n let value = raw;\n try {\n const parsed = JSON.parse(raw);\n if (typeof parsed === \"string\" || typeof parsed === \"number\" || typeof parsed === \"boolean\") {\n value = parsed;\n }\n } catch {\n }\n metadata[key] = value;\n }\n return metadata;\n}\nfunction collectFiles(root) {\n const files = [];\n const visit = (dir) => {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const path = join(dir, entry.name);\n if (entry.isDirectory()) visit(path);\n else if (entry.isFile()) files.push(path);\n }\n };\n if (existsSync(root)) visit(root);\n return files.sort();\n}\nfunction resolveCliJs(root) {\n const require2 = createRequire(join(root, \"package.json\"));\n const packageJson = require2.resolve(\"react-native/package.json\");\n return join(packageJson.slice(0, -\"package.json\".length), \"cli.js\");\n}\nfunction resolveNpmHermesc(root) {\n const require2 = createRequire(join(root, \"package.json\"));\n const reactNativeJson = require2.resolve(\"react-native/package.json\");\n const nested = createRequire(reactNativeJson);\n const compilerJson = nested.resolve(\"hermes-compiler/package.json\");\n const dir = compilerJson.slice(0, -\"package.json\".length);\n const bin = process.platform === \"darwin\" ? \"osx-bin\" : process.platform === \"win32\" ? \"win64-bin\" : \"linux64-bin\";\n return join(dir, \"hermesc\", bin, process.platform === \"win32\" ? \"hermesc.exe\" : \"hermesc\");\n}\nfunction resolveHermesc(root, platform) {\n if (platform === \"ios\") {\n const pod = join(root, \"ios\", \"Pods\", \"hermes-engine\", \"destroot\", \"bin\", \"hermesc\");\n if (existsSync(pod)) return pod;\n }\n const npm = resolveNpmHermesc(root);\n if (!existsSync(npm)) {\n throw new Error(\n `[one] hermesc not found at ${npm}: install dependencies${platform === \"ios\" ? \" and run one prebuild with pod install\" : \"\"} first`\n );\n }\n return npm;\n}\nasync function resolveRuntimeVersion(platform, flag) {\n const { oneOptions } = await loadUserOneOptions(\"build\", true);\n const native = oneOptions?.native;\n const app = typeof native === \"object\" ? native.app : void 0;\n if (!app) {\n if (!flag) {\n throw new Error(\n \"[one] one updates publish needs native.app.updates.runtimeVersion, or --runtime-version for an app built with expo prebuild: the binary only takes updates published for its own runtime version\"\n );\n }\n return flag;\n }\n validateNativeApp(app, platform);\n const runtimeVersion = app.updates?.runtimeVersion;\n if (!runtimeVersion) {\n throw new Error(\n \"[one] one updates publish needs native.app.updates.runtimeVersion: the binary only takes updates published for its own runtime version\"\n );\n }\n if (flag !== void 0 && flag !== runtimeVersion) {\n throw new Error(\n `[one] --runtime-version ${flag} differs from native.app.updates.runtimeVersion ${runtimeVersion}`\n );\n }\n return runtimeVersion;\n}\nasync function runUpdatesPublish(args) {\n const platform = lastValue(args.platform);\n if (platform !== \"ios\" && platform !== \"android\") {\n throw new Error(\"[one] one updates publish needs --platform ios|android\");\n }\n const out = lastValue(args.out);\n if (!out) {\n throw new Error(\"[one] one updates publish needs --out <dir>\");\n }\n const intermediatesOut = lastValue(args.intermediatesOut);\n if (intermediatesOut) {\n const published = resolve(out);\n const debug = resolve(intermediatesOut);\n if (published === debug || published.startsWith(`${debug}${sep}`) || debug.startsWith(`${published}${sep}`)) {\n throw new Error(\"[one] --intermediates-out must be separate from --out\");\n }\n if (existsSync(debug) && readdirSync(debug).length > 0) {\n throw new Error(`[one] refusing to write intermediates into non-empty ${debug}`);\n }\n }\n const root = process.cwd();\n const runtimeVersion = await resolveRuntimeVersion(\n platform,\n lastValue(args.runtimeVersion)\n );\n if (existsSync(out) && readdirSync(out).length > 0) {\n throw new Error(\n `[one] refusing to publish into non-empty ${out}: every publish writes a fresh directory`\n );\n }\n mkdirSync(out, { recursive: true });\n if (intermediatesOut) {\n mkdirSync(intermediatesOut, { recursive: true });\n const published = realpathSync(out);\n const debug = realpathSync(intermediatesOut);\n if (published === debug || published.startsWith(`${debug}${sep}`) || debug.startsWith(`${published}${sep}`)) {\n throw new Error(\"[one] --intermediates-out must be separate from --out\");\n }\n }\n const assetsOut = join(out, \"assets\");\n mkdirSync(assetsOut, { recursive: true });\n const metadata = parseMetadata(allValues(args.metadata));\n const work = mkdtempSync(join(tmpdir(), \"one-updates-publish-\"));\n const bundleJs = join(work, \"bundle.js\");\n const packagerMap = join(work, \"bundle.js.map\");\n const assetsDir = join(work, \"assets\");\n const bytecode = join(work, \"main.jsbundle\");\n const composedMap = join(work, \"main.jsbundle.map\");\n try {\n execFileSync(\n process.execPath,\n [\n resolveCliJs(root),\n \"bundle\",\n \"--entry-file\",\n \"index.js\",\n \"--platform\",\n platform,\n \"--dev\",\n \"false\",\n \"--reset-cache\",\n \"--bundle-output\",\n bundleJs,\n ...intermediatesOut ? [\"--sourcemap-output\", packagerMap] : [],\n \"--assets-dest\",\n assetsDir,\n \"--minify\",\n platform === \"ios\" ? \"true\" : \"false\"\n ],\n { cwd: root, stdio: \"inherit\" }\n );\n const hermesc = resolveHermesc(root, platform);\n const hermescArgs = [\"-emit-binary\", \"-max-diagnostic-width=80\"];\n if (platform === \"android\") hermescArgs.push(\"-w\");\n hermescArgs.push(\"-O\");\n if (intermediatesOut) hermescArgs.push(\"-output-source-map\");\n hermescArgs.push(\"-out\", bytecode, bundleJs);\n try {\n execFileSync(hermesc, hermescArgs, { cwd: root, stdio: \"inherit\" });\n } catch (error) {\n throw new Error(\n `[one] hermesc failed to compile the ${platform} update bundle${error instanceof Error ? `: ${error.message}` : \"\"}`\n );\n }\n if (intermediatesOut) {\n const require2 = createRequire(join(root, \"package.json\"));\n const reactNativeJson = require2.resolve(\"react-native/package.json\");\n const composeSourceMaps = join(\n reactNativeJson.slice(0, -\"package.json\".length),\n \"scripts\",\n \"compose-source-maps.js\"\n );\n execFileSync(\n process.execPath,\n [composeSourceMaps, packagerMap, `${bytecode}.map`, \"-o\", composedMap],\n { cwd: root, stdio: \"inherit\" }\n );\n writeFileSync(join(intermediatesOut, \"bundle.js\"), readFileSync(bundleJs));\n writeFileSync(join(intermediatesOut, \"main.jsbundle.map\"), readFileSync(composedMap));\n }\n const bundleHash = sha256Base64Url(bytecode);\n writeFileSync(join(assetsOut, bundleHash), readFileSync(bytecode));\n const assets = [];\n for (const file of collectFiles(assetsDir)) {\n const hash = sha256Base64Url(file);\n const target = join(assetsOut, hash);\n if (!existsSync(target)) writeFileSync(target, readFileSync(file));\n assets.push({\n hash,\n url: `assets/${hash}`,\n path: relative(assetsDir, file).split(sep).join(\"/\")\n });\n }\n assets.sort((a, b) => a.path < b.path ? -1 : a.path > b.path ? 1 : 0);\n const manifest = {\n id: randomUUID(),\n createdAt: (/* @__PURE__ */ new Date()).toISOString(),\n runtimeVersion,\n launchAsset: { hash: bundleHash, url: `assets/${bundleHash}`, path: \"main.jsbundle\" },\n assets,\n metadata\n };\n writeFileSync(join(out, \"manifest.json\"), `${JSON.stringify(manifest, null, 2)}\n`);\n console.info(\n `[one] published ${platform} update ${manifest.id} (${assets.length} assets) to ${out}`\n );\n } finally {\n rmSync(work, { recursive: true, force: true });\n }\n}\nexport {\n runUpdatesPublish\n};\n//# sourceMappingURL=updatesPublish.js.map\n"],"mappings":"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"}