@kizenapps/packager 0.2.0-c6aee7b → 0.3.0-18bea71

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.cjs CHANGED
@@ -37,6 +37,8 @@ __export(index_exports, {
37
37
  CALENDAR_SOURCES_DIRECTORY_NAME: () => CALENDAR_SOURCES_DIRECTORY_NAME,
38
38
  CALLBACK_SCRIPT_FILE: () => CALLBACK_SCRIPT_FILE,
39
39
  CONFIG_FILE_NAME: () => CONFIG_FILE_NAME,
40
+ CRYPTO_ALG: () => CRYPTO_ALG,
41
+ CRYPTO_VERSION: () => CRYPTO_VERSION,
40
42
  DATA_ADORNMENTS_DIRECTORY_NAME: () => DATA_ADORNMENTS_DIRECTORY_NAME,
41
43
  EVENT_SCRIPTS_DIRECTORY_NAME: () => EVENT_SCRIPTS_DIRECTORY_NAME,
42
44
  FLOATING_FRAMES_DIRECTORY_NAME: () => FLOATING_FRAMES_DIRECTORY_NAME,
@@ -54,6 +56,10 @@ __export(index_exports, {
54
56
  THUMBNAIL_FILE_NAMES: () => THUMBNAIL_FILE_NAMES,
55
57
  TOOLBAR_ITEMS_DIRECTORY_NAME: () => TOOLBAR_ITEMS_DIRECTORY_NAME,
56
58
  USER_SETUP_ASSISTANT_DIRECTORY_NAME: () => USER_SETUP_ASSISTANT_DIRECTORY_NAME,
59
+ decrypt: () => decrypt,
60
+ deserializeEnvelope: () => deserializeEnvelope,
61
+ encrypt: () => encrypt,
62
+ generateKeypair: () => generateKeypair,
57
63
  getAdornmentIcon: () => getAdornmentIcon,
58
64
  getMinimizedConfig: () => getMinimizedConfig,
59
65
  imagetoUint8Array: () => imagetoUint8Array,
@@ -61,8 +67,10 @@ __export(index_exports, {
61
67
  minifyFiles: () => minifyFiles,
62
68
  packagePlugin: () => packagePlugin,
63
69
  parseManifestFromFiles: () => parseManifestFromFiles,
70
+ roundTripVerify: () => roundTripVerify,
64
71
  sanitizeToAPIName: () => sanitizeToAPIName,
65
72
  scriptRuntimeToApiName: () => scriptRuntimeToApiName,
73
+ serializeEnvelope: () => serializeEnvelope,
66
74
  thumbnailImageExtensions: () => thumbnailImageExtensions,
67
75
  transformDeployablePlugin: () => transformDeployablePlugin,
68
76
  triggerImageExtensions: () => triggerImageExtensions,
@@ -892,6 +900,111 @@ var transformDeployablePlugin = (packagedPlugin) => {
892
900
  services: manifest.services ?? []
893
901
  };
894
902
  };
903
+
904
+ // src/lib/crypto.ts
905
+ var import_node_crypto = require("crypto");
906
+ var CRYPTO_VERSION = 1;
907
+ var CRYPTO_ALG = "RSA-OAEP-256+A256GCM";
908
+ var OAEP = {
909
+ padding: import_node_crypto.constants.RSA_PKCS1_OAEP_PADDING,
910
+ oaepHash: "sha256"
911
+ };
912
+ var generateKeypair = () => {
913
+ const { publicKey, privateKey } = (0, import_node_crypto.generateKeyPairSync)("rsa", {
914
+ modulusLength: 3072,
915
+ publicKeyEncoding: { type: "spki", format: "pem" },
916
+ privateKeyEncoding: { type: "pkcs8", format: "pem" }
917
+ });
918
+ return { publicKey, privateKey };
919
+ };
920
+ var encrypt = (plaintext, publicKeyPem) => {
921
+ const keyObject = (0, import_node_crypto.createPublicKey)(publicKeyPem);
922
+ const modulusLength = keyObject.asymmetricKeyDetails?.modulusLength;
923
+ if (modulusLength !== 3072) {
924
+ throw new Error(
925
+ `encrypt requires an RSA-3072 public key (got modulus length ${String(modulusLength)})`
926
+ );
927
+ }
928
+ const aesKey = (0, import_node_crypto.randomBytes)(32);
929
+ const iv = (0, import_node_crypto.randomBytes)(12);
930
+ const cipher = (0, import_node_crypto.createCipheriv)("aes-256-gcm", aesKey, iv);
931
+ const ct = Buffer.concat([cipher.update(plaintext, "utf8"), cipher.final()]);
932
+ const wrappedKey = (0, import_node_crypto.publicEncrypt)({ key: publicKeyPem, ...OAEP }, aesKey);
933
+ return {
934
+ v: CRYPTO_VERSION,
935
+ alg: CRYPTO_ALG,
936
+ k: wrappedKey.toString("base64"),
937
+ iv: iv.toString("base64"),
938
+ tag: cipher.getAuthTag().toString("base64"),
939
+ ct: ct.toString("base64")
940
+ };
941
+ };
942
+ var decrypt = (envelope, privateKeyPem) => {
943
+ const aesKey = (0, import_node_crypto.privateDecrypt)(
944
+ { key: privateKeyPem, ...OAEP },
945
+ Buffer.from(envelope.k, "base64")
946
+ );
947
+ const decipher = (0, import_node_crypto.createDecipheriv)(
948
+ "aes-256-gcm",
949
+ aesKey,
950
+ Buffer.from(envelope.iv, "base64")
951
+ );
952
+ decipher.setAuthTag(Buffer.from(envelope.tag, "base64"));
953
+ return Buffer.concat([
954
+ decipher.update(Buffer.from(envelope.ct, "base64")),
955
+ decipher.final()
956
+ ]).toString("utf8");
957
+ };
958
+ var roundTripVerify = (plaintext, keypair) => {
959
+ try {
960
+ return decrypt(encrypt(plaintext, keypair.publicKey), keypair.privateKey) === plaintext;
961
+ } catch {
962
+ return false;
963
+ }
964
+ };
965
+ var serializeEnvelope = (envelope) => ({
966
+ encrypted: true,
967
+ value: Buffer.from(JSON.stringify(envelope), "utf8").toString("base64")
968
+ });
969
+ var deserializeEnvelope = (value) => {
970
+ let parsed;
971
+ try {
972
+ parsed = JSON.parse(Buffer.from(value, "base64").toString("utf8"));
973
+ } catch {
974
+ throw new Error("Invalid encrypted value: not base64-encoded JSON");
975
+ }
976
+ if (typeof parsed !== "object" || parsed === null) {
977
+ throw new Error("Invalid encrypted value: envelope is not an object");
978
+ }
979
+ const envelope = parsed;
980
+ if (envelope.v !== CRYPTO_VERSION || envelope.alg !== CRYPTO_ALG) {
981
+ throw new Error(
982
+ `Unsupported encryption envelope (v=${String(envelope.v)}, alg=${String(envelope.alg)})`
983
+ );
984
+ }
985
+ if (typeof envelope.k !== "string" || typeof envelope.iv !== "string" || typeof envelope.tag !== "string" || typeof envelope.ct !== "string") {
986
+ throw new Error("Invalid encrypted value: missing envelope fields");
987
+ }
988
+ const ivBytes = Buffer.from(envelope.iv, "base64");
989
+ const tagBytes = Buffer.from(envelope.tag, "base64");
990
+ const kBytes = Buffer.from(envelope.k, "base64");
991
+ if (ivBytes.length !== 12) {
992
+ throw new Error(
993
+ `Invalid encrypted value: iv must be 12 bytes (got ${ivBytes.length})`
994
+ );
995
+ }
996
+ if (tagBytes.length !== 16) {
997
+ throw new Error(
998
+ `Invalid encrypted value: tag must be 16 bytes (got ${tagBytes.length})`
999
+ );
1000
+ }
1001
+ if (kBytes.length !== 384) {
1002
+ throw new Error(
1003
+ `Invalid encrypted value: wrapped key must be 384 bytes (got ${kBytes.length})`
1004
+ );
1005
+ }
1006
+ return envelope;
1007
+ };
895
1008
  // Annotate the CommonJS export names for ESM import in node:
896
1009
  0 && (module.exports = {
897
1010
  AUTOMATION_SCRIPT_FILE,
@@ -901,6 +1014,8 @@ var transformDeployablePlugin = (packagedPlugin) => {
901
1014
  CALENDAR_SOURCES_DIRECTORY_NAME,
902
1015
  CALLBACK_SCRIPT_FILE,
903
1016
  CONFIG_FILE_NAME,
1017
+ CRYPTO_ALG,
1018
+ CRYPTO_VERSION,
904
1019
  DATA_ADORNMENTS_DIRECTORY_NAME,
905
1020
  EVENT_SCRIPTS_DIRECTORY_NAME,
906
1021
  FLOATING_FRAMES_DIRECTORY_NAME,
@@ -918,6 +1033,10 @@ var transformDeployablePlugin = (packagedPlugin) => {
918
1033
  THUMBNAIL_FILE_NAMES,
919
1034
  TOOLBAR_ITEMS_DIRECTORY_NAME,
920
1035
  USER_SETUP_ASSISTANT_DIRECTORY_NAME,
1036
+ decrypt,
1037
+ deserializeEnvelope,
1038
+ encrypt,
1039
+ generateKeypair,
921
1040
  getAdornmentIcon,
922
1041
  getMinimizedConfig,
923
1042
  imagetoUint8Array,
@@ -925,8 +1044,10 @@ var transformDeployablePlugin = (packagedPlugin) => {
925
1044
  minifyFiles,
926
1045
  packagePlugin,
927
1046
  parseManifestFromFiles,
1047
+ roundTripVerify,
928
1048
  sanitizeToAPIName,
929
1049
  scriptRuntimeToApiName,
1050
+ serializeEnvelope,
930
1051
  thumbnailImageExtensions,
931
1052
  transformDeployablePlugin,
932
1053
  triggerImageExtensions,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/lib/minify.ts","../src/lib/apiNames.ts","../src/lib/image.ts","../src/lib/structure.ts","../src/lib/package.ts","../src/lib/transform.ts"],"sourcesContent":["export { minifyFiles } from \"./lib/minify.js\";\nexport { packagePlugin, parseManifestFromFiles } from \"./lib/package.js\";\nexport { transformDeployablePlugin } from \"./lib/transform.js\";\nexport { sanitizeToAPIName, scriptRuntimeToApiName } from \"./lib/apiNames.js\";\nexport { imagetoUint8Array, zipToUint8Array } from \"./lib/image.js\";\nexport {\n thumbnailImageExtensions,\n triggerImageExtensions,\n EVENT_SCRIPTS_DIRECTORY_NAME,\n FLOATING_FRAMES_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 SETUP_ASSISTANT_DIRECTORY_NAME,\n USER_SETUP_ASSISTANT_DIRECTORY_NAME,\n CALENDAR_SOURCES_DIRECTORY_NAME,\n BLOCKS_DIRECTORY_NAME,\n THUMBNAIL_FILE_NAMES,\n RELEASE_NOTES_EXTENSION,\n SCRIPT_EXTENSION,\n MAIN_SCRIPT_FILE,\n MESSAGE_SCRIPT_FILE,\n CALLBACK_SCRIPT_FILE,\n AUTOMATION_SCRIPT_FILE,\n CONFIG_FILE_NAME,\n STYLES_FILE_NAME,\n MANIFEST_FILE_NAME,\n KZN_FILE_NAME,\n maybeParseConfig,\n getMinimizedConfig,\n getAdornmentIcon,\n} from \"./lib/structure.js\";\n\nexport type { FileContent, MinifiedFileContent } from \"./types/files.js\";\nexport type {\n ManifestFile,\n ManifestFileContent,\n SetupAssistantConfig,\n SetupAssistantField,\n Environment,\n PublishableEnvironments,\n EnvironmentAliases,\n} from \"./types/manifest.js\";\nexport type {\n PackagedPlugin,\n ProcessedPluginPackage,\n DeployablePlugin,\n FloatingFrame,\n FloatingFramesMap,\n Block,\n BlocksMap,\n DataAdornment,\n DataAdornmentConfig,\n DataAdornmentsMap,\n RoutablePage,\n RoutablePagesMap,\n ToolbarItem,\n ToolbarItemsMap,\n JSAction,\n JSActionsMap,\n RouteScript,\n RouteScriptsMap,\n ObjectSettingsItem,\n ObjectSettingsItemsMap,\n AutomationStep,\n AutomationStepsMap,\n AutomationScriptRuntimeInput,\n AutomationScriptRuntimeOutput,\n CalendarSource,\n CalendarSourcesMap,\n EventScripts,\n} from \"./types/package.js\";\n","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"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../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":["export { minifyFiles } from \"./lib/minify.js\";\nexport { packagePlugin, parseManifestFromFiles } from \"./lib/package.js\";\nexport { transformDeployablePlugin } from \"./lib/transform.js\";\nexport { sanitizeToAPIName, scriptRuntimeToApiName } from \"./lib/apiNames.js\";\nexport { imagetoUint8Array, zipToUint8Array } from \"./lib/image.js\";\nexport {\n CRYPTO_VERSION,\n CRYPTO_ALG,\n generateKeypair,\n encrypt,\n decrypt,\n roundTripVerify,\n serializeEnvelope,\n deserializeEnvelope,\n} from \"./lib/crypto.js\";\nexport {\n thumbnailImageExtensions,\n triggerImageExtensions,\n EVENT_SCRIPTS_DIRECTORY_NAME,\n FLOATING_FRAMES_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 SETUP_ASSISTANT_DIRECTORY_NAME,\n USER_SETUP_ASSISTANT_DIRECTORY_NAME,\n CALENDAR_SOURCES_DIRECTORY_NAME,\n BLOCKS_DIRECTORY_NAME,\n THUMBNAIL_FILE_NAMES,\n RELEASE_NOTES_EXTENSION,\n SCRIPT_EXTENSION,\n MAIN_SCRIPT_FILE,\n MESSAGE_SCRIPT_FILE,\n CALLBACK_SCRIPT_FILE,\n AUTOMATION_SCRIPT_FILE,\n CONFIG_FILE_NAME,\n STYLES_FILE_NAME,\n MANIFEST_FILE_NAME,\n KZN_FILE_NAME,\n maybeParseConfig,\n getMinimizedConfig,\n getAdornmentIcon,\n} from \"./lib/structure.js\";\n\nexport type { CryptoEnvelope, Keypair, EncryptedValue } from \"./lib/crypto.js\";\nexport type { FileContent, MinifiedFileContent } from \"./types/files.js\";\nexport type {\n ManifestFile,\n ManifestFileContent,\n SetupAssistantConfig,\n SetupAssistantField,\n Environment,\n PublishableEnvironments,\n EnvironmentAliases,\n} from \"./types/manifest.js\";\nexport type {\n PackagedPlugin,\n ProcessedPluginPackage,\n DeployablePlugin,\n FloatingFrame,\n FloatingFramesMap,\n Block,\n BlocksMap,\n DataAdornment,\n DataAdornmentConfig,\n DataAdornmentsMap,\n RoutablePage,\n RoutablePagesMap,\n ToolbarItem,\n ToolbarItemsMap,\n JSAction,\n JSActionsMap,\n RouteScript,\n RouteScriptsMap,\n ObjectSettingsItem,\n ObjectSettingsItemsMap,\n AutomationStep,\n AutomationStepsMap,\n AutomationScriptRuntimeInput,\n AutomationScriptRuntimeOutput,\n CalendarSource,\n CalendarSourcesMap,\n EventScripts,\n} from \"./types/package.js\";\n","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":[]}
package/dist/index.d.cts CHANGED
@@ -251,6 +251,31 @@ declare const scriptRuntimeToApiName: (runtime: AutomationScriptRuntimeInput) =>
251
251
  declare const imagetoUint8Array: (base64Image: string) => Uint8Array;
252
252
  declare const zipToUint8Array: (zip: Buffer) => Uint8Array;
253
253
 
254
+ declare const CRYPTO_VERSION: 1;
255
+ declare const CRYPTO_ALG: "RSA-OAEP-256+A256GCM";
256
+ type CryptoEnvelope = {
257
+ v: typeof CRYPTO_VERSION;
258
+ alg: typeof CRYPTO_ALG;
259
+ k: string;
260
+ iv: string;
261
+ tag: string;
262
+ ct: string;
263
+ };
264
+ type Keypair = {
265
+ publicKey: string;
266
+ privateKey: string;
267
+ };
268
+ type EncryptedValue = {
269
+ encrypted: true;
270
+ value: string;
271
+ };
272
+ declare const generateKeypair: () => Keypair;
273
+ declare const encrypt: (plaintext: string, publicKeyPem: string) => CryptoEnvelope;
274
+ declare const decrypt: (envelope: CryptoEnvelope, privateKeyPem: string) => string;
275
+ declare const roundTripVerify: (plaintext: string, keypair: Keypair) => boolean;
276
+ declare const serializeEnvelope: (envelope: CryptoEnvelope) => EncryptedValue;
277
+ declare const deserializeEnvelope: (value: string) => CryptoEnvelope;
278
+
254
279
  declare const thumbnailImageExtensions: string[];
255
280
  declare const triggerImageExtensions: string[];
256
281
  declare const EVENT_SCRIPTS_DIRECTORY_NAME = "eventScripts";
@@ -281,4 +306,4 @@ declare const maybeParseConfig: (content: string | undefined, path: string) => R
281
306
  declare const getMinimizedConfig: (config: Record<string, unknown>, entry: string, splitPath: string[], consideredFiles: MinifiedFileContent[]) => Record<string, unknown>;
282
307
  declare const getAdornmentIcon: (config: Record<string, unknown>, entry: string, splitPath: string[], consideredFiles: MinifiedFileContent[]) => string;
283
308
 
284
- export { AUTOMATION_SCRIPT_FILE, AUTOMATION_STEPS_DIRECTORY_NAME, type AutomationScriptRuntimeInput, type AutomationScriptRuntimeOutput, type AutomationStep, type AutomationStepsMap, BLOCKS_DIRECTORY_NAME, BROWSER_ROUTE_SCRIPTS_DIRECTORY_NAME, type Block, type BlocksMap, CALENDAR_SOURCES_DIRECTORY_NAME, CALLBACK_SCRIPT_FILE, CONFIG_FILE_NAME, type CalendarSource, type CalendarSourcesMap, DATA_ADORNMENTS_DIRECTORY_NAME, type DataAdornment, type DataAdornmentConfig, type DataAdornmentsMap, type DeployablePlugin, EVENT_SCRIPTS_DIRECTORY_NAME, type Environment, type EnvironmentAliases, type EventScripts, FLOATING_FRAMES_DIRECTORY_NAME, type FileContent, type FloatingFrame, type FloatingFramesMap, type JSAction, type JSActionsMap, JS_ACTIONS_DIRECTORY_NAME, KZN_FILE_NAME, MAIN_SCRIPT_FILE, MANIFEST_FILE_NAME, MESSAGE_SCRIPT_FILE, type ManifestFile, type ManifestFileContent, type MinifiedFileContent, OBJECT_SETTINGS_ITEMS_DIRECTORY_NAME, type ObjectSettingsItem, type ObjectSettingsItemsMap, type PackagedPlugin, type ProcessedPluginPackage, type PublishableEnvironments, RELEASE_NOTES_EXTENSION, ROUTABLE_PAGES_DIRECTORY_NAME, type RoutablePage, type RoutablePagesMap, type RouteScript, type RouteScriptsMap, SCRIPT_EXTENSION, SETUP_ASSISTANT_DIRECTORY_NAME, STYLES_FILE_NAME, type SetupAssistantConfig, type SetupAssistantField, THUMBNAIL_FILE_NAMES, TOOLBAR_ITEMS_DIRECTORY_NAME, type ToolbarItem, type ToolbarItemsMap, USER_SETUP_ASSISTANT_DIRECTORY_NAME, getAdornmentIcon, getMinimizedConfig, imagetoUint8Array, maybeParseConfig, minifyFiles, packagePlugin, parseManifestFromFiles, sanitizeToAPIName, scriptRuntimeToApiName, thumbnailImageExtensions, transformDeployablePlugin, triggerImageExtensions, zipToUint8Array };
309
+ export { AUTOMATION_SCRIPT_FILE, AUTOMATION_STEPS_DIRECTORY_NAME, type AutomationScriptRuntimeInput, type AutomationScriptRuntimeOutput, type AutomationStep, type AutomationStepsMap, BLOCKS_DIRECTORY_NAME, BROWSER_ROUTE_SCRIPTS_DIRECTORY_NAME, type Block, type BlocksMap, CALENDAR_SOURCES_DIRECTORY_NAME, CALLBACK_SCRIPT_FILE, CONFIG_FILE_NAME, CRYPTO_ALG, CRYPTO_VERSION, type CalendarSource, type CalendarSourcesMap, type CryptoEnvelope, DATA_ADORNMENTS_DIRECTORY_NAME, type DataAdornment, type DataAdornmentConfig, type DataAdornmentsMap, type DeployablePlugin, EVENT_SCRIPTS_DIRECTORY_NAME, type EncryptedValue, type Environment, type EnvironmentAliases, type EventScripts, FLOATING_FRAMES_DIRECTORY_NAME, type FileContent, type FloatingFrame, type FloatingFramesMap, type JSAction, type JSActionsMap, JS_ACTIONS_DIRECTORY_NAME, KZN_FILE_NAME, type Keypair, MAIN_SCRIPT_FILE, MANIFEST_FILE_NAME, MESSAGE_SCRIPT_FILE, type ManifestFile, type ManifestFileContent, type MinifiedFileContent, OBJECT_SETTINGS_ITEMS_DIRECTORY_NAME, type ObjectSettingsItem, type ObjectSettingsItemsMap, type PackagedPlugin, type ProcessedPluginPackage, type PublishableEnvironments, RELEASE_NOTES_EXTENSION, ROUTABLE_PAGES_DIRECTORY_NAME, type RoutablePage, type RoutablePagesMap, type RouteScript, type RouteScriptsMap, SCRIPT_EXTENSION, SETUP_ASSISTANT_DIRECTORY_NAME, STYLES_FILE_NAME, type SetupAssistantConfig, type SetupAssistantField, THUMBNAIL_FILE_NAMES, TOOLBAR_ITEMS_DIRECTORY_NAME, type ToolbarItem, type ToolbarItemsMap, USER_SETUP_ASSISTANT_DIRECTORY_NAME, decrypt, deserializeEnvelope, encrypt, generateKeypair, getAdornmentIcon, getMinimizedConfig, imagetoUint8Array, maybeParseConfig, minifyFiles, packagePlugin, parseManifestFromFiles, roundTripVerify, sanitizeToAPIName, scriptRuntimeToApiName, serializeEnvelope, thumbnailImageExtensions, transformDeployablePlugin, triggerImageExtensions, zipToUint8Array };
package/dist/index.d.ts CHANGED
@@ -251,6 +251,31 @@ declare const scriptRuntimeToApiName: (runtime: AutomationScriptRuntimeInput) =>
251
251
  declare const imagetoUint8Array: (base64Image: string) => Uint8Array;
252
252
  declare const zipToUint8Array: (zip: Buffer) => Uint8Array;
253
253
 
254
+ declare const CRYPTO_VERSION: 1;
255
+ declare const CRYPTO_ALG: "RSA-OAEP-256+A256GCM";
256
+ type CryptoEnvelope = {
257
+ v: typeof CRYPTO_VERSION;
258
+ alg: typeof CRYPTO_ALG;
259
+ k: string;
260
+ iv: string;
261
+ tag: string;
262
+ ct: string;
263
+ };
264
+ type Keypair = {
265
+ publicKey: string;
266
+ privateKey: string;
267
+ };
268
+ type EncryptedValue = {
269
+ encrypted: true;
270
+ value: string;
271
+ };
272
+ declare const generateKeypair: () => Keypair;
273
+ declare const encrypt: (plaintext: string, publicKeyPem: string) => CryptoEnvelope;
274
+ declare const decrypt: (envelope: CryptoEnvelope, privateKeyPem: string) => string;
275
+ declare const roundTripVerify: (plaintext: string, keypair: Keypair) => boolean;
276
+ declare const serializeEnvelope: (envelope: CryptoEnvelope) => EncryptedValue;
277
+ declare const deserializeEnvelope: (value: string) => CryptoEnvelope;
278
+
254
279
  declare const thumbnailImageExtensions: string[];
255
280
  declare const triggerImageExtensions: string[];
256
281
  declare const EVENT_SCRIPTS_DIRECTORY_NAME = "eventScripts";
@@ -281,4 +306,4 @@ declare const maybeParseConfig: (content: string | undefined, path: string) => R
281
306
  declare const getMinimizedConfig: (config: Record<string, unknown>, entry: string, splitPath: string[], consideredFiles: MinifiedFileContent[]) => Record<string, unknown>;
282
307
  declare const getAdornmentIcon: (config: Record<string, unknown>, entry: string, splitPath: string[], consideredFiles: MinifiedFileContent[]) => string;
283
308
 
284
- export { AUTOMATION_SCRIPT_FILE, AUTOMATION_STEPS_DIRECTORY_NAME, type AutomationScriptRuntimeInput, type AutomationScriptRuntimeOutput, type AutomationStep, type AutomationStepsMap, BLOCKS_DIRECTORY_NAME, BROWSER_ROUTE_SCRIPTS_DIRECTORY_NAME, type Block, type BlocksMap, CALENDAR_SOURCES_DIRECTORY_NAME, CALLBACK_SCRIPT_FILE, CONFIG_FILE_NAME, type CalendarSource, type CalendarSourcesMap, DATA_ADORNMENTS_DIRECTORY_NAME, type DataAdornment, type DataAdornmentConfig, type DataAdornmentsMap, type DeployablePlugin, EVENT_SCRIPTS_DIRECTORY_NAME, type Environment, type EnvironmentAliases, type EventScripts, FLOATING_FRAMES_DIRECTORY_NAME, type FileContent, type FloatingFrame, type FloatingFramesMap, type JSAction, type JSActionsMap, JS_ACTIONS_DIRECTORY_NAME, KZN_FILE_NAME, MAIN_SCRIPT_FILE, MANIFEST_FILE_NAME, MESSAGE_SCRIPT_FILE, type ManifestFile, type ManifestFileContent, type MinifiedFileContent, OBJECT_SETTINGS_ITEMS_DIRECTORY_NAME, type ObjectSettingsItem, type ObjectSettingsItemsMap, type PackagedPlugin, type ProcessedPluginPackage, type PublishableEnvironments, RELEASE_NOTES_EXTENSION, ROUTABLE_PAGES_DIRECTORY_NAME, type RoutablePage, type RoutablePagesMap, type RouteScript, type RouteScriptsMap, SCRIPT_EXTENSION, SETUP_ASSISTANT_DIRECTORY_NAME, STYLES_FILE_NAME, type SetupAssistantConfig, type SetupAssistantField, THUMBNAIL_FILE_NAMES, TOOLBAR_ITEMS_DIRECTORY_NAME, type ToolbarItem, type ToolbarItemsMap, USER_SETUP_ASSISTANT_DIRECTORY_NAME, getAdornmentIcon, getMinimizedConfig, imagetoUint8Array, maybeParseConfig, minifyFiles, packagePlugin, parseManifestFromFiles, sanitizeToAPIName, scriptRuntimeToApiName, thumbnailImageExtensions, transformDeployablePlugin, triggerImageExtensions, zipToUint8Array };
309
+ export { AUTOMATION_SCRIPT_FILE, AUTOMATION_STEPS_DIRECTORY_NAME, type AutomationScriptRuntimeInput, type AutomationScriptRuntimeOutput, type AutomationStep, type AutomationStepsMap, BLOCKS_DIRECTORY_NAME, BROWSER_ROUTE_SCRIPTS_DIRECTORY_NAME, type Block, type BlocksMap, CALENDAR_SOURCES_DIRECTORY_NAME, CALLBACK_SCRIPT_FILE, CONFIG_FILE_NAME, CRYPTO_ALG, CRYPTO_VERSION, type CalendarSource, type CalendarSourcesMap, type CryptoEnvelope, DATA_ADORNMENTS_DIRECTORY_NAME, type DataAdornment, type DataAdornmentConfig, type DataAdornmentsMap, type DeployablePlugin, EVENT_SCRIPTS_DIRECTORY_NAME, type EncryptedValue, type Environment, type EnvironmentAliases, type EventScripts, FLOATING_FRAMES_DIRECTORY_NAME, type FileContent, type FloatingFrame, type FloatingFramesMap, type JSAction, type JSActionsMap, JS_ACTIONS_DIRECTORY_NAME, KZN_FILE_NAME, type Keypair, MAIN_SCRIPT_FILE, MANIFEST_FILE_NAME, MESSAGE_SCRIPT_FILE, type ManifestFile, type ManifestFileContent, type MinifiedFileContent, OBJECT_SETTINGS_ITEMS_DIRECTORY_NAME, type ObjectSettingsItem, type ObjectSettingsItemsMap, type PackagedPlugin, type ProcessedPluginPackage, type PublishableEnvironments, RELEASE_NOTES_EXTENSION, ROUTABLE_PAGES_DIRECTORY_NAME, type RoutablePage, type RoutablePagesMap, type RouteScript, type RouteScriptsMap, SCRIPT_EXTENSION, SETUP_ASSISTANT_DIRECTORY_NAME, STYLES_FILE_NAME, type SetupAssistantConfig, type SetupAssistantField, THUMBNAIL_FILE_NAMES, TOOLBAR_ITEMS_DIRECTORY_NAME, type ToolbarItem, type ToolbarItemsMap, USER_SETUP_ASSISTANT_DIRECTORY_NAME, decrypt, deserializeEnvelope, encrypt, generateKeypair, getAdornmentIcon, getMinimizedConfig, imagetoUint8Array, maybeParseConfig, minifyFiles, packagePlugin, parseManifestFromFiles, roundTripVerify, sanitizeToAPIName, scriptRuntimeToApiName, serializeEnvelope, thumbnailImageExtensions, transformDeployablePlugin, triggerImageExtensions, zipToUint8Array };
package/dist/index.js CHANGED
@@ -820,6 +820,120 @@ var transformDeployablePlugin = (packagedPlugin) => {
820
820
  services: manifest.services ?? []
821
821
  };
822
822
  };
823
+
824
+ // src/lib/crypto.ts
825
+ import {
826
+ constants,
827
+ createCipheriv,
828
+ createDecipheriv,
829
+ createPublicKey,
830
+ generateKeyPairSync,
831
+ privateDecrypt,
832
+ publicEncrypt,
833
+ randomBytes
834
+ } from "crypto";
835
+ var CRYPTO_VERSION = 1;
836
+ var CRYPTO_ALG = "RSA-OAEP-256+A256GCM";
837
+ var OAEP = {
838
+ padding: constants.RSA_PKCS1_OAEP_PADDING,
839
+ oaepHash: "sha256"
840
+ };
841
+ var generateKeypair = () => {
842
+ const { publicKey, privateKey } = generateKeyPairSync("rsa", {
843
+ modulusLength: 3072,
844
+ publicKeyEncoding: { type: "spki", format: "pem" },
845
+ privateKeyEncoding: { type: "pkcs8", format: "pem" }
846
+ });
847
+ return { publicKey, privateKey };
848
+ };
849
+ var encrypt = (plaintext, publicKeyPem) => {
850
+ const keyObject = createPublicKey(publicKeyPem);
851
+ const modulusLength = keyObject.asymmetricKeyDetails?.modulusLength;
852
+ if (modulusLength !== 3072) {
853
+ throw new Error(
854
+ `encrypt requires an RSA-3072 public key (got modulus length ${String(modulusLength)})`
855
+ );
856
+ }
857
+ const aesKey = randomBytes(32);
858
+ const iv = randomBytes(12);
859
+ const cipher = createCipheriv("aes-256-gcm", aesKey, iv);
860
+ const ct = Buffer.concat([cipher.update(plaintext, "utf8"), cipher.final()]);
861
+ const wrappedKey = publicEncrypt({ key: publicKeyPem, ...OAEP }, aesKey);
862
+ return {
863
+ v: CRYPTO_VERSION,
864
+ alg: CRYPTO_ALG,
865
+ k: wrappedKey.toString("base64"),
866
+ iv: iv.toString("base64"),
867
+ tag: cipher.getAuthTag().toString("base64"),
868
+ ct: ct.toString("base64")
869
+ };
870
+ };
871
+ var decrypt = (envelope, privateKeyPem) => {
872
+ const aesKey = privateDecrypt(
873
+ { key: privateKeyPem, ...OAEP },
874
+ Buffer.from(envelope.k, "base64")
875
+ );
876
+ const decipher = createDecipheriv(
877
+ "aes-256-gcm",
878
+ aesKey,
879
+ Buffer.from(envelope.iv, "base64")
880
+ );
881
+ decipher.setAuthTag(Buffer.from(envelope.tag, "base64"));
882
+ return Buffer.concat([
883
+ decipher.update(Buffer.from(envelope.ct, "base64")),
884
+ decipher.final()
885
+ ]).toString("utf8");
886
+ };
887
+ var roundTripVerify = (plaintext, keypair) => {
888
+ try {
889
+ return decrypt(encrypt(plaintext, keypair.publicKey), keypair.privateKey) === plaintext;
890
+ } catch {
891
+ return false;
892
+ }
893
+ };
894
+ var serializeEnvelope = (envelope) => ({
895
+ encrypted: true,
896
+ value: Buffer.from(JSON.stringify(envelope), "utf8").toString("base64")
897
+ });
898
+ var deserializeEnvelope = (value) => {
899
+ let parsed;
900
+ try {
901
+ parsed = JSON.parse(Buffer.from(value, "base64").toString("utf8"));
902
+ } catch {
903
+ throw new Error("Invalid encrypted value: not base64-encoded JSON");
904
+ }
905
+ if (typeof parsed !== "object" || parsed === null) {
906
+ throw new Error("Invalid encrypted value: envelope is not an object");
907
+ }
908
+ const envelope = parsed;
909
+ if (envelope.v !== CRYPTO_VERSION || envelope.alg !== CRYPTO_ALG) {
910
+ throw new Error(
911
+ `Unsupported encryption envelope (v=${String(envelope.v)}, alg=${String(envelope.alg)})`
912
+ );
913
+ }
914
+ if (typeof envelope.k !== "string" || typeof envelope.iv !== "string" || typeof envelope.tag !== "string" || typeof envelope.ct !== "string") {
915
+ throw new Error("Invalid encrypted value: missing envelope fields");
916
+ }
917
+ const ivBytes = Buffer.from(envelope.iv, "base64");
918
+ const tagBytes = Buffer.from(envelope.tag, "base64");
919
+ const kBytes = Buffer.from(envelope.k, "base64");
920
+ if (ivBytes.length !== 12) {
921
+ throw new Error(
922
+ `Invalid encrypted value: iv must be 12 bytes (got ${ivBytes.length})`
923
+ );
924
+ }
925
+ if (tagBytes.length !== 16) {
926
+ throw new Error(
927
+ `Invalid encrypted value: tag must be 16 bytes (got ${tagBytes.length})`
928
+ );
929
+ }
930
+ if (kBytes.length !== 384) {
931
+ throw new Error(
932
+ `Invalid encrypted value: wrapped key must be 384 bytes (got ${kBytes.length})`
933
+ );
934
+ }
935
+ return envelope;
936
+ };
823
937
  export {
824
938
  AUTOMATION_SCRIPT_FILE,
825
939
  AUTOMATION_STEPS_DIRECTORY_NAME,
@@ -828,6 +942,8 @@ export {
828
942
  CALENDAR_SOURCES_DIRECTORY_NAME,
829
943
  CALLBACK_SCRIPT_FILE,
830
944
  CONFIG_FILE_NAME,
945
+ CRYPTO_ALG,
946
+ CRYPTO_VERSION,
831
947
  DATA_ADORNMENTS_DIRECTORY_NAME,
832
948
  EVENT_SCRIPTS_DIRECTORY_NAME,
833
949
  FLOATING_FRAMES_DIRECTORY_NAME,
@@ -845,6 +961,10 @@ export {
845
961
  THUMBNAIL_FILE_NAMES,
846
962
  TOOLBAR_ITEMS_DIRECTORY_NAME,
847
963
  USER_SETUP_ASSISTANT_DIRECTORY_NAME,
964
+ decrypt,
965
+ deserializeEnvelope,
966
+ encrypt,
967
+ generateKeypair,
848
968
  getAdornmentIcon,
849
969
  getMinimizedConfig,
850
970
  imagetoUint8Array,
@@ -852,8 +972,10 @@ export {
852
972
  minifyFiles,
853
973
  packagePlugin,
854
974
  parseManifestFromFiles,
975
+ roundTripVerify,
855
976
  sanitizeToAPIName,
856
977
  scriptRuntimeToApiName,
978
+ serializeEnvelope,
857
979
  thumbnailImageExtensions,
858
980
  transformDeployablePlugin,
859
981
  triggerImageExtensions,
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"],"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"],"mappings":"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","names":[]}
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":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kizenapps/packager",
3
- "version": "0.2.0-c6aee7b",
3
+ "version": "0.3.0-18bea71",
4
4
  "description": "App packaging pipeline for Kizen plugin tools",
5
5
  "license": "GPL-3.0",
6
6
  "type": "module",
@@ -34,7 +34,8 @@
34
34
  "prettier": "^3.8.1",
35
35
  "tsup": "^8.0.0",
36
36
  "typescript": "^5.0.0",
37
- "typescript-eslint": "^8.58.1"
37
+ "typescript-eslint": "^8.58.1",
38
+ "vitest": "^4.1.9"
38
39
  },
39
40
  "scripts": {
40
41
  "build": "tsup",
@@ -46,6 +47,8 @@
46
47
  "lint": "eslint src",
47
48
  "lint:fix": "eslint src --fix",
48
49
  "format": "prettier --write .",
49
- "format:check": "prettier --check ."
50
+ "format:check": "prettier --check .",
51
+ "test": "vitest run",
52
+ "test:watch": "vitest"
50
53
  }
51
54
  }