app-builder-lib 26.13.0 → 26.14.0

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.
Files changed (57) hide show
  1. package/helpers/dynamic-import.js +24 -7
  2. package/out/asar/asarFileChecker.js.map +1 -1
  3. package/out/codeSign/windowsSignToolManager.d.ts +2 -0
  4. package/out/codeSign/windowsSignToolManager.js +7 -0
  5. package/out/codeSign/windowsSignToolManager.js.map +1 -1
  6. package/out/index.d.ts +2 -1
  7. package/out/index.js +3 -1
  8. package/out/index.js.map +1 -1
  9. package/out/node-module-collector/moduleManager.d.ts +9 -1
  10. package/out/node-module-collector/moduleManager.js +86 -55
  11. package/out/node-module-collector/moduleManager.js.map +1 -1
  12. package/out/node-module-collector/nodeModulesCollector.d.ts +6 -0
  13. package/out/node-module-collector/nodeModulesCollector.js +41 -22
  14. package/out/node-module-collector/nodeModulesCollector.js.map +1 -1
  15. package/out/node-module-collector/pnpmNodeModulesCollector.js +7 -5
  16. package/out/node-module-collector/pnpmNodeModulesCollector.js.map +1 -1
  17. package/out/options/macOptions.d.ts +29 -0
  18. package/out/options/macOptions.js.map +1 -1
  19. package/out/platformPackager.d.ts +1 -5
  20. package/out/platformPackager.js +9 -31
  21. package/out/platformPackager.js.map +1 -1
  22. package/out/targets/LinuxTargetHelper.d.ts +1 -1
  23. package/out/targets/LinuxTargetHelper.js.map +1 -1
  24. package/out/targets/appimage/appImageUtil.d.ts +2 -2
  25. package/out/targets/appimage/appImageUtil.js.map +1 -1
  26. package/out/targets/blockmap/blockmap.d.ts +16 -0
  27. package/out/targets/blockmap/blockmap.js +149 -0
  28. package/out/targets/blockmap/blockmap.js.map +1 -0
  29. package/out/targets/differentialUpdateInfoBuilder.js +3 -3
  30. package/out/targets/differentialUpdateInfoBuilder.js.map +1 -1
  31. package/out/targets/nsis/NsisTarget.js +28 -8
  32. package/out/targets/nsis/NsisTarget.js.map +1 -1
  33. package/out/targets/nsis/nsisValidation.d.ts +18 -0
  34. package/out/targets/nsis/nsisValidation.js +53 -0
  35. package/out/targets/nsis/nsisValidation.js.map +1 -0
  36. package/out/toolsets/icons.d.ts +8 -0
  37. package/out/toolsets/icons.js +37 -0
  38. package/out/toolsets/icons.js.map +1 -0
  39. package/out/util/config/config.js +6 -7
  40. package/out/util/config/config.js.map +1 -1
  41. package/out/util/config/schemaValidator.d.ts +7 -0
  42. package/out/util/config/schemaValidator.js +154 -0
  43. package/out/util/config/schemaValidator.js.map +1 -0
  44. package/out/util/iconConverter.d.ts +25 -0
  45. package/out/util/iconConverter.js +260 -0
  46. package/out/util/iconConverter.js.map +1 -0
  47. package/out/util/resEdit.js +16 -15
  48. package/out/util/resEdit.js.map +1 -1
  49. package/out/version.d.ts +1 -1
  50. package/out/version.js +1 -1
  51. package/out/version.js.map +1 -1
  52. package/out/winPackager.d.ts +1 -0
  53. package/out/winPackager.js +12 -9
  54. package/out/winPackager.js.map +1 -1
  55. package/package.json +9 -8
  56. package/scheme.json +14 -0
  57. package/templates/linux/after-remove.tpl +14 -2
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/util/config/config.ts"],"names":[],"mappings":"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","sourcesContent":["import { DebugLogger, InvalidConfigurationError, log, safeStringifyJson, statOrNull } from \"builder-util\"\nimport { deepAssign, Nullish } from \"builder-util-runtime\"\nimport { readJson } from \"fs-extra\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport { Configuration } from \"../../configuration\"\nimport { FileSet } from \"../../options/PlatformSpecificBuildOptions\"\nimport { reactCra } from \"../../presets/rectCra\"\nimport { PACKAGE_VERSION } from \"../../version\"\nimport { getConfig as _getConfig, loadParentConfig, orNullIfFileNotExist, ReadConfigRequest } from \"./load\"\nconst validateSchema = require(\"@develar/schema-utils\")\n\n// https://github.com/electron-userland/electron-builder/issues/1847\nfunction mergePublish(config: Configuration, configFromOptions: Configuration) {\n // if config from disk doesn't have publish (or object), no need to handle, it will be simply merged by deepAssign\n const publish = Array.isArray(config.publish) ? configFromOptions.publish : null\n if (publish != null) {\n delete (configFromOptions as any).publish\n }\n\n deepAssign(config, configFromOptions)\n\n if (publish == null) {\n return\n }\n\n const listOnDisk = config.publish as Array<any>\n if (listOnDisk.length === 0) {\n config.publish = publish\n } else {\n // apply to first\n deepAssign(listOnDisk[0], publish)\n }\n}\n\nexport async function getConfig(\n projectDir: string,\n configPath: string | null,\n configFromOptions: Configuration | Nullish,\n packageMetadata: Lazy<Record<string, any> | null> = new Lazy(() => orNullIfFileNotExist(readJson(path.join(projectDir, \"package.json\"))))\n): Promise<Configuration> {\n const configRequest: ReadConfigRequest = { packageKey: \"build\", configFilename: \"electron-builder\", projectDir, packageMetadata }\n const configAndEffectiveFile = await _getConfig<Configuration>(configRequest, configPath)\n const config = configAndEffectiveFile == null ? {} : configAndEffectiveFile.result\n if (configFromOptions != null) {\n mergePublish(config, configFromOptions)\n }\n\n if (configAndEffectiveFile != null) {\n log.info({ file: configAndEffectiveFile.configFile == null ? 'package.json (\"build\" field)' : configAndEffectiveFile.configFile }, \"loaded configuration\")\n }\n\n if (config.extends == null && config.extends !== null) {\n const metadata = (await packageMetadata.value) || {}\n const devDependencies = metadata.devDependencies\n const dependencies = metadata.dependencies\n if ((dependencies != null && \"react-scripts\" in dependencies) || (devDependencies != null && \"react-scripts\" in devDependencies)) {\n config.extends = \"react-cra\"\n } else if (devDependencies != null && \"electron-webpack\" in devDependencies) {\n let file = \"electron-webpack/out/electron-builder.js\"\n try {\n file = require.resolve(file)\n } catch (_ignore) {\n file = require.resolve(\"electron-webpack/electron-builder.yml\")\n }\n config.extends = `file:${file}`\n }\n }\n\n const parentConfigs = await loadParentConfigsRecursively(config.extends, async configExtend => {\n if (configExtend === \"react-cra\") {\n const result = await reactCra(projectDir)\n log.info({ preset: configExtend }, \"loaded parent configuration\")\n return result\n } else {\n const { configFile, result } = await loadParentConfig<Configuration>(configRequest, configExtend)\n log.info({ file: configFile }, \"loaded parent configuration\")\n return result\n }\n })\n\n return doMergeConfigs([...parentConfigs, config])\n}\n\nfunction asArray(value: string[] | string | Nullish): string[] {\n return Array.isArray(value) ? value : typeof value === \"string\" ? [value] : []\n}\n\nasync function loadParentConfigsRecursively(configExtends: Configuration[\"extends\"], loader: (configExtend: string) => Promise<Configuration>): Promise<Configuration[]> {\n const configs = []\n\n for (const configExtend of asArray(configExtends)) {\n const result = await loader(configExtend)\n const parentConfigs = await loadParentConfigsRecursively(result.extends, loader)\n configs.push(...parentConfigs, result)\n }\n\n return configs\n}\n\n// normalize for easy merge\nfunction normalizeFiles(configuration: Configuration, name: \"files\" | \"extraFiles\" | \"extraResources\") {\n let value = configuration[name]\n if (value == null) {\n return\n }\n\n if (!Array.isArray(value)) {\n value = [value]\n }\n\n itemLoop: for (let i = 0; i < value.length; i++) {\n let item = value[i]\n if (typeof item === \"string\") {\n // merge with previous if possible\n if (i !== 0) {\n let prevItemIndex = i - 1\n let prevItem: FileSet\n do {\n prevItem = value[prevItemIndex--] as FileSet\n } while (prevItem == null)\n\n if (prevItem.from == null && prevItem.to == null) {\n if (prevItem.filter == null) {\n prevItem.filter = [item]\n } else {\n ;(prevItem.filter as Array<string>).push(item)\n }\n value[i] = null as any\n continue itemLoop\n }\n }\n\n item = {\n filter: [item],\n }\n value[i] = item\n } else if (Array.isArray(item)) {\n throw new Error(`${name} configuration is invalid, nested array not expected for index ${i}: ${item}`)\n }\n\n // make sure that merge logic is not complex - unify different presentations\n if (item.from === \".\") {\n item.from = undefined\n }\n\n if (item.to === \".\") {\n item.to = undefined\n }\n\n if (item.filter != null && typeof item.filter === \"string\") {\n item.filter = [item.filter]\n }\n }\n\n configuration[name] = value.filter(it => it != null)\n}\n\nfunction isSimilarFileSet(value: FileSet, other: FileSet): boolean {\n return value.from === other.from && value.to === other.to\n}\n\ntype Filter = FileSet[\"filter\"]\n\nfunction mergeFilters(value: Filter, other: Filter): string[] {\n return asArray(value).concat(asArray(other))\n}\n\nfunction mergeFileSets(lists: FileSet[][]): FileSet[] {\n const result: FileSet[] = []\n\n for (const list of lists) {\n for (const item of list) {\n const existingItem = result.find(i => isSimilarFileSet(i, item))\n if (existingItem) {\n existingItem.filter = mergeFilters(item.filter, existingItem.filter)\n } else {\n result.push(item)\n }\n }\n }\n\n return result\n}\n\n/**\n * `doMergeConfigs` takes configs in the order you would pass them to\n * Object.assign as sources.\n */\nexport function doMergeConfigs(configs: Configuration[]): Configuration {\n for (const config of configs) {\n normalizeFiles(config, \"files\")\n normalizeFiles(config, \"extraFiles\")\n normalizeFiles(config, \"extraResources\")\n }\n\n const result = deepAssign(getDefaultConfig(), ...configs)\n\n // `deepAssign` prioritises latter configs, while `mergeFilesSets` prioritises\n // former configs, so we have to reverse the order, because latter configs\n // must have higher priority.\n configs = configs.slice().reverse()\n\n result.files = mergeFileSets(configs.map(config => (config.files ?? []) as FileSet[]))\n return result\n}\n\nfunction getDefaultConfig(): Configuration {\n return {\n directories: {\n output: \"dist\",\n buildResources: \"build\",\n },\n }\n}\n\nconst schemeDataPromise = new Lazy(() => readJson(path.join(__dirname, \"..\", \"..\", \"..\", \"scheme.json\")))\n\nexport async function validateConfiguration(config: Configuration, debugLogger: DebugLogger) {\n const extraMetadata = config.extraMetadata\n if (extraMetadata != null) {\n if (extraMetadata.build != null) {\n throw new InvalidConfigurationError(`--em.build is deprecated, please specify as -c\"`)\n }\n if (extraMetadata.directories != null) {\n throw new InvalidConfigurationError(`--em.directories is deprecated, please specify as -c.directories\"`)\n }\n }\n\n const oldConfig: any = config\n if (oldConfig.npmSkipBuildFromSource === false) {\n throw new InvalidConfigurationError(`npmSkipBuildFromSource is deprecated, please use buildDependenciesFromSource\"`)\n }\n if (oldConfig.appImage != null && oldConfig.appImage.systemIntegration != null) {\n throw new InvalidConfigurationError(`appImage.systemIntegration is deprecated, https://github.com/TheAssassin/AppImageLauncher is used for desktop integration\"`)\n }\n\n // noinspection JSUnusedGlobalSymbols\n validateSchema(await schemeDataPromise.value, config, {\n name: `electron-builder ${PACKAGE_VERSION}`,\n postFormatter: (formattedError: string, error: any): string => {\n if (debugLogger.isEnabled) {\n debugLogger.add(\"invalidConfig\", safeStringifyJson(error))\n }\n\n const site = \"https://www.electron.build\"\n let url = `${site}/configuration`\n const targets = new Set([\"mac\", \"dmg\", \"pkg\", \"mas\", \"win\", \"nsis\", \"appx\", \"linux\", \"appimage\", \"snap\"])\n const dataPath: string = error.dataPath == null ? null : error.dataPath\n const targetPath = dataPath.startsWith(\".\") ? dataPath.substr(1).toLowerCase() : null\n if (targetPath != null && targets.has(targetPath)) {\n url = `${site}/${targetPath}`\n }\n\n return `${formattedError}\\n How to fix:\n 1. Open ${url}\n 2. Search the option name on the page (or type in into Search to find across the docs).\n * Not found? The option was deprecated or not exists (check spelling).\n * Found? Check that the option in the appropriate place. e.g. \"title\" only in the \"dmg\", not in the root.\n`\n },\n })\n}\n\nconst DEFAULT_APP_DIR_NAMES = [\"app\", \"www\"]\n\nexport async function computeDefaultAppDirectory(projectDir: string, userAppDir: string | Nullish): Promise<string> {\n if (userAppDir != null) {\n const absolutePath = path.resolve(projectDir, userAppDir)\n const stat = await statOrNull(absolutePath)\n if (stat == null) {\n throw new InvalidConfigurationError(`Application directory ${userAppDir} doesn't exist`)\n } else if (!stat.isDirectory()) {\n throw new InvalidConfigurationError(`Application directory ${userAppDir} is not a directory`)\n } else if (projectDir === absolutePath) {\n log.warn({ appDirectory: userAppDir }, `Specified application directory equals to project dir — superfluous or wrong configuration`)\n }\n return absolutePath\n }\n\n for (const dir of DEFAULT_APP_DIR_NAMES) {\n const absolutePath = path.join(projectDir, dir)\n const packageJson = path.join(absolutePath, \"package.json\")\n const stat = await statOrNull(packageJson)\n if (stat != null && stat.isFile()) {\n return absolutePath\n }\n }\n return projectDir\n}\n"]}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/util/config/config.ts"],"names":[],"mappings":"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","sourcesContent":["import { DebugLogger, InvalidConfigurationError, log, safeStringifyJson, statOrNull } from \"builder-util\"\nimport { deepAssign, Nullish } from \"builder-util-runtime\"\nimport { readJson } from \"fs-extra\"\nimport { Lazy } from \"lazy-val\"\nimport * as path from \"path\"\nimport { Configuration } from \"../../configuration\"\nimport { FileSet } from \"../../options/PlatformSpecificBuildOptions\"\nimport { reactCra } from \"../../presets/rectCra\"\nimport { PACKAGE_VERSION } from \"../../version\"\nimport { getConfig as _getConfig, loadParentConfig, orNullIfFileNotExist, ReadConfigRequest } from \"./load\"\nimport { validateSchema } from \"./schemaValidator\"\n\n// https://github.com/electron-userland/electron-builder/issues/1847\nfunction mergePublish(config: Configuration, configFromOptions: Configuration) {\n // if config from disk doesn't have publish (or object), no need to handle, it will be simply merged by deepAssign\n const publish = Array.isArray(config.publish) ? configFromOptions.publish : null\n if (publish != null) {\n delete (configFromOptions as any).publish\n }\n\n deepAssign(config, configFromOptions)\n\n if (publish == null) {\n return\n }\n\n const listOnDisk = config.publish as Array<any>\n if (listOnDisk.length === 0) {\n config.publish = publish\n } else {\n // apply to first\n deepAssign(listOnDisk[0], publish)\n }\n}\n\nexport async function getConfig(\n projectDir: string,\n configPath: string | null,\n configFromOptions: Configuration | Nullish,\n packageMetadata: Lazy<Record<string, any> | null> = new Lazy(() => orNullIfFileNotExist(readJson(path.join(projectDir, \"package.json\"))))\n): Promise<Configuration> {\n const configRequest: ReadConfigRequest = { packageKey: \"build\", configFilename: \"electron-builder\", projectDir, packageMetadata }\n const configAndEffectiveFile = await _getConfig<Configuration>(configRequest, configPath)\n const config = configAndEffectiveFile == null ? {} : configAndEffectiveFile.result\n if (configFromOptions != null) {\n mergePublish(config, configFromOptions)\n }\n\n if (configAndEffectiveFile != null) {\n log.info({ file: configAndEffectiveFile.configFile == null ? 'package.json (\"build\" field)' : configAndEffectiveFile.configFile }, \"loaded configuration\")\n }\n\n if (config.extends == null && config.extends !== null) {\n const metadata = (await packageMetadata.value) || {}\n const devDependencies = metadata.devDependencies\n const dependencies = metadata.dependencies\n if ((dependencies != null && \"react-scripts\" in dependencies) || (devDependencies != null && \"react-scripts\" in devDependencies)) {\n config.extends = \"react-cra\"\n } else if (devDependencies != null && \"electron-webpack\" in devDependencies) {\n let file = \"electron-webpack/out/electron-builder.js\"\n try {\n file = require.resolve(file)\n } catch (_ignore) {\n file = require.resolve(\"electron-webpack/electron-builder.yml\")\n }\n config.extends = `file:${file}`\n }\n }\n\n const parentConfigs = await loadParentConfigsRecursively(config.extends, async configExtend => {\n if (configExtend === \"react-cra\") {\n const result = await reactCra(projectDir)\n log.info({ preset: configExtend }, \"loaded parent configuration\")\n return result\n } else {\n const { configFile, result } = await loadParentConfig<Configuration>(configRequest, configExtend)\n log.info({ file: configFile }, \"loaded parent configuration\")\n return result\n }\n })\n\n return doMergeConfigs([...parentConfigs, config])\n}\n\nfunction asArray(value: string[] | string | Nullish): string[] {\n return Array.isArray(value) ? value : typeof value === \"string\" ? [value] : []\n}\n\nasync function loadParentConfigsRecursively(configExtends: Configuration[\"extends\"], loader: (configExtend: string) => Promise<Configuration>): Promise<Configuration[]> {\n const configs = []\n\n for (const configExtend of asArray(configExtends)) {\n const result = await loader(configExtend)\n const parentConfigs = await loadParentConfigsRecursively(result.extends, loader)\n configs.push(...parentConfigs, result)\n }\n\n return configs\n}\n\n// normalize for easy merge\nfunction normalizeFiles(configuration: Configuration, name: \"files\" | \"extraFiles\" | \"extraResources\") {\n let value = configuration[name]\n if (value == null) {\n return\n }\n\n if (!Array.isArray(value)) {\n value = [value]\n }\n\n itemLoop: for (let i = 0; i < value.length; i++) {\n let item = value[i]\n if (typeof item === \"string\") {\n // merge with previous if possible\n if (i !== 0) {\n let prevItemIndex = i - 1\n let prevItem: FileSet\n do {\n prevItem = value[prevItemIndex--] as FileSet\n } while (prevItem == null)\n\n if (prevItem.from == null && prevItem.to == null) {\n if (prevItem.filter == null) {\n prevItem.filter = [item]\n } else {\n ;(prevItem.filter as Array<string>).push(item)\n }\n value[i] = null as any\n continue itemLoop\n }\n }\n\n item = {\n filter: [item],\n }\n value[i] = item\n } else if (Array.isArray(item)) {\n throw new Error(`${name} configuration is invalid, nested array not expected for index ${i}: ${item}`)\n }\n\n // make sure that merge logic is not complex - unify different presentations\n if (item.from === \".\") {\n item.from = undefined\n }\n\n if (item.to === \".\") {\n item.to = undefined\n }\n\n if (item.filter != null && typeof item.filter === \"string\") {\n item.filter = [item.filter]\n }\n }\n\n configuration[name] = value.filter(it => it != null)\n}\n\nfunction isSimilarFileSet(value: FileSet, other: FileSet): boolean {\n return value.from === other.from && value.to === other.to\n}\n\ntype Filter = FileSet[\"filter\"]\n\nfunction mergeFilters(value: Filter, other: Filter): string[] {\n return asArray(value).concat(asArray(other))\n}\n\nfunction mergeFileSets(lists: FileSet[][]): FileSet[] {\n const result: FileSet[] = []\n\n for (const list of lists) {\n for (const item of list) {\n const existingItem = result.find(i => isSimilarFileSet(i, item))\n if (existingItem) {\n existingItem.filter = mergeFilters(item.filter, existingItem.filter)\n } else {\n result.push(item)\n }\n }\n }\n\n return result\n}\n\n/**\n * `doMergeConfigs` takes configs in the order you would pass them to\n * Object.assign as sources.\n */\nexport function doMergeConfigs(configs: Configuration[]): Configuration {\n for (const config of configs) {\n normalizeFiles(config, \"files\")\n normalizeFiles(config, \"extraFiles\")\n normalizeFiles(config, \"extraResources\")\n }\n\n const result = deepAssign(getDefaultConfig(), ...configs)\n\n // `deepAssign` prioritises latter configs, while `mergeFilesSets` prioritises\n // former configs, so we have to reverse the order, because latter configs\n // must have higher priority.\n configs = configs.slice().reverse()\n\n result.files = mergeFileSets(configs.map(config => (config.files ?? []) as FileSet[]))\n return result\n}\n\nfunction getDefaultConfig(): Configuration {\n return {\n directories: {\n output: \"dist\",\n buildResources: \"build\",\n },\n }\n}\n\nconst schemeDataPromise = new Lazy(() => readJson(path.join(__dirname, \"..\", \"..\", \"..\", \"scheme.json\")))\n\nexport async function validateConfiguration(config: Configuration, debugLogger: DebugLogger) {\n const extraMetadata = config.extraMetadata\n if (extraMetadata != null) {\n if (extraMetadata.build != null) {\n throw new InvalidConfigurationError(`--em.build is deprecated, please specify as -c\"`)\n }\n if (extraMetadata.directories != null) {\n throw new InvalidConfigurationError(`--em.directories is deprecated, please specify as -c.directories\"`)\n }\n }\n\n const oldConfig: any = config\n if (oldConfig.npmSkipBuildFromSource === false) {\n throw new InvalidConfigurationError(`npmSkipBuildFromSource is deprecated, please use buildDependenciesFromSource\"`)\n }\n if (oldConfig.appImage != null && oldConfig.appImage.systemIntegration != null) {\n throw new InvalidConfigurationError(`appImage.systemIntegration is deprecated, https://github.com/TheAssassin/AppImageLauncher is used for desktop integration\"`)\n }\n\n validateSchema(await schemeDataPromise.value, config, {\n name: `electron-builder ${PACKAGE_VERSION}`,\n postFormatter: (formattedError, error): string => {\n if (debugLogger.isEnabled) {\n debugLogger.add(\"invalidConfig\", safeStringifyJson(error))\n }\n\n const site = \"https://www.electron.build\"\n let url = `${site}/configuration`\n const targets = new Set([\"mac\", \"dmg\", \"pkg\", \"mas\", \"win\", \"nsis\", \"appx\", \"linux\", \"appimage\", \"snap\"])\n const firstSegment = (error.instancePath ?? \"\").split(\"/\").filter(Boolean)[0]?.toLowerCase()\n if (firstSegment != null && targets.has(firstSegment)) {\n url = `${site}/${firstSegment}`\n }\n\n return `${formattedError}\\n How to fix:\n 1. Open ${url}\n 2. Search the option name on the page (or type in into Search to find across the docs).\n * Not found? The option was deprecated or not exists (check spelling).\n * Found? Check that the option in the appropriate place. e.g. \"title\" only in the \"dmg\", not in the root.\n`\n },\n })\n}\n\nconst DEFAULT_APP_DIR_NAMES = [\"app\", \"www\"]\n\nexport async function computeDefaultAppDirectory(projectDir: string, userAppDir: string | Nullish): Promise<string> {\n if (userAppDir != null) {\n const absolutePath = path.resolve(projectDir, userAppDir)\n const stat = await statOrNull(absolutePath)\n if (stat == null) {\n throw new InvalidConfigurationError(`Application directory ${userAppDir} doesn't exist`)\n } else if (!stat.isDirectory()) {\n throw new InvalidConfigurationError(`Application directory ${userAppDir} is not a directory`)\n } else if (projectDir === absolutePath) {\n log.warn({ appDirectory: userAppDir }, `Specified application directory equals to project dir — superfluous or wrong configuration`)\n }\n return absolutePath\n }\n\n for (const dir of DEFAULT_APP_DIR_NAMES) {\n const absolutePath = path.join(projectDir, dir)\n const packageJson = path.join(absolutePath, \"package.json\")\n const stat = await statOrNull(packageJson)\n if (stat != null && stat.isFile()) {\n return absolutePath\n }\n }\n return projectDir\n}\n"]}
@@ -0,0 +1,7 @@
1
+ import { ErrorObject } from "ajv";
2
+ export type PostFormatter = (formattedError: string, error: ErrorObject) => string;
3
+ export interface ValidationConfig {
4
+ name?: string;
5
+ postFormatter?: PostFormatter;
6
+ }
7
+ export declare function validateSchema(schema: unknown, data: unknown, config?: ValidationConfig): void;
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateSchema = validateSchema;
4
+ const ajv_1 = require("ajv");
5
+ const ajv = new ajv_1.default({
6
+ allErrors: true,
7
+ verbose: true,
8
+ coerceTypes: true,
9
+ strict: false,
10
+ });
11
+ // Cache the compiled validator for the canonical scheme.json so it is only
12
+ // compiled once per process lifetime.
13
+ let _cachedValidate;
14
+ function validateSchema(schema, data, config = {}) {
15
+ var _a, _b;
16
+ if (_cachedValidate == null || _cachedValidate.schema !== schema) {
17
+ _cachedValidate = ajv.compile(schema);
18
+ }
19
+ const validate = _cachedValidate;
20
+ if (validate(data)) {
21
+ return;
22
+ }
23
+ const errors = (_a = validate.errors) !== null && _a !== void 0 ? _a : [];
24
+ const baseDataPath = "configuration";
25
+ const name = (_b = config.name) !== null && _b !== void 0 ? _b : "Object";
26
+ const relevant = filterRelevantErrors(errors);
27
+ const formatted = relevant.map(error => {
28
+ let msg = formatError(error, baseDataPath);
29
+ if (config.postFormatter != null) {
30
+ msg = config.postFormatter(msg, error);
31
+ }
32
+ return ` - ${indentNewlines(msg, " ")}`;
33
+ });
34
+ const header = `Invalid configuration object. ${name} has been initialized using a configuration object that does not match the API schema.`;
35
+ throw new Error(`${header}\n${formatted.join("\n")}`);
36
+ }
37
+ /**
38
+ * Filters the flat list of ajv errors to the most actionable subset.
39
+ * Composite keywords (anyOf/oneOf/if) are suppressed when more specific
40
+ * errors exist at the same or deeper paths. When all errors share the
41
+ * same instancePath and a composite parent for that path exists, the
42
+ * parent is kept instead so the user sees a single "should be one of"
43
+ * message rather than every failed branch listed separately.
44
+ */
45
+ function filterRelevantErrors(errors) {
46
+ const compositeKeywords = new Set(["anyOf", "oneOf", "if"]);
47
+ const specific = errors.filter(e => !compositeKeywords.has(e.keyword));
48
+ if (specific.length === 0) {
49
+ return errors.filter(e => compositeKeywords.has(e.keyword));
50
+ }
51
+ // Group specific errors by instancePath
52
+ const byPath = new Map();
53
+ for (const e of specific) {
54
+ const list = byPath.get(e.instancePath);
55
+ if (list != null) {
56
+ list.push(e);
57
+ }
58
+ else {
59
+ byPath.set(e.instancePath, [e]);
60
+ }
61
+ }
62
+ const result = [];
63
+ for (const [path, group] of byPath) {
64
+ // When multiple branch-failures share the same path, prefer the anyOf
65
+ // parent error (one concise "should be one of these" message).
66
+ if (group.length > 1) {
67
+ const parent = errors.find(e => e.instancePath === path && compositeKeywords.has(e.keyword));
68
+ if (parent != null) {
69
+ result.push(parent);
70
+ continue;
71
+ }
72
+ }
73
+ result.push(...group);
74
+ }
75
+ return result;
76
+ }
77
+ /** Decodes a single RFC 6901 JSON Pointer segment (`~1` → `/`, `~0` → `~`). */
78
+ function decodePointerSegment(segment) {
79
+ return segment.replace(/~1/g, "/").replace(/~0/g, "~");
80
+ }
81
+ function instancePathToLabel(instancePath, baseDataPath) {
82
+ if (!instancePath) {
83
+ return baseDataPath;
84
+ }
85
+ const segments = instancePath.split("/").filter(Boolean).map(decodePointerSegment);
86
+ return [baseDataPath, ...segments].join(".");
87
+ }
88
+ function formatError(error, baseDataPath) {
89
+ var _a;
90
+ const label = instancePathToLabel(error.instancePath, baseDataPath);
91
+ const params = error.params;
92
+ const parentSchema = error.parentSchema;
93
+ switch (error.keyword) {
94
+ case "additionalProperties":
95
+ return `${label} has an unknown property '${params.additionalProperty}'`;
96
+ case "required": {
97
+ const missingProp = String(params.missingProperty).replace(/^\./, "");
98
+ return `${label} misses the property '${missingProp}'`;
99
+ }
100
+ case "type": {
101
+ const type = params.type;
102
+ if (Array.isArray(type)) {
103
+ const typeList = type.join(" | ");
104
+ const desc = descriptionSuffix(parentSchema);
105
+ return `${label} should be:\n${typeList}${desc}`;
106
+ }
107
+ return `${label} should be a ${type}`;
108
+ }
109
+ case "enum": {
110
+ const enumVals = (_a = parentSchema === null || parentSchema === void 0 ? void 0 : parentSchema.enum) !== null && _a !== void 0 ? _a : [];
111
+ if (enumVals.length === 1) {
112
+ return `${label} should be ${JSON.stringify(enumVals[0])}`;
113
+ }
114
+ return `${label} should be one of these:\n${enumVals.map(v => JSON.stringify(v)).join(" | ")}`;
115
+ }
116
+ case "anyOf":
117
+ case "oneOf": {
118
+ const schemaText = formatSchemaType(parentSchema);
119
+ return `${label} should be one of these:\n${schemaText}`;
120
+ }
121
+ default:
122
+ return `${label} ${error.message}`;
123
+ }
124
+ }
125
+ function descriptionSuffix(schema) {
126
+ return typeof (schema === null || schema === void 0 ? void 0 : schema.description) === "string" ? `\n-> ${schema.description}` : "";
127
+ }
128
+ function formatSchemaType(schema) {
129
+ if (schema == null) {
130
+ return "";
131
+ }
132
+ if (Array.isArray(schema.type)) {
133
+ return schema.type.join(" | ");
134
+ }
135
+ if (typeof schema.type === "string") {
136
+ return schema.type;
137
+ }
138
+ if (Array.isArray(schema.anyOf)) {
139
+ return schema.anyOf
140
+ .map(s => {
141
+ if (Array.isArray(s.type)) {
142
+ return s.type.join(" | ");
143
+ }
144
+ return typeof s.type === "string" ? s.type : "";
145
+ })
146
+ .filter(Boolean)
147
+ .join(" | ");
148
+ }
149
+ return JSON.stringify(schema);
150
+ }
151
+ function indentNewlines(str, prefix) {
152
+ return str.replace(/\n(?!$)/g, `\n${prefix}`);
153
+ }
154
+ //# sourceMappingURL=schemaValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemaValidator.js","sourceRoot":"","sources":["../../../src/util/config/schemaValidator.ts"],"names":[],"mappings":"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","sourcesContent":["import Ajv, { ErrorObject, ValidateFunction } from \"ajv\"\n\nexport type PostFormatter = (formattedError: string, error: ErrorObject) => string\n\nexport interface ValidationConfig {\n name?: string\n postFormatter?: PostFormatter\n}\n\nconst ajv = new Ajv({\n allErrors: true,\n verbose: true,\n coerceTypes: true,\n strict: false,\n})\n\n// Cache the compiled validator for the canonical scheme.json so it is only\n// compiled once per process lifetime.\nlet _cachedValidate: ValidateFunction | undefined\n\nexport function validateSchema(schema: unknown, data: unknown, config: ValidationConfig = {}): void {\n if (_cachedValidate == null || _cachedValidate.schema !== schema) {\n _cachedValidate = ajv.compile(schema as object)\n }\n const validate = _cachedValidate\n\n if (validate(data)) {\n return\n }\n\n const errors = validate.errors ?? []\n const baseDataPath = \"configuration\"\n const name = config.name ?? \"Object\"\n\n const relevant = filterRelevantErrors(errors)\n const formatted = relevant.map(error => {\n let msg = formatError(error, baseDataPath)\n if (config.postFormatter != null) {\n msg = config.postFormatter(msg, error)\n }\n return ` - ${indentNewlines(msg, \" \")}`\n })\n\n const header = `Invalid configuration object. ${name} has been initialized using a configuration object that does not match the API schema.`\n throw new Error(`${header}\\n${formatted.join(\"\\n\")}`)\n}\n\n/**\n * Filters the flat list of ajv errors to the most actionable subset.\n * Composite keywords (anyOf/oneOf/if) are suppressed when more specific\n * errors exist at the same or deeper paths. When all errors share the\n * same instancePath and a composite parent for that path exists, the\n * parent is kept instead so the user sees a single \"should be one of\"\n * message rather than every failed branch listed separately.\n */\nfunction filterRelevantErrors(errors: ErrorObject[]): ErrorObject[] {\n const compositeKeywords = new Set([\"anyOf\", \"oneOf\", \"if\"])\n const specific = errors.filter(e => !compositeKeywords.has(e.keyword))\n\n if (specific.length === 0) {\n return errors.filter(e => compositeKeywords.has(e.keyword))\n }\n\n // Group specific errors by instancePath\n const byPath = new Map<string, ErrorObject[]>()\n for (const e of specific) {\n const list = byPath.get(e.instancePath)\n if (list != null) {\n list.push(e)\n } else {\n byPath.set(e.instancePath, [e])\n }\n }\n\n const result: ErrorObject[] = []\n for (const [path, group] of byPath) {\n // When multiple branch-failures share the same path, prefer the anyOf\n // parent error (one concise \"should be one of these\" message).\n if (group.length > 1) {\n const parent = errors.find(e => e.instancePath === path && compositeKeywords.has(e.keyword))\n if (parent != null) {\n result.push(parent)\n continue\n }\n }\n result.push(...group)\n }\n return result\n}\n\n/** Decodes a single RFC 6901 JSON Pointer segment (`~1` → `/`, `~0` → `~`). */\nfunction decodePointerSegment(segment: string): string {\n return segment.replace(/~1/g, \"/\").replace(/~0/g, \"~\")\n}\n\nfunction instancePathToLabel(instancePath: string, baseDataPath: string): string {\n if (!instancePath) {\n return baseDataPath\n }\n const segments = instancePath.split(\"/\").filter(Boolean).map(decodePointerSegment)\n return [baseDataPath, ...segments].join(\".\")\n}\n\nfunction formatError(error: ErrorObject, baseDataPath: string): string {\n const label = instancePathToLabel(error.instancePath, baseDataPath)\n const params = error.params as Record<string, unknown>\n const parentSchema = (error as ErrorObject & { parentSchema?: Record<string, unknown> }).parentSchema\n\n switch (error.keyword) {\n case \"additionalProperties\":\n return `${label} has an unknown property '${params.additionalProperty}'`\n\n case \"required\": {\n const missingProp = String(params.missingProperty).replace(/^\\./, \"\")\n return `${label} misses the property '${missingProp}'`\n }\n\n case \"type\": {\n const type = params.type\n if (Array.isArray(type)) {\n const typeList = (type as string[]).join(\" | \")\n const desc = descriptionSuffix(parentSchema)\n return `${label} should be:\\n${typeList}${desc}`\n }\n return `${label} should be a ${type}`\n }\n\n case \"enum\": {\n const enumVals = (parentSchema?.enum as unknown[] | undefined) ?? []\n if (enumVals.length === 1) {\n return `${label} should be ${JSON.stringify(enumVals[0])}`\n }\n return `${label} should be one of these:\\n${enumVals.map(v => JSON.stringify(v)).join(\" | \")}`\n }\n\n case \"anyOf\":\n case \"oneOf\": {\n const schemaText = formatSchemaType(parentSchema)\n return `${label} should be one of these:\\n${schemaText}`\n }\n\n default:\n return `${label} ${error.message}`\n }\n}\n\nfunction descriptionSuffix(schema: Record<string, unknown> | undefined): string {\n return typeof schema?.description === \"string\" ? `\\n-> ${schema.description}` : \"\"\n}\n\nfunction formatSchemaType(schema: Record<string, unknown> | undefined): string {\n if (schema == null) {\n return \"\"\n }\n if (Array.isArray(schema.type)) {\n return (schema.type as string[]).join(\" | \")\n }\n if (typeof schema.type === \"string\") {\n return schema.type\n }\n if (Array.isArray(schema.anyOf)) {\n return (schema.anyOf as Array<Record<string, unknown>>)\n .map(s => {\n if (Array.isArray(s.type)) {\n return (s.type as string[]).join(\" | \")\n }\n return typeof s.type === \"string\" ? s.type : \"\"\n })\n .filter(Boolean)\n .join(\" | \")\n }\n return JSON.stringify(schema)\n}\n\nfunction indentNewlines(str: string, prefix: string): string {\n return str.replace(/\\n(?!$)/g, `\\n${prefix}`)\n}\n"]}
@@ -0,0 +1,25 @@
1
+ export interface IconInfo {
2
+ file: string;
3
+ size: number;
4
+ }
5
+ export type IconFormat = "icns" | "ico" | "set";
6
+ export interface IconConvertResult {
7
+ icons: IconInfo[];
8
+ isFallback: boolean;
9
+ error?: string;
10
+ errorCode?: string;
11
+ }
12
+ type IconConversionConfig = {
13
+ sources: string[];
14
+ fallbackSources: string[];
15
+ roots: string[];
16
+ format: IconFormat;
17
+ outDir: string;
18
+ };
19
+ export declare function convertIcon({ sources, fallbackSources, roots, format, outDir }: IconConversionConfig): Promise<IconConvertResult>;
20
+ export declare function getPngSize(filePath: string): Promise<{
21
+ width: number;
22
+ height: number;
23
+ }>;
24
+ export declare function buildSourceCandidates(sources: string[], format: IconFormat): string[];
25
+ export {};
@@ -0,0 +1,260 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.convertIcon = convertIcon;
4
+ exports.getPngSize = getPngSize;
5
+ exports.buildSourceCandidates = buildSourceCandidates;
6
+ const promises_1 = require("fs/promises");
7
+ const path = require("path");
8
+ const icons_1 = require("../toolsets/icons");
9
+ class IconConversionError extends Error {
10
+ constructor(message, errorCode) {
11
+ super(message);
12
+ this.errorCode = errorCode;
13
+ this.code = errorCode;
14
+ }
15
+ }
16
+ async function convertIcon({ sources, fallbackSources, roots, format, outDir }) {
17
+ const candidates = buildSourceCandidates(sources, format);
18
+ let icons = await doConvertIcon(candidates, roots, format, outDir);
19
+ let isFallback = false;
20
+ if (icons == null) {
21
+ const fallbackCandidates = buildSourceCandidates(fallbackSources, format);
22
+ icons = await doConvertIcon(fallbackCandidates, roots, format, outDir);
23
+ isFallback = true;
24
+ }
25
+ return { icons: icons !== null && icons !== void 0 ? icons : [], isFallback };
26
+ }
27
+ // ─── PNG dimension reader ─────────────────────────────────────────────────────
28
+ // Reads width/height from the PNG IHDR chunk at a fixed offset (no dependencies).
29
+ async function getPngSize(filePath) {
30
+ const buf = await (0, promises_1.readFile)(filePath);
31
+ // PNG signature = 8 bytes, IHDR chunk header = 8 bytes → width at 16, height at 20
32
+ if (buf.length < 24) {
33
+ return { width: 0, height: 0 };
34
+ }
35
+ return { width: buf.readUInt32BE(16), height: buf.readUInt32BE(20) };
36
+ }
37
+ // ─── ICO header parser ────────────────────────────────────────────────────────
38
+ async function getIcoMaxSize(filePath) {
39
+ const buf = await (0, promises_1.readFile)(filePath);
40
+ if (buf.length < 6 || buf[0] !== 0 || buf[1] !== 0 || buf[2] !== 1 || buf[3] !== 0) {
41
+ return null;
42
+ }
43
+ const count = buf.readUInt16LE(4);
44
+ let max = 0;
45
+ for (let i = 0; i < count; i++) {
46
+ const off = 6 + i * 16;
47
+ if (off + 2 > buf.length) {
48
+ break;
49
+ }
50
+ const w = buf[off] || 256;
51
+ const h = buf[off + 1] || 256;
52
+ if (w > max) {
53
+ max = w;
54
+ }
55
+ if (h > max) {
56
+ max = h;
57
+ }
58
+ }
59
+ return max;
60
+ }
61
+ // ─── Set output remapper ──────────────────────────────────────────────────────
62
+ // CLI outputs NxN.png; remap to icon_NxN.png to preserve existing naming convention.
63
+ async function remapSetOutput(outDir) {
64
+ const entries = await (0, promises_1.readdir)(outDir);
65
+ const result = [];
66
+ for (const name of entries) {
67
+ const match = name.match(/^(\d+)x\d+\.png$/);
68
+ if (!match) {
69
+ continue;
70
+ }
71
+ const size = parseInt(match[1], 10);
72
+ const oldPath = path.join(outDir, name);
73
+ const newPath = path.join(outDir, `icon_${size}x${size}.png`);
74
+ await (0, promises_1.rename)(oldPath, newPath);
75
+ result.push({ file: newPath, size });
76
+ }
77
+ return result.sort((a, b) => a.size - b.size);
78
+ }
79
+ // ─── CLI output collector ─────────────────────────────────────────────────────
80
+ async function collectCliOutput(outDir, format, sourceMaxSize = 0) {
81
+ if (format === "icns") {
82
+ return [{ file: path.join(outDir, "icon.icns"), size: sourceMaxSize }];
83
+ }
84
+ if (format === "ico") {
85
+ const icoFile = path.join(outDir, "icon.ico");
86
+ const size = await getIcoMaxSize(icoFile);
87
+ return [{ file: icoFile, size: size !== null && size !== void 0 ? size : sourceMaxSize }];
88
+ }
89
+ return remapSetOutput(outDir);
90
+ }
91
+ // ─── File resolution (matches go fileResolver.go + icon-converter.go) ────────
92
+ function imageHasExtension(name, format) {
93
+ return name.endsWith("." + format) || name.endsWith(".png") || name.endsWith(".ico") || name.endsWith(".svg") || name.endsWith(".icns");
94
+ }
95
+ function buildSourceCandidates(sources, format) {
96
+ const result = [];
97
+ for (const src of sources) {
98
+ if (imageHasExtension(src, format)) {
99
+ result.push(src);
100
+ }
101
+ else {
102
+ if (format !== "set") {
103
+ result.push(src + "." + format);
104
+ }
105
+ result.push(src);
106
+ result.push(src + ".png");
107
+ result.push(src + ".svg");
108
+ if (format !== "icns") {
109
+ result.push(src + ".icns");
110
+ if (format !== "ico") {
111
+ result.push(src + ".ico");
112
+ }
113
+ }
114
+ }
115
+ }
116
+ if (format !== "set") {
117
+ result.push("icon." + format);
118
+ }
119
+ for (const setName of ["icons", "icon"]) {
120
+ result.push(setName);
121
+ }
122
+ result.push("icon.png");
123
+ result.push("icon.svg");
124
+ if (format !== "icns") {
125
+ result.push("icon.icns");
126
+ if (format !== "ico") {
127
+ result.push("icon.ico");
128
+ }
129
+ }
130
+ // Deduplicate while preserving order so resolveSourceFile never stats the same path twice
131
+ return [...new Set(result)];
132
+ }
133
+ async function resolveSourceFile(candidates, roots) {
134
+ for (const candidate of candidates) {
135
+ const absPath = path.isAbsolute(candidate) ? path.normalize(candidate) : null;
136
+ const searchPaths = absPath ? [absPath] : roots.map(r => path.join(r, candidate));
137
+ for (const p of searchPaths) {
138
+ try {
139
+ const s = await (0, promises_1.stat)(p);
140
+ return { resolved: p, isDir: s.isDirectory() };
141
+ }
142
+ catch {
143
+ // not found, try next
144
+ }
145
+ }
146
+ }
147
+ return null;
148
+ }
149
+ // ─── Directory icon collection (go collect-icons.go) ────────────────────────
150
+ async function collectIconsFromDir(dir) {
151
+ const entries = await (0, promises_1.readdir)(dir);
152
+ const sizeMap = new Map();
153
+ let fallbackFile = null;
154
+ for (const name of entries) {
155
+ if (name === "icon.png" || name === "icon.PNG") {
156
+ fallbackFile = path.join(dir, name);
157
+ continue;
158
+ }
159
+ const match = name.match(/^(\d+)(?:x\d+)?\.png$/i);
160
+ if (!match) {
161
+ continue;
162
+ }
163
+ const size = parseInt(match[1], 10);
164
+ if (isNaN(size)) {
165
+ continue;
166
+ }
167
+ const filePath = path.join(dir, name);
168
+ const existing = sizeMap.get(size);
169
+ if (!existing || name.length < path.basename(existing.file).length) {
170
+ sizeMap.set(size, { file: filePath, size });
171
+ }
172
+ }
173
+ const icons = Array.from(sizeMap.values()).sort((a, b) => a.size - b.size);
174
+ return { icons, fallbackFile };
175
+ }
176
+ // ─── Main conversion logic ───────────────────────────────────────────────────
177
+ async function doConvertIcon(candidates, roots, format, outDir) {
178
+ const found = await resolveSourceFile(candidates, roots);
179
+ if (!found) {
180
+ return null;
181
+ }
182
+ const { resolved, isDir } = found;
183
+ // SVG source for set format: return the SVG directly — Linux targets place it in
184
+ // the freedesktop scalable/ dir. Never call getPngSize on an SVG file.
185
+ if (!isDir && resolved.endsWith(".svg") && format === "set") {
186
+ return [{ file: resolved, size: 1024 }];
187
+ }
188
+ const outExt = format === "set" ? ".png" : "." + format;
189
+ // If source already has the target extension and is not a directory, return it directly
190
+ if (!isDir && resolved.endsWith(outExt)) {
191
+ if (format === "icns") {
192
+ return [{ file: resolved, size: 0 }];
193
+ }
194
+ if (format === "ico") {
195
+ const size = await getIcoMaxSize(resolved);
196
+ if (size === null) {
197
+ throw new IconConversionError(`Icon is not a valid ICO file: ${resolved}`, "ERR_ICON_UNKNOWN_FORMAT");
198
+ }
199
+ if (size < 256) {
200
+ throw new IconConversionError(`Icon must be at least 256x256 pixels, provided: ${size}x${size}`, "ERR_ICON_TOO_SMALL");
201
+ }
202
+ return [{ file: resolved, size }];
203
+ }
204
+ // set: source is already a .png — return as-is with its dimensions
205
+ const { width, height } = await getPngSize(resolved);
206
+ return [{ file: resolved, size: Math.max(width, height) }];
207
+ }
208
+ if (isDir) {
209
+ const { icons, fallbackFile } = await collectIconsFromDir(resolved);
210
+ if (format === "set") {
211
+ if (icons.length > 0) {
212
+ return icons;
213
+ }
214
+ if (fallbackFile) {
215
+ return doConvertSingleFile(fallbackFile, format, outDir);
216
+ }
217
+ return null;
218
+ }
219
+ if (icons.length > 0) {
220
+ // Use largest available PNG from the directory as CLI input
221
+ const maxIcon = icons[icons.length - 1];
222
+ await (0, promises_1.mkdir)(outDir, { recursive: true });
223
+ await (0, icons_1.runIconsTool)({ inputFile: maxIcon.file, outputFormat: format, outDir });
224
+ return collectCliOutput(outDir, format, maxIcon.size);
225
+ }
226
+ if (fallbackFile) {
227
+ return doConvertSingleFile(fallbackFile, format, outDir);
228
+ }
229
+ return null;
230
+ }
231
+ // Single file: ICNS → ico or set — pass ICNS directly to CLI (CLI handles extraction)
232
+ if (resolved.endsWith(".icns") && format !== "icns") {
233
+ await (0, promises_1.mkdir)(outDir, { recursive: true });
234
+ await (0, icons_1.runIconsTool)({ inputFile: resolved, outputFormat: format, outDir });
235
+ return collectCliOutput(outDir, format);
236
+ }
237
+ return doConvertSingleFile(resolved, format, outDir);
238
+ }
239
+ async function doConvertSingleFile(sourceFile, format, outDir) {
240
+ const ext = path.extname(sourceFile).toLowerCase();
241
+ let maxSize;
242
+ if (ext === ".svg") {
243
+ maxSize = 1024; // CLI rasterizes SVG at 1024px
244
+ }
245
+ else {
246
+ const { width, height } = await getPngSize(sourceFile);
247
+ maxSize = Math.max(width, height);
248
+ if (maxSize === 0) {
249
+ return null;
250
+ }
251
+ const recommendedMin = format === "icns" ? 512 : 256;
252
+ if (maxSize < recommendedMin) {
253
+ throw new IconConversionError(`Icon must be at least ${recommendedMin}x${recommendedMin} pixels, provided: ${maxSize}x${maxSize}`, "ERR_ICON_TOO_SMALL");
254
+ }
255
+ }
256
+ await (0, promises_1.mkdir)(outDir, { recursive: true });
257
+ await (0, icons_1.runIconsTool)({ inputFile: sourceFile, outputFormat: format, outDir });
258
+ return collectCliOutput(outDir, format, maxSize);
259
+ }
260
+ //# sourceMappingURL=iconConverter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iconConverter.js","sourceRoot":"","sources":["../../src/util/iconConverter.ts"],"names":[],"mappings":"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","sourcesContent":["import { mkdir, readFile, readdir, rename, stat } from \"fs/promises\"\nimport * as path from \"path\"\nimport { runIconsTool } from \"../toolsets/icons\"\n\nclass IconConversionError extends Error {\n constructor(\n message: string,\n readonly errorCode: string\n ) {\n super(message)\n ;(this as NodeJS.ErrnoException).code = errorCode\n }\n}\n\nexport interface IconInfo {\n file: string\n size: number\n}\n\nexport type IconFormat = \"icns\" | \"ico\" | \"set\"\n\nexport interface IconConvertResult {\n icons: IconInfo[]\n isFallback: boolean\n error?: string\n errorCode?: string\n}\n\n// ─── Public API ──────────────────────────────────────────────────────────────\n\ntype IconConversionConfig = {\n sources: string[]\n fallbackSources: string[]\n roots: string[]\n format: IconFormat\n outDir: string\n}\n\nexport async function convertIcon({ sources, fallbackSources, roots, format, outDir }: IconConversionConfig): Promise<IconConvertResult> {\n const candidates = buildSourceCandidates(sources, format)\n\n let icons = await doConvertIcon(candidates, roots, format, outDir)\n\n let isFallback = false\n if (icons == null) {\n const fallbackCandidates = buildSourceCandidates(fallbackSources, format)\n icons = await doConvertIcon(fallbackCandidates, roots, format, outDir)\n isFallback = true\n }\n\n return { icons: icons ?? [], isFallback }\n}\n\n// ─── PNG dimension reader ─────────────────────────────────────────────────────\n// Reads width/height from the PNG IHDR chunk at a fixed offset (no dependencies).\n\nexport async function getPngSize(filePath: string): Promise<{ width: number; height: number }> {\n const buf = await readFile(filePath)\n // PNG signature = 8 bytes, IHDR chunk header = 8 bytes → width at 16, height at 20\n if (buf.length < 24) {\n return { width: 0, height: 0 }\n }\n return { width: buf.readUInt32BE(16), height: buf.readUInt32BE(20) }\n}\n\n// ─── ICO header parser ────────────────────────────────────────────────────────\n\nasync function getIcoMaxSize(filePath: string): Promise<number | null> {\n const buf = await readFile(filePath)\n if (buf.length < 6 || buf[0] !== 0 || buf[1] !== 0 || buf[2] !== 1 || buf[3] !== 0) {\n return null\n }\n const count = buf.readUInt16LE(4)\n let max = 0\n for (let i = 0; i < count; i++) {\n const off = 6 + i * 16\n if (off + 2 > buf.length) {\n break\n }\n const w = buf[off] || 256\n const h = buf[off + 1] || 256\n if (w > max) {\n max = w\n }\n if (h > max) {\n max = h\n }\n }\n return max\n}\n\n// ─── Set output remapper ──────────────────────────────────────────────────────\n// CLI outputs NxN.png; remap to icon_NxN.png to preserve existing naming convention.\n\nasync function remapSetOutput(outDir: string): Promise<IconInfo[]> {\n const entries = await readdir(outDir)\n const result: IconInfo[] = []\n for (const name of entries) {\n const match = name.match(/^(\\d+)x\\d+\\.png$/)\n if (!match) {\n continue\n }\n const size = parseInt(match[1], 10)\n const oldPath = path.join(outDir, name)\n const newPath = path.join(outDir, `icon_${size}x${size}.png`)\n await rename(oldPath, newPath)\n result.push({ file: newPath, size })\n }\n return result.sort((a, b) => a.size - b.size)\n}\n\n// ─── CLI output collector ─────────────────────────────────────────────────────\n\nasync function collectCliOutput(outDir: string, format: IconFormat, sourceMaxSize = 0): Promise<IconInfo[]> {\n if (format === \"icns\") {\n return [{ file: path.join(outDir, \"icon.icns\"), size: sourceMaxSize }]\n }\n if (format === \"ico\") {\n const icoFile = path.join(outDir, \"icon.ico\")\n const size = await getIcoMaxSize(icoFile)\n return [{ file: icoFile, size: size ?? sourceMaxSize }]\n }\n return remapSetOutput(outDir)\n}\n\n// ─── File resolution (matches go fileResolver.go + icon-converter.go) ────────\n\nfunction imageHasExtension(name: string, format: string): boolean {\n return name.endsWith(\".\" + format) || name.endsWith(\".png\") || name.endsWith(\".ico\") || name.endsWith(\".svg\") || name.endsWith(\".icns\")\n}\n\nexport function buildSourceCandidates(sources: string[], format: IconFormat): string[] {\n const result: string[] = []\n for (const src of sources) {\n if (imageHasExtension(src, format)) {\n result.push(src)\n } else {\n if (format !== \"set\") {\n result.push(src + \".\" + format)\n }\n result.push(src)\n result.push(src + \".png\")\n result.push(src + \".svg\")\n if (format !== \"icns\") {\n result.push(src + \".icns\")\n if (format !== \"ico\") {\n result.push(src + \".ico\")\n }\n }\n }\n }\n if (format !== \"set\") {\n result.push(\"icon.\" + format)\n }\n for (const setName of [\"icons\", \"icon\"]) {\n result.push(setName)\n }\n result.push(\"icon.png\")\n result.push(\"icon.svg\")\n if (format !== \"icns\") {\n result.push(\"icon.icns\")\n if (format !== \"ico\") {\n result.push(\"icon.ico\")\n }\n }\n // Deduplicate while preserving order so resolveSourceFile never stats the same path twice\n return [...new Set(result)]\n}\n\nasync function resolveSourceFile(candidates: string[], roots: string[]): Promise<{ resolved: string; isDir: boolean } | null> {\n for (const candidate of candidates) {\n const absPath = path.isAbsolute(candidate) ? path.normalize(candidate) : null\n const searchPaths = absPath ? [absPath] : roots.map(r => path.join(r, candidate))\n\n for (const p of searchPaths) {\n try {\n const s = await stat(p)\n return { resolved: p, isDir: s.isDirectory() }\n } catch {\n // not found, try next\n }\n }\n }\n return null\n}\n\n// ─── Directory icon collection (go collect-icons.go) ────────────────────────\n\nasync function collectIconsFromDir(dir: string): Promise<{ icons: IconInfo[]; fallbackFile: string | null }> {\n const entries = await readdir(dir)\n const sizeMap = new Map<number, IconInfo>()\n let fallbackFile: string | null = null\n\n for (const name of entries) {\n if (name === \"icon.png\" || name === \"icon.PNG\") {\n fallbackFile = path.join(dir, name)\n continue\n }\n const match = name.match(/^(\\d+)(?:x\\d+)?\\.png$/i)\n if (!match) {\n continue\n }\n const size = parseInt(match[1], 10)\n if (isNaN(size)) {\n continue\n }\n const filePath = path.join(dir, name)\n const existing = sizeMap.get(size)\n if (!existing || name.length < path.basename(existing.file).length) {\n sizeMap.set(size, { file: filePath, size })\n }\n }\n\n const icons = Array.from(sizeMap.values()).sort((a, b) => a.size - b.size)\n return { icons, fallbackFile }\n}\n\n// ─── Main conversion logic ───────────────────────────────────────────────────\n\nasync function doConvertIcon(candidates: string[], roots: string[], format: IconFormat, outDir: string): Promise<IconInfo[] | null> {\n const found = await resolveSourceFile(candidates, roots)\n if (!found) {\n return null\n }\n\n const { resolved, isDir } = found\n\n // SVG source for set format: return the SVG directly — Linux targets place it in\n // the freedesktop scalable/ dir. Never call getPngSize on an SVG file.\n if (!isDir && resolved.endsWith(\".svg\") && format === \"set\") {\n return [{ file: resolved, size: 1024 }]\n }\n\n const outExt = format === \"set\" ? \".png\" : \".\" + format\n\n // If source already has the target extension and is not a directory, return it directly\n if (!isDir && resolved.endsWith(outExt)) {\n if (format === \"icns\") {\n return [{ file: resolved, size: 0 }]\n }\n if (format === \"ico\") {\n const size = await getIcoMaxSize(resolved)\n if (size === null) {\n throw new IconConversionError(`Icon is not a valid ICO file: ${resolved}`, \"ERR_ICON_UNKNOWN_FORMAT\")\n }\n if (size < 256) {\n throw new IconConversionError(`Icon must be at least 256x256 pixels, provided: ${size}x${size}`, \"ERR_ICON_TOO_SMALL\")\n }\n return [{ file: resolved, size }]\n }\n // set: source is already a .png — return as-is with its dimensions\n const { width, height } = await getPngSize(resolved)\n return [{ file: resolved, size: Math.max(width, height) }]\n }\n\n if (isDir) {\n const { icons, fallbackFile } = await collectIconsFromDir(resolved)\n\n if (format === \"set\") {\n if (icons.length > 0) {\n return icons\n }\n if (fallbackFile) {\n return doConvertSingleFile(fallbackFile, format, outDir)\n }\n return null\n }\n\n if (icons.length > 0) {\n // Use largest available PNG from the directory as CLI input\n const maxIcon = icons[icons.length - 1]\n await mkdir(outDir, { recursive: true })\n await runIconsTool({ inputFile: maxIcon.file, outputFormat: format, outDir })\n return collectCliOutput(outDir, format, maxIcon.size)\n }\n\n if (fallbackFile) {\n return doConvertSingleFile(fallbackFile, format, outDir)\n }\n return null\n }\n\n // Single file: ICNS → ico or set — pass ICNS directly to CLI (CLI handles extraction)\n if (resolved.endsWith(\".icns\") && format !== \"icns\") {\n await mkdir(outDir, { recursive: true })\n await runIconsTool({ inputFile: resolved, outputFormat: format, outDir })\n return collectCliOutput(outDir, format)\n }\n\n return doConvertSingleFile(resolved, format, outDir)\n}\n\nasync function doConvertSingleFile(sourceFile: string, format: IconFormat, outDir: string): Promise<IconInfo[] | null> {\n const ext = path.extname(sourceFile).toLowerCase()\n let maxSize: number\n\n if (ext === \".svg\") {\n maxSize = 1024 // CLI rasterizes SVG at 1024px\n } else {\n const { width, height } = await getPngSize(sourceFile)\n maxSize = Math.max(width, height)\n if (maxSize === 0) {\n return null\n }\n const recommendedMin = format === \"icns\" ? 512 : 256\n if (maxSize < recommendedMin) {\n throw new IconConversionError(`Icon must be at least ${recommendedMin}x${recommendedMin} pixels, provided: ${maxSize}x${maxSize}`, \"ERR_ICON_TOO_SMALL\")\n }\n }\n\n await mkdir(outDir, { recursive: true })\n await runIconsTool({ inputFile: sourceFile, outputFormat: format, outDir })\n return collectCliOutput(outDir, format, maxSize)\n}\n"]}