@kizenapps/packager 0.3.0-18bea71 → 0.4.0-6ad8aed

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/minify.ts","../src/lib/apiNames.ts","../src/lib/image.ts","../src/lib/structure.ts","../src/lib/package.ts","../src/lib/transform.ts","../src/lib/crypto.ts"],"sourcesContent":["import type { FileContent, MinifiedFileContent } from \"../types/files.js\";\n\nconst minifyFile = async (file: FileContent): Promise<string> => {\n if (file.path.endsWith(\".js\")) {\n if (!file.content) {\n return \"\";\n }\n\n const { minify } = await import(\"@node-minify/core\");\n const { uglifyJs } = await import(\"@node-minify/uglify-js\");\n\n // The @node-minify generic Compressor type causes variance issues in strict TS.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result: string = await (minify as (opts: any) => Promise<string>)({\n compressor: uglifyJs,\n content: file.content,\n options: {\n mangle: true,\n parse: {\n bare_returns: true,\n },\n },\n });\n\n return result;\n }\n\n return file.content;\n};\n\nexport const minifyFiles = async (\n files: FileContent[],\n): Promise<MinifiedFileContent[]> => {\n return Promise.all(\n files.map(async (file) => {\n const minified = await minifyFile(file);\n return { ...file, minified };\n }),\n );\n};\n","import type { AutomationScriptRuntimeInput, AutomationScriptRuntimeOutput } from \"../types/package.js\";\n\nexport const sanitizeToAPIName = (name: string): string => {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9\\-\\s]/g, \"\")\n .replace(/\\s+/g, \"_\");\n};\n\nexport const scriptRuntimeToApiName = (\n runtime: AutomationScriptRuntimeInput,\n): AutomationScriptRuntimeOutput => {\n const result = runtime\n .replace(/\\s+/g, \"-\")\n .replace(/\\./g, \"-\") as AutomationScriptRuntimeOutput;\n\n return result;\n};\n","export const imagetoUint8Array = (base64Image: string): Uint8Array => {\n const byteCharacters = atob(base64Image);\n const byteNumbers = new Array(byteCharacters.length);\n\n for (let i = 0; i < byteCharacters.length; i++) {\n byteNumbers[i] = byteCharacters.charCodeAt(i);\n }\n\n return new Uint8Array(byteNumbers);\n};\n\nexport const zipToUint8Array = (zip: Buffer): Uint8Array => {\n return Uint8Array.from(zip);\n};\n","import type { MinifiedFileContent } from \"../types/files.js\";\n\nexport const thumbnailImageExtensions = [\"png\"];\nexport const triggerImageExtensions = [...thumbnailImageExtensions, \"svg\"];\n\nexport const EVENT_SCRIPTS_DIRECTORY_NAME = \"eventScripts\";\nexport const FLOATING_FRAMES_DIRECTORY_NAME = \"floatingFrames\";\nexport const DATA_ADORNMENTS_DIRECTORY_NAME = \"dataAdornments\";\nexport const TOOLBAR_ITEMS_DIRECTORY_NAME = \"toolbarItems\";\nexport const ROUTABLE_PAGES_DIRECTORY_NAME = \"pages\";\nexport const BROWSER_ROUTE_SCRIPTS_DIRECTORY_NAME = \"routeScripts\";\nexport const JS_ACTIONS_DIRECTORY_NAME = \"actions\";\nexport const OBJECT_SETTINGS_ITEMS_DIRECTORY_NAME = \"objectSettingsItems\";\nexport const AUTOMATION_STEPS_DIRECTORY_NAME = \"automationSteps\";\nexport const SETUP_ASSISTANT_DIRECTORY_NAME = \"setupAssistant\";\nexport const USER_SETUP_ASSISTANT_DIRECTORY_NAME = \"userSetupAssistant\";\nexport const CALENDAR_SOURCES_DIRECTORY_NAME = \"calendarSources\";\nexport const VIEWS_DIRECTORY_NAME = \"views\";\nexport const BLOCKS_DIRECTORY_NAME = \"blocks\";\n\nexport const THUMBNAIL_FILE_NAMES = thumbnailImageExtensions.map(\n (ext) => `thumbnail.${ext}`,\n);\n\nexport const RELEASE_NOTES_EXTENSION = \"md\";\nexport const SCRIPT_EXTENSION = \"js\";\n\nexport const MAIN_SCRIPT_FILE = `script.${SCRIPT_EXTENSION}`;\nexport const MESSAGE_SCRIPT_FILE = `message.${SCRIPT_EXTENSION}`;\nexport const CALLBACK_SCRIPT_FILE = `callback.${SCRIPT_EXTENSION}`;\nexport const AUTOMATION_SCRIPT_FILE = `script.py`;\nexport const VIEW_FILE = \"index.html\";\n\nexport const CONFIG_FILE_NAME = \"config.json\";\nexport const STYLES_FILE_NAME = \"styles.css\";\nexport const MANIFEST_FILE_NAME = \"kizen.json\";\nexport const KZN_FILE_NAME = \"import.kzn\";\n\nexport const maybeParseConfig = (\n content: string | undefined,\n path: string,\n): Record<string, unknown> => {\n if (!content) {\n throw new Error(`No content provided for config file: ${path}`);\n }\n\n try {\n return JSON.parse(content) as Record<string, unknown>;\n } catch {\n throw new Error(`Failed to parse config content: ${path}`);\n }\n};\n\nexport const getMinimizedConfig = (\n config: Record<string, unknown>,\n entry: string,\n splitPath: string[],\n consideredFiles: MinifiedFileContent[],\n): Record<string, unknown> => {\n const result: Record<string, unknown> =\n (config[\"minimized_config\"] as Record<string, unknown>) ?? {};\n\n if (result[\"customIconFile\"]) {\n let basePath = splitPath.slice(0, -1).join(\"/\");\n\n if (entry.endsWith(\"/\")) {\n basePath = `${entry}${basePath}`;\n } else {\n basePath = `${entry}/${basePath}`;\n }\n\n const filePath = `${basePath}/${result[\"customIconFile\"]}`;\n const file = consideredFiles.find((f) => f.path === filePath);\n\n if (file?.base64Image) {\n let extension = filePath.split(\".\").pop()?.toLowerCase();\n\n if (extension === \"svg\") {\n extension = \"svg+xml\";\n }\n\n result[\"customIcon\"] =\n `data:image/${extension};base64,${file.base64Image}`;\n }\n }\n\n return result;\n};\n\nexport const getAdornmentIcon = (\n config: Record<string, unknown>,\n entry: string,\n splitPath: string[],\n consideredFiles: MinifiedFileContent[],\n): string => {\n if (config[\"customIconFile\"]) {\n let basePath = splitPath.slice(0, -1).join(\"/\");\n\n if (entry.endsWith(\"/\")) {\n basePath = `${entry}${basePath}`;\n } else {\n basePath = `${entry}/${basePath}`;\n }\n\n const filePath = `${basePath}/${config[\"customIconFile\"]}`;\n const file = consideredFiles.find((f) => f.path === filePath);\n\n if (file?.base64Image) {\n let extension = filePath.split(\".\").pop()?.toLowerCase();\n\n if (extension === \"svg\") {\n extension = \"svg+xml\";\n }\n\n return `data:image/${extension};base64,${file.base64Image}`;\n }\n }\n\n return \"\";\n};\n","import type { ManifestFileContent } from \"../types/manifest.js\";\nimport type { MinifiedFileContent } from \"../types/files.js\";\nimport type {\n AutomationStepsMap,\n BlocksMap,\n CalendarSourcesMap,\n DataAdornmentsMap,\n FloatingFramesMap,\n JSActionsMap,\n ObjectSettingsItemsMap,\n ProcessedPluginPackage,\n RoutablePagesMap,\n RouteScriptsMap,\n ToolbarItemsMap,\n} from \"../types/package.js\";\nimport { sanitizeToAPIName, scriptRuntimeToApiName } from \"./apiNames.js\";\nimport { imagetoUint8Array, zipToUint8Array } from \"./image.js\";\nimport {\n AUTOMATION_SCRIPT_FILE,\n AUTOMATION_STEPS_DIRECTORY_NAME,\n BLOCKS_DIRECTORY_NAME,\n BROWSER_ROUTE_SCRIPTS_DIRECTORY_NAME,\n CALLBACK_SCRIPT_FILE,\n CALENDAR_SOURCES_DIRECTORY_NAME,\n CONFIG_FILE_NAME,\n DATA_ADORNMENTS_DIRECTORY_NAME,\n EVENT_SCRIPTS_DIRECTORY_NAME,\n FLOATING_FRAMES_DIRECTORY_NAME,\n getAdornmentIcon,\n getMinimizedConfig,\n JS_ACTIONS_DIRECTORY_NAME,\n KZN_FILE_NAME,\n MAIN_SCRIPT_FILE,\n MANIFEST_FILE_NAME,\n maybeParseConfig,\n MESSAGE_SCRIPT_FILE,\n OBJECT_SETTINGS_ITEMS_DIRECTORY_NAME,\n RELEASE_NOTES_EXTENSION,\n ROUTABLE_PAGES_DIRECTORY_NAME,\n SCRIPT_EXTENSION,\n SETUP_ASSISTANT_DIRECTORY_NAME,\n STYLES_FILE_NAME,\n THUMBNAIL_FILE_NAMES,\n TOOLBAR_ITEMS_DIRECTORY_NAME,\n USER_SETUP_ASSISTANT_DIRECTORY_NAME,\n VIEWS_DIRECTORY_NAME,\n VIEW_FILE,\n} from \"./structure.js\";\n\nconst replacementVar = \"__kizen_state\";\nconst prepend = \"const __kizen_utils = {};\\n\";\n\nconst convertToSelfInvokingFunction = (\n fn: string,\n variable: string,\n args: Record<string, unknown> = {},\n prependCode = \"\",\n): string => {\n const functionString = fn.replace(/\\n$/, \"\").replace(/;$/, \"\");\n const inner = `(${functionString})({ state: {{${variable}}}, args: ${JSON.stringify(args)}, utils: __kizen_utils })`;\n const full = `(function() { ${prependCode}\\nreturn ${inner}; })()`;\n return full;\n};\n\nconst mapFields = (\n fields: Array<Record<string, unknown>>,\n scriptsByKey: Record<string, Record<string, string>>,\n): Array<Record<string, unknown>> => {\n return fields.map((field) => {\n if (\n field[\"type\"] === \"container\" &&\n field[\"fields\"] &&\n Array.isArray(field[\"fields\"])\n ) {\n return {\n ...field,\n fields: mapFields(\n field[\"fields\"] as Array<Record<string, unknown>>,\n scriptsByKey,\n ),\n };\n }\n\n const fieldKey = field[\"key\"] as string;\n const scripts = scriptsByKey[fieldKey];\n\n if (scripts) {\n const result = { ...field };\n\n for (const fnName of [\n \"getFetchUrl\",\n \"optionMapper\",\n \"getHeaders\",\n \"getBody\",\n \"getContextUrl\",\n ] as const) {\n const fn = scripts[fnName];\n if (fn) {\n result[fnName] = convertToSelfInvokingFunction(\n fn,\n replacementVar,\n {},\n prepend,\n );\n }\n }\n\n return result;\n }\n\n return field;\n });\n};\n\nconst processSetupAssistantFromFiles = (\n assistantConfig: Record<string, unknown> | null,\n scripts: Array<{ key: string; type: string; content: string }>,\n): Record<string, unknown> | undefined => {\n if (!assistantConfig) {\n return undefined;\n }\n\n const scriptsByKey: Record<string, Record<string, string>> = scripts.reduce(\n (acc, script) => {\n (acc[script.key] ??= {})[script.type] = script.content;\n return acc;\n },\n {} as Record<string, Record<string, string>>,\n );\n\n const newConfig = { ...assistantConfig };\n\n if (newConfig[\"fields\"] && Array.isArray(newConfig[\"fields\"])) {\n newConfig[\"fields\"] = mapFields(\n newConfig[\"fields\"] as Array<Record<string, unknown>>,\n scriptsByKey,\n );\n }\n\n return newConfig;\n};\n\nconst processOnePluginFromManifest = (\n manifest: ManifestFileContent,\n files: MinifiedFileContent[],\n): ProcessedPluginPackage => {\n const entry = manifest.entry;\n const releaseNotesDirectory = manifest.release_notes_directory;\n const apiName = manifest.api_name;\n\n const consideredFiles = files.filter(\n (f) =>\n f.path !== MANIFEST_FILE_NAME &&\n f.path.startsWith(entry) &&\n !f.path.endsWith(\".DS_Store\"),\n );\n\n const releaseNotesFiles = releaseNotesDirectory\n ? files.filter((f) => f.path.startsWith(releaseNotesDirectory))\n : [];\n\n const { version } = manifest;\n\n const releaseNotes = releaseNotesFiles.find((file) =>\n file.path.endsWith(`${version}.${RELEASE_NOTES_EXTENSION}`),\n );\n\n const floatingFrames: FloatingFramesMap = {};\n const blocks: BlocksMap = {};\n const dataAdornments: DataAdornmentsMap = {};\n const toolbarItems: ToolbarItemsMap = {};\n const routablePages: RoutablePagesMap = {};\n const routeScripts: RouteScriptsMap = {};\n const jsActions: JSActionsMap = {};\n const objectSettingsItems: ObjectSettingsItemsMap = {};\n const automationSteps: AutomationStepsMap = {};\n const calendarSources: CalendarSourcesMap = {};\n\n let thumbnail: Uint8Array | null = null;\n let kznFile: Uint8Array | null = null;\n let hasBlockingCondition = false;\n\n const requiredConfigFiles: Record<string, boolean> = {};\n\n let setupAssistantJSON: Record<string, unknown> | null = null;\n const setupAssistantFunctions: Array<{\n key: string;\n type: string;\n content: string;\n }> = [];\n\n let userSetupAssistantJSON: Record<string, unknown> | null = null;\n const userSetupAssistantFunctions: Array<{\n key: string;\n type: string;\n content: string;\n }> = [];\n\n for (const file of consideredFiles) {\n let strippedPath = file.path.replace(entry, \"\");\n strippedPath = strippedPath.startsWith(\"/\")\n ? strippedPath.substring(1)\n : strippedPath;\n\n const splitPath = strippedPath.split(\"/\");\n\n if (splitPath[0] === SETUP_ASSISTANT_DIRECTORY_NAME) {\n if (splitPath[1] === \"assistant.json\") {\n setupAssistantJSON = maybeParseConfig(file.content, file.path);\n } else {\n const assistantKey = splitPath[1];\n if (assistantKey && splitPath[2]?.endsWith(`.${SCRIPT_EXTENSION}`)) {\n setupAssistantFunctions.push({\n key: assistantKey,\n type: splitPath[2].replace(`.${SCRIPT_EXTENSION}`, \"\"),\n content: file.content,\n });\n }\n }\n } else if (splitPath[0] === USER_SETUP_ASSISTANT_DIRECTORY_NAME) {\n if (splitPath[1] === \"assistant.json\") {\n userSetupAssistantJSON = maybeParseConfig(file.content, file.path);\n } else {\n const assistantKey = splitPath[1];\n if (assistantKey && splitPath[2]?.endsWith(`.${SCRIPT_EXTENSION}`)) {\n userSetupAssistantFunctions.push({\n key: assistantKey,\n type: splitPath[2].replace(`.${SCRIPT_EXTENSION}`, \"\"),\n content: file.content,\n });\n }\n }\n } else if (splitPath[0] === FLOATING_FRAMES_DIRECTORY_NAME) {\n const floatingFrameName = splitPath[1];\n\n if (!floatingFrameName) {\n continue;\n }\n\n if (!floatingFrames[floatingFrameName]) {\n requiredConfigFiles[`frame:${floatingFrameName}`] = true;\n floatingFrames[floatingFrameName] = {\n name: \"\",\n api_name: \"\",\n title: \"\",\n type: \"script\",\n css: \"\",\n event_scripts: {},\n default_position: \"bottom-right\",\n header_color: \"\",\n header_text_color: \"\",\n height: 0,\n width: 0,\n ignore: [],\n match: [],\n message_handler: \"\",\n minimized_style: \"circle\",\n minimized_config: {},\n script: \"\",\n html: \"\",\n when: \"\",\n };\n }\n\n const frame = floatingFrames[floatingFrameName];\n\n if (splitPath[2] === EVENT_SCRIPTS_DIRECTORY_NAME) {\n if (splitPath[3]?.endsWith(`.${SCRIPT_EXTENSION}`)) {\n const functionName = splitPath[3].replace(`.${SCRIPT_EXTENSION}`, \"\");\n frame.event_scripts[functionName] = file.minified;\n }\n } else if (splitPath[2] === CONFIG_FILE_NAME) {\n requiredConfigFiles[`frame:${floatingFrameName}`] = false;\n const config = maybeParseConfig(file.content, file.path);\n frame.name = (config[\"name\"] as string) || \"\";\n frame.api_name =\n (config[\"api_name\"] as string) ||\n sanitizeToAPIName(floatingFrameName);\n frame.title = (config[\"title\"] as string) || \"\";\n frame.default_position =\n (config[\"default_position\"] as string) || \"bottom-right\";\n frame.header_color = (config[\"header_color\"] as string) || \"\";\n frame.header_text_color = (config[\"header_text_color\"] as string) || \"\";\n frame.height = (config[\"height\"] as number) || 0;\n frame.width = (config[\"width\"] as number) || 0;\n frame.ignore = (config[\"ignore\"] as string[]) || [];\n frame.match = (config[\"match\"] as string[]) || [];\n frame.html = (config[\"html\"] as string) || \"\";\n frame.minimized_style =\n (config[\"minimized_style\"] as \"bar\" | \"circle\" | \"none\") || \"circle\";\n frame.minimized_config = getMinimizedConfig(\n config,\n entry,\n splitPath,\n consideredFiles,\n );\n frame.when = (config[\"when\"] as string) || \"\";\n } else if (splitPath[2] === MESSAGE_SCRIPT_FILE) {\n frame.message_handler = file.minified;\n } else if (splitPath[2] === MAIN_SCRIPT_FILE) {\n frame.script = file.minified;\n } else if (splitPath[2] === STYLES_FILE_NAME) {\n frame.css = file.minified;\n }\n } else if (splitPath[0] === BLOCKS_DIRECTORY_NAME) {\n const blockName = splitPath[1];\n\n if (!blockName) {\n continue;\n }\n\n if (!blocks[blockName]) {\n requiredConfigFiles[`block:${blockName}`] = true;\n blocks[blockName] = {\n name: \"\",\n api_name: \"\",\n min_w: 1,\n max_w: 12,\n min_h: 1,\n max_h: 12,\n event_scripts: {},\n script: \"\",\n styles: \"\",\n when: \"\",\n };\n }\n\n const block = blocks[blockName];\n\n if (splitPath[2] === EVENT_SCRIPTS_DIRECTORY_NAME) {\n if (splitPath[3]?.endsWith(`.${SCRIPT_EXTENSION}`)) {\n const functionName = splitPath[3].replace(`.${SCRIPT_EXTENSION}`, \"\");\n block.event_scripts[functionName] = file.minified;\n }\n } else if (splitPath[2] === CONFIG_FILE_NAME) {\n requiredConfigFiles[`block:${blockName}`] = false;\n\n const config = maybeParseConfig(file.content, file.path);\n\n block.name = (config[\"name\"] as string) || \"\";\n block.api_name =\n (config[\"api_name\"] as string) || sanitizeToAPIName(blockName);\n block.min_w = (config[\"min_w\"] as number) || 1;\n block.max_w = (config[\"max_w\"] as number) || 12;\n block.min_h = (config[\"min_h\"] as number) || 1;\n block.max_h = (config[\"max_h\"] as number) || 12;\n\n if (config[\"recommended_height\"] != null) {\n block.recommended_height = config[\"recommended_height\"] as number;\n }\n\n if (config[\"types\"]) {\n block.types = config[\"types\"] as string[];\n }\n\n block.when = (config[\"when\"] as string) || \"\";\n\n if (config[\"when\"]) {\n hasBlockingCondition = true;\n }\n } else if (splitPath[2] === MAIN_SCRIPT_FILE) {\n block.script = file.minified;\n } else if (splitPath[2] === STYLES_FILE_NAME) {\n block.styles = file.minified;\n }\n } else if (splitPath[0] === DATA_ADORNMENTS_DIRECTORY_NAME) {\n const dataAdornmentName = splitPath[1];\n\n if (!dataAdornmentName) {\n continue;\n }\n\n if (!dataAdornments[dataAdornmentName]) {\n requiredConfigFiles[`dataAdornment:${dataAdornmentName}`] = true;\n dataAdornments[dataAdornmentName] = {\n config: { icon: \"\", color: \"\", tooltip: \"\" },\n field_type: \"phonenumber\",\n script: \"\",\n when: \"\",\n };\n }\n\n const adornment = dataAdornments[dataAdornmentName];\n\n if (splitPath[2] === CONFIG_FILE_NAME) {\n requiredConfigFiles[`dataAdornment:${dataAdornmentName}`] = false;\n const config = maybeParseConfig(file.content, file.path);\n adornment.config.icon = (config[\"icon\"] as string) || \"\";\n adornment.config.color = (config[\"color\"] as string) || \"\";\n adornment.config.tooltip = (config[\"tooltip\"] as string) || \"\";\n adornment.config.customIcon = getAdornmentIcon(\n config,\n entry,\n splitPath,\n consideredFiles,\n );\n adornment.field_type =\n (config[\"field_type\"] as \"phonenumber\" | \"date\" | \"datetime\") ||\n \"phonenumber\";\n adornment.when = (config[\"when\"] as string) || \"\";\n if (config[\"when\"]) hasBlockingCondition = true;\n } else if (splitPath[2] === MAIN_SCRIPT_FILE) {\n adornment.script = file.minified;\n }\n } else if (splitPath[0] === TOOLBAR_ITEMS_DIRECTORY_NAME) {\n const toolbarItemName = splitPath[1];\n\n if (!toolbarItemName) {\n continue;\n }\n\n if (!toolbarItems[toolbarItemName]) {\n requiredConfigFiles[`toolbarItem:${toolbarItemName}`] = true;\n toolbarItems[toolbarItemName] = {\n api_name: \"\",\n label: \"\",\n icon: \"\",\n color: \"\",\n script: \"\",\n when: \"\",\n };\n }\n\n const item = toolbarItems[toolbarItemName];\n\n if (splitPath[2] === CONFIG_FILE_NAME) {\n requiredConfigFiles[`toolbarItem:${toolbarItemName}`] = false;\n const config = maybeParseConfig(file.content, file.path);\n item.api_name =\n (config[\"api_name\"] as string) || sanitizeToAPIName(toolbarItemName);\n item.label = (config[\"label\"] as string) || \"\";\n item.icon = (config[\"icon\"] as string) || \"\";\n item.color = (config[\"color\"] as string) || \"\";\n item.when = (config[\"when\"] as string) || \"\";\n if (config[\"when\"]) hasBlockingCondition = true;\n } else if (splitPath[2] === MAIN_SCRIPT_FILE) {\n item.script = file.minified;\n }\n } else if (splitPath[0] === ROUTABLE_PAGES_DIRECTORY_NAME) {\n const pageName = splitPath[1];\n\n if (!pageName) {\n continue;\n }\n\n if (!routablePages[pageName]) {\n requiredConfigFiles[`page:${pageName}`] = true;\n routablePages[pageName] = {\n name: pageName,\n api_name: \"\",\n event_scripts: {},\n script: \"\",\n callback: \"\",\n css: \"\",\n is_toolbar_item: false,\n toolbar_color: \"\",\n toolbar_icon: \"\",\n type: \"script\",\n html: \"\",\n iframe_url: \"\",\n };\n }\n\n const page = routablePages[pageName];\n\n if (splitPath[2] === EVENT_SCRIPTS_DIRECTORY_NAME) {\n if (splitPath[3]?.endsWith(SCRIPT_EXTENSION)) {\n const functionName = splitPath[3].replace(`.${SCRIPT_EXTENSION}`, \"\");\n page.event_scripts[functionName] = file.minified;\n }\n } else if (splitPath[2] === CONFIG_FILE_NAME) {\n requiredConfigFiles[`page:${pageName}`] = false;\n const config = maybeParseConfig(file.content, file.path);\n page.api_name =\n (config[\"api_name\"] as string) || sanitizeToAPIName(pageName);\n page.name = (config[\"name\"] as string) || pageName;\n page.is_toolbar_item = (config[\"is_toolbar_item\"] as boolean) || false;\n page.toolbar_color = (config[\"toolbar_color\"] as string) || \"\";\n page.toolbar_icon = (config[\"toolbar_icon\"] as string) || \"\";\n } else if (splitPath[2] === MAIN_SCRIPT_FILE) {\n page.script = file.minified;\n } else if (splitPath[2] === CALLBACK_SCRIPT_FILE) {\n page.callback = file.minified;\n } else if (splitPath[2] === STYLES_FILE_NAME) {\n page.css = file.minified;\n }\n } else if (splitPath[0] === AUTOMATION_STEPS_DIRECTORY_NAME) {\n const stepName = splitPath[1];\n\n if (!stepName) {\n continue;\n }\n\n if (!automationSteps[stepName]) {\n requiredConfigFiles[`automationStep:${stepName}`] = true;\n automationSteps[stepName] = {\n name: \"\",\n action_step_api_name: \"\",\n overall_description: \"\",\n action_description: \"\",\n action_type: \"\",\n script_runtime: scriptRuntimeToApiName(\"python 3.12\"),\n secrets: [],\n inputs: [],\n outputs: [],\n script: \"\",\n when: \"\",\n };\n }\n\n const step = automationSteps[stepName];\n\n if (splitPath[2] === CONFIG_FILE_NAME) {\n requiredConfigFiles[`automationStep:${stepName}`] = false;\n const config = maybeParseConfig(file.content, file.path);\n step.name = (config[\"name\"] as string) || stepName;\n step.action_step_api_name =\n (config[\"api_name\"] as string) || sanitizeToAPIName(stepName);\n step.overall_description =\n (config[\"plugin_description\"] as string) || \"\";\n step.action_description =\n (config[\"action_description\"] as string) || \"\";\n step.action_type = (config[\"action_type\"] as string) || \"\";\n step.secrets = (config[\"secrets\"] as string[]) || [];\n step.inputs = (config[\"inputs\"] as typeof step.inputs) || [];\n step.outputs = (config[\"outputs\"] as typeof step.outputs) || [];\n step.script_runtime = scriptRuntimeToApiName(\n ((config[\"runtime\"] as string) ||\n \"python 3.12\") as `${string} ${number}.${number}`,\n );\n step.when = (config[\"when\"] as string) || \"\";\n if (config[\"when\"]) hasBlockingCondition = true;\n } else if (splitPath[2] === AUTOMATION_SCRIPT_FILE) {\n step.script = file.content;\n }\n } else if (splitPath[0] === BROWSER_ROUTE_SCRIPTS_DIRECTORY_NAME) {\n const routeName = splitPath[1];\n\n if (!routeName) {\n continue;\n }\n\n if (!routeScripts[routeName]) {\n requiredConfigFiles[`route:${routeName}`] = true;\n routeScripts[routeName] = {\n script: \"\",\n api_name: \"\",\n hint_object_name: \"\",\n routes: [],\n name: routeName,\n };\n }\n\n const route = routeScripts[routeName];\n\n if (splitPath[2] === CONFIG_FILE_NAME) {\n requiredConfigFiles[`route:${routeName}`] = false;\n const config = maybeParseConfig(file.content, file.path);\n route.api_name =\n (config[\"api_name\"] as string) || sanitizeToAPIName(routeName);\n route.hint_object_name = (config[\"hint_object_name\"] as string) || \"\";\n route.routes = (config[\"routes\"] as string[]) || [];\n route.name = (config[\"name\"] as string) || routeName;\n } else if (splitPath[2] === MAIN_SCRIPT_FILE) {\n route.script = file.minified;\n }\n } else if (splitPath[0] === JS_ACTIONS_DIRECTORY_NAME) {\n const actionName = splitPath[1];\n\n if (!actionName) {\n continue;\n }\n\n if (!jsActions[actionName]) {\n requiredConfigFiles[`action:${actionName}`] = true;\n jsActions[actionName] = {\n script: \"\",\n name: \"\",\n hint_object_name: \"\",\n api_name: \"\",\n };\n }\n\n const action = jsActions[actionName];\n\n if (splitPath[2] === CONFIG_FILE_NAME) {\n requiredConfigFiles[`action:${actionName}`] = false;\n const config = maybeParseConfig(file.content, file.path);\n action.name = (config[\"name\"] as string) || actionName;\n action.hint_object_name = (config[\"hint_object_name\"] as string) || \"\";\n action.api_name =\n (config[\"api_name\"] as string) || sanitizeToAPIName(actionName);\n } else if (splitPath[2] === MAIN_SCRIPT_FILE) {\n action.script = file.minified;\n }\n } else if (splitPath[0] === OBJECT_SETTINGS_ITEMS_DIRECTORY_NAME) {\n const itemName = splitPath[1];\n\n if (!itemName) {\n continue;\n }\n\n if (!objectSettingsItems[itemName]) {\n requiredConfigFiles[`objectSettingsItem:${itemName}`] = true;\n objectSettingsItems[itemName] = {\n api_name: \"\",\n label: \"\",\n script: \"\",\n when: \"\",\n };\n }\n\n const settingsItem = objectSettingsItems[itemName];\n\n if (splitPath[2] === CONFIG_FILE_NAME) {\n requiredConfigFiles[`objectSettingsItem:${itemName}`] = false;\n const config = maybeParseConfig(file.content, file.path);\n settingsItem.api_name =\n (config[\"api_name\"] as string) || sanitizeToAPIName(itemName);\n settingsItem.label = (config[\"label\"] as string) || \"\";\n settingsItem.when = (config[\"when\"] as string) || \"\";\n } else if (splitPath[2] === MAIN_SCRIPT_FILE) {\n settingsItem.script = file.minified;\n }\n } else if (splitPath[0] === CALENDAR_SOURCES_DIRECTORY_NAME) {\n const itemName = splitPath[1];\n\n if (!itemName) {\n continue;\n }\n\n if (!calendarSources[itemName]) {\n requiredConfigFiles[`calendarSource:${itemName}`] = true;\n calendarSources[itemName] = {\n api_name: \"\",\n name: \"\",\n calendars_script: \"\",\n events_script: \"\",\n when: \"\",\n };\n }\n\n const cal = calendarSources[itemName];\n\n if (splitPath[2] === CONFIG_FILE_NAME) {\n requiredConfigFiles[`calendarSource:${itemName}`] = false;\n const config = maybeParseConfig(file.content, file.path);\n cal.api_name =\n (config[\"api_name\"] as string) || sanitizeToAPIName(itemName);\n cal.name = (config[\"name\"] as string) || \"\";\n cal.when = (config[\"when\"] as string) || \"\";\n if (config[\"when\"]) hasBlockingCondition = true;\n } else if (splitPath[2] === \"calendars.js\") {\n cal.calendars_script = file.minified;\n } else if (splitPath[2] === \"events.js\") {\n cal.events_script = file.minified;\n }\n // Views are just routable pages with some extra requirements\n } else if (splitPath[0] === VIEWS_DIRECTORY_NAME) {\n const pageName = splitPath[1];\n\n if (!pageName) {\n continue;\n }\n\n if (!routablePages[pageName]) {\n routablePages[pageName] = {\n name: pageName,\n api_name: sanitizeToAPIName(pageName),\n event_scripts: {},\n script: \"\",\n callback: \"\",\n css: \"\",\n is_toolbar_item: false,\n toolbar_color: \"\",\n toolbar_icon: \"\",\n type: \"html\",\n html: \"\",\n iframe_url: \"\",\n };\n }\n\n const page = routablePages[pageName];\n\n if (splitPath[2] === EVENT_SCRIPTS_DIRECTORY_NAME) {\n if (splitPath[3]?.endsWith(SCRIPT_EXTENSION)) {\n const functionName = splitPath[3].replace(`.${SCRIPT_EXTENSION}`, \"\");\n page.event_scripts[functionName] = file.minified;\n }\n } else if (splitPath[2] === CONFIG_FILE_NAME) {\n const config = maybeParseConfig(file.content, file.path);\n page.api_name =\n (config[\"api_name\"] as string) || sanitizeToAPIName(pageName);\n page.name = (config[\"name\"] as string) || pageName;\n } else if (splitPath[2] === VIEW_FILE) {\n page.html = file.content;\n page.type = \"html\";\n } else if (splitPath[2] === MAIN_SCRIPT_FILE) {\n page.script = file.minified;\n page.type = \"script\";\n } else if (splitPath[2] === STYLES_FILE_NAME) {\n page.css = file.minified;\n }\n } else if (splitPath[0] === KZN_FILE_NAME) {\n if (!file.binaryData) {\n throw new Error(\n `KZN file ${file.path} does not contain binary data. Cannot proceed.`,\n );\n }\n\n if (kznFile) {\n throw new Error(\n `Multiple KZN files found for plugin ${apiName}. Only one is allowed.`,\n );\n }\n\n kznFile = zipToUint8Array(file.binaryData);\n } else if (THUMBNAIL_FILE_NAMES.includes(splitPath[0] ?? \"\")) {\n if (file.base64Image) {\n if (thumbnail) {\n throw new Error(\n `Multiple thumbnail files found for plugin ${apiName}. Only one is allowed.`,\n );\n }\n thumbnail = imagetoUint8Array(file.base64Image);\n }\n }\n }\n\n const requiredFileKeys = Object.keys(requiredConfigFiles).filter(\n (key) => requiredConfigFiles[key] === true,\n );\n\n if (requiredFileKeys.length > 0) {\n throw new Error(\n `The following required files are missing for plugin ${apiName}: ${requiredFileKeys.join(\" config.json, \")} config.json. Please ensure these files are present in the repository.`,\n );\n }\n\n const setupAssistantContent = processSetupAssistantFromFiles(\n setupAssistantJSON,\n setupAssistantFunctions,\n );\n\n const userSetupAssistantContent = processSetupAssistantFromFiles(\n userSetupAssistantJSON,\n userSetupAssistantFunctions,\n );\n\n // Build the updated manifest carefully to satisfy exactOptionalPropertyTypes:\n // only set optional fields when they have a value.\n const updatedManifest: ManifestFileContent = {\n ...manifest,\n block_loading_for_setup: hasBlockingCondition,\n };\n\n const resolvedSetupAssistant =\n manifest.setup_assistant ??\n (setupAssistantContent as ManifestFileContent[\"setup_assistant\"]);\n if (resolvedSetupAssistant !== undefined) {\n updatedManifest.setup_assistant = resolvedSetupAssistant;\n }\n\n const resolvedUserSetupAssistant =\n manifest.user_setup_assistant ??\n (userSetupAssistantContent as ManifestFileContent[\"user_setup_assistant\"]);\n if (resolvedUserSetupAssistant !== undefined) {\n updatedManifest.user_setup_assistant = resolvedUserSetupAssistant;\n }\n\n return {\n [apiName]: {\n manifest: updatedManifest,\n thumbnail,\n floatingFrames,\n blocks,\n dataAdornments,\n toolbarItems,\n routablePages,\n actions: jsActions,\n routeScripts,\n releaseNotes: releaseNotes?.content,\n objectSettingsMenuItems: objectSettingsItems,\n calendarSources,\n automationSteps,\n kznFile,\n },\n };\n};\n\n/**\n * Packages one or more plugins from the given set of minified files.\n * The caller is responsible for any branch-based filtering of manifests before calling.\n */\nexport const packagePlugin = (\n files: MinifiedFileContent[],\n manifests: ManifestFileContent | ManifestFileContent[],\n): ProcessedPluginPackage => {\n const manifestArray = Array.isArray(manifests) ? manifests : [manifests];\n\n return manifestArray.reduce<ProcessedPluginPackage>((acc, manifest) => {\n return { ...acc, ...processOnePluginFromManifest(manifest, files) };\n }, {});\n};\n\n/**\n * Reads and parses kizen.json from a set of files.\n * Returns the manifest content (single or array) without any branch defaulting.\n */\nexport const parseManifestFromFiles = (\n files: MinifiedFileContent[],\n): ManifestFileContent | ManifestFileContent[] => {\n const manifestFile = files.find((f) => f.path === MANIFEST_FILE_NAME);\n\n if (!manifestFile) {\n throw new Error(\"Missing kizen.json at the root of the plugin directory.\");\n }\n\n try {\n return JSON.parse(manifestFile.content) as\n | ManifestFileContent\n | ManifestFileContent[];\n } catch {\n throw new Error(\"kizen.json could not be parsed.\");\n }\n};\n","import type { SetupAssistantConfig } from \"../types/manifest.js\";\nimport type { DeployablePlugin, PackagedPlugin } from \"../types/package.js\";\n\nconst formatBaseConfig = (packagedPlugin: PackagedPlugin): Record<string, unknown> => {\n const assistantConfig: SetupAssistantConfig | undefined =\n packagedPlugin.manifest.setup_assistant;\n\n const actionsByApiName = Object.values(packagedPlugin.actions).reduce(\n (acc, action) => {\n acc[action.api_name] = action;\n return acc;\n },\n {} as Record<string, unknown>,\n );\n\n const userAssistantConfig: SetupAssistantConfig | undefined =\n packagedPlugin.manifest.user_setup_assistant;\n\n return {\n ...packagedPlugin.manifest.base_config,\n setup_assistant: assistantConfig\n ? {\n ...assistantConfig,\n actions: (assistantConfig.actions ?? []).map((apiName) => {\n const action = actionsByApiName[apiName];\n\n if (!action) {\n throw new Error(\n `Action with API name ${apiName} not found in packaged plugin for setup assistant. Allowed actions: ${Object.keys(actionsByApiName).join(\", \")}`,\n );\n }\n\n return action;\n }),\n }\n : undefined,\n user_setup_assistant: userAssistantConfig,\n block_loading_for_setup: packagedPlugin.manifest.block_loading_for_setup,\n };\n};\n\nexport const transformDeployablePlugin = (\n packagedPlugin: PackagedPlugin,\n): DeployablePlugin => {\n const {\n manifest,\n floatingFrames,\n blocks,\n dataAdornments,\n routablePages,\n toolbarItems,\n actions,\n routeScripts,\n thumbnail,\n releaseNotes,\n objectSettingsMenuItems,\n automationSteps,\n calendarSources,\n kznFile,\n } = packagedPlugin;\n\n return {\n ...manifest,\n api_name: manifest.api_name,\n artifacts: {\n data_adornments: Object.values(dataAdornments),\n floating_frames: Object.values(floatingFrames),\n custom_blocks: Object.values(blocks),\n routable_pages: Object.values(routablePages),\n toolbar_items: Object.values(toolbarItems),\n js_action_templates: Object.values(actions),\n route_scripts: Object.values(routeScripts),\n object_settings_menu_items: Object.values(objectSettingsMenuItems),\n automation_action_configs: Object.values(automationSteps),\n calendar_sources: Object.values(calendarSources),\n },\n thumbnail,\n kznFile,\n releaseNotes,\n base_config: formatBaseConfig(packagedPlugin),\n setup_assistant: undefined,\n services: manifest.services ?? [],\n };\n};\n","import {\n constants,\n createCipheriv,\n createDecipheriv,\n createPublicKey,\n generateKeyPairSync,\n privateDecrypt,\n publicEncrypt,\n randomBytes,\n} from \"node:crypto\";\n\nexport const CRYPTO_VERSION = 1 as const;\nexport const CRYPTO_ALG = \"RSA-OAEP-256+A256GCM\" as const;\n\nconst OAEP = {\n padding: constants.RSA_PKCS1_OAEP_PADDING,\n oaepHash: \"sha256\",\n} as const;\n\nexport type CryptoEnvelope = {\n v: typeof CRYPTO_VERSION;\n alg: typeof CRYPTO_ALG;\n k: string; // RSA-wrapped AES key\n iv: string; // 12-byte GCM IV\n tag: string; // GCM auth tag\n ct: string; // ciphertext\n};\n\nexport type Keypair = {\n publicKey: string;\n privateKey: string;\n};\n\nexport type EncryptedValue = {\n encrypted: true;\n value: string;\n};\n\nexport const generateKeypair = (): Keypair => {\n const { publicKey, privateKey } = generateKeyPairSync(\"rsa\", {\n modulusLength: 3072,\n publicKeyEncoding: { type: \"spki\", format: \"pem\" },\n privateKeyEncoding: { type: \"pkcs8\", format: \"pem\" },\n });\n\n return { publicKey, privateKey };\n};\n\n// Hybrid scheme: a random AES-256-GCM data key encrypts the plaintext, and that\n// data key is wrapped with RSA-3072-OAEP(SHA-256).\nexport const encrypt = (\n plaintext: string,\n publicKeyPem: string,\n): CryptoEnvelope => {\n const keyObject = createPublicKey(publicKeyPem);\n const modulusLength = keyObject.asymmetricKeyDetails?.modulusLength;\n if (modulusLength !== 3072) {\n throw new Error(\n `encrypt requires an RSA-3072 public key (got modulus length ${String(modulusLength)})`,\n );\n }\n\n const aesKey = randomBytes(32);\n const iv = randomBytes(12);\n\n const cipher = createCipheriv(\"aes-256-gcm\", aesKey, iv);\n const ct = Buffer.concat([cipher.update(plaintext, \"utf8\"), cipher.final()]);\n const wrappedKey = publicEncrypt({ key: publicKeyPem, ...OAEP }, aesKey);\n\n return {\n v: CRYPTO_VERSION,\n alg: CRYPTO_ALG,\n k: wrappedKey.toString(\"base64\"),\n iv: iv.toString(\"base64\"),\n tag: cipher.getAuthTag().toString(\"base64\"),\n ct: ct.toString(\"base64\"),\n };\n};\n\n// Throws on decryption failure - should be caught by caller and treated as \"unable to decrypt with this key\" rather than a fatal error.\nexport const decrypt = (\n envelope: CryptoEnvelope,\n privateKeyPem: string,\n): string => {\n const aesKey = privateDecrypt(\n { key: privateKeyPem, ...OAEP },\n Buffer.from(envelope.k, \"base64\"),\n );\n\n const decipher = createDecipheriv(\n \"aes-256-gcm\",\n aesKey,\n Buffer.from(envelope.iv, \"base64\"),\n );\n decipher.setAuthTag(Buffer.from(envelope.tag, \"base64\"));\n\n return Buffer.concat([\n decipher.update(Buffer.from(envelope.ct, \"base64\")),\n decipher.final(),\n ]).toString(\"utf8\");\n};\n\nexport const roundTripVerify = (\n plaintext: string,\n keypair: Keypair,\n): boolean => {\n try {\n return (\n decrypt(encrypt(plaintext, keypair.publicKey), keypair.privateKey) ===\n plaintext\n );\n } catch {\n return false;\n }\n};\n\nexport const serializeEnvelope = (\n envelope: CryptoEnvelope,\n): EncryptedValue => ({\n encrypted: true,\n value: Buffer.from(JSON.stringify(envelope), \"utf8\").toString(\"base64\"),\n});\n\nexport const deserializeEnvelope = (value: string): CryptoEnvelope => {\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(Buffer.from(value, \"base64\").toString(\"utf8\"));\n } catch {\n throw new Error(\"Invalid encrypted value: not base64-encoded JSON\");\n }\n\n if (typeof parsed !== \"object\" || parsed === null) {\n throw new Error(\"Invalid encrypted value: envelope is not an object\");\n }\n\n const envelope = parsed as Partial<CryptoEnvelope>;\n\n if (envelope.v !== CRYPTO_VERSION || envelope.alg !== CRYPTO_ALG) {\n throw new Error(\n `Unsupported encryption envelope (v=${String(envelope.v)}, alg=${String(envelope.alg)})`,\n );\n }\n\n if (\n typeof envelope.k !== \"string\" ||\n typeof envelope.iv !== \"string\" ||\n typeof envelope.tag !== \"string\" ||\n typeof envelope.ct !== \"string\"\n ) {\n throw new Error(\"Invalid encrypted value: missing envelope fields\");\n }\n\n const ivBytes = Buffer.from(envelope.iv, \"base64\");\n const tagBytes = Buffer.from(envelope.tag, \"base64\");\n const kBytes = Buffer.from(envelope.k, \"base64\");\n\n if (ivBytes.length !== 12) {\n throw new Error(\n `Invalid encrypted value: iv must be 12 bytes (got ${ivBytes.length})`,\n );\n }\n if (tagBytes.length !== 16) {\n throw new Error(\n `Invalid encrypted value: tag must be 16 bytes (got ${tagBytes.length})`,\n );\n }\n if (kBytes.length !== 384) {\n throw new Error(\n `Invalid encrypted value: wrapped key must be 384 bytes (got ${kBytes.length})`,\n );\n }\n\n return envelope as CryptoEnvelope;\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/lib/minify.ts","../src/lib/apiNames.ts","../src/lib/issues.ts","../src/types/manifest.ts","../src/lib/structure.ts","../src/lib/validate.ts","../src/lib/image.ts","../src/lib/package.ts","../src/lib/transform.ts","../src/lib/crypto.ts"],"sourcesContent":["import type { FileContent, MinifiedFileContent } from '../types/files.js';\n\nconst minifyFile = async (file: FileContent): Promise<string> => {\n if (file.path.endsWith('.js')) {\n if (!file.content) {\n return '';\n }\n\n const { minify } = await import('@node-minify/core');\n const { uglifyJs } = await import('@node-minify/uglify-js');\n\n // The @node-minify generic Compressor type causes variance issues in strict TS.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result: string = await (minify as (opts: any) => Promise<string>)({\n compressor: uglifyJs,\n content: file.content,\n options: {\n mangle: true,\n parse: {\n bare_returns: true,\n },\n },\n });\n\n return result;\n }\n\n return file.content;\n};\n\nexport const minifyFiles = async (files: FileContent[]): Promise<MinifiedFileContent[]> => {\n return Promise.all(\n files.map(async (file) => {\n const minified = await minifyFile(file);\n return { ...file, minified };\n }),\n );\n};\n","import type {\n AutomationScriptRuntimeInput,\n AutomationScriptRuntimeOutput,\n} from '../types/package.js';\n\n/**\n * Derives a fallback api_name from a directory name, targeting the alphabet of\n * API_NAME_PATTERN (/^[a-z_][a-z0-9_]+$/): the result is lowercased, runs of\n * hyphens and whitespace collapse to a single underscore, and any remaining\n * character outside [a-z0-9_] is dropped. A leading digit or too-short result\n * is left intact so validation can reject it loudly rather than silently\n * padding it into something valid.\n */\nexport const sanitizeToAPIName = (name: string): string => {\n return name\n .toLowerCase()\n .replace(/[-\\s]+/g, '_')\n .replace(/[^a-z0-9_]/g, '');\n};\n\nexport const resolveApiName = (explicit: unknown, directoryName: string): string =>\n typeof explicit === 'string' && explicit !== '' ? explicit : sanitizeToAPIName(directoryName);\n\nexport const scriptRuntimeToApiName = (\n runtime: AutomationScriptRuntimeInput,\n): AutomationScriptRuntimeOutput => {\n const result = runtime.replace(/\\s+/g, '-').replace(/\\./g, '-') as AutomationScriptRuntimeOutput;\n\n return result;\n};\n","export type ValidationSeverity = 'error' | 'warning';\n\nexport interface ValidationIssue {\n /** Stable rule id, e.g. \"manifest/api-name-format\". */\n rule: string;\n severity: ValidationSeverity;\n /** Canonical message, shared verbatim by every consumer. */\n message: string;\n /** Repo-relative path of the file (or directory) the issue was found in. */\n path?: string;\n /** api_name of the owning manifest entry, when known (multi-app repos). */\n pluginApiName?: string;\n}\n\nexport const errorIssue = (\n rule: string,\n message: string,\n path?: string,\n pluginApiName?: string,\n): ValidationIssue => ({\n rule,\n severity: 'error',\n message,\n ...(path !== undefined && { path }),\n ...(pluginApiName !== undefined && { pluginApiName }),\n});\n\n/**\n * Warning-severity counterpart to errorIssue. Warnings surface in the issues\n * array for consumers but never fail a build: the packaging gate throws only on\n * errors, and PluginValidationError counts only errors.\n */\nexport const warningIssue = (\n rule: string,\n message: string,\n path?: string,\n pluginApiName?: string,\n): ValidationIssue => ({\n rule,\n severity: 'warning',\n message,\n ...(path !== undefined && { path }),\n ...(pluginApiName !== undefined && { pluginApiName }),\n});\n\n/**\n * Structured error carrying the same issue shape as validatePluginApp, so\n * pre-flight results and packaging-stage throws render identically.\n */\nexport class PluginValidationError extends Error {\n issues: ValidationIssue[];\n\n constructor(issues: ValidationIssue[]) {\n const errors = issues.filter((i) => i.severity === 'error');\n const details = errors.map((i) => `${i.path ? `${i.path}: ` : ''}${i.message}`).join('\\n');\n\n super(`Plugin app validation failed with ${String(errors.length)} error(s):\\n${details}`);\n this.name = 'PluginValidationError';\n this.issues = issues;\n }\n}\n","export const PUBLISHABLE_ENVIRONMENTS = [\n 'go',\n 'fmo',\n 'staging',\n 'integration',\n 'e2e-integration',\n 'e2e-staging',\n 'test1',\n] as const;\n\nexport const ENVIRONMENT_ALIASES = ['prod', 'dev', 'testing'] as const;\n\nexport const ENVIRONMENTS = [...PUBLISHABLE_ENVIRONMENTS, ...ENVIRONMENT_ALIASES] as const;\n\nexport type PublishableEnvironments = (typeof PUBLISHABLE_ENVIRONMENTS)[number];\n\nexport type EnvironmentAliases = (typeof ENVIRONMENT_ALIASES)[number];\n\nexport type Environment = (typeof ENVIRONMENTS)[number];\n\nexport interface ManifestFileContent {\n version: string;\n api_name: string;\n name: string;\n engine: string;\n description: string;\n release_branches?: string[];\n release_environments?: Environment[];\n entry: string;\n release_notes_directory?: string;\n config_template?: Record<string, unknown>;\n base_config?: Record<string, unknown>;\n setup_assistant?: SetupAssistantConfig;\n user_setup_assistant?: SetupAssistantConfig;\n services?: Record<string, unknown>[];\n published?: boolean;\n developer_business_id?: string | Record<PublishableEnvironments, string>;\n block_loading_for_setup?: boolean;\n}\n\nexport interface SetupAssistantField {\n key: string;\n type:\n | 'custom_object'\n | 'description'\n | 'container'\n | 'field'\n | 'text'\n | 'number'\n | 'select'\n | 'boolean';\n columns?: number;\n fields?: SetupAssistantField[];\n content?: string;\n label?: string;\n object_id?: string;\n default?: string;\n options?: { label: string; value: string }[];\n allow_multiple?: boolean;\n placeholder?: string;\n when?: string;\n}\n\nexport interface SetupAssistantConfig {\n fields?: SetupAssistantField[];\n actions?: string[];\n}\n\nexport type ManifestFile = ManifestFileContent | ManifestFileContent[];\n","import type { MinifiedFileContent } from '../types/files.js';\nimport type { ValidationIssue } from './issues.js';\nimport { PluginValidationError, errorIssue } from './issues.js';\n\nexport const thumbnailImageExtensions = ['png'];\nexport const triggerImageExtensions = [...thumbnailImageExtensions, 'svg'];\n\nexport const EVENT_SCRIPTS_DIRECTORY_NAME = 'eventScripts';\nexport const FLOATING_FRAMES_DIRECTORY_NAME = 'floatingFrames';\nexport const DATA_ADORNMENTS_DIRECTORY_NAME = 'dataAdornments';\nexport const TOOLBAR_ITEMS_DIRECTORY_NAME = 'toolbarItems';\nexport const ROUTABLE_PAGES_DIRECTORY_NAME = 'pages';\nexport const BROWSER_ROUTE_SCRIPTS_DIRECTORY_NAME = 'routeScripts';\nexport const JS_ACTIONS_DIRECTORY_NAME = 'actions';\nexport const OBJECT_SETTINGS_ITEMS_DIRECTORY_NAME = 'objectSettingsItems';\nexport const AUTOMATION_STEPS_DIRECTORY_NAME = 'automationSteps';\nexport const SETUP_ASSISTANT_DIRECTORY_NAME = 'setupAssistant';\nexport const USER_SETUP_ASSISTANT_DIRECTORY_NAME = 'userSetupAssistant';\nexport const CALENDAR_SOURCES_DIRECTORY_NAME = 'calendarSources';\nexport const VIEWS_DIRECTORY_NAME = 'views';\nexport const BLOCKS_DIRECTORY_NAME = 'blocks';\n\nexport const THUMBNAIL_FILE_NAMES = thumbnailImageExtensions.map((ext) => `thumbnail.${ext}`);\n\nexport const RELEASE_NOTES_EXTENSION = 'md';\nexport const SCRIPT_EXTENSION = 'js';\n\nexport const MAIN_SCRIPT_FILE = `script.${SCRIPT_EXTENSION}`;\nexport const MESSAGE_SCRIPT_FILE = `message.${SCRIPT_EXTENSION}`;\nexport const CALLBACK_SCRIPT_FILE = `callback.${SCRIPT_EXTENSION}`;\nexport const AUTOMATION_SCRIPT_FILE = `script.py`;\nexport const VIEW_FILE = 'index.html';\n\nexport const CONFIG_FILE_NAME = 'config.json';\nexport const STYLES_FILE_NAME = 'styles.css';\nexport const MANIFEST_FILE_NAME = 'kizen.json';\nexport const KZN_FILE_NAME = 'import.kzn';\n\nexport type ConfigParseResult = { config: Record<string, unknown> } | { issue: ValidationIssue };\n\nexport const tryParseConfig = (\n content: string | undefined,\n path: string,\n pluginApiName?: string,\n): ConfigParseResult => {\n if (!content) {\n return {\n issue: errorIssue(\n 'structure/config-content',\n `No content provided for config file: ${path}`,\n path,\n pluginApiName,\n ),\n };\n }\n try {\n return { config: JSON.parse(content) as Record<string, unknown> };\n } catch {\n return {\n issue: errorIssue(\n 'structure/config-parse',\n `Failed to parse ${CONFIG_FILE_NAME} as JSON.`,\n path,\n pluginApiName,\n ),\n };\n }\n};\n\nexport const maybeParseConfig = (\n content: string | undefined,\n path: string,\n pluginApiName?: string,\n): Record<string, unknown> => {\n const result = tryParseConfig(content, path, pluginApiName);\n if ('issue' in result) throw new PluginValidationError([result.issue]);\n return result.config;\n};\n\nexport const getMinimizedConfig = (\n config: Record<string, unknown>,\n entry: string,\n splitPath: string[],\n consideredFiles: MinifiedFileContent[],\n): Record<string, unknown> => {\n const result: Record<string, unknown> =\n (config.minimized_config as Record<string, unknown> | undefined) ?? {};\n\n const customIconFile = result.customIconFile;\n if (typeof customIconFile === 'string' && customIconFile) {\n let basePath = splitPath.slice(0, -1).join('/');\n\n if (entry.endsWith('/')) {\n basePath = `${entry}${basePath}`;\n } else {\n basePath = `${entry}/${basePath}`;\n }\n\n const filePath = `${basePath}/${customIconFile}`;\n const file = consideredFiles.find((f) => f.path === filePath);\n\n if (file?.base64Image) {\n let extension = filePath.split('.').pop()?.toLowerCase() ?? '';\n\n if (extension === 'svg') {\n extension = 'svg+xml';\n }\n\n result.customIcon = `data:image/${extension};base64,${file.base64Image}`;\n }\n }\n\n return result;\n};\n\nexport const getAdornmentIcon = (\n config: Record<string, unknown>,\n entry: string,\n splitPath: string[],\n consideredFiles: MinifiedFileContent[],\n): string => {\n const customIconFile = config.customIconFile;\n if (typeof customIconFile === 'string' && customIconFile) {\n let basePath = splitPath.slice(0, -1).join('/');\n\n if (entry.endsWith('/')) {\n basePath = `${entry}${basePath}`;\n } else {\n basePath = `${entry}/${basePath}`;\n }\n\n const filePath = `${basePath}/${customIconFile}`;\n const file = consideredFiles.find((f) => f.path === filePath);\n\n if (file?.base64Image) {\n let extension = filePath.split('.').pop()?.toLowerCase() ?? '';\n\n if (extension === 'svg') {\n extension = 'svg+xml';\n }\n\n return `data:image/${extension};base64,${file.base64Image}`;\n }\n }\n\n return '';\n};\n","import type { FileContent } from '../types/files.js';\nimport { ENVIRONMENT_ALIASES, ENVIRONMENTS, PUBLISHABLE_ENVIRONMENTS } from '../types/manifest.js';\nimport { sanitizeToAPIName } from './apiNames.js';\nimport type { ValidationIssue } from './issues.js';\nimport { errorIssue as error, warningIssue as warning } from './issues.js';\nimport {\n AUTOMATION_STEPS_DIRECTORY_NAME,\n BLOCKS_DIRECTORY_NAME,\n BROWSER_ROUTE_SCRIPTS_DIRECTORY_NAME,\n CALENDAR_SOURCES_DIRECTORY_NAME,\n CONFIG_FILE_NAME,\n DATA_ADORNMENTS_DIRECTORY_NAME,\n FLOATING_FRAMES_DIRECTORY_NAME,\n JS_ACTIONS_DIRECTORY_NAME,\n MANIFEST_FILE_NAME,\n OBJECT_SETTINGS_ITEMS_DIRECTORY_NAME,\n ROUTABLE_PAGES_DIRECTORY_NAME,\n TOOLBAR_ITEMS_DIRECTORY_NAME,\n tryParseConfig,\n VIEWS_DIRECTORY_NAME,\n} from './structure.js';\n\nexport const API_NAME_PATTERN = /^[a-z_][a-z0-9_]+$/;\n\nconst API_NAME_HINT =\n 'must start with a letter or underscore and contain only lowercase letters, numbers, or underscores (minimum 2 characters)';\n\nconst SEMVER_PATTERN = /^\\d+\\.\\d+\\.\\d+$/;\nconst PATH_PATTERN = /^[a-zA-Z][a-zA-Z0-9_\\-/]*$/;\n\nconst SUPPORTED_ENGINES = ['1.0.0'];\n\n/** Component directories that must contain a config.json per component. */\nconst CONFIG_REQUIRED_DIRECTORIES = [\n FLOATING_FRAMES_DIRECTORY_NAME,\n BLOCKS_DIRECTORY_NAME,\n DATA_ADORNMENTS_DIRECTORY_NAME,\n TOOLBAR_ITEMS_DIRECTORY_NAME,\n ROUTABLE_PAGES_DIRECTORY_NAME,\n BROWSER_ROUTE_SCRIPTS_DIRECTORY_NAME,\n JS_ACTIONS_DIRECTORY_NAME,\n OBJECT_SETTINGS_ITEMS_DIRECTORY_NAME,\n AUTOMATION_STEPS_DIRECTORY_NAME,\n CALENDAR_SOURCES_DIRECTORY_NAME,\n];\n\n/**\n * Component directories whose components carry an api_name — explicit in\n * config.json, or derived from the directory name via sanitizeToAPIName.\n * Data adornments are config-required but have no api_name.\n */\nconst API_NAMED_DIRECTORIES = new Set([\n FLOATING_FRAMES_DIRECTORY_NAME,\n BLOCKS_DIRECTORY_NAME,\n TOOLBAR_ITEMS_DIRECTORY_NAME,\n ROUTABLE_PAGES_DIRECTORY_NAME,\n BROWSER_ROUTE_SCRIPTS_DIRECTORY_NAME,\n JS_ACTIONS_DIRECTORY_NAME,\n OBJECT_SETTINGS_ITEMS_DIRECTORY_NAME,\n AUTOMATION_STEPS_DIRECTORY_NAME,\n CALENDAR_SOURCES_DIRECTORY_NAME,\n VIEWS_DIRECTORY_NAME,\n]);\n\nconst COMPONENT_DIRECTORIES = [...CONFIG_REQUIRED_DIRECTORIES, VIEWS_DIRECTORY_NAME];\n\nconst isNonEmptyString = (value: unknown): value is string =>\n typeof value === 'string' && value !== '';\n\nconst validateManifestFields = (\n manifest: Record<string, unknown>,\n label: string,\n pluginApiName: string | undefined,\n): ValidationIssue[] => {\n const issues: ValidationIssue[] = [];\n const problem = (rule: string, message: string): void => {\n issues.push(error(rule, `${label}: ${message}`, MANIFEST_FILE_NAME, pluginApiName));\n };\n const warn = (rule: string, message: string): void => {\n issues.push(warning(rule, `${label}: ${message}`, MANIFEST_FILE_NAME, pluginApiName));\n };\n\n const requireString = (field: string): string | null => {\n const value = manifest[field];\n if (!isNonEmptyString(value)) {\n problem('manifest/required-field', `${field} is required and must be a non-empty string.`);\n return null;\n }\n return value;\n };\n\n const optionalString = (field: string): string | null => {\n const value = manifest[field];\n if (value === undefined) {\n return null;\n }\n if (!isNonEmptyString(value)) {\n problem('manifest/required-field', `${field} must be a non-empty string when present.`);\n return null;\n }\n return value;\n };\n\n const optionalStringArray = (field: string, rule: string): string[] | null => {\n const value = manifest[field];\n if (value === undefined) {\n return null;\n }\n if (!Array.isArray(value) || !value.every(isNonEmptyString)) {\n problem(rule, `${field} must be an array of non-empty strings when present.`);\n return null;\n }\n return value;\n };\n\n const version = requireString('version');\n if (version !== null && !SEMVER_PATTERN.test(version)) {\n problem(\n 'manifest/version-format',\n `version must be a semantic version (e.g. 1.0.0), got \"${version}\".`,\n );\n }\n\n const apiName = requireString('api_name');\n if (apiName !== null && !API_NAME_PATTERN.test(apiName)) {\n problem('manifest/api-name-format', `api_name \"${apiName}\" is invalid: ${API_NAME_HINT}.`);\n }\n\n requireString('name');\n requireString('description');\n\n const engine = requireString('engine');\n if (engine !== null && !SUPPORTED_ENGINES.includes(engine)) {\n problem(\n 'manifest/engine-version',\n `engine must be one of ${SUPPORTED_ENGINES.join(', ')}, got \"${engine}\".`,\n );\n }\n\n const entry = requireString('entry');\n if (entry !== null && !PATH_PATTERN.test(entry)) {\n problem(\n 'manifest/entry-path',\n `entry must be a directory path matching ${String(PATH_PATTERN)}, got \"${entry}\".`,\n );\n }\n\n const releaseNotesDirectory = optionalString('release_notes_directory');\n if (releaseNotesDirectory !== null && !PATH_PATTERN.test(releaseNotesDirectory)) {\n problem(\n 'manifest/release-notes-directory-path',\n `release_notes_directory must be a directory path matching ${String(PATH_PATTERN)}, got \"${releaseNotesDirectory}\".`,\n );\n }\n\n optionalStringArray('release_branches', 'manifest/release-branches');\n\n const releaseEnvironments = optionalStringArray(\n 'release_environments',\n 'manifest/release-environments',\n );\n\n if (releaseEnvironments !== null) {\n for (const env of releaseEnvironments) {\n if (!(ENVIRONMENTS as readonly string[]).includes(env)) {\n problem(\n 'manifest/release-environments',\n `release_environments must only contain ${ENVIRONMENTS.join(', ')}. Instead, got \"${env}\".`,\n );\n }\n }\n }\n\n const developerBusinessId = manifest.developer_business_id;\n if (developerBusinessId !== undefined) {\n if (isNonEmptyString(developerBusinessId)) {\n // A bare string id is minted in one environment and does not exist in the\n // others; kizen.ts only resolves per-environment for the object form, so\n // publishing this string to multiple environments 500s on the backend.\n const distinctValidEnvs = new Set(\n (releaseEnvironments ?? []).filter((env) =>\n (ENVIRONMENTS as readonly string[]).includes(env),\n ),\n );\n if (distinctValidEnvs.size >= 2) {\n warn(\n 'manifest/developer-business-id-environments',\n 'developer_business_id is a single id but release_environments targets multiple environments; a business id generally exists in only one environment, so publishing to the others will fail - use the per-environment object form instead.',\n );\n }\n } else if (\n typeof developerBusinessId === 'object' &&\n developerBusinessId !== null &&\n !Array.isArray(developerBusinessId)\n ) {\n for (const [env, id] of Object.entries(developerBusinessId as Record<string, unknown>)) {\n if (!(PUBLISHABLE_ENVIRONMENTS as readonly string[]).includes(env)) {\n problem(\n 'manifest/developer-business-id',\n `developer_business_id has an invalid environment key \"${env}\": keys must be one of ${PUBLISHABLE_ENVIRONMENTS.join(', ')}. Aliases like ${ENVIRONMENT_ALIASES.join(', ')} are not valid keys here - the publisher indexes by concrete environment, so alias keys silently resolve to nothing.`,\n );\n }\n if (!isNonEmptyString(id)) {\n problem(\n 'manifest/developer-business-id',\n `developer_business_id[\"${env}\"] must be a non-empty string.`,\n );\n }\n }\n } else {\n problem(\n 'manifest/developer-business-id',\n 'developer_business_id must be a non-empty string or an object mapping publishable environments to ids.',\n );\n }\n }\n\n return issues;\n};\n\ninterface ComponentInstance {\n directory: string;\n name: string;\n configFile: FileContent | undefined;\n}\n\nconst collectComponents = (files: FileContent[], entry: string): ComponentInstance[] => {\n const entryPrefix = entry.endsWith('/') ? entry : `${entry}/`;\n const components = new Map<string, ComponentInstance>();\n\n for (const file of files) {\n // Mirror packagePlugin, which excludes .DS_Store from considered files.\n if (!file.path.startsWith(entryPrefix) || file.path.endsWith('.DS_Store')) {\n continue;\n }\n\n const [directory, name, child] = file.path.slice(entryPrefix.length).split('/');\n\n if (!directory || !name || !COMPONENT_DIRECTORIES.includes(directory)) {\n continue;\n }\n\n const key = `${directory}/${name}`;\n const existing = components.get(key) ?? {\n directory,\n name,\n configFile: undefined,\n };\n\n if (child === CONFIG_FILE_NAME) {\n existing.configFile = file;\n }\n\n components.set(key, existing);\n }\n\n return [...components.values()];\n};\n\ninterface ResolvedApiName {\n apiName: string;\n path: string;\n}\n\ninterface ComponentResult {\n issues: ValidationIssue[];\n path: string;\n resolved?: ResolvedApiName;\n}\n\n// These are assets that both become routable_pages so they share a single namespace for api_name uniqueness.\nconst PAGE_LIKE_DIRECTORIES = new Set([ROUTABLE_PAGES_DIRECTORY_NAME, VIEWS_DIRECTORY_NAME]);\n\nconst validateComponent = (\n component: ComponentInstance,\n entry: string,\n pluginApiName: string | undefined,\n): ComponentResult => {\n const { directory, name, configFile } = component;\n const entryBase = entry.endsWith('/') ? entry.slice(0, -1) : entry;\n const componentPath = `${entryBase}/${directory}/${name}`;\n const issues: ValidationIssue[] = [];\n\n const apiNameIssue = (value: string, derived: boolean, path: string): void => {\n const derivedNote = derived ? ` (derived from directory name \"${name}\")` : '';\n const derivedFix = derived ? ` Set an explicit api_name in ${CONFIG_FILE_NAME}.` : '';\n\n issues.push(\n error(\n 'structure/api-name-format',\n `api_name \"${value}\"${derivedNote} is invalid: ${API_NAME_HINT}.${derivedFix}`,\n path,\n pluginApiName,\n ),\n );\n };\n\n if (!configFile) {\n if (CONFIG_REQUIRED_DIRECTORIES.includes(directory)) {\n issues.push(\n error(\n 'structure/missing-config',\n `Missing required ${CONFIG_FILE_NAME} for ${directory}/${name}.`,\n componentPath,\n pluginApiName,\n ),\n );\n }\n\n if (API_NAMED_DIRECTORIES.has(directory)) {\n const derived = sanitizeToAPIName(name);\n\n if (!API_NAME_PATTERN.test(derived)) {\n apiNameIssue(derived, true, componentPath);\n } else {\n return {\n issues,\n path: componentPath,\n resolved: { apiName: derived, path: componentPath },\n };\n }\n }\n\n return { issues, path: componentPath };\n }\n\n const result = tryParseConfig(configFile.content, configFile.path, pluginApiName);\n\n if ('issue' in result) {\n return { issues: [result.issue], path: componentPath };\n }\n\n const config = result.config;\n\n // Fixed-position floating frames are positioned by anchoring to the minimized\n // circle trigger the host only renders for minimized_style \"circle\"; with\n // \"bar\"/\"none\" the frame never positions or responds to resize.\n if (directory === FLOATING_FRAMES_DIRECTORY_NAME) {\n const defaultPosition = config.default_position;\n const minimizedStyle = config.minimized_style;\n\n if (\n (defaultPosition === 'bottom-left-fixed' || defaultPosition === 'bottom-right-fixed') &&\n minimizedStyle !== undefined &&\n minimizedStyle !== 'circle'\n ) {\n issues.push(\n error(\n 'structure/fixed-frame-minimized-style',\n `Floating frame \"${name}\" sets default_position \"${defaultPosition}\" with minimized_style ${JSON.stringify(minimizedStyle)}. Fixed-position frames require minimized_style \"circle\" (or omit it).`,\n configFile.path,\n pluginApiName,\n ),\n );\n }\n }\n\n if (!API_NAMED_DIRECTORIES.has(directory)) {\n return { issues, path: componentPath };\n }\n\n const explicit = config.api_name;\n\n if (isNonEmptyString(explicit)) {\n if (!API_NAME_PATTERN.test(explicit)) {\n apiNameIssue(explicit, false, configFile.path);\n\n return { issues, path: componentPath };\n }\n\n return {\n issues,\n path: componentPath,\n resolved: { apiName: explicit, path: configFile.path },\n };\n }\n\n if (explicit) {\n issues.push(\n error(\n 'structure/api-name-format',\n 'api_name must be a non-empty string.',\n configFile.path,\n pluginApiName,\n ),\n );\n\n return { issues, path: componentPath };\n }\n\n const derived = sanitizeToAPIName(name);\n\n if (!API_NAME_PATTERN.test(derived)) {\n apiNameIssue(derived, true, configFile.path);\n\n return { issues, path: componentPath };\n }\n\n return {\n issues,\n path: componentPath,\n resolved: { apiName: derived, path: configFile.path },\n };\n};\n\nconst validateManifestList = (\n manifests: unknown[],\n isMultiManifest: boolean,\n files: FileContent[],\n): ValidationIssue[] => {\n const issues: ValidationIssue[] = [];\n const seenApiNames = new Map<string, number>();\n\n manifests.forEach((manifest, index) => {\n const label = isMultiManifest\n ? `${MANIFEST_FILE_NAME} entry #${String(index + 1)}`\n : MANIFEST_FILE_NAME;\n\n if (typeof manifest !== 'object' || manifest === null || Array.isArray(manifest)) {\n issues.push(error('manifest/shape', `${label}: must be a JSON object.`, MANIFEST_FILE_NAME));\n return;\n }\n\n const record = manifest as Record<string, unknown>;\n const rawApiName = record.api_name;\n const pluginApiName = isNonEmptyString(rawApiName) ? rawApiName : undefined;\n\n issues.push(...validateManifestFields(record, label, pluginApiName));\n\n if (pluginApiName !== undefined) {\n const firstIndex = seenApiNames.get(pluginApiName);\n if (firstIndex !== undefined) {\n issues.push(\n error(\n 'manifest/duplicate-api-name',\n `${label}: duplicate api_name \"${pluginApiName}\" already used by entry #${String(firstIndex + 1)}. Plugins in a multi-plugin manifest must have unique api_names.`,\n MANIFEST_FILE_NAME,\n pluginApiName,\n ),\n );\n } else {\n seenApiNames.set(pluginApiName, index);\n }\n }\n\n const entry = record.entry;\n if (isNonEmptyString(entry) && PATH_PATTERN.test(entry)) {\n const seenResolved = new Map<string, string>();\n const seenPageNames = new Map<string, { path: string; directory: string }>();\n\n for (const component of collectComponents(files, entry)) {\n const {\n issues: componentIssues,\n path: componentPath,\n resolved,\n } = validateComponent(component, entry, pluginApiName);\n\n issues.push(...componentIssues);\n\n if (PAGE_LIKE_DIRECTORIES.has(component.directory)) {\n const firstPage = seenPageNames.get(component.name);\n if (firstPage !== undefined) {\n issues.push(\n error(\n 'structure/duplicate-component-name',\n `duplicate component name \"${component.name}\": ${component.directory}/${component.name} (${componentPath}) collides with ${firstPage.directory}/${component.name} (${firstPage.path}). pages and views share one routable-pages collection, so names must be unique across both directories.`,\n componentPath,\n pluginApiName,\n ),\n );\n } else {\n seenPageNames.set(component.name, {\n path: componentPath,\n directory: component.directory,\n });\n }\n }\n\n if (resolved) {\n const key = `${component.directory}\\n${resolved.apiName}`;\n const firstPath = seenResolved.get(key);\n\n if (firstPath !== undefined) {\n issues.push(\n error(\n 'structure/duplicate-api-name',\n `duplicate api_name \"${resolved.apiName}\" in ${component.directory}: ${resolved.path} collides with ${firstPath}. Sibling ${component.directory} components must resolve to unique api_names.`,\n resolved.path,\n pluginApiName,\n ),\n );\n } else {\n seenResolved.set(key, resolved.path);\n }\n }\n }\n }\n });\n\n return issues;\n};\n\nexport const validatePluginApp = (files: FileContent[]): ValidationIssue[] => {\n const manifestFile = files.find((f) => f.path === MANIFEST_FILE_NAME);\n\n if (!manifestFile) {\n return [\n error(\n 'manifest/missing',\n `Missing ${MANIFEST_FILE_NAME} at the root of the plugin directory.`,\n MANIFEST_FILE_NAME,\n ),\n ];\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(manifestFile.content);\n } catch {\n return [\n error(\n 'manifest/parse',\n `${MANIFEST_FILE_NAME} could not be parsed. Is it properly formatted JSON?`,\n MANIFEST_FILE_NAME,\n ),\n ];\n }\n\n const isMultiManifest = Array.isArray(parsed);\n const manifests: unknown[] = isMultiManifest ? (parsed as unknown[]) : [parsed];\n\n return validateManifestList(manifests, isMultiManifest, files);\n};\n\nexport const validatePackagedManifests = (\n manifests: unknown,\n files: FileContent[],\n): ValidationIssue[] => {\n const isMultiManifest = Array.isArray(manifests);\n const list = isMultiManifest ? (manifests as unknown[]) : [manifests];\n\n return validateManifestList(list, isMultiManifest, files);\n};\n","export const imagetoUint8Array = (base64Image: string): Uint8Array => {\n const byteCharacters = atob(base64Image);\n const byteNumbers = new Array(byteCharacters.length);\n\n for (let i = 0; i < byteCharacters.length; i++) {\n byteNumbers[i] = byteCharacters.charCodeAt(i);\n }\n\n return new Uint8Array(byteNumbers);\n};\n\nexport const zipToUint8Array = (zip: Buffer): Uint8Array => {\n return Uint8Array.from(zip);\n};\n","import type { ManifestFileContent } from '../types/manifest.js';\nimport type { MinifiedFileContent } from '../types/files.js';\nimport type {\n AutomationStepsMap,\n BlocksMap,\n CalendarSourcesMap,\n DataAdornmentsMap,\n FloatingFramesMap,\n JSActionsMap,\n ObjectSettingsItemsMap,\n PackagedPlugin,\n ProcessedPluginPackage,\n RoutablePagesMap,\n RouteScriptsMap,\n ToolbarItemsMap,\n} from '../types/package.js';\nimport { resolveApiName, sanitizeToAPIName, scriptRuntimeToApiName } from './apiNames.js';\nimport { PluginValidationError, errorIssue } from './issues.js';\nimport { validatePackagedManifests } from './validate.js';\nimport { imagetoUint8Array, zipToUint8Array } from './image.js';\nimport {\n AUTOMATION_SCRIPT_FILE,\n AUTOMATION_STEPS_DIRECTORY_NAME,\n BLOCKS_DIRECTORY_NAME,\n BROWSER_ROUTE_SCRIPTS_DIRECTORY_NAME,\n CALLBACK_SCRIPT_FILE,\n CALENDAR_SOURCES_DIRECTORY_NAME,\n CONFIG_FILE_NAME,\n DATA_ADORNMENTS_DIRECTORY_NAME,\n EVENT_SCRIPTS_DIRECTORY_NAME,\n FLOATING_FRAMES_DIRECTORY_NAME,\n getAdornmentIcon,\n getMinimizedConfig,\n JS_ACTIONS_DIRECTORY_NAME,\n KZN_FILE_NAME,\n MAIN_SCRIPT_FILE,\n MANIFEST_FILE_NAME,\n maybeParseConfig,\n MESSAGE_SCRIPT_FILE,\n OBJECT_SETTINGS_ITEMS_DIRECTORY_NAME,\n RELEASE_NOTES_EXTENSION,\n ROUTABLE_PAGES_DIRECTORY_NAME,\n SCRIPT_EXTENSION,\n SETUP_ASSISTANT_DIRECTORY_NAME,\n STYLES_FILE_NAME,\n THUMBNAIL_FILE_NAMES,\n TOOLBAR_ITEMS_DIRECTORY_NAME,\n USER_SETUP_ASSISTANT_DIRECTORY_NAME,\n VIEWS_DIRECTORY_NAME,\n VIEW_FILE,\n} from './structure.js';\n\nconst replacementVar = '__kizen_state';\nconst prepend = 'const __kizen_utils = {};\\n';\n\nconst convertToSelfInvokingFunction = (\n fn: string,\n variable: string,\n args: Record<string, unknown> = {},\n prependCode = '',\n): string => {\n const functionString = fn.replace(/\\n$/, '').replace(/;$/, '');\n const inner = `(${functionString})({ state: {{${variable}}}, args: ${JSON.stringify(args)}, utils: __kizen_utils })`;\n const full = `(function() { ${prependCode}\\nreturn ${inner}; })()`;\n return full;\n};\n\nconst mapFields = (\n fields: Record<string, unknown>[],\n scriptsByKey: Record<string, Record<string, string>>,\n): Record<string, unknown>[] => {\n return fields.map((field) => {\n if (field.type === 'container' && field.fields && Array.isArray(field.fields)) {\n return {\n ...field,\n fields: mapFields(field.fields as Record<string, unknown>[], scriptsByKey),\n };\n }\n\n const fieldKey = field.key as string;\n const scripts = scriptsByKey[fieldKey];\n\n if (scripts) {\n const result = { ...field };\n\n for (const fnName of [\n 'getFetchUrl',\n 'optionMapper',\n 'getHeaders',\n 'getBody',\n 'getContextUrl',\n ] as const) {\n const fn = scripts[fnName];\n if (fn) {\n result[fnName] = convertToSelfInvokingFunction(fn, replacementVar, {}, prepend);\n }\n }\n\n return result;\n }\n\n return field;\n });\n};\n\nconst processSetupAssistantFromFiles = (\n assistantConfig: Record<string, unknown> | null,\n scripts: { key: string; type: string; content: string }[],\n): Record<string, unknown> | undefined => {\n if (!assistantConfig) {\n return undefined;\n }\n\n const scriptsByKey: Record<string, Record<string, string>> = scripts.reduce<\n Record<string, Record<string, string>>\n >((acc, script) => {\n (acc[script.key] ??= {})[script.type] = script.content;\n return acc;\n }, {});\n\n const newConfig = { ...assistantConfig };\n\n if (newConfig.fields && Array.isArray(newConfig.fields)) {\n newConfig.fields = mapFields(newConfig.fields as Record<string, unknown>[], scriptsByKey);\n }\n\n return newConfig;\n};\n\nconst processOnePluginFromManifest = (\n manifest: ManifestFileContent,\n files: MinifiedFileContent[],\n): ProcessedPluginPackage => {\n const entry = manifest.entry;\n const releaseNotesDirectory = manifest.release_notes_directory;\n const apiName = manifest.api_name;\n\n // Segment-aware prefix so a sibling directory like \"src-legacy\" is not\n // swept into a plugin whose entry is \"src\".\n const entryPrefix = entry.endsWith('/') ? entry : `${entry}/`;\n\n const consideredFiles = files.filter(\n (f) =>\n f.path !== MANIFEST_FILE_NAME &&\n f.path.startsWith(entryPrefix) &&\n !f.path.endsWith('.DS_Store'),\n );\n\n // Segment-aware prefix, same as entryPrefix: \"notes\" must not sweep in a\n // sibling directory like \"notes-archive\".\n const releaseNotesPrefix = releaseNotesDirectory?.endsWith('/')\n ? releaseNotesDirectory\n : `${releaseNotesDirectory ?? ''}/`;\n\n const releaseNotesFiles = releaseNotesDirectory\n ? files.filter((f) => f.path.startsWith(releaseNotesPrefix))\n : [];\n\n const { version } = manifest;\n\n const releaseNotes = releaseNotesFiles.find((file) =>\n file.path.endsWith(`${version}.${RELEASE_NOTES_EXTENSION}`),\n );\n\n const floatingFrames: FloatingFramesMap = {};\n const blocks: BlocksMap = {};\n const dataAdornments: DataAdornmentsMap = {};\n const toolbarItems: ToolbarItemsMap = {};\n const routablePages: RoutablePagesMap = {};\n const routeScripts: RouteScriptsMap = {};\n const jsActions: JSActionsMap = {};\n const objectSettingsItems: ObjectSettingsItemsMap = {};\n const automationSteps: AutomationStepsMap = {};\n const calendarSources: CalendarSourcesMap = {};\n\n let thumbnail: Uint8Array | null = null;\n let kznFile: Uint8Array | null = null;\n let hasBlockingCondition = false;\n\n let setupAssistantJSON: Record<string, unknown> | null = null;\n const setupAssistantFunctions: {\n key: string;\n type: string;\n content: string;\n }[] = [];\n\n let userSetupAssistantJSON: Record<string, unknown> | null = null;\n const userSetupAssistantFunctions: {\n key: string;\n type: string;\n content: string;\n }[] = [];\n\n for (const file of consideredFiles) {\n const strippedPath = file.path.slice(entryPrefix.length);\n\n const splitPath = strippedPath.split('/');\n\n if (splitPath[0] === SETUP_ASSISTANT_DIRECTORY_NAME) {\n if (splitPath[1] === 'assistant.json') {\n setupAssistantJSON = maybeParseConfig(file.content, file.path, apiName);\n } else {\n const assistantKey = splitPath[1];\n if (assistantKey && splitPath[2]?.endsWith(`.${SCRIPT_EXTENSION}`)) {\n setupAssistantFunctions.push({\n key: assistantKey,\n type: splitPath[2].replace(`.${SCRIPT_EXTENSION}`, ''),\n content: file.content,\n });\n }\n }\n } else if (splitPath[0] === USER_SETUP_ASSISTANT_DIRECTORY_NAME) {\n if (splitPath[1] === 'assistant.json') {\n userSetupAssistantJSON = maybeParseConfig(file.content, file.path, apiName);\n } else {\n const assistantKey = splitPath[1];\n if (assistantKey && splitPath[2]?.endsWith(`.${SCRIPT_EXTENSION}`)) {\n userSetupAssistantFunctions.push({\n key: assistantKey,\n type: splitPath[2].replace(`.${SCRIPT_EXTENSION}`, ''),\n content: file.content,\n });\n }\n }\n } else if (splitPath[0] === FLOATING_FRAMES_DIRECTORY_NAME) {\n const floatingFrameName = splitPath[1];\n\n if (!floatingFrameName) {\n continue;\n }\n\n floatingFrames[floatingFrameName] ??= {\n name: '',\n api_name: '',\n title: '',\n type: 'script',\n css: '',\n event_scripts: {},\n default_position: 'bottom-right',\n header_color: '',\n header_text_color: '',\n height: 0,\n width: 0,\n ignore: [],\n match: [],\n message_handler: '',\n minimized_style: 'circle',\n minimized_config: {},\n script: '',\n html: '',\n when: '',\n };\n\n const frame = floatingFrames[floatingFrameName];\n\n if (splitPath[2] === EVENT_SCRIPTS_DIRECTORY_NAME) {\n if (splitPath[3]?.endsWith(`.${SCRIPT_EXTENSION}`)) {\n const functionName = splitPath[3].replace(`.${SCRIPT_EXTENSION}`, '');\n frame.event_scripts[functionName] = file.minified;\n }\n } else if (splitPath[2] === CONFIG_FILE_NAME) {\n const config = maybeParseConfig(file.content, file.path, apiName);\n frame.name = (config.name as string) || '';\n frame.api_name = resolveApiName(config.api_name, floatingFrameName);\n frame.title = (config.title as string) || '';\n frame.default_position = (config.default_position as string) || 'bottom-right';\n frame.header_color = (config.header_color as string) || '';\n frame.header_text_color = (config.header_text_color as string) || '';\n frame.height = (config.height as number) || 0;\n frame.width = (config.width as number) || 0;\n frame.ignore = Array.isArray(config.ignore) ? (config.ignore as string[]) : [];\n frame.match = Array.isArray(config.match) ? (config.match as string[]) : [];\n frame.html = (config.html as string) || '';\n const minimizedStyle = config.minimized_style;\n frame.minimized_style =\n minimizedStyle === 'bar' || minimizedStyle === 'circle' || minimizedStyle === 'none'\n ? minimizedStyle\n : 'circle';\n frame.minimized_config = getMinimizedConfig(config, entry, splitPath, consideredFiles);\n frame.when = (config.when as string) || '';\n } else if (splitPath[2] === MESSAGE_SCRIPT_FILE) {\n frame.message_handler = file.minified;\n } else if (splitPath[2] === MAIN_SCRIPT_FILE) {\n frame.script = file.minified;\n } else if (splitPath[2] === STYLES_FILE_NAME) {\n frame.css = file.minified;\n }\n } else if (splitPath[0] === BLOCKS_DIRECTORY_NAME) {\n const blockName = splitPath[1];\n\n if (!blockName) {\n continue;\n }\n\n blocks[blockName] ??= {\n name: '',\n api_name: '',\n min_w: 1,\n max_w: 12,\n min_h: 1,\n max_h: 12,\n event_scripts: {},\n script: '',\n styles: '',\n when: '',\n };\n\n const block = blocks[blockName];\n\n if (splitPath[2] === EVENT_SCRIPTS_DIRECTORY_NAME) {\n if (splitPath[3]?.endsWith(`.${SCRIPT_EXTENSION}`)) {\n const functionName = splitPath[3].replace(`.${SCRIPT_EXTENSION}`, '');\n block.event_scripts[functionName] = file.minified;\n }\n } else if (splitPath[2] === CONFIG_FILE_NAME) {\n const config = maybeParseConfig(file.content, file.path, apiName);\n\n block.name = (config.name as string) || '';\n block.api_name = resolveApiName(config.api_name, blockName);\n block.min_w = (config.min_w as number) || 1;\n block.max_w = (config.max_w as number) || 12;\n block.min_h = (config.min_h as number) || 1;\n block.max_h = (config.max_h as number) || 12;\n\n if (config.recommended_height != null) {\n block.recommended_height = config.recommended_height as number;\n }\n\n if (config.types) {\n block.types = config.types as string[];\n }\n\n block.when = (config.when as string) || '';\n\n if (config.when) {\n hasBlockingCondition = true;\n }\n } else if (splitPath[2] === MAIN_SCRIPT_FILE) {\n block.script = file.minified;\n } else if (splitPath[2] === STYLES_FILE_NAME) {\n block.styles = file.minified;\n }\n } else if (splitPath[0] === DATA_ADORNMENTS_DIRECTORY_NAME) {\n const dataAdornmentName = splitPath[1];\n\n if (!dataAdornmentName) {\n continue;\n }\n\n dataAdornments[dataAdornmentName] ??= {\n config: { icon: '', color: '', tooltip: '' },\n field_type: 'phonenumber',\n script: '',\n when: '',\n };\n\n const adornment = dataAdornments[dataAdornmentName];\n\n if (splitPath[2] === CONFIG_FILE_NAME) {\n const config = maybeParseConfig(file.content, file.path, apiName);\n adornment.config.icon = (config.icon as string) || '';\n adornment.config.color = (config.color as string) || '';\n adornment.config.tooltip = (config.tooltip as string) || '';\n adornment.config.customIcon = getAdornmentIcon(config, entry, splitPath, consideredFiles);\n const fieldType = config.field_type;\n adornment.field_type =\n fieldType === 'phonenumber' || fieldType === 'date' || fieldType === 'datetime'\n ? fieldType\n : 'phonenumber';\n adornment.when = (config.when as string) || '';\n if (config.when) hasBlockingCondition = true;\n } else if (splitPath[2] === MAIN_SCRIPT_FILE) {\n adornment.script = file.minified;\n }\n } else if (splitPath[0] === TOOLBAR_ITEMS_DIRECTORY_NAME) {\n const toolbarItemName = splitPath[1];\n\n if (!toolbarItemName) {\n continue;\n }\n\n toolbarItems[toolbarItemName] ??= {\n api_name: '',\n label: '',\n icon: '',\n color: '',\n script: '',\n when: '',\n };\n\n const item = toolbarItems[toolbarItemName];\n\n if (splitPath[2] === CONFIG_FILE_NAME) {\n const config = maybeParseConfig(file.content, file.path, apiName);\n item.api_name = resolveApiName(config.api_name, toolbarItemName);\n item.label = (config.label as string) || '';\n item.icon = (config.icon as string) || '';\n item.color = (config.color as string) || '';\n item.when = (config.when as string) || '';\n if (config.when) hasBlockingCondition = true;\n } else if (splitPath[2] === MAIN_SCRIPT_FILE) {\n item.script = file.minified;\n }\n } else if (splitPath[0] === ROUTABLE_PAGES_DIRECTORY_NAME) {\n const pageName = splitPath[1];\n\n if (!pageName) {\n continue;\n }\n\n routablePages[pageName] ??= {\n name: pageName,\n api_name: '',\n event_scripts: {},\n script: '',\n callback: '',\n css: '',\n is_toolbar_item: false,\n toolbar_color: '',\n toolbar_icon: '',\n type: 'script',\n html: '',\n iframe_url: '',\n };\n\n const page = routablePages[pageName];\n\n if (splitPath[2] === EVENT_SCRIPTS_DIRECTORY_NAME) {\n if (splitPath[3]?.endsWith(SCRIPT_EXTENSION)) {\n const functionName = splitPath[3].replace(`.${SCRIPT_EXTENSION}`, '');\n page.event_scripts[functionName] = file.minified;\n }\n } else if (splitPath[2] === CONFIG_FILE_NAME) {\n const config = maybeParseConfig(file.content, file.path, apiName);\n page.api_name = resolveApiName(config.api_name, pageName);\n page.name = (config.name as string) || pageName;\n page.is_toolbar_item = (config.is_toolbar_item as boolean) || false;\n page.toolbar_color = (config.toolbar_color as string) || '';\n page.toolbar_icon = (config.toolbar_icon as string) || '';\n } else if (splitPath[2] === MAIN_SCRIPT_FILE) {\n page.script = file.minified;\n } else if (splitPath[2] === CALLBACK_SCRIPT_FILE) {\n page.callback = file.minified;\n } else if (splitPath[2] === STYLES_FILE_NAME) {\n page.css = file.minified;\n }\n } else if (splitPath[0] === AUTOMATION_STEPS_DIRECTORY_NAME) {\n const stepName = splitPath[1];\n\n if (!stepName) {\n continue;\n }\n\n automationSteps[stepName] ??= {\n name: '',\n action_step_api_name: '',\n overall_description: '',\n action_description: '',\n action_type: '',\n script_runtime: scriptRuntimeToApiName('python 3.12'),\n secrets: [],\n inputs: [],\n outputs: [],\n script: '',\n when: '',\n };\n\n const step = automationSteps[stepName];\n\n if (splitPath[2] === CONFIG_FILE_NAME) {\n const config = maybeParseConfig(file.content, file.path, apiName);\n step.name = (config.name as string) || stepName;\n step.action_step_api_name = resolveApiName(config.api_name, stepName);\n step.overall_description = (config.plugin_description as string) || '';\n step.action_description = (config.action_description as string) || '';\n step.action_type = (config.action_type as string) || '';\n step.secrets = Array.isArray(config.secrets) ? (config.secrets as string[]) : [];\n step.inputs = Array.isArray(config.inputs) ? (config.inputs as typeof step.inputs) : [];\n step.outputs = Array.isArray(config.outputs) ? (config.outputs as typeof step.outputs) : [];\n step.script_runtime = scriptRuntimeToApiName(\n ((config.runtime as string) || 'python 3.12') as `${string} ${number}.${number}`,\n );\n step.when = (config.when as string) || '';\n if (config.when) hasBlockingCondition = true;\n } else if (splitPath[2] === AUTOMATION_SCRIPT_FILE) {\n step.script = file.content;\n }\n } else if (splitPath[0] === BROWSER_ROUTE_SCRIPTS_DIRECTORY_NAME) {\n const routeName = splitPath[1];\n\n if (!routeName) {\n continue;\n }\n\n routeScripts[routeName] ??= {\n script: '',\n api_name: '',\n hint_object_name: '',\n routes: [],\n name: routeName,\n };\n\n const route = routeScripts[routeName];\n\n if (splitPath[2] === CONFIG_FILE_NAME) {\n const config = maybeParseConfig(file.content, file.path, apiName);\n route.api_name = resolveApiName(config.api_name, routeName);\n route.hint_object_name = (config.hint_object_name as string) || '';\n route.routes = Array.isArray(config.routes) ? (config.routes as string[]) : [];\n route.name = (config.name as string) || routeName;\n } else if (splitPath[2] === MAIN_SCRIPT_FILE) {\n route.script = file.minified;\n }\n } else if (splitPath[0] === JS_ACTIONS_DIRECTORY_NAME) {\n const actionName = splitPath[1];\n\n if (!actionName) {\n continue;\n }\n\n jsActions[actionName] ??= {\n script: '',\n name: '',\n hint_object_name: '',\n api_name: '',\n };\n\n const action = jsActions[actionName];\n\n if (splitPath[2] === CONFIG_FILE_NAME) {\n const config = maybeParseConfig(file.content, file.path, apiName);\n action.name = (config.name as string) || actionName;\n action.hint_object_name = (config.hint_object_name as string) || '';\n action.api_name = resolveApiName(config.api_name, actionName);\n } else if (splitPath[2] === MAIN_SCRIPT_FILE) {\n action.script = file.minified;\n }\n } else if (splitPath[0] === OBJECT_SETTINGS_ITEMS_DIRECTORY_NAME) {\n const itemName = splitPath[1];\n\n if (!itemName) {\n continue;\n }\n\n objectSettingsItems[itemName] ??= {\n api_name: '',\n label: '',\n script: '',\n when: '',\n };\n\n const settingsItem = objectSettingsItems[itemName];\n\n if (splitPath[2] === CONFIG_FILE_NAME) {\n const config = maybeParseConfig(file.content, file.path, apiName);\n settingsItem.api_name = resolveApiName(config.api_name, itemName);\n settingsItem.label = (config.label as string) || '';\n settingsItem.when = (config.when as string) || '';\n } else if (splitPath[2] === MAIN_SCRIPT_FILE) {\n settingsItem.script = file.minified;\n }\n } else if (splitPath[0] === CALENDAR_SOURCES_DIRECTORY_NAME) {\n const itemName = splitPath[1];\n\n if (!itemName) {\n continue;\n }\n\n calendarSources[itemName] ??= {\n api_name: '',\n name: '',\n calendars_script: '',\n events_script: '',\n when: '',\n };\n\n const cal = calendarSources[itemName];\n\n if (splitPath[2] === CONFIG_FILE_NAME) {\n const config = maybeParseConfig(file.content, file.path, apiName);\n cal.api_name = resolveApiName(config.api_name, itemName);\n cal.name = (config.name as string) || '';\n cal.when = (config.when as string) || '';\n if (config.when) hasBlockingCondition = true;\n } else if (splitPath[2] === 'calendars.js') {\n cal.calendars_script = file.minified;\n } else if (splitPath[2] === 'events.js') {\n cal.events_script = file.minified;\n }\n // Views are just routable pages with some extra requirements\n } else if (splitPath[0] === VIEWS_DIRECTORY_NAME) {\n const pageName = splitPath[1];\n\n if (!pageName) {\n continue;\n }\n\n routablePages[pageName] ??= {\n name: pageName,\n api_name: sanitizeToAPIName(pageName),\n event_scripts: {},\n script: '',\n callback: '',\n css: '',\n is_toolbar_item: false,\n toolbar_color: '',\n toolbar_icon: '',\n type: 'html',\n html: '',\n iframe_url: '',\n };\n\n const page = routablePages[pageName];\n\n if (splitPath[2] === EVENT_SCRIPTS_DIRECTORY_NAME) {\n if (splitPath[3]?.endsWith(SCRIPT_EXTENSION)) {\n const functionName = splitPath[3].replace(`.${SCRIPT_EXTENSION}`, '');\n page.event_scripts[functionName] = file.minified;\n }\n } else if (splitPath[2] === CONFIG_FILE_NAME) {\n const config = maybeParseConfig(file.content, file.path, apiName);\n page.api_name = resolveApiName(config.api_name, pageName);\n page.name = (config.name as string) || pageName;\n } else if (splitPath[2] === VIEW_FILE) {\n page.html = file.content;\n page.type = 'html';\n } else if (splitPath[2] === MAIN_SCRIPT_FILE) {\n page.script = file.minified;\n page.type = 'script';\n } else if (splitPath[2] === STYLES_FILE_NAME) {\n page.css = file.minified;\n }\n } else if (splitPath[0] === KZN_FILE_NAME) {\n if (!file.binaryData) {\n throw new PluginValidationError([\n errorIssue(\n 'structure/kzn-binary',\n `KZN file ${file.path} does not contain binary data. Cannot proceed.`,\n file.path,\n apiName,\n ),\n ]);\n }\n\n if (kznFile) {\n throw new PluginValidationError([\n errorIssue(\n 'structure/duplicate-kzn',\n `Multiple KZN files found for plugin ${apiName}. Only one is allowed.`,\n file.path,\n apiName,\n ),\n ]);\n }\n\n kznFile = zipToUint8Array(file.binaryData);\n } else if (THUMBNAIL_FILE_NAMES.includes(splitPath[0] ?? '')) {\n if (file.base64Image) {\n if (thumbnail) {\n throw new PluginValidationError([\n errorIssue(\n 'structure/duplicate-thumbnail',\n `Multiple thumbnail files found for plugin ${apiName}. Only one is allowed.`,\n file.path,\n apiName,\n ),\n ]);\n }\n thumbnail = imagetoUint8Array(file.base64Image);\n }\n }\n }\n\n const setupAssistantContent = processSetupAssistantFromFiles(\n setupAssistantJSON,\n setupAssistantFunctions,\n );\n\n const userSetupAssistantContent = processSetupAssistantFromFiles(\n userSetupAssistantJSON,\n userSetupAssistantFunctions,\n );\n\n // Build the updated manifest carefully to satisfy exactOptionalPropertyTypes:\n // only set optional fields when they have a value.\n const updatedManifest: ManifestFileContent = {\n ...manifest,\n block_loading_for_setup: hasBlockingCondition,\n };\n\n const resolvedSetupAssistant =\n manifest.setup_assistant ?? (setupAssistantContent as ManifestFileContent['setup_assistant']);\n if (resolvedSetupAssistant !== undefined) {\n updatedManifest.setup_assistant = resolvedSetupAssistant;\n }\n\n const resolvedUserSetupAssistant =\n manifest.user_setup_assistant ??\n (userSetupAssistantContent as ManifestFileContent['user_setup_assistant']);\n if (resolvedUserSetupAssistant !== undefined) {\n updatedManifest.user_setup_assistant = resolvedUserSetupAssistant;\n }\n\n const packagedPlugin: PackagedPlugin = {\n manifest: updatedManifest,\n thumbnail,\n floatingFrames,\n blocks,\n dataAdornments,\n toolbarItems,\n routablePages,\n actions: jsActions,\n routeScripts,\n objectSettingsMenuItems: objectSettingsItems,\n calendarSources,\n automationSteps,\n kznFile,\n };\n\n // Only set the optional releaseNotes when present, per exactOptionalPropertyTypes.\n if (releaseNotes?.content !== undefined) {\n packagedPlugin.releaseNotes = releaseNotes.content;\n }\n\n return { [apiName]: packagedPlugin };\n};\n\n/**\n * Packages one or more plugins from the given set of minified files.\n * The caller is responsible for any branch-based filtering of manifests before calling.\n */\nexport const packagePlugin = (\n files: MinifiedFileContent[],\n manifests: ManifestFileContent | ManifestFileContent[],\n): ProcessedPluginPackage => {\n // Gate on exactly the manifests being packaged (not whatever kizen.json is in\n // `files`), so a caller passing a filtered subset is validated for only what\n // it asked to build, and no manifest bytes are required in `files`.\n const errors = validatePackagedManifests(manifests, files).filter((i) => i.severity === 'error');\n\n if (errors.length > 0) {\n throw new PluginValidationError(errors);\n }\n\n const manifestArray = Array.isArray(manifests) ? manifests : [manifests];\n\n return manifestArray.reduce<ProcessedPluginPackage>((acc, manifest) => {\n return { ...acc, ...processOnePluginFromManifest(manifest, files) };\n }, {});\n};\n\n/**\n * Reads and parses kizen.json from a set of files.\n * Returns the manifest content (single or array) without any branch defaulting.\n */\nexport const parseManifestFromFiles = (\n files: MinifiedFileContent[],\n): ManifestFileContent | ManifestFileContent[] => {\n const manifestFile = files.find((f) => f.path === MANIFEST_FILE_NAME);\n\n if (!manifestFile) {\n throw new PluginValidationError([\n errorIssue(\n 'manifest/missing',\n `Missing ${MANIFEST_FILE_NAME} at the root of the plugin directory.`,\n MANIFEST_FILE_NAME,\n ),\n ]);\n }\n\n try {\n return JSON.parse(manifestFile.content) as ManifestFileContent | ManifestFileContent[];\n } catch {\n throw new PluginValidationError([\n errorIssue(\n 'manifest/parse',\n `${MANIFEST_FILE_NAME} could not be parsed. Is it properly formatted JSON?`,\n MANIFEST_FILE_NAME,\n ),\n ]);\n }\n};\n","import type { SetupAssistantConfig } from '../types/manifest.js';\nimport type { DeployablePlugin, PackagedPlugin } from '../types/package.js';\nimport { PluginValidationError, errorIssue } from './issues.js';\n\nconst formatBaseConfig = (packagedPlugin: PackagedPlugin): Record<string, unknown> => {\n const assistantConfig: SetupAssistantConfig | undefined = packagedPlugin.manifest.setup_assistant;\n\n const actionsByApiName = Object.values(packagedPlugin.actions).reduce<Record<string, unknown>>(\n (acc, action) => {\n acc[action.api_name] = action;\n return acc;\n },\n {},\n );\n\n const userAssistantConfig: SetupAssistantConfig | undefined =\n packagedPlugin.manifest.user_setup_assistant;\n\n return {\n ...packagedPlugin.manifest.base_config,\n setup_assistant: assistantConfig\n ? {\n ...assistantConfig,\n actions: (assistantConfig.actions ?? []).map((apiName) => {\n const action = actionsByApiName[apiName];\n\n if (!action) {\n throw new PluginValidationError([\n errorIssue(\n 'structure/setup-assistant-action-ref',\n `Action with API name ${apiName} not found in packaged plugin for setup assistant. Allowed actions: ${Object.keys(actionsByApiName).join(', ')}`,\n undefined,\n packagedPlugin.manifest.api_name,\n ),\n ]);\n }\n\n return action;\n }),\n }\n : undefined,\n user_setup_assistant: userAssistantConfig,\n block_loading_for_setup: packagedPlugin.manifest.block_loading_for_setup,\n };\n};\n\nexport const transformDeployablePlugin = (packagedPlugin: PackagedPlugin): DeployablePlugin => {\n const {\n manifest,\n floatingFrames,\n blocks,\n dataAdornments,\n routablePages,\n toolbarItems,\n actions,\n routeScripts,\n thumbnail,\n releaseNotes,\n objectSettingsMenuItems,\n automationSteps,\n calendarSources,\n kznFile,\n } = packagedPlugin;\n\n const deployablePlugin: DeployablePlugin = {\n ...manifest,\n api_name: manifest.api_name,\n artifacts: {\n data_adornments: Object.values(dataAdornments),\n floating_frames: Object.values(floatingFrames),\n custom_blocks: Object.values(blocks),\n routable_pages: Object.values(routablePages),\n toolbar_items: Object.values(toolbarItems),\n js_action_templates: Object.values(actions),\n route_scripts: Object.values(routeScripts),\n object_settings_menu_items: Object.values(objectSettingsMenuItems),\n automation_action_configs: Object.values(automationSteps),\n calendar_sources: Object.values(calendarSources),\n },\n thumbnail,\n kznFile,\n base_config: formatBaseConfig(packagedPlugin),\n setup_assistant: undefined,\n services: manifest.services ?? [],\n };\n\n // Only set the optional releaseNotes when present, per exactOptionalPropertyTypes.\n if (releaseNotes !== undefined) {\n deployablePlugin.releaseNotes = releaseNotes;\n }\n\n return deployablePlugin;\n};\n","import {\n constants,\n createCipheriv,\n createDecipheriv,\n createPublicKey,\n generateKeyPairSync,\n privateDecrypt,\n publicEncrypt,\n randomBytes,\n} from 'node:crypto';\n\nexport const CRYPTO_VERSION = 1 as const;\nexport const CRYPTO_ALG = 'RSA-OAEP-256+A256GCM' as const;\n\nconst OAEP = {\n padding: constants.RSA_PKCS1_OAEP_PADDING,\n oaepHash: 'sha256',\n} as const;\n\nexport interface CryptoEnvelope {\n v: typeof CRYPTO_VERSION;\n alg: typeof CRYPTO_ALG;\n k: string; // RSA-wrapped AES key\n iv: string; // 12-byte GCM IV\n tag: string; // GCM auth tag\n ct: string; // ciphertext\n}\n\nexport interface Keypair {\n publicKey: string;\n privateKey: string;\n}\n\nexport interface EncryptedValue {\n encrypted: true;\n value: string;\n}\n\nexport const generateKeypair = (): Keypair => {\n const { publicKey, privateKey } = generateKeyPairSync('rsa', {\n modulusLength: 3072,\n publicKeyEncoding: { type: 'spki', format: 'pem' },\n privateKeyEncoding: { type: 'pkcs8', format: 'pem' },\n });\n\n return { publicKey, privateKey };\n};\n\n// Hybrid scheme: a random AES-256-GCM data key encrypts the plaintext, and that\n// data key is wrapped with RSA-3072-OAEP(SHA-256).\nexport const encrypt = (plaintext: string, publicKeyPem: string): CryptoEnvelope => {\n const keyObject = createPublicKey(publicKeyPem);\n const modulusLength = keyObject.asymmetricKeyDetails?.modulusLength;\n if (modulusLength !== 3072) {\n throw new Error(\n `encrypt requires an RSA-3072 public key (got modulus length ${String(modulusLength)})`,\n );\n }\n\n const aesKey = randomBytes(32);\n const iv = randomBytes(12);\n\n const cipher = createCipheriv('aes-256-gcm', aesKey, iv);\n const ct = Buffer.concat([cipher.update(plaintext, 'utf8'), cipher.final()]);\n const wrappedKey = publicEncrypt({ key: publicKeyPem, ...OAEP }, aesKey);\n\n return {\n v: CRYPTO_VERSION,\n alg: CRYPTO_ALG,\n k: wrappedKey.toString('base64'),\n iv: iv.toString('base64'),\n tag: cipher.getAuthTag().toString('base64'),\n ct: ct.toString('base64'),\n };\n};\n\n// Throws on decryption failure - should be caught by caller and treated as \"unable to decrypt with this key\" rather than a fatal error.\nexport const decrypt = (envelope: CryptoEnvelope, privateKeyPem: string): string => {\n const aesKey = privateDecrypt({ key: privateKeyPem, ...OAEP }, Buffer.from(envelope.k, 'base64'));\n\n const decipher = createDecipheriv('aes-256-gcm', aesKey, Buffer.from(envelope.iv, 'base64'));\n decipher.setAuthTag(Buffer.from(envelope.tag, 'base64'));\n\n return Buffer.concat([\n decipher.update(Buffer.from(envelope.ct, 'base64')),\n decipher.final(),\n ]).toString('utf8');\n};\n\nexport const roundTripVerify = (plaintext: string, keypair: Keypair): boolean => {\n try {\n return decrypt(encrypt(plaintext, keypair.publicKey), keypair.privateKey) === plaintext;\n } catch {\n return false;\n }\n};\n\nexport const serializeEnvelope = (envelope: CryptoEnvelope): EncryptedValue => ({\n encrypted: true,\n value: Buffer.from(JSON.stringify(envelope), 'utf8').toString('base64'),\n});\n\nexport const deserializeEnvelope = (value: string): CryptoEnvelope => {\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(Buffer.from(value, 'base64').toString('utf8'));\n } catch {\n throw new Error('Invalid encrypted value: not base64-encoded JSON');\n }\n\n if (typeof parsed !== 'object' || parsed === null) {\n throw new Error('Invalid encrypted value: envelope is not an object');\n }\n\n const envelope = parsed as Partial<CryptoEnvelope>;\n\n if (envelope.v !== CRYPTO_VERSION || envelope.alg !== CRYPTO_ALG) {\n throw new Error(\n `Unsupported encryption envelope (v=${String(envelope.v)}, alg=${String(envelope.alg)})`,\n );\n }\n\n if (\n typeof envelope.k !== 'string' ||\n typeof envelope.iv !== 'string' ||\n typeof envelope.tag !== 'string' ||\n typeof envelope.ct !== 'string'\n ) {\n throw new Error('Invalid encrypted value: missing envelope fields');\n }\n\n const ivBytes = Buffer.from(envelope.iv, 'base64');\n const tagBytes = Buffer.from(envelope.tag, 'base64');\n const kBytes = Buffer.from(envelope.k, 'base64');\n\n if (ivBytes.length !== 12) {\n throw new Error(`Invalid encrypted value: iv must be 12 bytes (got ${String(ivBytes.length)})`);\n }\n if (tagBytes.length !== 16) {\n throw new Error(\n `Invalid encrypted value: tag must be 16 bytes (got ${String(tagBytes.length)})`,\n );\n }\n if (kBytes.length !== 384) {\n throw new Error(\n `Invalid encrypted value: wrapped key must be 384 bytes (got ${String(kBytes.length)})`,\n );\n }\n\n return envelope as CryptoEnvelope;\n};\n"],"mappings":"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","names":["derived"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kizenapps/packager",
3
- "version": "0.3.0-18bea71",
3
+ "version": "0.4.0-6ad8aed",
4
4
  "description": "App packaging pipeline for Kizen plugin tools",
5
5
  "license": "GPL-3.0",
6
6
  "type": "module",
@@ -27,13 +27,12 @@
27
27
  "@node-minify/uglify-js": "^10.4.0"
28
28
  },
29
29
  "devDependencies": {
30
- "@eslint/js": "^10.0.1",
31
30
  "@node-minify/types": "^9.0.0",
32
31
  "@types/node": "^22.0.0",
33
32
  "eslint": "^10.2.0",
34
33
  "prettier": "^3.8.1",
35
34
  "tsup": "^8.0.0",
36
- "typescript": "^5.0.0",
35
+ "typescript": "^6.0.2",
37
36
  "typescript-eslint": "^8.58.1",
38
37
  "vitest": "^4.1.9"
39
38
  },