{"version":3,"file":"LibUiFramework.js","sourceRoot":"","sources":["../../src/frameworks/LibUiFramework.ts"],"names":[],"mappings":"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","sourcesContent":["import { InvalidConfigurationError } from \"builder-util\"\nimport { copy, emptyDir } from \"fs-extra\"\nimport { chmod, copyFile, mkdir, rename, writeFile } from \"fs/promises\"\nimport * as https from \"https\"\nimport * as path from \"path\"\nimport { AfterPackContext } from \"../configuration\"\nimport { Platform } from \"../core\"\nimport { Framework, PrepareApplicationStageDirectoryOptions } from \"../Framework\"\nimport { LinuxPackager } from \"../linuxPackager\"\nimport { MacPackager } from \"../macPackager\"\nimport { downloadBuilderToolset } from \"../util/electronGet\"\nimport { savePlistFile } from \"../util/plist\"\n\n/** Validates that a value is safe to embed in a double-quoted shell string (no metacharacters). */\nexport function validateShellEmbeddable(value: string, fieldName: string): void {\n  // Allow letters, digits, dots, underscores, hyphens, forward slashes, and spaces.\n  // Reject anything that could be interpreted as a shell metacharacter when embedded\n  // inside a double-quoted string: $, `, \", \\, and newlines.\n  if (/[$`\"\\\\\\n]/.test(value)) {\n    throw new InvalidConfigurationError(\n      `${fieldName} contains characters that are not safe in shell scripts: ${JSON.stringify(value)}. ` + `Avoid $, backtick, double-quote, backslash, and newline characters.`\n    )\n  }\n}\n\n// LaunchUI version is independent of the Node.js version; this was the hardcoded default in the Go binary.\n// https://github.com/develar/app-builder/blob/master/pkg/package-format/proton-native/protonNative.go#L105-L136\nexport const LAUNCHUI_DEFAULT_VERSION = \"0.1.4-10.13.0\"\n// https://github.com/develar/launchui/releases/tag/v0.1.4-10.13.0\nconst launchUiChecksums = {\n  \"launchui-v0.1.4-10.13.0-linux-x64.7z\": \"4fb5cd8ed79e1e24e0f5cf4b26107f2fa6f6fd8dc48ecd18fb6f48f3ccfe9ee6\",\n  \"launchui-v0.1.4-10.13.0-win32-ia32.7z\": \"682734da3d817ac365093c6c8ef3d9a70cc3f2a809e4588cb12a311358a68a2d\",\n  \"launchui-v0.1.4-10.13.0-win32-x64.7z\": \"2f26629c5f5c12baeff272ac7855a1df7f27621cce782b79965f9a9b5eccc359\",\n}\n\nexport class LibUiFramework implements Framework {\n  readonly name: string = \"libui\"\n  // noinspection JSUnusedGlobalSymbols\n  readonly macOsDefaultTargets = [\"dmg\"]\n\n  readonly defaultAppIdPrefix: string = \"com.libui.\"\n\n  // noinspection JSUnusedGlobalSymbols\n  readonly isCopyElevateHelper = false\n\n  // noinspection JSUnusedGlobalSymbols\n  readonly isNpmRebuildRequired = false\n\n  readonly launchUiVersion: string = LAUNCHUI_DEFAULT_VERSION\n\n  constructor(\n    readonly version: string,\n    readonly macOsProductName: string,\n    protected readonly isUseLaunchUi: boolean\n  ) {}\n\n  get distMacOsAppName(): string {\n    return `${this.macOsProductName}.app`\n  }\n\n  async prepareApplicationStageDirectory(options: PrepareApplicationStageDirectoryOptions) {\n    await emptyDir(options.appOutDir)\n\n    const packager = options.packager\n    const platform = packager.platform\n\n    if (this.isUseLaunchUiForPlatform(platform)) {\n      const appOutDir = options.appOutDir\n      const launchUiDir = await downloadLaunchUiDir(this.launchUiVersion, platform, options.arch)\n      await copy(launchUiDir, appOutDir)\n      const skeletonExe = `launchui${platform === Platform.WINDOWS ? \".exe\" : \"\"}`\n      const executableName = `${packager.appInfo.productFilename}${platform === Platform.WINDOWS ? \".exe\" : \"\"}`\n      await rename(path.join(appOutDir, skeletonExe), path.join(appOutDir, executableName))\n      return\n    }\n\n    if (platform === Platform.MAC) {\n      await this.prepareMacosApplicationStageDirectory(packager as MacPackager, options)\n    } else if (platform === Platform.LINUX) {\n      await this.prepareLinuxApplicationStageDirectory(options)\n    }\n  }\n\n  private async prepareMacosApplicationStageDirectory(packager: MacPackager, options: PrepareApplicationStageDirectoryOptions) {\n    const appContentsDir = path.join(options.appOutDir, this.distMacOsAppName, \"Contents\")\n    await mkdir(path.join(appContentsDir, \"Resources\"), { recursive: true })\n    await mkdir(path.join(appContentsDir, \"MacOS\"), { recursive: true })\n    const nodeBinaryMac = await downloadNodeJsBinary(this.version, Platform.MAC, \"x64\")\n    await copyFile(nodeBinaryMac, path.join(appContentsDir, \"MacOS\", \"node\"))\n    await chmod(path.join(appContentsDir, \"MacOS\", \"node\"), 0o755)\n\n    const appPlist: any = {\n      // https://github.com/albe-rosado/create-proton-app/issues/13\n      NSHighResolutionCapable: true,\n    }\n    await packager.applyCommonInfo(appPlist, appContentsDir)\n    await savePlistFile(path.join(appContentsDir, \"Info.plist\"), appPlist)\n    const macMain = options.packager.info.metadata.main || \"index.js\"\n    validateShellEmbeddable(macMain, \"package.json main\")\n    await writeExecutableMain(\n      path.join(appContentsDir, \"MacOS\", appPlist.CFBundleExecutable),\n      `#!/bin/sh\n  DIR=$(dirname \"$0\")\n  \"$DIR/node\" \"$DIR/../Resources/app/${macMain}\"\n  `\n    )\n  }\n\n  private async prepareLinuxApplicationStageDirectory(options: PrepareApplicationStageDirectoryOptions) {\n    const appOutDir = options.appOutDir\n    const nodeBinaryLinux = await downloadNodeJsBinary(this.version, Platform.LINUX, options.arch)\n    await copyFile(nodeBinaryLinux, path.join(appOutDir, \"node\"))\n    await chmod(path.join(appOutDir, \"node\"), 0o755)\n    const mainPath = path.join(appOutDir, (options.packager as LinuxPackager).executableName)\n    const linuxMain = options.packager.info.metadata.main || \"index.js\"\n    validateShellEmbeddable(linuxMain, \"package.json main\")\n    await writeExecutableMain(\n      mainPath,\n      `#!/bin/sh\n  DIR=$(dirname \"$0\")\n  \"$DIR/node\" \"$DIR/app/${linuxMain}\"\n  `\n    )\n  }\n\n  async afterPack(context: AfterPackContext) {\n    const packager = context.packager\n    if (!this.isUseLaunchUiForPlatform(packager.platform)) {\n      return\n    }\n\n    // LaunchUI requires main.js, rename if need\n    const userMain = packager.info.metadata.main || \"index.js\"\n    if (userMain === \"main.js\") {\n      return\n    }\n\n    await rename(path.join(context.appOutDir, \"app\", userMain), path.join(context.appOutDir, \"app\", \"main.js\"))\n  }\n\n  getMainFile(platform: Platform): string | null {\n    return this.isUseLaunchUiForPlatform(platform) ? \"main.js\" : null\n  }\n\n  private isUseLaunchUiForPlatform(platform: Platform) {\n    return platform === Platform.WINDOWS || (this.isUseLaunchUi && platform === Platform.LINUX)\n  }\n\n  getExcludedDependencies(platform: Platform): Array<string> | null {\n    // part of launchui\n    return this.isUseLaunchUiForPlatform(platform) ? [\"libui-node\"] : null\n  }\n}\n\nasync function writeExecutableMain(file: string, content: string) {\n  await writeFile(file, content, { mode: 0o755 })\n  await chmod(file, 0o755)\n}\n\nexport type NodeJsDownloadParams = {\n  releaseName: string\n  filenameWithExt: string\n  overrideUrl: string\n  binaryRelPath: string\n}\n\nexport function getNodeJsDownloadParams(version: string, platform: Platform, arch: string): NodeJsDownloadParams {\n  const isWindows = platform === Platform.WINDOWS\n  const nodePlatform = isWindows ? \"win\" : platform === Platform.MAC ? \"darwin\" : \"linux\"\n  const nodeArch = isWindows && arch === \"ia32\" ? \"x86\" : arch\n  const format = isWindows ? \"zip\" : \"tar.gz\"\n  const filenameWithExt = `node-v${version}-${nodePlatform}-${nodeArch}.${format}`\n  // tar.gz: strip:1 moves node-v.../bin/node → bin/node in extractDir\n  // zip: no strip, node.exe lives under the top-level dir node-v{version}-win-{arch}/\n  const binaryRelPath = isWindows ? path.join(`node-v${version}-win-${nodeArch}`, \"node.exe\") : path.join(\"bin\", \"node\")\n  return { releaseName: `nodejs-v${version}`, filenameWithExt, overrideUrl: `https://nodejs.org/dist/v${version}`, binaryRelPath }\n}\n\nexport async function downloadNodeJsBinary(version: string, platform: Platform, arch: string): Promise<string> {\n  const { releaseName, filenameWithExt, overrideUrl, binaryRelPath } = getNodeJsDownloadParams(version, platform, arch)\n  const sha256 = await fetchNodeJsChecksum(version, filenameWithExt)\n  const checksums = { [filenameWithExt]: sha256 }\n  const extractDir = await downloadBuilderToolset({ releaseName, filenameWithExt, overrideUrl, checksums })\n  return path.join(extractDir, binaryRelPath)\n}\n\n/**\n * Fetches the SHA-256 hex digest for a specific Node.js distribution file from\n * the official nodejs.org SHASUMS256.txt, preventing MITM substitution attacks.\n */\nexport async function fetchNodeJsChecksum(version: string, filename: string): Promise<string> {\n  const url = `https://nodejs.org/dist/v${version}/SHASUMS256.txt`\n  return new Promise((resolve, reject) => {\n    https\n      .get(url, { headers: { \"User-Agent\": \"electron-builder\" } }, res => {\n        if (res.statusCode !== 200) {\n          res.resume()\n          reject(new Error(`HTTP ${res.statusCode} fetching Node.js SHASUMS256.txt for v${version}`))\n          return\n        }\n        const chunks: Buffer[] = []\n        res.on(\"data\", (c: Buffer) => chunks.push(c))\n        res.on(\"end\", () => {\n          const text = Buffer.concat(chunks).toString(\"utf8\")\n          for (const line of text.split(\"\\n\")) {\n            const m = line.match(/^([0-9a-f]{64})\\s+(.+)$/)\n            if (m != null && m[2].trim() === filename) {\n              resolve(m[1])\n              return\n            }\n          }\n          reject(new Error(`No checksum for ${filename} in Node.js v${version} SHASUMS256.txt`))\n        })\n        res.on(\"error\", reject)\n      })\n      .on(\"error\", reject)\n  })\n}\n\nexport type LaunchUiDownloadParams = {\n  releaseName: string\n  filenameWithExt: string\n  githubOrgRepo: string\n  checksums: Record<string, string>\n}\n\nexport function getLaunchUiDownloadParams(version: string, platform: Platform, arch: string): LaunchUiDownloadParams {\n  const launchPlatform = platform === Platform.MAC ? \"mac\" : platform === Platform.WINDOWS ? \"win32\" : \"linux\"\n  return {\n    releaseName: `v${version}`,\n    filenameWithExt: `launchui-v${version}-${launchPlatform}-${arch}.7z`,\n    githubOrgRepo: \"develar/launchui\",\n    checksums: launchUiChecksums,\n  }\n}\n\nexport async function downloadLaunchUiDir(version: string, platform: Platform, arch: string): Promise<string> {\n  return downloadBuilderToolset(getLaunchUiDownloadParams(version, platform, arch))\n}\n"]}