@kizenapps/packager 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +121 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +26 -1
- package/dist/index.d.ts +26 -1
- package/dist/index.js +122 -0
- package/dist/index.js.map +1 -1
- package/package.json +6 -3
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,
|
package/dist/index.cjs.map
CHANGED
|
@@ -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":";AAEA,IAAM,aAAa,OAAO,SAAuC;AAC/D,MAAI,KAAK,KAAK,SAAS,KAAK,GAAG;AAC7B,QAAI,CAAC,KAAK,SAAS;AACjB,aAAO;AAAA,IACT;AAEA,UAAM,EAAE,OAAO,IAAI,MAAM,OAAO,mBAAmB;AACnD,UAAM,EAAE,SAAS,IAAI,MAAM,OAAO,wBAAwB;AAI1D,UAAM,SAAiB,MAAO,OAA0C;AAAA,MACtE,YAAY;AAAA,MACZ,SAAS,KAAK;AAAA,MACd,SAAS;AAAA,QACP,QAAQ;AAAA,QACR,OAAO;AAAA,UACL,cAAc;AAAA,QAChB;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAEA,SAAO,KAAK;AACd;AAEO,IAAM,cAAc,OACzB,UACmC;AACnC,SAAO,QAAQ;AAAA,IACb,MAAM,IAAI,OAAO,SAAS;AACxB,YAAM,WAAW,MAAM,WAAW,IAAI;AACtC,aAAO,EAAE,GAAG,MAAM,SAAS;AAAA,IAC7B,CAAC;AAAA,EACH;AACF;;;ACrCO,IAAM,oBAAoB,CAAC,SAAyB;AACzD,SAAO,KACJ,YAAY,EACZ,QAAQ,kBAAkB,EAAE,EAC5B,QAAQ,QAAQ,GAAG;AACxB;AAEO,IAAM,yBAAyB,CACpC,YACkC;AAClC,QAAM,SAAS,QACZ,QAAQ,QAAQ,GAAG,EACnB,QAAQ,OAAO,GAAG;AAErB,SAAO;AACT;;;ACjBO,IAAM,oBAAoB,CAAC,gBAAoC;AACpE,QAAM,iBAAiB,KAAK,WAAW;AACvC,QAAM,cAAc,IAAI,MAAM,eAAe,MAAM;AAEnD,WAAS,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK;AAC9C,gBAAY,CAAC,IAAI,eAAe,WAAW,CAAC;AAAA,EAC9C;AAEA,SAAO,IAAI,WAAW,WAAW;AACnC;AAEO,IAAM,kBAAkB,CAAC,QAA4B;AAC1D,SAAO,WAAW,KAAK,GAAG;AAC5B;;;ACXO,IAAM,2BAA2B,CAAC,KAAK;AACvC,IAAM,yBAAyB,CAAC,GAAG,0BAA0B,KAAK;AAElE,IAAM,+BAA+B;AACrC,IAAM,iCAAiC;AACvC,IAAM,iCAAiC;AACvC,IAAM,+BAA+B;AACrC,IAAM,gCAAgC;AACtC,IAAM,uCAAuC;AAC7C,IAAM,4BAA4B;AAClC,IAAM,uCAAuC;AAC7C,IAAM,kCAAkC;AACxC,IAAM,iCAAiC;AACvC,IAAM,sCAAsC;AAC5C,IAAM,kCAAkC;AACxC,IAAM,uBAAuB;AAC7B,IAAM,wBAAwB;AAE9B,IAAM,uBAAuB,yBAAyB;AAAA,EAC3D,CAAC,QAAQ,aAAa,GAAG;AAC3B;AAEO,IAAM,0BAA0B;AAChC,IAAM,mBAAmB;AAEzB,IAAM,mBAAmB,UAAU,gBAAgB;AACnD,IAAM,sBAAsB,WAAW,gBAAgB;AACvD,IAAM,uBAAuB,YAAY,gBAAgB;AACzD,IAAM,yBAAyB;AAC/B,IAAM,YAAY;AAElB,IAAM,mBAAmB;AACzB,IAAM,mBAAmB;AACzB,IAAM,qBAAqB;AAC3B,IAAM,gBAAgB;AAEtB,IAAM,mBAAmB,CAC9B,SACA,SAC4B;AAC5B,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,wCAAwC,IAAI,EAAE;AAAA,EAChE;AAEA,MAAI;AACF,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,QAAQ;AACN,UAAM,IAAI,MAAM,mCAAmC,IAAI,EAAE;AAAA,EAC3D;AACF;AAEO,IAAM,qBAAqB,CAChC,QACA,OACA,WACA,oBAC4B;AAC5B,QAAM,SACH,OAAO,kBAAkB,KAAiC,CAAC;AAE9D,MAAI,OAAO,gBAAgB,GAAG;AAC5B,QAAI,WAAW,UAAU,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG;AAE9C,QAAI,MAAM,SAAS,GAAG,GAAG;AACvB,iBAAW,GAAG,KAAK,GAAG,QAAQ;AAAA,IAChC,OAAO;AACL,iBAAW,GAAG,KAAK,IAAI,QAAQ;AAAA,IACjC;AAEA,UAAM,WAAW,GAAG,QAAQ,IAAI,OAAO,gBAAgB,CAAC;AACxD,UAAM,OAAO,gBAAgB,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ;AAE5D,QAAI,MAAM,aAAa;AACrB,UAAI,YAAY,SAAS,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY;AAEvD,UAAI,cAAc,OAAO;AACvB,oBAAY;AAAA,MACd;AAEA,aAAO,YAAY,IACjB,cAAc,SAAS,WAAW,KAAK,WAAW;AAAA,IACtD;AAAA,EACF;AAEA,SAAO;AACT;AAEO,IAAM,mBAAmB,CAC9B,QACA,OACA,WACA,oBACW;AACX,MAAI,OAAO,gBAAgB,GAAG;AAC5B,QAAI,WAAW,UAAU,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG;AAE9C,QAAI,MAAM,SAAS,GAAG,GAAG;AACvB,iBAAW,GAAG,KAAK,GAAG,QAAQ;AAAA,IAChC,OAAO;AACL,iBAAW,GAAG,KAAK,IAAI,QAAQ;AAAA,IACjC;AAEA,UAAM,WAAW,GAAG,QAAQ,IAAI,OAAO,gBAAgB,CAAC;AACxD,UAAM,OAAO,gBAAgB,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ;AAE5D,QAAI,MAAM,aAAa;AACrB,UAAI,YAAY,SAAS,MAAM,GAAG,EAAE,IAAI,GAAG,YAAY;AAEvD,UAAI,cAAc,OAAO;AACvB,oBAAY;AAAA,MACd;AAEA,aAAO,cAAc,SAAS,WAAW,KAAK,WAAW;AAAA,IAC3D;AAAA,EACF;AAEA,SAAO;AACT;;;ACtEA,IAAM,iBAAiB;AACvB,IAAM,UAAU;AAEhB,IAAM,gCAAgC,CACpC,IACA,UACA,OAAgC,CAAC,GACjC,cAAc,OACH;AACX,QAAM,iBAAiB,GAAG,QAAQ,OAAO,EAAE,EAAE,QAAQ,MAAM,EAAE;AAC7D,QAAM,QAAQ,IAAI,cAAc,gBAAgB,QAAQ,aAAa,KAAK,UAAU,IAAI,CAAC;AACzF,QAAM,OAAO,iBAAiB,WAAW;AAAA,SAAY,KAAK;AAC1D,SAAO;AACT;AAEA,IAAM,YAAY,CAChB,QACA,iBACmC;AACnC,SAAO,OAAO,IAAI,CAAC,UAAU;AAC3B,QACE,MAAM,MAAM,MAAM,eAClB,MAAM,QAAQ,KACd,MAAM,QAAQ,MAAM,QAAQ,CAAC,GAC7B;AACA,aAAO;AAAA,QACL,GAAG;AAAA,QACH,QAAQ;AAAA,UACN,MAAM,QAAQ;AAAA,UACd;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,WAAW,MAAM,KAAK;AAC5B,UAAM,UAAU,aAAa,QAAQ;AAErC,QAAI,SAAS;AACX,YAAM,SAAS,EAAE,GAAG,MAAM;AAE1B,iBAAW,UAAU;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF,GAAY;AACV,cAAM,KAAK,QAAQ,MAAM;AACzB,YAAI,IAAI;AACN,iBAAO,MAAM,IAAI;AAAA,YACf;AAAA,YACA;AAAA,YACA,CAAC;AAAA,YACD;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT,CAAC;AACH;AAEA,IAAM,iCAAiC,CACrC,iBACA,YACwC;AACxC,MAAI,CAAC,iBAAiB;AACpB,WAAO;AAAA,EACT;AAEA,QAAM,eAAuD,QAAQ;AAAA,IACnE,CAAC,KAAK,WAAW;AACf,OAAC,IAAI,OAAO,GAAG,MAAM,CAAC,GAAG,OAAO,IAAI,IAAI,OAAO;AAC/C,aAAO;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,YAAY,EAAE,GAAG,gBAAgB;AAEvC,MAAI,UAAU,QAAQ,KAAK,MAAM,QAAQ,UAAU,QAAQ,CAAC,GAAG;AAC7D,cAAU,QAAQ,IAAI;AAAA,MACpB,UAAU,QAAQ;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAM,+BAA+B,CACnC,UACA,UAC2B;AAC3B,QAAM,QAAQ,SAAS;AACvB,QAAM,wBAAwB,SAAS;AACvC,QAAM,UAAU,SAAS;AAEzB,QAAM,kBAAkB,MAAM;AAAA,IAC5B,CAAC,MACC,EAAE,SAAS,sBACX,EAAE,KAAK,WAAW,KAAK,KACvB,CAAC,EAAE,KAAK,SAAS,WAAW;AAAA,EAChC;AAEA,QAAM,oBAAoB,wBACtB,MAAM,OAAO,CAAC,MAAM,EAAE,KAAK,WAAW,qBAAqB,CAAC,IAC5D,CAAC;AAEL,QAAM,EAAE,QAAQ,IAAI;AAEpB,QAAM,eAAe,kBAAkB;AAAA,IAAK,CAAC,SAC3C,KAAK,KAAK,SAAS,GAAG,OAAO,IAAI,uBAAuB,EAAE;AAAA,EAC5D;AAEA,QAAM,iBAAoC,CAAC;AAC3C,QAAM,SAAoB,CAAC;AAC3B,QAAM,iBAAoC,CAAC;AAC3C,QAAM,eAAgC,CAAC;AACvC,QAAM,gBAAkC,CAAC;AACzC,QAAM,eAAgC,CAAC;AACvC,QAAM,YAA0B,CAAC;AACjC,QAAM,sBAA8C,CAAC;AACrD,QAAM,kBAAsC,CAAC;AAC7C,QAAM,kBAAsC,CAAC;AAE7C,MAAI,YAA+B;AACnC,MAAI,UAA6B;AACjC,MAAI,uBAAuB;AAE3B,QAAM,sBAA+C,CAAC;AAEtD,MAAI,qBAAqD;AACzD,QAAM,0BAID,CAAC;AAEN,MAAI,yBAAyD;AAC7D,QAAM,8BAID,CAAC;AAEN,aAAW,QAAQ,iBAAiB;AAClC,QAAI,eAAe,KAAK,KAAK,QAAQ,OAAO,EAAE;AAC9C,mBAAe,aAAa,WAAW,GAAG,IACtC,aAAa,UAAU,CAAC,IACxB;AAEJ,UAAM,YAAY,aAAa,MAAM,GAAG;AAExC,QAAI,UAAU,CAAC,MAAM,gCAAgC;AACnD,UAAI,UAAU,CAAC,MAAM,kBAAkB;AACrC,6BAAqB,iBAAiB,KAAK,SAAS,KAAK,IAAI;AAAA,MAC/D,OAAO;AACL,cAAM,eAAe,UAAU,CAAC;AAChC,YAAI,gBAAgB,UAAU,CAAC,GAAG,SAAS,IAAI,gBAAgB,EAAE,GAAG;AAClE,kCAAwB,KAAK;AAAA,YAC3B,KAAK;AAAA,YACL,MAAM,UAAU,CAAC,EAAE,QAAQ,IAAI,gBAAgB,IAAI,EAAE;AAAA,YACrD,SAAS,KAAK;AAAA,UAChB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,WAAW,UAAU,CAAC,MAAM,qCAAqC;AAC/D,UAAI,UAAU,CAAC,MAAM,kBAAkB;AACrC,iCAAyB,iBAAiB,KAAK,SAAS,KAAK,IAAI;AAAA,MACnE,OAAO;AACL,cAAM,eAAe,UAAU,CAAC;AAChC,YAAI,gBAAgB,UAAU,CAAC,GAAG,SAAS,IAAI,gBAAgB,EAAE,GAAG;AAClE,sCAA4B,KAAK;AAAA,YAC/B,KAAK;AAAA,YACL,MAAM,UAAU,CAAC,EAAE,QAAQ,IAAI,gBAAgB,IAAI,EAAE;AAAA,YACrD,SAAS,KAAK;AAAA,UAChB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,WAAW,UAAU,CAAC,MAAM,gCAAgC;AAC1D,YAAM,oBAAoB,UAAU,CAAC;AAErC,UAAI,CAAC,mBAAmB;AACtB;AAAA,MACF;AAEA,UAAI,CAAC,eAAe,iBAAiB,GAAG;AACtC,4BAAoB,SAAS,iBAAiB,EAAE,IAAI;AACpD,uBAAe,iBAAiB,IAAI;AAAA,UAClC,MAAM;AAAA,UACN,UAAU;AAAA,UACV,OAAO;AAAA,UACP,MAAM;AAAA,UACN,KAAK;AAAA,UACL,eAAe,CAAC;AAAA,UAChB,kBAAkB;AAAA,UAClB,cAAc;AAAA,UACd,mBAAmB;AAAA,UACnB,QAAQ;AAAA,UACR,OAAO;AAAA,UACP,QAAQ,CAAC;AAAA,UACT,OAAO,CAAC;AAAA,UACR,iBAAiB;AAAA,UACjB,iBAAiB;AAAA,UACjB,kBAAkB,CAAC;AAAA,UACnB,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,MAAM;AAAA,QACR;AAAA,MACF;AAEA,YAAM,QAAQ,eAAe,iBAAiB;AAE9C,UAAI,UAAU,CAAC,MAAM,8BAA8B;AACjD,YAAI,UAAU,CAAC,GAAG,SAAS,IAAI,gBAAgB,EAAE,GAAG;AAClD,gBAAM,eAAe,UAAU,CAAC,EAAE,QAAQ,IAAI,gBAAgB,IAAI,EAAE;AACpE,gBAAM,cAAc,YAAY,IAAI,KAAK;AAAA,QAC3C;AAAA,MACF,WAAW,UAAU,CAAC,MAAM,kBAAkB;AAC5C,4BAAoB,SAAS,iBAAiB,EAAE,IAAI;AACpD,cAAM,SAAS,iBAAiB,KAAK,SAAS,KAAK,IAAI;AACvD,cAAM,OAAQ,OAAO,MAAM,KAAgB;AAC3C,cAAM,WACH,OAAO,UAAU,KAClB,kBAAkB,iBAAiB;AACrC,cAAM,QAAS,OAAO,OAAO,KAAgB;AAC7C,cAAM,mBACH,OAAO,kBAAkB,KAAgB;AAC5C,cAAM,eAAgB,OAAO,cAAc,KAAgB;AAC3D,cAAM,oBAAqB,OAAO,mBAAmB,KAAgB;AACrE,cAAM,SAAU,OAAO,QAAQ,KAAgB;AAC/C,cAAM,QAAS,OAAO,OAAO,KAAgB;AAC7C,cAAM,SAAU,OAAO,QAAQ,KAAkB,CAAC;AAClD,cAAM,QAAS,OAAO,OAAO,KAAkB,CAAC;AAChD,cAAM,OAAQ,OAAO,MAAM,KAAgB;AAC3C,cAAM,kBACH,OAAO,iBAAiB,KAAmC;AAC9D,cAAM,mBAAmB;AAAA,UACvB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,cAAM,OAAQ,OAAO,MAAM,KAAgB;AAAA,MAC7C,WAAW,UAAU,CAAC,MAAM,qBAAqB;AAC/C,cAAM,kBAAkB,KAAK;AAAA,MAC/B,WAAW,UAAU,CAAC,MAAM,kBAAkB;AAC5C,cAAM,SAAS,KAAK;AAAA,MACtB,WAAW,UAAU,CAAC,MAAM,kBAAkB;AAC5C,cAAM,MAAM,KAAK;AAAA,MACnB;AAAA,IACF,WAAW,UAAU,CAAC,MAAM,uBAAuB;AACjD,YAAM,YAAY,UAAU,CAAC;AAE7B,UAAI,CAAC,WAAW;AACd;AAAA,MACF;AAEA,UAAI,CAAC,OAAO,SAAS,GAAG;AACtB,4BAAoB,SAAS,SAAS,EAAE,IAAI;AAC5C,eAAO,SAAS,IAAI;AAAA,UAClB,MAAM;AAAA,UACN,UAAU;AAAA,UACV,OAAO;AAAA,UACP,OAAO;AAAA,UACP,OAAO;AAAA,UACP,OAAO;AAAA,UACP,eAAe,CAAC;AAAA,UAChB,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,MAAM;AAAA,QACR;AAAA,MACF;AAEA,YAAM,QAAQ,OAAO,SAAS;AAE9B,UAAI,UAAU,CAAC,MAAM,8BAA8B;AACjD,YAAI,UAAU,CAAC,GAAG,SAAS,IAAI,gBAAgB,EAAE,GAAG;AAClD,gBAAM,eAAe,UAAU,CAAC,EAAE,QAAQ,IAAI,gBAAgB,IAAI,EAAE;AACpE,gBAAM,cAAc,YAAY,IAAI,KAAK;AAAA,QAC3C;AAAA,MACF,WAAW,UAAU,CAAC,MAAM,kBAAkB;AAC5C,4BAAoB,SAAS,SAAS,EAAE,IAAI;AAE5C,cAAM,SAAS,iBAAiB,KAAK,SAAS,KAAK,IAAI;AAEvD,cAAM,OAAQ,OAAO,MAAM,KAAgB;AAC3C,cAAM,WACH,OAAO,UAAU,KAAgB,kBAAkB,SAAS;AAC/D,cAAM,QAAS,OAAO,OAAO,KAAgB;AAC7C,cAAM,QAAS,OAAO,OAAO,KAAgB;AAC7C,cAAM,QAAS,OAAO,OAAO,KAAgB;AAC7C,cAAM,QAAS,OAAO,OAAO,KAAgB;AAE7C,YAAI,OAAO,oBAAoB,KAAK,MAAM;AACxC,gBAAM,qBAAqB,OAAO,oBAAoB;AAAA,QACxD;AAEA,YAAI,OAAO,OAAO,GAAG;AACnB,gBAAM,QAAQ,OAAO,OAAO;AAAA,QAC9B;AAEA,cAAM,OAAQ,OAAO,MAAM,KAAgB;AAE3C,YAAI,OAAO,MAAM,GAAG;AAClB,iCAAuB;AAAA,QACzB;AAAA,MACF,WAAW,UAAU,CAAC,MAAM,kBAAkB;AAC5C,cAAM,SAAS,KAAK;AAAA,MACtB,WAAW,UAAU,CAAC,MAAM,kBAAkB;AAC5C,cAAM,SAAS,KAAK;AAAA,MACtB;AAAA,IACF,WAAW,UAAU,CAAC,MAAM,gCAAgC;AAC1D,YAAM,oBAAoB,UAAU,CAAC;AAErC,UAAI,CAAC,mBAAmB;AACtB;AAAA,MACF;AAEA,UAAI,CAAC,eAAe,iBAAiB,GAAG;AACtC,4BAAoB,iBAAiB,iBAAiB,EAAE,IAAI;AAC5D,uBAAe,iBAAiB,IAAI;AAAA,UAClC,QAAQ,EAAE,MAAM,IAAI,OAAO,IAAI,SAAS,GAAG;AAAA,UAC3C,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,MAAM;AAAA,QACR;AAAA,MACF;AAEA,YAAM,YAAY,eAAe,iBAAiB;AAElD,UAAI,UAAU,CAAC,MAAM,kBAAkB;AACrC,4BAAoB,iBAAiB,iBAAiB,EAAE,IAAI;AAC5D,cAAM,SAAS,iBAAiB,KAAK,SAAS,KAAK,IAAI;AACvD,kBAAU,OAAO,OAAQ,OAAO,MAAM,KAAgB;AACtD,kBAAU,OAAO,QAAS,OAAO,OAAO,KAAgB;AACxD,kBAAU,OAAO,UAAW,OAAO,SAAS,KAAgB;AAC5D,kBAAU,OAAO,aAAa;AAAA,UAC5B;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACA,kBAAU,aACP,OAAO,YAAY,KACpB;AACF,kBAAU,OAAQ,OAAO,MAAM,KAAgB;AAC/C,YAAI,OAAO,MAAM,EAAG,wBAAuB;AAAA,MAC7C,WAAW,UAAU,CAAC,MAAM,kBAAkB;AAC5C,kBAAU,SAAS,KAAK;AAAA,MAC1B;AAAA,IACF,WAAW,UAAU,CAAC,MAAM,8BAA8B;AACxD,YAAM,kBAAkB,UAAU,CAAC;AAEnC,UAAI,CAAC,iBAAiB;AACpB;AAAA,MACF;AAEA,UAAI,CAAC,aAAa,eAAe,GAAG;AAClC,4BAAoB,eAAe,eAAe,EAAE,IAAI;AACxD,qBAAa,eAAe,IAAI;AAAA,UAC9B,UAAU;AAAA,UACV,OAAO;AAAA,UACP,MAAM;AAAA,UACN,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,MAAM;AAAA,QACR;AAAA,MACF;AAEA,YAAM,OAAO,aAAa,eAAe;AAEzC,UAAI,UAAU,CAAC,MAAM,kBAAkB;AACrC,4BAAoB,eAAe,eAAe,EAAE,IAAI;AACxD,cAAM,SAAS,iBAAiB,KAAK,SAAS,KAAK,IAAI;AACvD,aAAK,WACF,OAAO,UAAU,KAAgB,kBAAkB,eAAe;AACrE,aAAK,QAAS,OAAO,OAAO,KAAgB;AAC5C,aAAK,OAAQ,OAAO,MAAM,KAAgB;AAC1C,aAAK,QAAS,OAAO,OAAO,KAAgB;AAC5C,aAAK,OAAQ,OAAO,MAAM,KAAgB;AAC1C,YAAI,OAAO,MAAM,EAAG,wBAAuB;AAAA,MAC7C,WAAW,UAAU,CAAC,MAAM,kBAAkB;AAC5C,aAAK,SAAS,KAAK;AAAA,MACrB;AAAA,IACF,WAAW,UAAU,CAAC,MAAM,+BAA+B;AACzD,YAAM,WAAW,UAAU,CAAC;AAE5B,UAAI,CAAC,UAAU;AACb;AAAA,MACF;AAEA,UAAI,CAAC,cAAc,QAAQ,GAAG;AAC5B,4BAAoB,QAAQ,QAAQ,EAAE,IAAI;AAC1C,sBAAc,QAAQ,IAAI;AAAA,UACxB,MAAM;AAAA,UACN,UAAU;AAAA,UACV,eAAe,CAAC;AAAA,UAChB,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,KAAK;AAAA,UACL,iBAAiB;AAAA,UACjB,eAAe;AAAA,UACf,cAAc;AAAA,UACd,MAAM;AAAA,UACN,MAAM;AAAA,UACN,YAAY;AAAA,QACd;AAAA,MACF;AAEA,YAAM,OAAO,cAAc,QAAQ;AAEnC,UAAI,UAAU,CAAC,MAAM,8BAA8B;AACjD,YAAI,UAAU,CAAC,GAAG,SAAS,gBAAgB,GAAG;AAC5C,gBAAM,eAAe,UAAU,CAAC,EAAE,QAAQ,IAAI,gBAAgB,IAAI,EAAE;AACpE,eAAK,cAAc,YAAY,IAAI,KAAK;AAAA,QAC1C;AAAA,MACF,WAAW,UAAU,CAAC,MAAM,kBAAkB;AAC5C,4BAAoB,QAAQ,QAAQ,EAAE,IAAI;AAC1C,cAAM,SAAS,iBAAiB,KAAK,SAAS,KAAK,IAAI;AACvD,aAAK,WACF,OAAO,UAAU,KAAgB,kBAAkB,QAAQ;AAC9D,aAAK,OAAQ,OAAO,MAAM,KAAgB;AAC1C,aAAK,kBAAmB,OAAO,iBAAiB,KAAiB;AACjE,aAAK,gBAAiB,OAAO,eAAe,KAAgB;AAC5D,aAAK,eAAgB,OAAO,cAAc,KAAgB;AAAA,MAC5D,WAAW,UAAU,CAAC,MAAM,kBAAkB;AAC5C,aAAK,SAAS,KAAK;AAAA,MACrB,WAAW,UAAU,CAAC,MAAM,sBAAsB;AAChD,aAAK,WAAW,KAAK;AAAA,MACvB,WAAW,UAAU,CAAC,MAAM,kBAAkB;AAC5C,aAAK,MAAM,KAAK;AAAA,MAClB;AAAA,IACF,WAAW,UAAU,CAAC,MAAM,iCAAiC;AAC3D,YAAM,WAAW,UAAU,CAAC;AAE5B,UAAI,CAAC,UAAU;AACb;AAAA,MACF;AAEA,UAAI,CAAC,gBAAgB,QAAQ,GAAG;AAC9B,4BAAoB,kBAAkB,QAAQ,EAAE,IAAI;AACpD,wBAAgB,QAAQ,IAAI;AAAA,UAC1B,MAAM;AAAA,UACN,sBAAsB;AAAA,UACtB,qBAAqB;AAAA,UACrB,oBAAoB;AAAA,UACpB,aAAa;AAAA,UACb,gBAAgB,uBAAuB,aAAa;AAAA,UACpD,SAAS,CAAC;AAAA,UACV,QAAQ,CAAC;AAAA,UACT,SAAS,CAAC;AAAA,UACV,QAAQ;AAAA,UACR,MAAM;AAAA,QACR;AAAA,MACF;AAEA,YAAM,OAAO,gBAAgB,QAAQ;AAErC,UAAI,UAAU,CAAC,MAAM,kBAAkB;AACrC,4BAAoB,kBAAkB,QAAQ,EAAE,IAAI;AACpD,cAAM,SAAS,iBAAiB,KAAK,SAAS,KAAK,IAAI;AACvD,aAAK,OAAQ,OAAO,MAAM,KAAgB;AAC1C,aAAK,uBACF,OAAO,UAAU,KAAgB,kBAAkB,QAAQ;AAC9D,aAAK,sBACF,OAAO,oBAAoB,KAAgB;AAC9C,aAAK,qBACF,OAAO,oBAAoB,KAAgB;AAC9C,aAAK,cAAe,OAAO,aAAa,KAAgB;AACxD,aAAK,UAAW,OAAO,SAAS,KAAkB,CAAC;AACnD,aAAK,SAAU,OAAO,QAAQ,KAA4B,CAAC;AAC3D,aAAK,UAAW,OAAO,SAAS,KAA6B,CAAC;AAC9D,aAAK,iBAAiB;AAAA,UAClB,OAAO,SAAS,KAChB;AAAA,QACJ;AACA,aAAK,OAAQ,OAAO,MAAM,KAAgB;AAC1C,YAAI,OAAO,MAAM,EAAG,wBAAuB;AAAA,MAC7C,WAAW,UAAU,CAAC,MAAM,wBAAwB;AAClD,aAAK,SAAS,KAAK;AAAA,MACrB;AAAA,IACF,WAAW,UAAU,CAAC,MAAM,sCAAsC;AAChE,YAAM,YAAY,UAAU,CAAC;AAE7B,UAAI,CAAC,WAAW;AACd;AAAA,MACF;AAEA,UAAI,CAAC,aAAa,SAAS,GAAG;AAC5B,4BAAoB,SAAS,SAAS,EAAE,IAAI;AAC5C,qBAAa,SAAS,IAAI;AAAA,UACxB,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,kBAAkB;AAAA,UAClB,QAAQ,CAAC;AAAA,UACT,MAAM;AAAA,QACR;AAAA,MACF;AAEA,YAAM,QAAQ,aAAa,SAAS;AAEpC,UAAI,UAAU,CAAC,MAAM,kBAAkB;AACrC,4BAAoB,SAAS,SAAS,EAAE,IAAI;AAC5C,cAAM,SAAS,iBAAiB,KAAK,SAAS,KAAK,IAAI;AACvD,cAAM,WACH,OAAO,UAAU,KAAgB,kBAAkB,SAAS;AAC/D,cAAM,mBAAoB,OAAO,kBAAkB,KAAgB;AACnE,cAAM,SAAU,OAAO,QAAQ,KAAkB,CAAC;AAClD,cAAM,OAAQ,OAAO,MAAM,KAAgB;AAAA,MAC7C,WAAW,UAAU,CAAC,MAAM,kBAAkB;AAC5C,cAAM,SAAS,KAAK;AAAA,MACtB;AAAA,IACF,WAAW,UAAU,CAAC,MAAM,2BAA2B;AACrD,YAAM,aAAa,UAAU,CAAC;AAE9B,UAAI,CAAC,YAAY;AACf;AAAA,MACF;AAEA,UAAI,CAAC,UAAU,UAAU,GAAG;AAC1B,4BAAoB,UAAU,UAAU,EAAE,IAAI;AAC9C,kBAAU,UAAU,IAAI;AAAA,UACtB,QAAQ;AAAA,UACR,MAAM;AAAA,UACN,kBAAkB;AAAA,UAClB,UAAU;AAAA,QACZ;AAAA,MACF;AAEA,YAAM,SAAS,UAAU,UAAU;AAEnC,UAAI,UAAU,CAAC,MAAM,kBAAkB;AACrC,4BAAoB,UAAU,UAAU,EAAE,IAAI;AAC9C,cAAM,SAAS,iBAAiB,KAAK,SAAS,KAAK,IAAI;AACvD,eAAO,OAAQ,OAAO,MAAM,KAAgB;AAC5C,eAAO,mBAAoB,OAAO,kBAAkB,KAAgB;AACpE,eAAO,WACJ,OAAO,UAAU,KAAgB,kBAAkB,UAAU;AAAA,MAClE,WAAW,UAAU,CAAC,MAAM,kBAAkB;AAC5C,eAAO,SAAS,KAAK;AAAA,MACvB;AAAA,IACF,WAAW,UAAU,CAAC,MAAM,sCAAsC;AAChE,YAAM,WAAW,UAAU,CAAC;AAE5B,UAAI,CAAC,UAAU;AACb;AAAA,MACF;AAEA,UAAI,CAAC,oBAAoB,QAAQ,GAAG;AAClC,4BAAoB,sBAAsB,QAAQ,EAAE,IAAI;AACxD,4BAAoB,QAAQ,IAAI;AAAA,UAC9B,UAAU;AAAA,UACV,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,MAAM;AAAA,QACR;AAAA,MACF;AAEA,YAAM,eAAe,oBAAoB,QAAQ;AAEjD,UAAI,UAAU,CAAC,MAAM,kBAAkB;AACrC,4BAAoB,sBAAsB,QAAQ,EAAE,IAAI;AACxD,cAAM,SAAS,iBAAiB,KAAK,SAAS,KAAK,IAAI;AACvD,qBAAa,WACV,OAAO,UAAU,KAAgB,kBAAkB,QAAQ;AAC9D,qBAAa,QAAS,OAAO,OAAO,KAAgB;AACpD,qBAAa,OAAQ,OAAO,MAAM,KAAgB;AAAA,MACpD,WAAW,UAAU,CAAC,MAAM,kBAAkB;AAC5C,qBAAa,SAAS,KAAK;AAAA,MAC7B;AAAA,IACF,WAAW,UAAU,CAAC,MAAM,iCAAiC;AAC3D,YAAM,WAAW,UAAU,CAAC;AAE5B,UAAI,CAAC,UAAU;AACb;AAAA,MACF;AAEA,UAAI,CAAC,gBAAgB,QAAQ,GAAG;AAC9B,4BAAoB,kBAAkB,QAAQ,EAAE,IAAI;AACpD,wBAAgB,QAAQ,IAAI;AAAA,UAC1B,UAAU;AAAA,UACV,MAAM;AAAA,UACN,kBAAkB;AAAA,UAClB,eAAe;AAAA,UACf,MAAM;AAAA,QACR;AAAA,MACF;AAEA,YAAM,MAAM,gBAAgB,QAAQ;AAEpC,UAAI,UAAU,CAAC,MAAM,kBAAkB;AACrC,4BAAoB,kBAAkB,QAAQ,EAAE,IAAI;AACpD,cAAM,SAAS,iBAAiB,KAAK,SAAS,KAAK,IAAI;AACvD,YAAI,WACD,OAAO,UAAU,KAAgB,kBAAkB,QAAQ;AAC9D,YAAI,OAAQ,OAAO,MAAM,KAAgB;AACzC,YAAI,OAAQ,OAAO,MAAM,KAAgB;AACzC,YAAI,OAAO,MAAM,EAAG,wBAAuB;AAAA,MAC7C,WAAW,UAAU,CAAC,MAAM,gBAAgB;AAC1C,YAAI,mBAAmB,KAAK;AAAA,MAC9B,WAAW,UAAU,CAAC,MAAM,aAAa;AACvC,YAAI,gBAAgB,KAAK;AAAA,MAC3B;AAAA,IAEF,WAAW,UAAU,CAAC,MAAM,sBAAsB;AAChD,YAAM,WAAW,UAAU,CAAC;AAE5B,UAAI,CAAC,UAAU;AACb;AAAA,MACF;AAEA,UAAI,CAAC,cAAc,QAAQ,GAAG;AAC5B,sBAAc,QAAQ,IAAI;AAAA,UACxB,MAAM;AAAA,UACN,UAAU,kBAAkB,QAAQ;AAAA,UACpC,eAAe,CAAC;AAAA,UAChB,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,KAAK;AAAA,UACL,iBAAiB;AAAA,UACjB,eAAe;AAAA,UACf,cAAc;AAAA,UACd,MAAM;AAAA,UACN,MAAM;AAAA,UACN,YAAY;AAAA,QACd;AAAA,MACF;AAEA,YAAM,OAAO,cAAc,QAAQ;AAEnC,UAAI,UAAU,CAAC,MAAM,8BAA8B;AACjD,YAAI,UAAU,CAAC,GAAG,SAAS,gBAAgB,GAAG;AAC5C,gBAAM,eAAe,UAAU,CAAC,EAAE,QAAQ,IAAI,gBAAgB,IAAI,EAAE;AACpE,eAAK,cAAc,YAAY,IAAI,KAAK;AAAA,QAC1C;AAAA,MACF,WAAW,UAAU,CAAC,MAAM,kBAAkB;AAC5C,cAAM,SAAS,iBAAiB,KAAK,SAAS,KAAK,IAAI;AACvD,aAAK,WACF,OAAO,UAAU,KAAgB,kBAAkB,QAAQ;AAC9D,aAAK,OAAQ,OAAO,MAAM,KAAgB;AAAA,MAC5C,WAAW,UAAU,CAAC,MAAM,WAAW;AACrC,aAAK,OAAO,KAAK;AACjB,aAAK,OAAO;AAAA,MACd,WAAW,UAAU,CAAC,MAAM,kBAAkB;AAC5C,aAAK,SAAS,KAAK;AACnB,aAAK,OAAO;AAAA,MACd,WAAW,UAAU,CAAC,MAAM,kBAAkB;AAC5C,aAAK,MAAM,KAAK;AAAA,MAClB;AAAA,IACF,WAAW,UAAU,CAAC,MAAM,eAAe;AACzC,UAAI,CAAC,KAAK,YAAY;AACpB,cAAM,IAAI;AAAA,UACR,YAAY,KAAK,IAAI;AAAA,QACvB;AAAA,MACF;AAEA,UAAI,SAAS;AACX,cAAM,IAAI;AAAA,UACR,uCAAuC,OAAO;AAAA,QAChD;AAAA,MACF;AAEA,gBAAU,gBAAgB,KAAK,UAAU;AAAA,IAC3C,WAAW,qBAAqB,SAAS,UAAU,CAAC,KAAK,EAAE,GAAG;AAC5D,UAAI,KAAK,aAAa;AACpB,YAAI,WAAW;AACb,gBAAM,IAAI;AAAA,YACR,6CAA6C,OAAO;AAAA,UACtD;AAAA,QACF;AACA,oBAAY,kBAAkB,KAAK,WAAW;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,mBAAmB,OAAO,KAAK,mBAAmB,EAAE;AAAA,IACxD,CAAC,QAAQ,oBAAoB,GAAG,MAAM;AAAA,EACxC;AAEA,MAAI,iBAAiB,SAAS,GAAG;AAC/B,UAAM,IAAI;AAAA,MACR,uDAAuD,OAAO,KAAK,iBAAiB,KAAK,gBAAgB,CAAC;AAAA,IAC5G;AAAA,EACF;AAEA,QAAM,wBAAwB;AAAA,IAC5B;AAAA,IACA;AAAA,EACF;AAEA,QAAM,4BAA4B;AAAA,IAChC;AAAA,IACA;AAAA,EACF;AAIA,QAAM,kBAAuC;AAAA,IAC3C,GAAG;AAAA,IACH,yBAAyB;AAAA,EAC3B;AAEA,QAAM,yBACJ,SAAS,mBACR;AACH,MAAI,2BAA2B,QAAW;AACxC,oBAAgB,kBAAkB;AAAA,EACpC;AAEA,QAAM,6BACJ,SAAS,wBACR;AACH,MAAI,+BAA+B,QAAW;AAC5C,oBAAgB,uBAAuB;AAAA,EACzC;AAEA,SAAO;AAAA,IACL,CAAC,OAAO,GAAG;AAAA,MACT,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT;AAAA,MACA,cAAc,cAAc;AAAA,MAC5B,yBAAyB;AAAA,MACzB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAMO,IAAM,gBAAgB,CAC3B,OACA,cAC2B;AAC3B,QAAM,gBAAgB,MAAM,QAAQ,SAAS,IAAI,YAAY,CAAC,SAAS;AAEvE,SAAO,cAAc,OAA+B,CAAC,KAAK,aAAa;AACrE,WAAO,EAAE,GAAG,KAAK,GAAG,6BAA6B,UAAU,KAAK,EAAE;AAAA,EACpE,GAAG,CAAC,CAAC;AACP;AAMO,IAAM,yBAAyB,CACpC,UACgD;AAChD,QAAM,eAAe,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,kBAAkB;AAEpE,MAAI,CAAC,cAAc;AACjB,UAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AAEA,MAAI;AACF,WAAO,KAAK,MAAM,aAAa,OAAO;AAAA,EAGxC,QAAQ;AACN,UAAM,IAAI,MAAM,iCAAiC;AAAA,EACnD;AACF;;;ACtzBA,IAAM,mBAAmB,CAAC,mBAA4D;AACpF,QAAM,kBACJ,eAAe,SAAS;AAE1B,QAAM,mBAAmB,OAAO,OAAO,eAAe,OAAO,EAAE;AAAA,IAC7D,CAAC,KAAK,WAAW;AACf,UAAI,OAAO,QAAQ,IAAI;AACvB,aAAO;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,sBACJ,eAAe,SAAS;AAE1B,SAAO;AAAA,IACL,GAAG,eAAe,SAAS;AAAA,IAC3B,iBAAiB,kBACb;AAAA,MACE,GAAG;AAAA,MACH,UAAU,gBAAgB,WAAW,CAAC,GAAG,IAAI,CAAC,YAAY;AACxD,cAAM,SAAS,iBAAiB,OAAO;AAEvC,YAAI,CAAC,QAAQ;AACX,gBAAM,IAAI;AAAA,YACR,wBAAwB,OAAO,uEAAuE,OAAO,KAAK,gBAAgB,EAAE,KAAK,IAAI,CAAC;AAAA,UAChJ;AAAA,QACF;AAEA,eAAO;AAAA,MACT,CAAC;AAAA,IACH,IACA;AAAA,IACJ,sBAAsB;AAAA,IACtB,yBAAyB,eAAe,SAAS;AAAA,EACnD;AACF;AAEO,IAAM,4BAA4B,CACvC,mBACqB;AACrB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI;AAEJ,SAAO;AAAA,IACL,GAAG;AAAA,IACH,UAAU,SAAS;AAAA,IACnB,WAAW;AAAA,MACT,iBAAiB,OAAO,OAAO,cAAc;AAAA,MAC7C,iBAAiB,OAAO,OAAO,cAAc;AAAA,MAC7C,eAAe,OAAO,OAAO,MAAM;AAAA,MACnC,gBAAgB,OAAO,OAAO,aAAa;AAAA,MAC3C,eAAe,OAAO,OAAO,YAAY;AAAA,MACzC,qBAAqB,OAAO,OAAO,OAAO;AAAA,MAC1C,eAAe,OAAO,OAAO,YAAY;AAAA,MACzC,4BAA4B,OAAO,OAAO,uBAAuB;AAAA,MACjE,2BAA2B,OAAO,OAAO,eAAe;AAAA,MACxD,kBAAkB,OAAO,OAAO,eAAe;AAAA,IACjD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,iBAAiB,cAAc;AAAA,IAC5C,iBAAiB;AAAA,IACjB,UAAU,SAAS,YAAY,CAAC;AAAA,EAClC;AACF;","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.
|
|
3
|
+
"version": "0.3.0",
|
|
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
|
}
|