@kizenapps/packager 0.1.2-b893782 → 0.2.0-c6aee7b

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -32,6 +32,7 @@ var index_exports = {};
32
32
  __export(index_exports, {
33
33
  AUTOMATION_SCRIPT_FILE: () => AUTOMATION_SCRIPT_FILE,
34
34
  AUTOMATION_STEPS_DIRECTORY_NAME: () => AUTOMATION_STEPS_DIRECTORY_NAME,
35
+ BLOCKS_DIRECTORY_NAME: () => BLOCKS_DIRECTORY_NAME,
35
36
  BROWSER_ROUTE_SCRIPTS_DIRECTORY_NAME: () => BROWSER_ROUTE_SCRIPTS_DIRECTORY_NAME,
36
37
  CALENDAR_SOURCES_DIRECTORY_NAME: () => CALENDAR_SOURCES_DIRECTORY_NAME,
37
38
  CALLBACK_SCRIPT_FILE: () => CALLBACK_SCRIPT_FILE,
@@ -138,6 +139,7 @@ var SETUP_ASSISTANT_DIRECTORY_NAME = "setupAssistant";
138
139
  var USER_SETUP_ASSISTANT_DIRECTORY_NAME = "userSetupAssistant";
139
140
  var CALENDAR_SOURCES_DIRECTORY_NAME = "calendarSources";
140
141
  var VIEWS_DIRECTORY_NAME = "views";
142
+ var BLOCKS_DIRECTORY_NAME = "blocks";
141
143
  var THUMBNAIL_FILE_NAMES = thumbnailImageExtensions.map(
142
144
  (ext) => `thumbnail.${ext}`
143
145
  );
@@ -257,10 +259,7 @@ var processSetupAssistantFromFiles = (assistantConfig, scripts) => {
257
259
  }
258
260
  const scriptsByKey = scripts.reduce(
259
261
  (acc, script) => {
260
- if (!acc[script.key]) {
261
- acc[script.key] = {};
262
- }
263
- acc[script.key][script.type] = script.content;
262
+ (acc[script.key] ??= {})[script.type] = script.content;
264
263
  return acc;
265
264
  },
266
265
  {}
@@ -287,6 +286,7 @@ var processOnePluginFromManifest = (manifest, files) => {
287
286
  (file) => file.path.endsWith(`${version}.${RELEASE_NOTES_EXTENSION}`)
288
287
  );
289
288
  const floatingFrames = {};
289
+ const blocks = {};
290
290
  const dataAdornments = {};
291
291
  const toolbarItems = {};
292
292
  const routablePages = {};
@@ -335,7 +335,9 @@ var processOnePluginFromManifest = (manifest, files) => {
335
335
  }
336
336
  } else if (splitPath[0] === FLOATING_FRAMES_DIRECTORY_NAME) {
337
337
  const floatingFrameName = splitPath[1];
338
- if (!floatingFrameName) continue;
338
+ if (!floatingFrameName) {
339
+ continue;
340
+ }
339
341
  if (!floatingFrames[floatingFrameName]) {
340
342
  requiredConfigFiles[`frame:${floatingFrameName}`] = true;
341
343
  floatingFrames[floatingFrameName] = {
@@ -395,9 +397,61 @@ var processOnePluginFromManifest = (manifest, files) => {
395
397
  } else if (splitPath[2] === STYLES_FILE_NAME) {
396
398
  frame.css = file.minified;
397
399
  }
400
+ } else if (splitPath[0] === BLOCKS_DIRECTORY_NAME) {
401
+ const blockName = splitPath[1];
402
+ if (!blockName) {
403
+ continue;
404
+ }
405
+ if (!blocks[blockName]) {
406
+ requiredConfigFiles[`block:${blockName}`] = true;
407
+ blocks[blockName] = {
408
+ name: "",
409
+ api_name: "",
410
+ min_w: 1,
411
+ max_w: 12,
412
+ min_h: 1,
413
+ max_h: 12,
414
+ event_scripts: {},
415
+ script: "",
416
+ styles: "",
417
+ when: ""
418
+ };
419
+ }
420
+ const block = blocks[blockName];
421
+ if (splitPath[2] === EVENT_SCRIPTS_DIRECTORY_NAME) {
422
+ if (splitPath[3]?.endsWith(`.${SCRIPT_EXTENSION}`)) {
423
+ const functionName = splitPath[3].replace(`.${SCRIPT_EXTENSION}`, "");
424
+ block.event_scripts[functionName] = file.minified;
425
+ }
426
+ } else if (splitPath[2] === CONFIG_FILE_NAME) {
427
+ requiredConfigFiles[`block:${blockName}`] = false;
428
+ const config = maybeParseConfig(file.content, file.path);
429
+ block.name = config["name"] || "";
430
+ block.api_name = config["api_name"] || sanitizeToAPIName(blockName);
431
+ block.min_w = config["min_w"] || 1;
432
+ block.max_w = config["max_w"] || 12;
433
+ block.min_h = config["min_h"] || 1;
434
+ block.max_h = config["max_h"] || 12;
435
+ if (config["recommended_height"] != null) {
436
+ block.recommended_height = config["recommended_height"];
437
+ }
438
+ if (config["types"]) {
439
+ block.types = config["types"];
440
+ }
441
+ block.when = config["when"] || "";
442
+ if (config["when"]) {
443
+ hasBlockingCondition = true;
444
+ }
445
+ } else if (splitPath[2] === MAIN_SCRIPT_FILE) {
446
+ block.script = file.minified;
447
+ } else if (splitPath[2] === STYLES_FILE_NAME) {
448
+ block.styles = file.minified;
449
+ }
398
450
  } else if (splitPath[0] === DATA_ADORNMENTS_DIRECTORY_NAME) {
399
451
  const dataAdornmentName = splitPath[1];
400
- if (!dataAdornmentName) continue;
452
+ if (!dataAdornmentName) {
453
+ continue;
454
+ }
401
455
  if (!dataAdornments[dataAdornmentName]) {
402
456
  requiredConfigFiles[`dataAdornment:${dataAdornmentName}`] = true;
403
457
  dataAdornments[dataAdornmentName] = {
@@ -428,7 +482,9 @@ var processOnePluginFromManifest = (manifest, files) => {
428
482
  }
429
483
  } else if (splitPath[0] === TOOLBAR_ITEMS_DIRECTORY_NAME) {
430
484
  const toolbarItemName = splitPath[1];
431
- if (!toolbarItemName) continue;
485
+ if (!toolbarItemName) {
486
+ continue;
487
+ }
432
488
  if (!toolbarItems[toolbarItemName]) {
433
489
  requiredConfigFiles[`toolbarItem:${toolbarItemName}`] = true;
434
490
  toolbarItems[toolbarItemName] = {
@@ -455,7 +511,9 @@ var processOnePluginFromManifest = (manifest, files) => {
455
511
  }
456
512
  } else if (splitPath[0] === ROUTABLE_PAGES_DIRECTORY_NAME) {
457
513
  const pageName = splitPath[1];
458
- if (!pageName) continue;
514
+ if (!pageName) {
515
+ continue;
516
+ }
459
517
  if (!routablePages[pageName]) {
460
518
  requiredConfigFiles[`page:${pageName}`] = true;
461
519
  routablePages[pageName] = {
@@ -496,7 +554,9 @@ var processOnePluginFromManifest = (manifest, files) => {
496
554
  }
497
555
  } else if (splitPath[0] === AUTOMATION_STEPS_DIRECTORY_NAME) {
498
556
  const stepName = splitPath[1];
499
- if (!stepName) continue;
557
+ if (!stepName) {
558
+ continue;
559
+ }
500
560
  if (!automationSteps[stepName]) {
501
561
  requiredConfigFiles[`automationStep:${stepName}`] = true;
502
562
  automationSteps[stepName] = {
@@ -535,7 +595,9 @@ var processOnePluginFromManifest = (manifest, files) => {
535
595
  }
536
596
  } else if (splitPath[0] === BROWSER_ROUTE_SCRIPTS_DIRECTORY_NAME) {
537
597
  const routeName = splitPath[1];
538
- if (!routeName) continue;
598
+ if (!routeName) {
599
+ continue;
600
+ }
539
601
  if (!routeScripts[routeName]) {
540
602
  requiredConfigFiles[`route:${routeName}`] = true;
541
603
  routeScripts[routeName] = {
@@ -559,7 +621,9 @@ var processOnePluginFromManifest = (manifest, files) => {
559
621
  }
560
622
  } else if (splitPath[0] === JS_ACTIONS_DIRECTORY_NAME) {
561
623
  const actionName = splitPath[1];
562
- if (!actionName) continue;
624
+ if (!actionName) {
625
+ continue;
626
+ }
563
627
  if (!jsActions[actionName]) {
564
628
  requiredConfigFiles[`action:${actionName}`] = true;
565
629
  jsActions[actionName] = {
@@ -581,7 +645,9 @@ var processOnePluginFromManifest = (manifest, files) => {
581
645
  }
582
646
  } else if (splitPath[0] === OBJECT_SETTINGS_ITEMS_DIRECTORY_NAME) {
583
647
  const itemName = splitPath[1];
584
- if (!itemName) continue;
648
+ if (!itemName) {
649
+ continue;
650
+ }
585
651
  if (!objectSettingsItems[itemName]) {
586
652
  requiredConfigFiles[`objectSettingsItem:${itemName}`] = true;
587
653
  objectSettingsItems[itemName] = {
@@ -603,7 +669,9 @@ var processOnePluginFromManifest = (manifest, files) => {
603
669
  }
604
670
  } else if (splitPath[0] === CALENDAR_SOURCES_DIRECTORY_NAME) {
605
671
  const itemName = splitPath[1];
606
- if (!itemName) continue;
672
+ if (!itemName) {
673
+ continue;
674
+ }
607
675
  if (!calendarSources[itemName]) {
608
676
  requiredConfigFiles[`calendarSource:${itemName}`] = true;
609
677
  calendarSources[itemName] = {
@@ -629,7 +697,9 @@ var processOnePluginFromManifest = (manifest, files) => {
629
697
  }
630
698
  } else if (splitPath[0] === VIEWS_DIRECTORY_NAME) {
631
699
  const pageName = splitPath[1];
632
- if (!pageName) continue;
700
+ if (!pageName) {
701
+ continue;
702
+ }
633
703
  if (!routablePages[pageName]) {
634
704
  routablePages[pageName] = {
635
705
  name: pageName,
@@ -721,6 +791,7 @@ var processOnePluginFromManifest = (manifest, files) => {
721
791
  manifest: updatedManifest,
722
792
  thumbnail,
723
793
  floatingFrames,
794
+ blocks,
724
795
  dataAdornments,
725
796
  toolbarItems,
726
797
  routablePages,
@@ -785,6 +856,7 @@ var transformDeployablePlugin = (packagedPlugin) => {
785
856
  const {
786
857
  manifest,
787
858
  floatingFrames,
859
+ blocks,
788
860
  dataAdornments,
789
861
  routablePages,
790
862
  toolbarItems,
@@ -803,6 +875,7 @@ var transformDeployablePlugin = (packagedPlugin) => {
803
875
  artifacts: {
804
876
  data_adornments: Object.values(dataAdornments),
805
877
  floating_frames: Object.values(floatingFrames),
878
+ custom_blocks: Object.values(blocks),
806
879
  routable_pages: Object.values(routablePages),
807
880
  toolbar_items: Object.values(toolbarItems),
808
881
  js_action_templates: Object.values(actions),
@@ -823,6 +896,7 @@ var transformDeployablePlugin = (packagedPlugin) => {
823
896
  0 && (module.exports = {
824
897
  AUTOMATION_SCRIPT_FILE,
825
898
  AUTOMATION_STEPS_DIRECTORY_NAME,
899
+ BLOCKS_DIRECTORY_NAME,
826
900
  BROWSER_ROUTE_SCRIPTS_DIRECTORY_NAME,
827
901
  CALENDAR_SOURCES_DIRECTORY_NAME,
828
902
  CALLBACK_SCRIPT_FILE,
@@ -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 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 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\";\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 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 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 if (!acc[script.key]) {\n acc[script.key] = {};\n }\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 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 if (!floatingFrameName) continue;\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] === DATA_ADORNMENTS_DIRECTORY_NAME) {\n const dataAdornmentName = splitPath[1];\n if (!dataAdornmentName) continue;\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 if (!toolbarItemName) continue;\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 if (!pageName) continue;\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 if (!stepName) continue;\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 if (!routeName) continue;\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 if (!actionName) continue;\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 if (!itemName) continue;\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 if (!itemName) continue;\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 if (!pageName) continue;\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 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 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 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"],"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":[]}
package/dist/index.d.cts CHANGED
@@ -145,6 +145,21 @@ type FloatingFrame = {
145
145
  when: string;
146
146
  };
147
147
  type FloatingFramesMap = Record<string, FloatingFrame>;
148
+ type Block = {
149
+ name: string;
150
+ api_name: string;
151
+ min_w: number;
152
+ max_w: number;
153
+ min_h: number;
154
+ max_h: number;
155
+ recommended_height?: number;
156
+ event_scripts: EventScripts;
157
+ script: string;
158
+ styles: string;
159
+ types?: Array<string>;
160
+ when: string;
161
+ };
162
+ type BlocksMap = Record<string, Block>;
148
163
  type AutomationScriptRuntimeInput = `${string} ${number}.${number}`;
149
164
  type AutomationScriptRuntimeOutput = `${string}-${number}-${number}`;
150
165
  type AutomationStep = {
@@ -184,6 +199,7 @@ type AutomationStepsMap = Record<string, AutomationStep>;
184
199
  type PackagedPlugin = {
185
200
  manifest: ManifestFileContent;
186
201
  floatingFrames: FloatingFramesMap;
202
+ blocks: BlocksMap;
187
203
  dataAdornments: DataAdornmentsMap;
188
204
  routablePages: RoutablePagesMap;
189
205
  toolbarItems: ToolbarItemsMap;
@@ -202,6 +218,7 @@ type DeployablePlugin = ManifestFileContent & {
202
218
  artifacts: {
203
219
  data_adornments: Array<DataAdornment>;
204
220
  floating_frames: Array<FloatingFrame>;
221
+ custom_blocks: Array<Block>;
205
222
  routable_pages: Array<RoutablePage>;
206
223
  toolbar_items: Array<ToolbarItem>;
207
224
  js_action_templates: Array<JSAction>;
@@ -248,6 +265,7 @@ declare const AUTOMATION_STEPS_DIRECTORY_NAME = "automationSteps";
248
265
  declare const SETUP_ASSISTANT_DIRECTORY_NAME = "setupAssistant";
249
266
  declare const USER_SETUP_ASSISTANT_DIRECTORY_NAME = "userSetupAssistant";
250
267
  declare const CALENDAR_SOURCES_DIRECTORY_NAME = "calendarSources";
268
+ declare const BLOCKS_DIRECTORY_NAME = "blocks";
251
269
  declare const THUMBNAIL_FILE_NAMES: string[];
252
270
  declare const RELEASE_NOTES_EXTENSION = "md";
253
271
  declare const SCRIPT_EXTENSION = "js";
@@ -263,4 +281,4 @@ declare const maybeParseConfig: (content: string | undefined, path: string) => R
263
281
  declare const getMinimizedConfig: (config: Record<string, unknown>, entry: string, splitPath: string[], consideredFiles: MinifiedFileContent[]) => Record<string, unknown>;
264
282
  declare const getAdornmentIcon: (config: Record<string, unknown>, entry: string, splitPath: string[], consideredFiles: MinifiedFileContent[]) => string;
265
283
 
266
- export { AUTOMATION_SCRIPT_FILE, AUTOMATION_STEPS_DIRECTORY_NAME, type AutomationScriptRuntimeInput, type AutomationScriptRuntimeOutput, type AutomationStep, type AutomationStepsMap, BROWSER_ROUTE_SCRIPTS_DIRECTORY_NAME, 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 };
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 };
package/dist/index.d.ts CHANGED
@@ -145,6 +145,21 @@ type FloatingFrame = {
145
145
  when: string;
146
146
  };
147
147
  type FloatingFramesMap = Record<string, FloatingFrame>;
148
+ type Block = {
149
+ name: string;
150
+ api_name: string;
151
+ min_w: number;
152
+ max_w: number;
153
+ min_h: number;
154
+ max_h: number;
155
+ recommended_height?: number;
156
+ event_scripts: EventScripts;
157
+ script: string;
158
+ styles: string;
159
+ types?: Array<string>;
160
+ when: string;
161
+ };
162
+ type BlocksMap = Record<string, Block>;
148
163
  type AutomationScriptRuntimeInput = `${string} ${number}.${number}`;
149
164
  type AutomationScriptRuntimeOutput = `${string}-${number}-${number}`;
150
165
  type AutomationStep = {
@@ -184,6 +199,7 @@ type AutomationStepsMap = Record<string, AutomationStep>;
184
199
  type PackagedPlugin = {
185
200
  manifest: ManifestFileContent;
186
201
  floatingFrames: FloatingFramesMap;
202
+ blocks: BlocksMap;
187
203
  dataAdornments: DataAdornmentsMap;
188
204
  routablePages: RoutablePagesMap;
189
205
  toolbarItems: ToolbarItemsMap;
@@ -202,6 +218,7 @@ type DeployablePlugin = ManifestFileContent & {
202
218
  artifacts: {
203
219
  data_adornments: Array<DataAdornment>;
204
220
  floating_frames: Array<FloatingFrame>;
221
+ custom_blocks: Array<Block>;
205
222
  routable_pages: Array<RoutablePage>;
206
223
  toolbar_items: Array<ToolbarItem>;
207
224
  js_action_templates: Array<JSAction>;
@@ -248,6 +265,7 @@ declare const AUTOMATION_STEPS_DIRECTORY_NAME = "automationSteps";
248
265
  declare const SETUP_ASSISTANT_DIRECTORY_NAME = "setupAssistant";
249
266
  declare const USER_SETUP_ASSISTANT_DIRECTORY_NAME = "userSetupAssistant";
250
267
  declare const CALENDAR_SOURCES_DIRECTORY_NAME = "calendarSources";
268
+ declare const BLOCKS_DIRECTORY_NAME = "blocks";
251
269
  declare const THUMBNAIL_FILE_NAMES: string[];
252
270
  declare const RELEASE_NOTES_EXTENSION = "md";
253
271
  declare const SCRIPT_EXTENSION = "js";
@@ -263,4 +281,4 @@ declare const maybeParseConfig: (content: string | undefined, path: string) => R
263
281
  declare const getMinimizedConfig: (config: Record<string, unknown>, entry: string, splitPath: string[], consideredFiles: MinifiedFileContent[]) => Record<string, unknown>;
264
282
  declare const getAdornmentIcon: (config: Record<string, unknown>, entry: string, splitPath: string[], consideredFiles: MinifiedFileContent[]) => string;
265
283
 
266
- export { AUTOMATION_SCRIPT_FILE, AUTOMATION_STEPS_DIRECTORY_NAME, type AutomationScriptRuntimeInput, type AutomationScriptRuntimeOutput, type AutomationStep, type AutomationStepsMap, BROWSER_ROUTE_SCRIPTS_DIRECTORY_NAME, 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 };
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 };
package/dist/index.js CHANGED
@@ -67,6 +67,7 @@ var SETUP_ASSISTANT_DIRECTORY_NAME = "setupAssistant";
67
67
  var USER_SETUP_ASSISTANT_DIRECTORY_NAME = "userSetupAssistant";
68
68
  var CALENDAR_SOURCES_DIRECTORY_NAME = "calendarSources";
69
69
  var VIEWS_DIRECTORY_NAME = "views";
70
+ var BLOCKS_DIRECTORY_NAME = "blocks";
70
71
  var THUMBNAIL_FILE_NAMES = thumbnailImageExtensions.map(
71
72
  (ext) => `thumbnail.${ext}`
72
73
  );
@@ -186,10 +187,7 @@ var processSetupAssistantFromFiles = (assistantConfig, scripts) => {
186
187
  }
187
188
  const scriptsByKey = scripts.reduce(
188
189
  (acc, script) => {
189
- if (!acc[script.key]) {
190
- acc[script.key] = {};
191
- }
192
- acc[script.key][script.type] = script.content;
190
+ (acc[script.key] ??= {})[script.type] = script.content;
193
191
  return acc;
194
192
  },
195
193
  {}
@@ -216,6 +214,7 @@ var processOnePluginFromManifest = (manifest, files) => {
216
214
  (file) => file.path.endsWith(`${version}.${RELEASE_NOTES_EXTENSION}`)
217
215
  );
218
216
  const floatingFrames = {};
217
+ const blocks = {};
219
218
  const dataAdornments = {};
220
219
  const toolbarItems = {};
221
220
  const routablePages = {};
@@ -264,7 +263,9 @@ var processOnePluginFromManifest = (manifest, files) => {
264
263
  }
265
264
  } else if (splitPath[0] === FLOATING_FRAMES_DIRECTORY_NAME) {
266
265
  const floatingFrameName = splitPath[1];
267
- if (!floatingFrameName) continue;
266
+ if (!floatingFrameName) {
267
+ continue;
268
+ }
268
269
  if (!floatingFrames[floatingFrameName]) {
269
270
  requiredConfigFiles[`frame:${floatingFrameName}`] = true;
270
271
  floatingFrames[floatingFrameName] = {
@@ -324,9 +325,61 @@ var processOnePluginFromManifest = (manifest, files) => {
324
325
  } else if (splitPath[2] === STYLES_FILE_NAME) {
325
326
  frame.css = file.minified;
326
327
  }
328
+ } else if (splitPath[0] === BLOCKS_DIRECTORY_NAME) {
329
+ const blockName = splitPath[1];
330
+ if (!blockName) {
331
+ continue;
332
+ }
333
+ if (!blocks[blockName]) {
334
+ requiredConfigFiles[`block:${blockName}`] = true;
335
+ blocks[blockName] = {
336
+ name: "",
337
+ api_name: "",
338
+ min_w: 1,
339
+ max_w: 12,
340
+ min_h: 1,
341
+ max_h: 12,
342
+ event_scripts: {},
343
+ script: "",
344
+ styles: "",
345
+ when: ""
346
+ };
347
+ }
348
+ const block = blocks[blockName];
349
+ if (splitPath[2] === EVENT_SCRIPTS_DIRECTORY_NAME) {
350
+ if (splitPath[3]?.endsWith(`.${SCRIPT_EXTENSION}`)) {
351
+ const functionName = splitPath[3].replace(`.${SCRIPT_EXTENSION}`, "");
352
+ block.event_scripts[functionName] = file.minified;
353
+ }
354
+ } else if (splitPath[2] === CONFIG_FILE_NAME) {
355
+ requiredConfigFiles[`block:${blockName}`] = false;
356
+ const config = maybeParseConfig(file.content, file.path);
357
+ block.name = config["name"] || "";
358
+ block.api_name = config["api_name"] || sanitizeToAPIName(blockName);
359
+ block.min_w = config["min_w"] || 1;
360
+ block.max_w = config["max_w"] || 12;
361
+ block.min_h = config["min_h"] || 1;
362
+ block.max_h = config["max_h"] || 12;
363
+ if (config["recommended_height"] != null) {
364
+ block.recommended_height = config["recommended_height"];
365
+ }
366
+ if (config["types"]) {
367
+ block.types = config["types"];
368
+ }
369
+ block.when = config["when"] || "";
370
+ if (config["when"]) {
371
+ hasBlockingCondition = true;
372
+ }
373
+ } else if (splitPath[2] === MAIN_SCRIPT_FILE) {
374
+ block.script = file.minified;
375
+ } else if (splitPath[2] === STYLES_FILE_NAME) {
376
+ block.styles = file.minified;
377
+ }
327
378
  } else if (splitPath[0] === DATA_ADORNMENTS_DIRECTORY_NAME) {
328
379
  const dataAdornmentName = splitPath[1];
329
- if (!dataAdornmentName) continue;
380
+ if (!dataAdornmentName) {
381
+ continue;
382
+ }
330
383
  if (!dataAdornments[dataAdornmentName]) {
331
384
  requiredConfigFiles[`dataAdornment:${dataAdornmentName}`] = true;
332
385
  dataAdornments[dataAdornmentName] = {
@@ -357,7 +410,9 @@ var processOnePluginFromManifest = (manifest, files) => {
357
410
  }
358
411
  } else if (splitPath[0] === TOOLBAR_ITEMS_DIRECTORY_NAME) {
359
412
  const toolbarItemName = splitPath[1];
360
- if (!toolbarItemName) continue;
413
+ if (!toolbarItemName) {
414
+ continue;
415
+ }
361
416
  if (!toolbarItems[toolbarItemName]) {
362
417
  requiredConfigFiles[`toolbarItem:${toolbarItemName}`] = true;
363
418
  toolbarItems[toolbarItemName] = {
@@ -384,7 +439,9 @@ var processOnePluginFromManifest = (manifest, files) => {
384
439
  }
385
440
  } else if (splitPath[0] === ROUTABLE_PAGES_DIRECTORY_NAME) {
386
441
  const pageName = splitPath[1];
387
- if (!pageName) continue;
442
+ if (!pageName) {
443
+ continue;
444
+ }
388
445
  if (!routablePages[pageName]) {
389
446
  requiredConfigFiles[`page:${pageName}`] = true;
390
447
  routablePages[pageName] = {
@@ -425,7 +482,9 @@ var processOnePluginFromManifest = (manifest, files) => {
425
482
  }
426
483
  } else if (splitPath[0] === AUTOMATION_STEPS_DIRECTORY_NAME) {
427
484
  const stepName = splitPath[1];
428
- if (!stepName) continue;
485
+ if (!stepName) {
486
+ continue;
487
+ }
429
488
  if (!automationSteps[stepName]) {
430
489
  requiredConfigFiles[`automationStep:${stepName}`] = true;
431
490
  automationSteps[stepName] = {
@@ -464,7 +523,9 @@ var processOnePluginFromManifest = (manifest, files) => {
464
523
  }
465
524
  } else if (splitPath[0] === BROWSER_ROUTE_SCRIPTS_DIRECTORY_NAME) {
466
525
  const routeName = splitPath[1];
467
- if (!routeName) continue;
526
+ if (!routeName) {
527
+ continue;
528
+ }
468
529
  if (!routeScripts[routeName]) {
469
530
  requiredConfigFiles[`route:${routeName}`] = true;
470
531
  routeScripts[routeName] = {
@@ -488,7 +549,9 @@ var processOnePluginFromManifest = (manifest, files) => {
488
549
  }
489
550
  } else if (splitPath[0] === JS_ACTIONS_DIRECTORY_NAME) {
490
551
  const actionName = splitPath[1];
491
- if (!actionName) continue;
552
+ if (!actionName) {
553
+ continue;
554
+ }
492
555
  if (!jsActions[actionName]) {
493
556
  requiredConfigFiles[`action:${actionName}`] = true;
494
557
  jsActions[actionName] = {
@@ -510,7 +573,9 @@ var processOnePluginFromManifest = (manifest, files) => {
510
573
  }
511
574
  } else if (splitPath[0] === OBJECT_SETTINGS_ITEMS_DIRECTORY_NAME) {
512
575
  const itemName = splitPath[1];
513
- if (!itemName) continue;
576
+ if (!itemName) {
577
+ continue;
578
+ }
514
579
  if (!objectSettingsItems[itemName]) {
515
580
  requiredConfigFiles[`objectSettingsItem:${itemName}`] = true;
516
581
  objectSettingsItems[itemName] = {
@@ -532,7 +597,9 @@ var processOnePluginFromManifest = (manifest, files) => {
532
597
  }
533
598
  } else if (splitPath[0] === CALENDAR_SOURCES_DIRECTORY_NAME) {
534
599
  const itemName = splitPath[1];
535
- if (!itemName) continue;
600
+ if (!itemName) {
601
+ continue;
602
+ }
536
603
  if (!calendarSources[itemName]) {
537
604
  requiredConfigFiles[`calendarSource:${itemName}`] = true;
538
605
  calendarSources[itemName] = {
@@ -558,7 +625,9 @@ var processOnePluginFromManifest = (manifest, files) => {
558
625
  }
559
626
  } else if (splitPath[0] === VIEWS_DIRECTORY_NAME) {
560
627
  const pageName = splitPath[1];
561
- if (!pageName) continue;
628
+ if (!pageName) {
629
+ continue;
630
+ }
562
631
  if (!routablePages[pageName]) {
563
632
  routablePages[pageName] = {
564
633
  name: pageName,
@@ -650,6 +719,7 @@ var processOnePluginFromManifest = (manifest, files) => {
650
719
  manifest: updatedManifest,
651
720
  thumbnail,
652
721
  floatingFrames,
722
+ blocks,
653
723
  dataAdornments,
654
724
  toolbarItems,
655
725
  routablePages,
@@ -714,6 +784,7 @@ var transformDeployablePlugin = (packagedPlugin) => {
714
784
  const {
715
785
  manifest,
716
786
  floatingFrames,
787
+ blocks,
717
788
  dataAdornments,
718
789
  routablePages,
719
790
  toolbarItems,
@@ -732,6 +803,7 @@ var transformDeployablePlugin = (packagedPlugin) => {
732
803
  artifacts: {
733
804
  data_adornments: Object.values(dataAdornments),
734
805
  floating_frames: Object.values(floatingFrames),
806
+ custom_blocks: Object.values(blocks),
735
807
  routable_pages: Object.values(routablePages),
736
808
  toolbar_items: Object.values(toolbarItems),
737
809
  js_action_templates: Object.values(actions),
@@ -751,6 +823,7 @@ var transformDeployablePlugin = (packagedPlugin) => {
751
823
  export {
752
824
  AUTOMATION_SCRIPT_FILE,
753
825
  AUTOMATION_STEPS_DIRECTORY_NAME,
826
+ BLOCKS_DIRECTORY_NAME,
754
827
  BROWSER_ROUTE_SCRIPTS_DIRECTORY_NAME,
755
828
  CALENDAR_SOURCES_DIRECTORY_NAME,
756
829
  CALLBACK_SCRIPT_FILE,
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\";\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 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 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 if (!acc[script.key]) {\n acc[script.key] = {};\n }\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 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 if (!floatingFrameName) continue;\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] === DATA_ADORNMENTS_DIRECTORY_NAME) {\n const dataAdornmentName = splitPath[1];\n if (!dataAdornmentName) continue;\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 if (!toolbarItemName) continue;\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 if (!pageName) continue;\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 if (!stepName) continue;\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 if (!routeName) continue;\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 if (!actionName) continue;\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 if (!itemName) continue;\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 if (!itemName) continue;\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 if (!pageName) continue;\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 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 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 routable_pages: Object.values(routablePages),\n toolbar_items: Object.values(toolbarItems),\n js_action_templates: Object.values(actions),\n route_scripts: Object.values(routeScripts),\n object_settings_menu_items: Object.values(objectSettingsMenuItems),\n automation_action_configs: Object.values(automationSteps),\n calendar_sources: Object.values(calendarSources),\n },\n thumbnail,\n kznFile,\n releaseNotes,\n base_config: formatBaseConfig(packagedPlugin),\n setup_assistant: undefined,\n services: manifest.services ?? [],\n };\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/lib/minify.ts","../src/lib/apiNames.ts","../src/lib/image.ts","../src/lib/structure.ts","../src/lib/package.ts","../src/lib/transform.ts"],"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":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kizenapps/packager",
3
- "version": "0.1.2-b893782",
3
+ "version": "0.2.0-c6aee7b",
4
4
  "description": "App packaging pipeline for Kizen plugin tools",
5
5
  "license": "GPL-3.0",
6
6
  "type": "module",