@webiny/website-builder-sdk 0.0.0-unstable.e53eceafb5 → 0.0.0-unstable.e6f0dc8ca7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/BindingsApi.d.ts +4 -4
  2. package/BindingsApi.js +3 -3
  3. package/BindingsApi.js.map +1 -1
  4. package/BindingsProcessor.d.ts +1 -1
  5. package/BindingsProcessor.js.map +1 -1
  6. package/BindingsProcessor.test.js +2 -1
  7. package/BindingsProcessor.test.js.map +1 -1
  8. package/BindingsResolver.d.ts +2 -2
  9. package/BindingsResolver.js +3 -6
  10. package/BindingsResolver.js.map +1 -1
  11. package/BindingsResolver.test.js +4 -3
  12. package/BindingsResolver.test.js.map +1 -1
  13. package/ComponentInputTraverser.d.ts +1 -1
  14. package/ComponentInputTraverser.js.map +1 -1
  15. package/ComponentManifestToAstConverter.d.ts +1 -1
  16. package/ComponentManifestToAstConverter.js.map +1 -1
  17. package/ComponentRegistry.js +30 -0
  18. package/ComponentRegistry.js.map +1 -1
  19. package/ComponentResolver.d.ts +2 -2
  20. package/ComponentResolver.js +3 -3
  21. package/ComponentResolver.js.map +1 -1
  22. package/ConstraintEvaluator.d.ts +36 -0
  23. package/ConstraintEvaluator.js +395 -0
  24. package/ConstraintEvaluator.js.map +1 -0
  25. package/ConstraintEvaluator.test.d.ts +1 -0
  26. package/ConstraintEvaluator.test.js +1456 -0
  27. package/ConstraintEvaluator.test.js.map +1 -0
  28. package/ContentSdk.d.ts +13 -7
  29. package/ContentSdk.js +26 -10
  30. package/ContentSdk.js.map +1 -1
  31. package/DocumentStore.d.ts +3 -3
  32. package/DocumentStore.js +1 -1
  33. package/DocumentStore.js.map +1 -1
  34. package/DocumentStoreManager.d.ts +2 -2
  35. package/DocumentStoreManager.js +1 -1
  36. package/DocumentStoreManager.js.map +1 -1
  37. package/EditingSdk.d.ts +4 -4
  38. package/EditingSdk.js +12 -15
  39. package/EditingSdk.js.map +1 -1
  40. package/ElementFactory.d.ts +5 -6
  41. package/ElementFactory.js +25 -16
  42. package/ElementFactory.js.map +1 -1
  43. package/ElementFactory.test.d.ts +1 -0
  44. package/ElementFactory.test.js +280 -0
  45. package/ElementFactory.test.js.map +1 -0
  46. package/HashObject.js +14 -0
  47. package/HashObject.js.map +1 -1
  48. package/HotkeyManager.js +1 -1
  49. package/HotkeyManager.js.map +1 -1
  50. package/IBindingsUpdater.d.ts +2 -2
  51. package/IBindingsUpdater.js.map +1 -1
  52. package/IRedirects.d.ts +5 -0
  53. package/IRedirects.js +3 -0
  54. package/IRedirects.js.map +1 -0
  55. package/InheritanceProcessor.d.ts +4 -4
  56. package/InheritanceProcessor.js.map +1 -1
  57. package/InheritanceProcessor.test.js +2 -1
  58. package/InheritanceProcessor.test.js.map +1 -1
  59. package/InheritedValueResolver.d.ts +1 -1
  60. package/InheritedValueResolver.js.map +1 -1
  61. package/InputBindingsProcessor.d.ts +4 -4
  62. package/InputBindingsProcessor.js +29 -11
  63. package/InputBindingsProcessor.js.map +1 -1
  64. package/InputsBindingsProcessor.test.js +4 -2
  65. package/InputsBindingsProcessor.test.js.map +1 -1
  66. package/InputsUpdater.d.ts +5 -5
  67. package/InputsUpdater.js +2 -2
  68. package/InputsUpdater.js.map +1 -1
  69. package/LiveSdk.d.ts +2 -2
  70. package/LiveSdk.js +1 -1
  71. package/LiveSdk.js.map +1 -1
  72. package/Logger.d.ts +2 -1
  73. package/Logger.js +7 -4
  74. package/Logger.js.map +1 -1
  75. package/NullSdk.d.ts +5 -3
  76. package/NullSdk.js +10 -0
  77. package/NullSdk.js.map +1 -1
  78. package/PreviewDocument.js +1 -1
  79. package/PreviewDocument.js.map +1 -1
  80. package/PreviewSdk.d.ts +2 -2
  81. package/PreviewSdk.js +3 -3
  82. package/PreviewSdk.js.map +1 -1
  83. package/PreviewViewport.d.ts +1 -2
  84. package/PreviewViewport.js +1 -21
  85. package/PreviewViewport.js.map +1 -1
  86. package/README.md +10 -2
  87. package/StylesBindingsProcessor.d.ts +2 -2
  88. package/StylesBindingsProcessor.js +4 -4
  89. package/StylesBindingsProcessor.js.map +1 -1
  90. package/StylesUpdater.d.ts +4 -4
  91. package/StylesUpdater.js +2 -2
  92. package/StylesUpdater.js.map +1 -1
  93. package/Theme.d.ts +1 -1
  94. package/Theme.js +6 -11
  95. package/Theme.js.map +1 -1
  96. package/ViewportManager.d.ts +3 -1
  97. package/ViewportManager.js +8 -1
  98. package/ViewportManager.js.map +1 -1
  99. package/constants.d.ts +1 -0
  100. package/constants.js +2 -1
  101. package/constants.js.map +1 -1
  102. package/createElement.d.ts +1 -1
  103. package/createElement.js.map +1 -1
  104. package/createInput.d.ts +124 -16
  105. package/createInput.js +33 -1
  106. package/createInput.js.map +1 -1
  107. package/createTheme.d.ts +2 -1
  108. package/createTheme.js.map +1 -1
  109. package/dataProviders/ApiClient.d.ts +6 -1
  110. package/dataProviders/ApiClient.js +19 -8
  111. package/dataProviders/ApiClient.js.map +1 -1
  112. package/dataProviders/DefaultDataProvider.d.ts +4 -3
  113. package/dataProviders/DefaultDataProvider.js +32 -6
  114. package/dataProviders/DefaultDataProvider.js.map +1 -1
  115. package/dataProviders/GET_PAGE_BY_ID.d.ts +1 -1
  116. package/dataProviders/GET_PAGE_BY_ID.js +2 -0
  117. package/dataProviders/GET_PAGE_BY_ID.js.map +1 -1
  118. package/dataProviders/GET_PAGE_BY_PATH.d.ts +1 -1
  119. package/dataProviders/GET_PAGE_BY_PATH.js +2 -0
  120. package/dataProviders/GET_PAGE_BY_PATH.js.map +1 -1
  121. package/dataProviders/LIST_PUBLISHED_PAGES.d.ts +1 -1
  122. package/dataProviders/LIST_PUBLISHED_PAGES.js +15 -4
  123. package/dataProviders/LIST_PUBLISHED_PAGES.js.map +1 -1
  124. package/dataProviders/NullDataProvider.d.ts +13 -4
  125. package/dataProviders/NullDataProvider.js +11 -1
  126. package/dataProviders/NullDataProvider.js.map +1 -1
  127. package/dataProviders/RedirectsProvider.d.ts +11 -0
  128. package/dataProviders/RedirectsProvider.js +32 -0
  129. package/dataProviders/RedirectsProvider.js.map +1 -0
  130. package/defaultBreakpoints.d.ts +1 -1
  131. package/defaultBreakpoints.js.map +1 -1
  132. package/documentOperations/$addElementReferenceToParent.d.ts +1 -1
  133. package/documentOperations/$addElementReferenceToParent.js +9 -2
  134. package/documentOperations/$addElementReferenceToParent.js.map +1 -1
  135. package/documentOperations/AddElement.d.ts +1 -1
  136. package/documentOperations/AddElement.js.map +1 -1
  137. package/documentOperations/AddToParent.d.ts +3 -3
  138. package/documentOperations/AddToParent.js.map +1 -1
  139. package/documentOperations/RemoveElement.d.ts +1 -1
  140. package/documentOperations/RemoveElement.js +9 -0
  141. package/documentOperations/RemoveElement.js.map +1 -1
  142. package/documentOperations/SetGlobalInputBinding.d.ts +1 -1
  143. package/documentOperations/SetGlobalInputBinding.js.map +1 -1
  144. package/documentOperations/SetGlobalStyleBinding.d.ts +1 -1
  145. package/documentOperations/SetGlobalStyleBinding.js.map +1 -1
  146. package/documentOperations/SetInputBindingOverride.d.ts +1 -1
  147. package/documentOperations/SetInputBindingOverride.js.map +1 -1
  148. package/documentOperations/SetStyleBindingOverride.d.ts +1 -1
  149. package/documentOperations/SetStyleBindingOverride.js.map +1 -1
  150. package/documentOperations/index.d.ts +8 -8
  151. package/documentOperations/index.js +7 -7
  152. package/documentOperations/index.js.map +1 -1
  153. package/findMatchingAstNode.d.ts +1 -1
  154. package/findMatchingAstNode.js.map +1 -1
  155. package/generateElementId.d.ts +1 -1
  156. package/generateElementId.js +0 -1
  157. package/generateElementId.js.map +1 -1
  158. package/index.d.ts +3 -3
  159. package/index.js +2 -3
  160. package/index.js.map +1 -1
  161. package/jsonPatch.d.ts +1 -1
  162. package/messenger/Messenger.js +6 -6
  163. package/messenger/Messenger.js.map +1 -1
  164. package/package.json +14 -20
  165. package/registerComponentGroup.d.ts +1 -1
  166. package/registerComponentGroup.js +1 -1
  167. package/registerComponentGroup.js.map +1 -1
  168. package/types/WebsiteBuilderTheme.d.ts +52 -42
  169. package/types/WebsiteBuilderTheme.js.map +1 -1
  170. package/types.d.ts +207 -20
  171. package/types.js.map +1 -1
  172. package/lexical/createDefaultLexicalTheme.d.ts +0 -2
  173. package/lexical/createDefaultLexicalTheme.js +0 -84
  174. package/lexical/createDefaultLexicalTheme.js.map +0 -1
  175. package/lexical/createLexicalTheme.d.ts +0 -2
  176. package/lexical/createLexicalTheme.js +0 -7
  177. package/lexical/createLexicalTheme.js.map +0 -1
  178. package/lexical/deepMerge.d.ts +0 -1
  179. package/lexical/deepMerge.js +0 -23
  180. package/lexical/deepMerge.js.map +0 -1
  181. package/types/LexicalEditorTheme.d.ts +0 -2
  182. package/types/LexicalEditorTheme.js +0 -3
  183. package/types/LexicalEditorTheme.js.map +0 -1
package/EditingSdk.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["Messenger","MessageOrigin","logger","PreviewViewport","viewportManager","componentRegistry","functionConverter","documentStoreManager","PreviewDocument","hashObject","EditingSdk","positionReportingEnabled","previewViewport","lastBoxesHash","constructor","liveSdk","theme","source","window","location","origin","target","parent","getReferrerOrigin","previewDocument","createFromWindow","documentStore","getStore","getId","messenger","onRegister","reg","send","component","manifest","setupListeners","disableLinks","getPage","path","matches","type","waitForDocument","getDocument","listPages","registerComponentGroup","group","filter","serialize","undefined","searchParams","URLSearchParams","search","get","on","data","setDocument","initPositionReporting","updateElement","id","patch","applyPatch","scrollBy","deltaX","deltaY","onViewportChangeStart","onViewportChangeEnd","setInterval","reportBoxes","warn","newBoxes","getVisibleBoxes","hash","boxes","viewport","getViewport","document","addEventListener","event","anchor","closest","href","preventDefault","stopPropagation"],"sources":["EditingSdk.ts"],"sourcesContent":["\"use client\";\nimport type { ComponentGroup, IContentSdk, PublicPage } from \"./types.js\";\nimport { Messenger, MessageOrigin } from \"./messenger\";\nimport { logger } from \"./Logger\";\nimport { PreviewViewport } from \"./PreviewViewport\";\nimport { viewportManager } from \"./ViewportManager\";\nimport { componentRegistry } from \"./ComponentRegistry\";\nimport { functionConverter } from \"./FunctionConverter\";\nimport { documentStoreManager } from \"~/DocumentStoreManager\";\nimport type { DocumentStore } from \"~/DocumentStore\";\nimport { PreviewDocument } from \"./PreviewDocument.js\";\nimport { hashObject } from \"~/HashObject\";\nimport type { WebsiteBuilderTheme } from \"~/types/WebsiteBuilderTheme\";\n\nexport class EditingSdk implements IContentSdk {\n public readonly messenger: Messenger;\n private positionReportingEnabled = false;\n private previewViewport: PreviewViewport | null = null;\n private liveSdk: IContentSdk;\n private documentStore: DocumentStore<PublicPage>;\n private previewDocument: PreviewDocument;\n private lastBoxesHash = 0;\n\n constructor(liveSdk: IContentSdk, theme: WebsiteBuilderTheme) {\n this.liveSdk = liveSdk;\n\n const source = new MessageOrigin(() => window, window.location.origin);\n const target = new MessageOrigin(() => window.parent, this.getReferrerOrigin());\n\n this.previewDocument = PreviewDocument.createFromWindow();\n\n this.documentStore = documentStoreManager.getStore<PublicPage>(\n this.previewDocument.getId()\n );\n\n this.messenger = new Messenger(source, target, \"wb.editor.*\");\n\n componentRegistry.onRegister(reg => {\n this.messenger.send(\"preview.component.register\", reg.component.manifest);\n });\n\n this.setupListeners();\n\n this.messenger.send(\"preview.ready\", true);\n\n if (theme) {\n this.messenger.send(\"preview.theme\", { theme });\n }\n\n this.disableLinks();\n }\n\n public async getPage(path: string): Promise<PublicPage | null> {\n if (!this.previewDocument.matches({ type: \"page\", path })) {\n return this.liveSdk.getPage(path);\n }\n\n await this.documentStore.waitForDocument();\n return this.documentStore.getDocument();\n }\n\n public async listPages(): Promise<PublicPage[]> {\n return this.liveSdk.listPages();\n }\n\n registerComponentGroup(group: ComponentGroup) {\n this.messenger.send(\"preview.componentGroup.register\", {\n ...group,\n filter: group.filter ? functionConverter.serialize(group.filter) : undefined\n });\n }\n\n private getReferrerOrigin(): string {\n try {\n const searchParams = new URLSearchParams(window.location.search);\n return searchParams.get(\"wb.referrer\")!;\n } catch {\n return \"\";\n }\n }\n\n private setupListeners() {\n if (!this.messenger) {\n return;\n }\n\n this.messenger.on(\"document.set\", data => {\n this.documentStore.setDocument(data);\n\n if (!this.positionReportingEnabled) {\n // Initialize position reporting\n this.initPositionReporting();\n }\n });\n\n this.messenger.on(\"element.set\", data => {\n this.documentStore.updateElement(data.id, data.patch);\n });\n\n this.messenger.on(\"document.patch\", patch => {\n this.documentStore.applyPatch(patch);\n });\n\n this.messenger.on(\"preview.scroll\", data => {\n window.scrollBy(data.deltaX, data.deltaY);\n });\n }\n\n private initPositionReporting(): void {\n if (this.positionReportingEnabled) {\n return;\n }\n\n // Initialize element positions tracker\n this.previewViewport = new PreviewViewport();\n\n // Add event listeners\n viewportManager.onViewportChangeStart(() => {\n if (this.messenger) {\n this.messenger.send(\"preview.viewport.change.start\");\n }\n });\n\n viewportManager.onViewportChangeEnd(() => {\n if (this.messenger) {\n this.messenger.send(\"preview.viewport.change.end\");\n }\n });\n\n // Enable position reporting by default\n this.positionReportingEnabled = true;\n\n // Report positions periodically\n setInterval(() => this.reportBoxes(), 300);\n }\n\n private reportBoxes(): void {\n if (!this.messenger || !this.previewViewport) {\n logger.warn(\"No messenger or preview viewport. Skipping position reporting.\");\n return;\n }\n\n const newBoxes = this.previewViewport.getVisibleBoxes();\n const hash = hashObject.hash(newBoxes);\n if (hash === this.lastBoxesHash) {\n return;\n }\n\n this.lastBoxesHash = hash;\n // Send positions to the editor\n this.messenger.send(\"preview.viewport\", {\n boxes: this.previewViewport.getVisibleBoxes(),\n viewport: this.previewViewport.getViewport()\n });\n }\n\n private disableLinks() {\n // Intercept link clicks when we're in the editing mode (loaded via iframe from the editor).\n document.addEventListener(\n \"click\",\n event => {\n const target = event.target as HTMLElement;\n\n // Check if the clicked element or any of its ancestors is a link\n const anchor = target.closest(\"a\");\n\n if (anchor && anchor.href) {\n event.preventDefault();\n event.stopPropagation();\n }\n },\n // https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#usecapture\n true\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Messenger","MessageOrigin","logger","PreviewViewport","viewportManager","componentRegistry","functionConverter","documentStoreManager","PreviewDocument","hashObject","EditingSdk","positionReportingEnabled","previewViewport","lastBoxesHash","constructor","liveSdk","theme","source","window","location","origin","target","parent","getReferrerOrigin","previewDocument","createFromWindow","documentStore","getStore","getId","messenger","onRegister","reg","send","component","manifest","setupListeners","disableLinks","getPage","path","matches","type","waitForDocument","getDocument","listPages","options","registerComponentGroup","group","filter","serialize","undefined","searchParams","URLSearchParams","search","get","on","data","setDocument","initPositionReporting","updateElement","id","patch","applyPatch","onViewportChangeStart","onViewportChangeEnd","setInterval","reportBoxes","warn","newBoxes","getBoxes","hash","boxes","viewport","getViewport","document","addEventListener","event","anchor","closest","href","preventDefault","stopPropagation"],"sources":["EditingSdk.ts"],"sourcesContent":["\"use client\";\nimport type {\n ComponentGroup,\n IContentSdk,\n ListPagesOptions,\n ListPagesResult,\n PublicPage\n} from \"./types.js\";\nimport { Messenger, MessageOrigin } from \"./messenger/index.js\";\nimport { logger } from \"./Logger.js\";\nimport { PreviewViewport } from \"./PreviewViewport.js\";\nimport { viewportManager } from \"./ViewportManager.js\";\nimport { componentRegistry } from \"./ComponentRegistry.js\";\nimport { functionConverter } from \"./FunctionConverter.js\";\nimport { documentStoreManager } from \"~/DocumentStoreManager.js\";\nimport type { DocumentStore } from \"~/DocumentStore.js\";\nimport { PreviewDocument } from \"./PreviewDocument.js\";\nimport { hashObject } from \"~/HashObject.js\";\nimport type { WebsiteBuilderTheme } from \"~/types/WebsiteBuilderTheme.js\";\n\nexport class EditingSdk implements IContentSdk {\n public readonly messenger: Messenger;\n private positionReportingEnabled = false;\n private previewViewport: PreviewViewport | null = null;\n private liveSdk: IContentSdk;\n private documentStore: DocumentStore<PublicPage>;\n private previewDocument: PreviewDocument;\n private lastBoxesHash = 0;\n\n constructor(liveSdk: IContentSdk, theme: WebsiteBuilderTheme) {\n this.liveSdk = liveSdk;\n\n const source = new MessageOrigin(() => window, window.location.origin);\n const target = new MessageOrigin(() => window.parent, this.getReferrerOrigin());\n\n this.previewDocument = PreviewDocument.createFromWindow();\n\n this.documentStore = documentStoreManager.getStore<PublicPage>(\n this.previewDocument.getId()\n );\n\n this.messenger = new Messenger(source, target, \"wb.editor.*\");\n\n componentRegistry.onRegister(reg => {\n this.messenger.send(\"preview.component.register\", reg.component.manifest);\n });\n\n this.setupListeners();\n\n this.messenger.send(\"preview.ready\", true);\n\n if (theme) {\n this.messenger.send(\"preview.theme\", { theme });\n }\n\n this.disableLinks();\n }\n\n public async getPage(path: string): Promise<PublicPage | null> {\n if (!this.previewDocument.matches({ type: \"page\", path })) {\n return this.liveSdk.getPage(path);\n }\n\n await this.documentStore.waitForDocument();\n return this.documentStore.getDocument();\n }\n\n public async listPages(options?: ListPagesOptions): Promise<ListPagesResult> {\n return this.liveSdk.listPages(options);\n }\n\n registerComponentGroup(group: ComponentGroup) {\n this.messenger.send(\"preview.componentGroup.register\", {\n ...group,\n filter: group.filter ? functionConverter.serialize(group.filter) : undefined\n });\n }\n\n private getReferrerOrigin(): string {\n try {\n const searchParams = new URLSearchParams(window.location.search);\n return searchParams.get(\"wb.referrer\")!;\n } catch {\n return \"\";\n }\n }\n\n private setupListeners() {\n if (!this.messenger) {\n return;\n }\n\n this.messenger.on(\"document.set\", data => {\n this.documentStore.setDocument(data);\n\n if (!this.positionReportingEnabled) {\n // Initialize position reporting\n this.initPositionReporting();\n }\n });\n\n this.messenger.on(\"element.set\", data => {\n this.documentStore.updateElement(data.id, data.patch);\n });\n\n this.messenger.on(\"document.patch\", patch => {\n this.documentStore.applyPatch(patch);\n });\n }\n\n private initPositionReporting(): void {\n if (this.positionReportingEnabled) {\n return;\n }\n\n // Initialize element positions tracker\n this.previewViewport = new PreviewViewport();\n\n // Add event listeners\n viewportManager.onViewportChangeStart(() => {\n if (this.messenger) {\n this.messenger.send(\"preview.viewport.change.start\");\n }\n });\n\n viewportManager.onViewportChangeEnd(() => {\n if (this.messenger) {\n this.messenger.send(\"preview.viewport.change.end\");\n }\n });\n\n // Enable position reporting by default\n this.positionReportingEnabled = true;\n\n // Report positions periodically\n setInterval(() => this.reportBoxes(), 300);\n }\n\n private reportBoxes(): void {\n if (!this.messenger || !this.previewViewport) {\n logger.warn(\"No messenger or preview viewport. Skipping position reporting.\");\n return;\n }\n\n const newBoxes = this.previewViewport.getBoxes();\n const hash = hashObject.hash(newBoxes);\n if (hash === this.lastBoxesHash) {\n return;\n }\n\n this.lastBoxesHash = hash;\n // Send positions to the editor\n this.messenger.send(\"preview.viewport\", {\n boxes: this.previewViewport.getBoxes(),\n viewport: this.previewViewport.getViewport()\n });\n }\n\n private disableLinks() {\n // Intercept link clicks when we're in the editing mode (loaded via iframe from the editor).\n document.addEventListener(\n \"click\",\n event => {\n const target = event.target as HTMLElement;\n\n // Check if the clicked element or any of its ancestors is a link\n const anchor = target.closest(\"a\");\n\n if (anchor && anchor.href) {\n event.preventDefault();\n event.stopPropagation();\n }\n },\n // https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#usecapture\n true\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,11 +1,11 @@
1
- import type { DocumentElement, ComponentManifest, InputValueBinding, StyleValueBinding } from "./types";
2
- import { type IDocumentOperation } from "./documentOperations";
3
- import { type InputAstNode } from "./ComponentManifestToAstConverter";
1
+ import type { DocumentElement, ComponentManifest, InputValueBinding, StyleValueBinding } from "./types.js";
2
+ import { type IDocumentOperation } from "./documentOperations/index.js";
3
+ import { type InputAstNode } from "./ComponentManifestToAstConverter.js";
4
4
  export interface ElementFactoryCreateElementParams {
5
5
  componentName: string;
6
6
  parentId: string;
7
7
  slot: string;
8
- index: number;
8
+ index?: number;
9
9
  bindings?: {
10
10
  inputs?: Record<string, any>;
11
11
  styles?: Record<string, any>;
@@ -34,7 +34,7 @@ interface GenerateOperationsParams {
34
34
  }
35
35
  type ElementFactoryOperations = {
36
36
  addElement: (element: DocumentElement) => IDocumentOperation;
37
- addToParent: (element: DocumentElement, index: number) => IDocumentOperation;
37
+ addToParent: (element: DocumentElement, index?: number) => IDocumentOperation;
38
38
  setInputBinding: (elementId: string, bindingPath: string, binding: InputValueBinding) => IDocumentOperation;
39
39
  setStyleBinding: (elementId: string, bindingPath: string, binding: StyleValueBinding) => IDocumentOperation;
40
40
  };
@@ -48,7 +48,6 @@ export declare class ElementFactory {
48
48
  generateOperations({ element, inputsAst, bindings, operations }: GenerateOperationsParams): IDocumentOperation[];
49
49
  private generateOperationsFromBindings;
50
50
  private getComponentManifest;
51
- private extractIndex;
52
51
  private createElement;
53
52
  }
54
53
  export {};
package/ElementFactory.js CHANGED
@@ -1,7 +1,7 @@
1
- import { generateElementId } from "./generateElementId";
2
- import { DocumentOperations } from "./documentOperations";
3
- import { ComponentManifestToAstConverter } from "./ComponentManifestToAstConverter";
4
- import { ComponentInputTraverser } from "./ComponentInputTraverser";
1
+ import { generateElementId } from "./generateElementId.js";
2
+ import { DocumentOperations } from "./documentOperations/index.js";
3
+ import { ComponentManifestToAstConverter } from "./ComponentManifestToAstConverter.js";
4
+ import { ComponentInputTraverser } from "./ComponentInputTraverser.js";
5
5
  const defaultStyles = {
6
6
  display: "flex",
7
7
  flexDirection: "column"
@@ -113,19 +113,32 @@ export class ElementFactory {
113
113
  const factory = new ElementFactory(this.components);
114
114
  const newElement = factory.createElementFromComponent({
115
115
  componentName: value.params.component,
116
- index: isList ? this.extractIndex(path) : 0,
116
+ // undefined index = append to end of the slot array
117
+ index: isList ? undefined : 0,
117
118
  slot: path,
118
119
  parentId: elementId,
119
120
  bindings: value.params
120
121
  });
121
122
  const newElementId = newElement.element.id;
122
- ops.push(...newElement.operations, operations.setInputBinding(elementId, path, {
123
- id: generateElementId(),
124
- static: node.list ? [newElementId] : newElementId,
125
- type: node.type,
126
- translatable: node.input.translatable,
127
- list: node.list
128
- }));
123
+ ops.push(...newElement.operations);
124
+ if (isList) {
125
+ // For list slots, AddToParent already manages the static array.
126
+ // We only set metadata here.
127
+ ops.push(operations.setInputBinding(elementId, path, {
128
+ id: generateElementId(),
129
+ type: node.type,
130
+ translatable: node.input.translatable,
131
+ list: node.list
132
+ }));
133
+ } else {
134
+ ops.push(operations.setInputBinding(elementId, path, {
135
+ id: generateElementId(),
136
+ static: newElementId,
137
+ type: node.type,
138
+ translatable: node.input.translatable,
139
+ list: node.list
140
+ }));
141
+ }
129
142
  } else if (isObject && isList) {
130
143
  return;
131
144
  } else {
@@ -154,10 +167,6 @@ export class ElementFactory {
154
167
  }
155
168
  return manifest;
156
169
  }
157
- extractIndex(path) {
158
- const match = path.match(/\/(\d+)\//);
159
- return match ? parseInt(match[1], 10) : 0;
160
- }
161
170
  createElement(componentName, parentId, slot) {
162
171
  const element = {
163
172
  type: "Webiny/Element",
@@ -1 +1 @@
1
- {"version":3,"names":["generateElementId","DocumentOperations","ComponentManifestToAstConverter","ComponentInputTraverser","defaultStyles","display","flexDirection","withDefaultStyles","styles","defaultOperations","addElement","element","AddElement","addToParent","index","AddToParent","setInputBinding","elementId","bindingPath","binding","SetGlobalInputBinding","setStyleBinding","SetGlobalStyleBinding","ElementFactory","constructor","components","createElementFromComponent","componentName","parentId","slot","bindings","componentManifest","inputsAst","createElement","documentOps","push","generateOperations","inputs","defaults","overrides","operations","ops","generateOperationsFromBindings","id","ignoreDefaultValues","breakpoint","Object","entries","SetInputBindingOverride","SetStyleBindingOverride","inputData","traverser","traverse","node","path","value","isCreateElement","action","isList","list","isObject","type","factory","newElement","params","component","extractIndex","newElementId","static","translatable","input","undefined","defaultValue","key","getComponentManifest","manifest","Error","match","parseInt","parent","name","convert"],"sources":["ElementFactory.ts"],"sourcesContent":["import { generateElementId } from \"./generateElementId\";\nimport type {\n DocumentElement,\n ComponentManifest,\n InputValueBinding,\n StyleValueBinding,\n CssProperties\n} from \"~/types\";\nimport { type IDocumentOperation, DocumentOperations } from \"./documentOperations\";\nimport {\n ComponentManifestToAstConverter,\n type InputAstNode\n} from \"./ComponentManifestToAstConverter\";\nimport { ComponentInputTraverser } from \"./ComponentInputTraverser\";\n\nconst defaultStyles = {\n display: \"flex\",\n flexDirection: \"column\"\n};\n\nconst withDefaultStyles = (styles: CssProperties) => {\n return { ...defaultStyles, ...styles };\n};\n\nexport interface ElementFactoryCreateElementParams {\n componentName: string;\n parentId: string;\n slot: string;\n index: number;\n bindings?: {\n inputs?: Record<string, any>;\n styles?: Record<string, any>;\n overrides?: {\n [breakpoint: string]: {\n inputs?: Record<string, any>;\n styles?: Record<string, any>;\n };\n };\n };\n}\n\ninterface GenerateOperationsParams {\n element: DocumentElement;\n inputsAst: InputAstNode[];\n operations: ElementFactoryOperations;\n bindings: {\n inputs: Record<string, any>;\n styles: Record<string, any>;\n overrides: {\n [breakpoint: string]: {\n inputs?: Record<string, any>;\n styles?: Record<string, any>;\n };\n };\n };\n}\n\ninterface GenerateOperationsFromBindingsParams {\n elementId: string;\n inputsAst: InputAstNode[];\n bindings: {\n inputs: Record<string, any>;\n styles: Record<string, any>;\n };\n operations: ElementFactoryOperations;\n ignoreDefaultValues: boolean;\n}\n\ntype ElementFactoryOperations = {\n addElement: (element: DocumentElement) => IDocumentOperation;\n addToParent: (element: DocumentElement, index: number) => IDocumentOperation;\n setInputBinding: (\n elementId: string,\n bindingPath: string,\n binding: InputValueBinding\n ) => IDocumentOperation;\n setStyleBinding: (\n elementId: string,\n bindingPath: string,\n binding: StyleValueBinding\n ) => IDocumentOperation;\n};\n\nconst defaultOperations: ElementFactoryOperations = {\n addElement: (element: DocumentElement) => {\n return new DocumentOperations.AddElement(element);\n },\n addToParent: (element: DocumentElement, index: number) => {\n return new DocumentOperations.AddToParent(element, index);\n },\n setInputBinding: (elementId, bindingPath, binding) => {\n return new DocumentOperations.SetGlobalInputBinding(elementId, bindingPath, binding);\n },\n setStyleBinding: (elementId, bindingPath, binding) => {\n return new DocumentOperations.SetGlobalStyleBinding(elementId, bindingPath, binding);\n }\n};\n\nexport class ElementFactory {\n constructor(private components: Record<string, ComponentManifest>) {}\n\n public createElementFromComponent({\n componentName,\n parentId,\n slot,\n index,\n bindings\n }: ElementFactoryCreateElementParams) {\n const { element, componentManifest, inputsAst } = this.createElement(\n componentName,\n parentId,\n slot\n );\n\n const documentOps: IDocumentOperation[] = [\n defaultOperations.addElement(element),\n defaultOperations.addToParent(element, index)\n ];\n\n documentOps.push(\n ...this.generateOperations({\n element,\n inputsAst,\n bindings: {\n inputs: bindings?.inputs ?? componentManifest.defaults?.inputs ?? {},\n styles: withDefaultStyles(\n bindings?.styles ?? componentManifest.defaults?.styles ?? {}\n ),\n overrides: bindings?.overrides ?? {}\n },\n operations: defaultOperations\n })\n );\n\n return { element, operations: documentOps };\n }\n\n public generateOperations({\n element,\n inputsAst,\n bindings,\n operations\n }: GenerateOperationsParams): IDocumentOperation[] {\n const ops = this.generateOperationsFromBindings({\n elementId: element.id,\n inputsAst,\n bindings,\n operations,\n ignoreDefaultValues: false\n });\n\n if (bindings.overrides) {\n for (const [breakpoint, overrides] of Object.entries(bindings.overrides)) {\n ops.push(\n ...this.generateOperationsFromBindings({\n elementId: element.id,\n inputsAst,\n bindings: {\n inputs: overrides.inputs ?? {},\n styles: overrides.styles ?? {}\n },\n operations: {\n ...operations,\n setInputBinding: (elementId, bindingPath, binding) => {\n return new DocumentOperations.SetInputBindingOverride(\n elementId,\n bindingPath,\n binding,\n breakpoint\n );\n },\n setStyleBinding: (elementId, bindingPath, binding) => {\n return new DocumentOperations.SetStyleBindingOverride(\n elementId,\n bindingPath,\n binding,\n breakpoint\n );\n }\n },\n ignoreDefaultValues: true\n })\n );\n }\n }\n\n return ops;\n }\n\n private generateOperationsFromBindings({\n elementId,\n inputsAst,\n bindings,\n operations,\n ignoreDefaultValues\n }: GenerateOperationsFromBindingsParams): IDocumentOperation[] {\n const inputData = bindings.inputs;\n const traverser = new ComponentInputTraverser(inputsAst);\n\n const ops: IDocumentOperation[] = [];\n\n traverser.traverse(inputData, (node, path, value) => {\n const isCreateElement = value?.action === \"CreateElement\";\n const isList = node.list;\n const isObject = node.type === \"object\";\n\n if (isCreateElement) {\n const factory = new ElementFactory(this.components);\n const newElement = factory.createElementFromComponent({\n componentName: value.params.component,\n index: isList ? this.extractIndex(path) : 0,\n slot: path,\n parentId: elementId,\n bindings: value.params\n });\n\n const newElementId = newElement.element.id;\n\n ops.push(\n ...newElement.operations,\n operations.setInputBinding(elementId, path, {\n id: generateElementId(),\n static: node.list ? [newElementId] : newElementId,\n type: node.type,\n translatable: node.input.translatable,\n list: node.list\n })\n );\n } else if (isObject && isList) {\n return;\n } else {\n ops.push(\n operations.setInputBinding(elementId, path, {\n id: generateElementId(),\n static: ignoreDefaultValues ? undefined : value ?? node.input.defaultValue,\n type: node.type,\n list: node.list,\n translatable: node.input.translatable\n })\n );\n }\n });\n\n // Process styles\n for (const key in bindings.styles) {\n ops.push(\n operations.setStyleBinding(elementId, key, {\n static: bindings.styles[key]\n })\n );\n }\n\n return ops;\n }\n\n private getComponentManifest(componentName: string): ComponentManifest {\n const manifest = this.components[componentName];\n if (!manifest) {\n throw new Error(`Component \"${componentName}\" not registered.`);\n }\n\n return manifest;\n }\n\n private extractIndex(path: string): number {\n const match = path.match(/\\/(\\d+)\\//);\n return match ? parseInt(match[1], 10) : 0;\n }\n\n private createElement(componentName: string, parentId: string, slot: string) {\n const element: DocumentElement = {\n type: \"Webiny/Element\",\n id: generateElementId(),\n parent: { id: parentId, slot },\n component: { name: componentName }\n };\n\n const componentManifest = this.getComponentManifest(componentName);\n const inputsAst = ComponentManifestToAstConverter.convert(componentManifest.inputs ?? []);\n\n return {\n element,\n inputsAst,\n componentManifest\n };\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["generateElementId","DocumentOperations","ComponentManifestToAstConverter","ComponentInputTraverser","defaultStyles","display","flexDirection","withDefaultStyles","styles","defaultOperations","addElement","element","AddElement","addToParent","index","AddToParent","setInputBinding","elementId","bindingPath","binding","SetGlobalInputBinding","setStyleBinding","SetGlobalStyleBinding","ElementFactory","constructor","components","createElementFromComponent","componentName","parentId","slot","bindings","componentManifest","inputsAst","createElement","documentOps","push","generateOperations","inputs","defaults","overrides","operations","ops","generateOperationsFromBindings","id","ignoreDefaultValues","breakpoint","Object","entries","SetInputBindingOverride","SetStyleBindingOverride","inputData","traverser","traverse","node","path","value","isCreateElement","action","isList","list","isObject","type","factory","newElement","params","component","undefined","newElementId","translatable","input","static","defaultValue","key","getComponentManifest","manifest","Error","parent","name","convert"],"sources":["ElementFactory.ts"],"sourcesContent":["import { generateElementId } from \"./generateElementId.js\";\nimport type {\n DocumentElement,\n ComponentManifest,\n InputValueBinding,\n StyleValueBinding,\n CssProperties\n} from \"~/types.js\";\nimport { type IDocumentOperation, DocumentOperations } from \"./documentOperations/index.js\";\nimport {\n ComponentManifestToAstConverter,\n type InputAstNode\n} from \"./ComponentManifestToAstConverter.js\";\nimport { ComponentInputTraverser } from \"./ComponentInputTraverser.js\";\n\nconst defaultStyles = {\n display: \"flex\",\n flexDirection: \"column\"\n};\n\nconst withDefaultStyles = (styles: CssProperties) => {\n return { ...defaultStyles, ...styles };\n};\n\nexport interface ElementFactoryCreateElementParams {\n componentName: string;\n parentId: string;\n slot: string;\n index?: number;\n bindings?: {\n inputs?: Record<string, any>;\n styles?: Record<string, any>;\n overrides?: {\n [breakpoint: string]: {\n inputs?: Record<string, any>;\n styles?: Record<string, any>;\n };\n };\n };\n}\n\ninterface GenerateOperationsParams {\n element: DocumentElement;\n inputsAst: InputAstNode[];\n operations: ElementFactoryOperations;\n bindings: {\n inputs: Record<string, any>;\n styles: Record<string, any>;\n overrides: {\n [breakpoint: string]: {\n inputs?: Record<string, any>;\n styles?: Record<string, any>;\n };\n };\n };\n}\n\ninterface GenerateOperationsFromBindingsParams {\n elementId: string;\n inputsAst: InputAstNode[];\n bindings: {\n inputs: Record<string, any>;\n styles: Record<string, any>;\n };\n operations: ElementFactoryOperations;\n ignoreDefaultValues: boolean;\n}\n\ntype ElementFactoryOperations = {\n addElement: (element: DocumentElement) => IDocumentOperation;\n addToParent: (element: DocumentElement, index?: number) => IDocumentOperation;\n setInputBinding: (\n elementId: string,\n bindingPath: string,\n binding: InputValueBinding\n ) => IDocumentOperation;\n setStyleBinding: (\n elementId: string,\n bindingPath: string,\n binding: StyleValueBinding\n ) => IDocumentOperation;\n};\n\nconst defaultOperations: ElementFactoryOperations = {\n addElement: (element: DocumentElement) => {\n return new DocumentOperations.AddElement(element);\n },\n addToParent: (element: DocumentElement, index?: number) => {\n return new DocumentOperations.AddToParent(element, index);\n },\n setInputBinding: (elementId, bindingPath, binding) => {\n return new DocumentOperations.SetGlobalInputBinding(elementId, bindingPath, binding);\n },\n setStyleBinding: (elementId, bindingPath, binding) => {\n return new DocumentOperations.SetGlobalStyleBinding(elementId, bindingPath, binding);\n }\n};\n\nexport class ElementFactory {\n constructor(private components: Record<string, ComponentManifest>) {}\n\n public createElementFromComponent({\n componentName,\n parentId,\n slot,\n index,\n bindings\n }: ElementFactoryCreateElementParams) {\n const { element, componentManifest, inputsAst } = this.createElement(\n componentName,\n parentId,\n slot\n );\n\n const documentOps: IDocumentOperation[] = [\n defaultOperations.addElement(element),\n defaultOperations.addToParent(element, index)\n ];\n\n documentOps.push(\n ...this.generateOperations({\n element,\n inputsAst,\n bindings: {\n inputs: bindings?.inputs ?? componentManifest.defaults?.inputs ?? {},\n styles: withDefaultStyles(\n bindings?.styles ?? componentManifest.defaults?.styles ?? {}\n ),\n overrides: bindings?.overrides ?? {}\n },\n operations: defaultOperations\n })\n );\n\n return { element, operations: documentOps };\n }\n\n public generateOperations({\n element,\n inputsAst,\n bindings,\n operations\n }: GenerateOperationsParams): IDocumentOperation[] {\n const ops = this.generateOperationsFromBindings({\n elementId: element.id,\n inputsAst,\n bindings,\n operations,\n ignoreDefaultValues: false\n });\n\n if (bindings.overrides) {\n for (const [breakpoint, overrides] of Object.entries(bindings.overrides)) {\n ops.push(\n ...this.generateOperationsFromBindings({\n elementId: element.id,\n inputsAst,\n bindings: {\n inputs: overrides.inputs ?? {},\n styles: overrides.styles ?? {}\n },\n operations: {\n ...operations,\n setInputBinding: (elementId, bindingPath, binding) => {\n return new DocumentOperations.SetInputBindingOverride(\n elementId,\n bindingPath,\n binding,\n breakpoint\n );\n },\n setStyleBinding: (elementId, bindingPath, binding) => {\n return new DocumentOperations.SetStyleBindingOverride(\n elementId,\n bindingPath,\n binding,\n breakpoint\n );\n }\n },\n ignoreDefaultValues: true\n })\n );\n }\n }\n\n return ops;\n }\n\n private generateOperationsFromBindings({\n elementId,\n inputsAst,\n bindings,\n operations,\n ignoreDefaultValues\n }: GenerateOperationsFromBindingsParams): IDocumentOperation[] {\n const inputData = bindings.inputs;\n const traverser = new ComponentInputTraverser(inputsAst);\n\n const ops: IDocumentOperation[] = [];\n\n traverser.traverse(inputData, (node, path, value) => {\n const isCreateElement = value?.action === \"CreateElement\";\n const isList = node.list;\n const isObject = node.type === \"object\";\n\n if (isCreateElement) {\n const factory = new ElementFactory(this.components);\n const newElement = factory.createElementFromComponent({\n componentName: value.params.component,\n // undefined index = append to end of the slot array\n index: isList ? undefined : 0,\n slot: path,\n parentId: elementId,\n bindings: value.params\n });\n\n const newElementId = newElement.element.id;\n\n ops.push(...newElement.operations);\n\n if (isList) {\n // For list slots, AddToParent already manages the static array.\n // We only set metadata here.\n ops.push(\n operations.setInputBinding(elementId, path, {\n id: generateElementId(),\n type: node.type,\n translatable: node.input.translatable,\n list: node.list\n })\n );\n } else {\n ops.push(\n operations.setInputBinding(elementId, path, {\n id: generateElementId(),\n static: newElementId,\n type: node.type,\n translatable: node.input.translatable,\n list: node.list\n })\n );\n }\n } else if (isObject && isList) {\n return;\n } else {\n ops.push(\n operations.setInputBinding(elementId, path, {\n id: generateElementId(),\n static: ignoreDefaultValues\n ? undefined\n : (value ?? node.input.defaultValue),\n type: node.type,\n list: node.list,\n translatable: node.input.translatable\n })\n );\n }\n });\n\n // Process styles\n for (const key in bindings.styles) {\n ops.push(\n operations.setStyleBinding(elementId, key, {\n static: bindings.styles[key]\n })\n );\n }\n\n return ops;\n }\n\n private getComponentManifest(componentName: string): ComponentManifest {\n const manifest = this.components[componentName];\n if (!manifest) {\n throw new Error(`Component \"${componentName}\" not registered.`);\n }\n\n return manifest;\n }\n\n private createElement(componentName: string, parentId: string, slot: string) {\n const element: DocumentElement = {\n type: \"Webiny/Element\",\n id: generateElementId(),\n parent: { id: parentId, slot },\n component: { name: componentName }\n };\n\n const componentManifest = this.getComponentManifest(componentName);\n const inputsAst = ComponentManifestToAstConverter.convert(componentManifest.inputs ?? []);\n\n return {\n element,\n inputsAst,\n componentManifest\n };\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,280 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { ElementFactory } from "./ElementFactory.js";
3
+ import { DocumentOperations } from "./documentOperations/index.js";
4
+ const components = {
5
+ "Webiny/Root": {
6
+ name: "Webiny/Root",
7
+ label: "Main Content",
8
+ tags: [],
9
+ inputs: [{
10
+ type: "slot",
11
+ list: true,
12
+ renderer: "Webiny/Slot",
13
+ defaultValue: [],
14
+ name: "children"
15
+ }]
16
+ },
17
+ "FunnelBuilder/Funnel": {
18
+ name: "FunnelBuilder/Funnel",
19
+ label: "Funnel",
20
+ tags: [],
21
+ inputs: [{
22
+ type: "object",
23
+ renderer: "Webiny/Object",
24
+ name: "fields",
25
+ list: true,
26
+ fields: [],
27
+ defaultValue: []
28
+ }, {
29
+ type: "number",
30
+ renderer: "Webiny/Number",
31
+ name: "activeStep",
32
+ label: "Active Step",
33
+ defaultValue: 0
34
+ }, {
35
+ type: "slot",
36
+ list: true,
37
+ renderer: "Webiny/Slot",
38
+ defaultValue: [],
39
+ name: "steps"
40
+ }, {
41
+ type: "object",
42
+ renderer: "FunnelBuilder/ConditionRulesRenderer",
43
+ name: "conditionRules",
44
+ list: true,
45
+ fields: []
46
+ }]
47
+ },
48
+ "FunnelBuilder/Step": {
49
+ name: "FunnelBuilder/Step",
50
+ label: "Funnel Step",
51
+ tags: [],
52
+ inputs: [{
53
+ type: "text",
54
+ renderer: "Webiny/Input",
55
+ name: "label",
56
+ label: "Label"
57
+ }, {
58
+ type: "slot",
59
+ list: true,
60
+ renderer: "Webiny/Slot",
61
+ defaultValue: [],
62
+ name: "children"
63
+ }]
64
+ }
65
+ };
66
+
67
+ /**
68
+ * Extract private fields from operation instances for assertion.
69
+ */
70
+ function serializeOp(op) {
71
+ if (op instanceof DocumentOperations.AddElement) {
72
+ return {
73
+ type: "AddElement",
74
+ element: op["element"]
75
+ };
76
+ }
77
+ if (op instanceof DocumentOperations.AddToParent) {
78
+ return {
79
+ type: "AddToParent",
80
+ element: op["element"],
81
+ index: op["index"]
82
+ };
83
+ }
84
+ if (op instanceof DocumentOperations.SetGlobalInputBinding) {
85
+ return {
86
+ type: "SetGlobalInputBinding",
87
+ elementId: op["elementId"],
88
+ bindingPath: op["bindingPath"],
89
+ binding: op["binding"]
90
+ };
91
+ }
92
+ if (op instanceof DocumentOperations.SetGlobalStyleBinding) {
93
+ return {
94
+ type: "SetGlobalStyleBinding",
95
+ elementId: op["elementId"],
96
+ bindingPath: op["bindingPath"],
97
+ binding: op["binding"]
98
+ };
99
+ }
100
+ return op;
101
+ }
102
+ describe("ElementFactory", () => {
103
+ it("should produce correct operation sequence for a Funnel with two Steps", () => {
104
+ const factory = new ElementFactory(components);
105
+ const result = factory.createElementFromComponent({
106
+ componentName: "FunnelBuilder/Funnel",
107
+ parentId: "root",
108
+ slot: "children",
109
+ index: 0,
110
+ bindings: {
111
+ inputs: {
112
+ fields: [],
113
+ activeStep: 0,
114
+ steps: [{
115
+ action: "CreateElement",
116
+ params: {
117
+ component: "FunnelBuilder/Step",
118
+ inputs: {
119
+ label: "Step 1",
120
+ children: []
121
+ }
122
+ }
123
+ }, {
124
+ action: "CreateElement",
125
+ params: {
126
+ component: "FunnelBuilder/Step",
127
+ inputs: {
128
+ label: "Final Step",
129
+ children: []
130
+ }
131
+ }
132
+ }]
133
+ }
134
+ }
135
+ });
136
+ const ops = result.operations.map(serializeOp);
137
+ const funnelId = result.element.id;
138
+
139
+ // 0: AddElement — Funnel
140
+ expect(ops[0].type).toBe("AddElement");
141
+ expect(ops[0].element.component.name).toBe("FunnelBuilder/Funnel");
142
+
143
+ // 1: AddToParent — Funnel → root/children at index 0
144
+ expect(ops[1].type).toBe("AddToParent");
145
+ expect(ops[1].element.id).toBe(funnelId);
146
+ expect(ops[1].index).toBe(0);
147
+
148
+ // 2: SetGlobalInputBinding — activeStep = 0
149
+ expect(ops[2].type).toBe("SetGlobalInputBinding");
150
+ expect(ops[2].elementId).toBe(funnelId);
151
+ expect(ops[2].bindingPath).toBe("activeStep");
152
+ expect(ops[2].binding.static).toBe(0);
153
+
154
+ // 3: AddElement — Step 1
155
+ const step1Id = ops[3].element.id;
156
+ expect(ops[3].type).toBe("AddElement");
157
+ expect(ops[3].element.component.name).toBe("FunnelBuilder/Step");
158
+ expect(ops[3].element.parent).toEqual({
159
+ id: funnelId,
160
+ slot: "steps"
161
+ });
162
+
163
+ // 4: AddToParent — Step 1 (undefined = append)
164
+ expect(ops[4].type).toBe("AddToParent");
165
+ expect(ops[4].element.id).toBe(step1Id);
166
+ expect(ops[4].index).toBeUndefined();
167
+
168
+ // 5: Step 1 label binding
169
+ expect(ops[5].bindingPath).toBe("label");
170
+ expect(ops[5].binding.static).toBe("Step 1");
171
+
172
+ // 6: Step 1 children binding
173
+ expect(ops[6].bindingPath).toBe("children");
174
+ expect(ops[6].binding.static).toEqual([]);
175
+
176
+ // 7-8: Step 1 style bindings
177
+ expect(ops[7].bindingPath).toBe("display");
178
+ expect(ops[8].bindingPath).toBe("flexDirection");
179
+
180
+ // 9: SetGlobalInputBinding — steps slot metadata (no static, AddToParent handles it)
181
+ expect(ops[9].type).toBe("SetGlobalInputBinding");
182
+ expect(ops[9].elementId).toBe(funnelId);
183
+ expect(ops[9].bindingPath).toBe("steps");
184
+ expect(ops[9].binding.static).toBeUndefined();
185
+ expect(ops[9].binding.type).toBe("slot");
186
+ expect(ops[9].binding.list).toBe(true);
187
+
188
+ // 10: AddElement — Step 2
189
+ expect(ops[10].element.component.name).toBe("FunnelBuilder/Step");
190
+
191
+ // 11: AddToParent — Step 2 (undefined = append)
192
+ expect(ops[11].index).toBeUndefined();
193
+
194
+ // 12-15: Step 2 bindings + styles
195
+ expect(ops[12].binding.static).toBe("Final Step");
196
+ expect(ops[13].binding.static).toEqual([]);
197
+
198
+ // 16: SetGlobalInputBinding — steps slot metadata (no static)
199
+ expect(ops[16].type).toBe("SetGlobalInputBinding");
200
+ expect(ops[16].elementId).toBe(funnelId);
201
+ expect(ops[16].bindingPath).toBe("steps");
202
+ expect(ops[16].binding.static).toBeUndefined();
203
+
204
+ // 17-18: Funnel style bindings
205
+ expect(ops[17].bindingPath).toBe("display");
206
+ expect(ops[18].bindingPath).toBe("flexDirection");
207
+ expect(ops).toHaveLength(19);
208
+ });
209
+ it("should produce correct document after applying all operations", () => {
210
+ const factory = new ElementFactory(components);
211
+ const result = factory.createElementFromComponent({
212
+ componentName: "FunnelBuilder/Funnel",
213
+ parentId: "root",
214
+ slot: "children",
215
+ index: 0,
216
+ bindings: {
217
+ inputs: {
218
+ fields: [],
219
+ activeStep: 0,
220
+ steps: [{
221
+ action: "CreateElement",
222
+ params: {
223
+ component: "FunnelBuilder/Step",
224
+ inputs: {
225
+ label: "Step 1",
226
+ children: []
227
+ }
228
+ }
229
+ }, {
230
+ action: "CreateElement",
231
+ params: {
232
+ component: "FunnelBuilder/Step",
233
+ inputs: {
234
+ label: "Final Step",
235
+ children: []
236
+ }
237
+ }
238
+ }]
239
+ }
240
+ }
241
+ });
242
+ const document = {
243
+ state: {},
244
+ elements: {
245
+ root: {
246
+ type: "Webiny/Element",
247
+ id: "root",
248
+ component: {
249
+ name: "Webiny/Root"
250
+ }
251
+ }
252
+ },
253
+ bindings: {}
254
+ };
255
+ for (const op of result.operations) {
256
+ op.apply(document);
257
+ }
258
+ const funnelId = result.element.id;
259
+
260
+ // Both step elements exist in the document.
261
+ const stepElements = Object.values(document.elements).filter(el => el.component.name === "FunnelBuilder/Step");
262
+ expect(stepElements).toHaveLength(2);
263
+
264
+ // Both steps have their correct labels.
265
+ const labels = stepElements.map(el => document.bindings[el.id]?.inputs?.label?.static);
266
+ expect(labels).toContain("Step 1");
267
+ expect(labels).toContain("Final Step");
268
+
269
+ // The steps binding contains both step IDs in order.
270
+ const stepsBinding = document.bindings[funnelId]?.inputs?.steps;
271
+ expect(stepsBinding?.list).toBe(true);
272
+ expect(stepsBinding?.type).toBe("slot");
273
+ expect(stepsBinding?.static).toHaveLength(2);
274
+ const step1 = stepElements.find(el => document.bindings[el.id]?.inputs?.label?.static === "Step 1");
275
+ const step2 = stepElements.find(el => document.bindings[el.id]?.inputs?.label?.static === "Final Step");
276
+ expect(stepsBinding?.static).toEqual([step1.id, step2.id]);
277
+ });
278
+ });
279
+
280
+ //# sourceMappingURL=ElementFactory.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["describe","it","expect","ElementFactory","DocumentOperations","components","name","label","tags","inputs","type","list","renderer","defaultValue","fields","serializeOp","op","AddElement","element","AddToParent","index","SetGlobalInputBinding","elementId","bindingPath","binding","SetGlobalStyleBinding","factory","result","createElementFromComponent","componentName","parentId","slot","bindings","activeStep","steps","action","params","component","children","ops","operations","map","funnelId","id","toBe","static","step1Id","parent","toEqual","toBeUndefined","toHaveLength","document","state","elements","root","apply","stepElements","Object","values","filter","el","labels","toContain","stepsBinding","step1","find","step2"],"sources":["ElementFactory.test.ts"],"sourcesContent":["import { describe, it, expect } from \"vitest\";\nimport { ElementFactory } from \"./ElementFactory.js\";\nimport { DocumentOperations } from \"./documentOperations/index.js\";\nimport type { ComponentManifest, Document } from \"~/types.js\";\n\nconst components: Record<string, ComponentManifest> = {\n \"Webiny/Root\": {\n name: \"Webiny/Root\",\n label: \"Main Content\",\n tags: [],\n inputs: [\n {\n type: \"slot\",\n list: true,\n renderer: \"Webiny/Slot\",\n defaultValue: [],\n name: \"children\"\n }\n ]\n },\n \"FunnelBuilder/Funnel\": {\n name: \"FunnelBuilder/Funnel\",\n label: \"Funnel\",\n tags: [],\n inputs: [\n {\n type: \"object\",\n renderer: \"Webiny/Object\",\n name: \"fields\",\n list: true,\n fields: [],\n defaultValue: []\n },\n {\n type: \"number\",\n renderer: \"Webiny/Number\",\n name: \"activeStep\",\n label: \"Active Step\",\n defaultValue: 0\n },\n {\n type: \"slot\",\n list: true,\n renderer: \"Webiny/Slot\",\n defaultValue: [],\n name: \"steps\"\n },\n {\n type: \"object\",\n renderer: \"FunnelBuilder/ConditionRulesRenderer\",\n name: \"conditionRules\",\n list: true,\n fields: []\n }\n ]\n },\n \"FunnelBuilder/Step\": {\n name: \"FunnelBuilder/Step\",\n label: \"Funnel Step\",\n tags: [],\n inputs: [\n {\n type: \"text\",\n renderer: \"Webiny/Input\",\n name: \"label\",\n label: \"Label\"\n },\n {\n type: \"slot\",\n list: true,\n renderer: \"Webiny/Slot\",\n defaultValue: [],\n name: \"children\"\n }\n ]\n }\n};\n\n/**\n * Extract private fields from operation instances for assertion.\n */\nfunction serializeOp(op: any) {\n if (op instanceof DocumentOperations.AddElement) {\n return { type: \"AddElement\", element: op[\"element\"] };\n }\n if (op instanceof DocumentOperations.AddToParent) {\n return { type: \"AddToParent\", element: op[\"element\"], index: op[\"index\"] };\n }\n if (op instanceof DocumentOperations.SetGlobalInputBinding) {\n return {\n type: \"SetGlobalInputBinding\",\n elementId: op[\"elementId\"],\n bindingPath: op[\"bindingPath\"],\n binding: op[\"binding\"]\n };\n }\n if (op instanceof DocumentOperations.SetGlobalStyleBinding) {\n return {\n type: \"SetGlobalStyleBinding\",\n elementId: op[\"elementId\"],\n bindingPath: op[\"bindingPath\"],\n binding: op[\"binding\"]\n };\n }\n return op;\n}\n\ndescribe(\"ElementFactory\", () => {\n it(\"should produce correct operation sequence for a Funnel with two Steps\", () => {\n const factory = new ElementFactory(components);\n const result = factory.createElementFromComponent({\n componentName: \"FunnelBuilder/Funnel\",\n parentId: \"root\",\n slot: \"children\",\n index: 0,\n bindings: {\n inputs: {\n fields: [],\n activeStep: 0,\n steps: [\n {\n action: \"CreateElement\",\n params: {\n component: \"FunnelBuilder/Step\",\n inputs: { label: \"Step 1\", children: [] }\n }\n },\n {\n action: \"CreateElement\",\n params: {\n component: \"FunnelBuilder/Step\",\n inputs: { label: \"Final Step\", children: [] }\n }\n }\n ]\n }\n }\n });\n\n const ops = result.operations.map(serializeOp);\n const funnelId = result.element.id;\n\n // 0: AddElement — Funnel\n expect(ops[0].type).toBe(\"AddElement\");\n expect(ops[0].element.component.name).toBe(\"FunnelBuilder/Funnel\");\n\n // 1: AddToParent — Funnel → root/children at index 0\n expect(ops[1].type).toBe(\"AddToParent\");\n expect(ops[1].element.id).toBe(funnelId);\n expect(ops[1].index).toBe(0);\n\n // 2: SetGlobalInputBinding — activeStep = 0\n expect(ops[2].type).toBe(\"SetGlobalInputBinding\");\n expect(ops[2].elementId).toBe(funnelId);\n expect(ops[2].bindingPath).toBe(\"activeStep\");\n expect(ops[2].binding.static).toBe(0);\n\n // 3: AddElement — Step 1\n const step1Id = ops[3].element.id;\n expect(ops[3].type).toBe(\"AddElement\");\n expect(ops[3].element.component.name).toBe(\"FunnelBuilder/Step\");\n expect(ops[3].element.parent).toEqual({ id: funnelId, slot: \"steps\" });\n\n // 4: AddToParent — Step 1 (undefined = append)\n expect(ops[4].type).toBe(\"AddToParent\");\n expect(ops[4].element.id).toBe(step1Id);\n expect(ops[4].index).toBeUndefined();\n\n // 5: Step 1 label binding\n expect(ops[5].bindingPath).toBe(\"label\");\n expect(ops[5].binding.static).toBe(\"Step 1\");\n\n // 6: Step 1 children binding\n expect(ops[6].bindingPath).toBe(\"children\");\n expect(ops[6].binding.static).toEqual([]);\n\n // 7-8: Step 1 style bindings\n expect(ops[7].bindingPath).toBe(\"display\");\n expect(ops[8].bindingPath).toBe(\"flexDirection\");\n\n // 9: SetGlobalInputBinding — steps slot metadata (no static, AddToParent handles it)\n expect(ops[9].type).toBe(\"SetGlobalInputBinding\");\n expect(ops[9].elementId).toBe(funnelId);\n expect(ops[9].bindingPath).toBe(\"steps\");\n expect(ops[9].binding.static).toBeUndefined();\n expect(ops[9].binding.type).toBe(\"slot\");\n expect(ops[9].binding.list).toBe(true);\n\n // 10: AddElement — Step 2\n expect(ops[10].element.component.name).toBe(\"FunnelBuilder/Step\");\n\n // 11: AddToParent — Step 2 (undefined = append)\n expect(ops[11].index).toBeUndefined();\n\n // 12-15: Step 2 bindings + styles\n expect(ops[12].binding.static).toBe(\"Final Step\");\n expect(ops[13].binding.static).toEqual([]);\n\n // 16: SetGlobalInputBinding — steps slot metadata (no static)\n expect(ops[16].type).toBe(\"SetGlobalInputBinding\");\n expect(ops[16].elementId).toBe(funnelId);\n expect(ops[16].bindingPath).toBe(\"steps\");\n expect(ops[16].binding.static).toBeUndefined();\n\n // 17-18: Funnel style bindings\n expect(ops[17].bindingPath).toBe(\"display\");\n expect(ops[18].bindingPath).toBe(\"flexDirection\");\n\n expect(ops).toHaveLength(19);\n });\n\n it(\"should produce correct document after applying all operations\", () => {\n const factory = new ElementFactory(components);\n const result = factory.createElementFromComponent({\n componentName: \"FunnelBuilder/Funnel\",\n parentId: \"root\",\n slot: \"children\",\n index: 0,\n bindings: {\n inputs: {\n fields: [],\n activeStep: 0,\n steps: [\n {\n action: \"CreateElement\",\n params: {\n component: \"FunnelBuilder/Step\",\n inputs: { label: \"Step 1\", children: [] }\n }\n },\n {\n action: \"CreateElement\",\n params: {\n component: \"FunnelBuilder/Step\",\n inputs: { label: \"Final Step\", children: [] }\n }\n }\n ]\n }\n }\n });\n\n const document = {\n state: {},\n elements: {\n root: {\n type: \"Webiny/Element\",\n id: \"root\",\n component: { name: \"Webiny/Root\" }\n }\n },\n bindings: {}\n } as unknown as Document;\n\n for (const op of result.operations) {\n op.apply(document);\n }\n\n const funnelId = result.element.id;\n\n // Both step elements exist in the document.\n const stepElements = Object.values(document.elements).filter(\n el => el.component.name === \"FunnelBuilder/Step\"\n );\n expect(stepElements).toHaveLength(2);\n\n // Both steps have their correct labels.\n const labels = stepElements.map(el => document.bindings[el.id]?.inputs?.label?.static);\n expect(labels).toContain(\"Step 1\");\n expect(labels).toContain(\"Final Step\");\n\n // The steps binding contains both step IDs in order.\n const stepsBinding = document.bindings[funnelId]?.inputs?.steps;\n expect(stepsBinding?.list).toBe(true);\n expect(stepsBinding?.type).toBe(\"slot\");\n expect(stepsBinding?.static).toHaveLength(2);\n\n const step1 = stepElements.find(\n el => document.bindings[el.id]?.inputs?.label?.static === \"Step 1\"\n )!;\n const step2 = stepElements.find(\n el => document.bindings[el.id]?.inputs?.label?.static === \"Final Step\"\n )!;\n expect(stepsBinding?.static).toEqual([step1.id, step2.id]);\n });\n});\n"],"mappings":"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","ignoreList":[]}
package/HashObject.js CHANGED
@@ -1,4 +1,18 @@
1
1
  import stringify from "fast-json-stable-stringify";
2
+ /*
3
+ // TODO @pavel consider using this library instead of fast-json-stable-stringify as it is a bit newer
4
+ import { configure } from 'safe-stable-stringify'
5
+
6
+ const stringify = configure({
7
+ bigint: true,
8
+ circularValue: '[Circular]',
9
+ deterministic: true,
10
+ maximumDepth: Infinity,
11
+ maximumBreadth: Infinity,
12
+ strict: false,
13
+ });
14
+ */
15
+
2
16
  class HashObject {
3
17
  hash(object) {
4
18
  return this.fastHash(object);
package/HashObject.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["stringify","HashObject","hash","object","fastHash","obj","str","i","length","charCodeAt","hashObject"],"sources":["HashObject.ts"],"sourcesContent":["import stringify from \"fast-json-stable-stringify\";\n\nclass HashObject {\n hash(object: object) {\n return this.fastHash(object);\n }\n\n private fastHash(obj: object): number {\n const str = stringify(obj); // stable key order\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) - hash + str.charCodeAt(i)) | 0;\n }\n return hash >>> 0; // unsigned\n }\n}\n\nexport const hashObject = new HashObject();\n"],"mappings":"AAAA,OAAOA,SAAS,MAAM,4BAA4B;AAElD,MAAMC,UAAU,CAAC;EACbC,IAAIA,CAACC,MAAc,EAAE;IACjB,OAAO,IAAI,CAACC,QAAQ,CAACD,MAAM,CAAC;EAChC;EAEQC,QAAQA,CAACC,GAAW,EAAU;IAClC,MAAMC,GAAG,GAAGN,SAAS,CAACK,GAAG,CAAC,CAAC,CAAC;IAC5B,IAAIH,IAAI,GAAG,CAAC;IACZ,KAAK,IAAIK,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGD,GAAG,CAACE,MAAM,EAAED,CAAC,EAAE,EAAE;MACjCL,IAAI,GAAI,CAACA,IAAI,IAAI,CAAC,IAAIA,IAAI,GAAGI,GAAG,CAACG,UAAU,CAACF,CAAC,CAAC,GAAI,CAAC;IACvD;IACA,OAAOL,IAAI,KAAK,CAAC,CAAC,CAAC;EACvB;AACJ;AAEA,OAAO,MAAMQ,UAAU,GAAG,IAAIT,UAAU,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["stringify","HashObject","hash","object","fastHash","obj","str","i","length","charCodeAt","hashObject"],"sources":["HashObject.ts"],"sourcesContent":["import stringify from \"fast-json-stable-stringify\";\n/*\n// TODO @pavel consider using this library instead of fast-json-stable-stringify as it is a bit newer\nimport { configure } from 'safe-stable-stringify'\n\nconst stringify = configure({\n bigint: true,\n circularValue: '[Circular]',\n deterministic: true,\n maximumDepth: Infinity,\n maximumBreadth: Infinity,\n strict: false,\n});\n*/\n\nclass HashObject {\n hash(object: object) {\n return this.fastHash(object);\n }\n\n private fastHash(obj: object): number {\n const str = stringify(obj); // stable key order\n let hash = 0;\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) - hash + str.charCodeAt(i)) | 0;\n }\n return hash >>> 0; // unsigned\n }\n}\n\nexport const hashObject = new HashObject();\n"],"mappings":"AAAA,OAAOA,SAAS,MAAM,4BAA4B;AAClD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,MAAMC,UAAU,CAAC;EACbC,IAAIA,CAACC,MAAc,EAAE;IACjB,OAAO,IAAI,CAACC,QAAQ,CAACD,MAAM,CAAC;EAChC;EAEQC,QAAQA,CAACC,GAAW,EAAU;IAClC,MAAMC,GAAG,GAAGN,SAAS,CAACK,GAAG,CAAC,CAAC,CAAC;IAC5B,IAAIH,IAAI,GAAG,CAAC;IACZ,KAAK,IAAIK,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGD,GAAG,CAACE,MAAM,EAAED,CAAC,EAAE,EAAE;MACjCL,IAAI,GAAI,CAACA,IAAI,IAAI,CAAC,IAAIA,IAAI,GAAGI,GAAG,CAACG,UAAU,CAACF,CAAC,CAAC,GAAI,CAAC;IACvD;IACA,OAAOL,IAAI,KAAK,CAAC,CAAC,CAAC;EACvB;AACJ;AAEA,OAAO,MAAMQ,UAAU,GAAG,IAAIT,UAAU,CAAC,CAAC","ignoreList":[]}
package/HotkeyManager.js CHANGED
@@ -1,4 +1,4 @@
1
- import isHotkey from "is-hotkey";
1
+ import { isHotkey } from "is-hotkey";
2
2
  const keyStack = {};
3
3
  let listenerInitialized = false;
4
4
  const filterTags = ["TEXTAREA", "INPUT"];
@@ -1 +1 @@
1
- {"version":3,"names":["isHotkey","keyStack","listenerInitialized","filterTags","isContentEditable","value","includes","idCounter","generateSimpleId","setupListener","document","body","eventListener","ev","target","nodeName","contentEditable","matchedKey","Object","keys","find","key","length","item","handler","stopPropagation","addEventListener","HotkeyManager","constructor","id","add","exists","some","unshift","remove","index","findIndex","splice"],"sources":["HotkeyManager.ts"],"sourcesContent":["import isHotkey from \"is-hotkey\";\n\ninterface KeyHandler {\n id: string;\n handler: (e: KeyboardEvent) => void;\n}\n\nconst keyStack: Record<string, KeyHandler[]> = {};\nlet listenerInitialized = false;\nconst filterTags = [\"TEXTAREA\", \"INPUT\"];\n\nconst isContentEditable = (value: any) => {\n return [\"true\", true].includes(value);\n};\n\nlet idCounter = 0;\nconst generateSimpleId = () => `hotkey-${++idCounter}`;\n\nconst setupListener = (): void => {\n if (listenerInitialized || !document.body) {\n return;\n }\n\n const eventListener = (ev: KeyboardEvent) => {\n const target = ev.target as HTMLElement;\n\n if (!target) {\n return;\n }\n if (filterTags.includes(target.nodeName) || isContentEditable(target.contentEditable)) {\n return;\n }\n\n const matchedKey = Object.keys(keyStack).find(key => isHotkey(key, ev));\n if (matchedKey && keyStack[matchedKey]?.length > 0) {\n const item = keyStack[matchedKey][0];\n item.handler(ev);\n ev.stopPropagation();\n }\n };\n\n document.body.addEventListener(\"keydown\", eventListener);\n listenerInitialized = true;\n};\n\nexport class HotkeyManager {\n private readonly id: string;\n\n constructor() {\n this.id = generateSimpleId();\n setupListener();\n }\n\n add(key: string, handler: (e: KeyboardEvent) => void): void {\n keyStack[key] = keyStack[key] || [];\n const exists = keyStack[key].some(item => item.id === this.id);\n if (!exists) {\n keyStack[key].unshift({ id: this.id, handler });\n }\n }\n\n remove(key: string): void {\n if (!keyStack[key]) {\n return;\n }\n\n const index = keyStack[key].findIndex(item => item.id === this.id);\n if (index >= 0) {\n keyStack[key].splice(index, 1);\n }\n }\n}\n"],"mappings":"AAAA,OAAOA,QAAQ,MAAM,WAAW;AAOhC,MAAMC,QAAsC,GAAG,CAAC,CAAC;AACjD,IAAIC,mBAAmB,GAAG,KAAK;AAC/B,MAAMC,UAAU,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC;AAExC,MAAMC,iBAAiB,GAAIC,KAAU,IAAK;EACtC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAACC,QAAQ,CAACD,KAAK,CAAC;AACzC,CAAC;AAED,IAAIE,SAAS,GAAG,CAAC;AACjB,MAAMC,gBAAgB,GAAGA,CAAA,KAAM,UAAU,EAAED,SAAS,EAAE;AAEtD,MAAME,aAAa,GAAGA,CAAA,KAAY;EAC9B,IAAIP,mBAAmB,IAAI,CAACQ,QAAQ,CAACC,IAAI,EAAE;IACvC;EACJ;EAEA,MAAMC,aAAa,GAAIC,EAAiB,IAAK;IACzC,MAAMC,MAAM,GAAGD,EAAE,CAACC,MAAqB;IAEvC,IAAI,CAACA,MAAM,EAAE;MACT;IACJ;IACA,IAAIX,UAAU,CAACG,QAAQ,CAACQ,MAAM,CAACC,QAAQ,CAAC,IAAIX,iBAAiB,CAACU,MAAM,CAACE,eAAe,CAAC,EAAE;MACnF;IACJ;IAEA,MAAMC,UAAU,GAAGC,MAAM,CAACC,IAAI,CAAClB,QAAQ,CAAC,CAACmB,IAAI,CAACC,GAAG,IAAIrB,QAAQ,CAACqB,GAAG,EAAER,EAAE,CAAC,CAAC;IACvE,IAAII,UAAU,IAAIhB,QAAQ,CAACgB,UAAU,CAAC,EAAEK,MAAM,GAAG,CAAC,EAAE;MAChD,MAAMC,IAAI,GAAGtB,QAAQ,CAACgB,UAAU,CAAC,CAAC,CAAC,CAAC;MACpCM,IAAI,CAACC,OAAO,CAACX,EAAE,CAAC;MAChBA,EAAE,CAACY,eAAe,CAAC,CAAC;IACxB;EACJ,CAAC;EAEDf,QAAQ,CAACC,IAAI,CAACe,gBAAgB,CAAC,SAAS,EAAEd,aAAa,CAAC;EACxDV,mBAAmB,GAAG,IAAI;AAC9B,CAAC;AAED,OAAO,MAAMyB,aAAa,CAAC;EAGvBC,WAAWA,CAAA,EAAG;IACV,IAAI,CAACC,EAAE,GAAGrB,gBAAgB,CAAC,CAAC;IAC5BC,aAAa,CAAC,CAAC;EACnB;EAEAqB,GAAGA,CAACT,GAAW,EAAEG,OAAmC,EAAQ;IACxDvB,QAAQ,CAACoB,GAAG,CAAC,GAAGpB,QAAQ,CAACoB,GAAG,CAAC,IAAI,EAAE;IACnC,MAAMU,MAAM,GAAG9B,QAAQ,CAACoB,GAAG,CAAC,CAACW,IAAI,CAACT,IAAI,IAAIA,IAAI,CAACM,EAAE,KAAK,IAAI,CAACA,EAAE,CAAC;IAC9D,IAAI,CAACE,MAAM,EAAE;MACT9B,QAAQ,CAACoB,GAAG,CAAC,CAACY,OAAO,CAAC;QAAEJ,EAAE,EAAE,IAAI,CAACA,EAAE;QAAEL;MAAQ,CAAC,CAAC;IACnD;EACJ;EAEAU,MAAMA,CAACb,GAAW,EAAQ;IACtB,IAAI,CAACpB,QAAQ,CAACoB,GAAG,CAAC,EAAE;MAChB;IACJ;IAEA,MAAMc,KAAK,GAAGlC,QAAQ,CAACoB,GAAG,CAAC,CAACe,SAAS,CAACb,IAAI,IAAIA,IAAI,CAACM,EAAE,KAAK,IAAI,CAACA,EAAE,CAAC;IAClE,IAAIM,KAAK,IAAI,CAAC,EAAE;MACZlC,QAAQ,CAACoB,GAAG,CAAC,CAACgB,MAAM,CAACF,KAAK,EAAE,CAAC,CAAC;IAClC;EACJ;AACJ","ignoreList":[]}
1
+ {"version":3,"names":["isHotkey","keyStack","listenerInitialized","filterTags","isContentEditable","value","includes","idCounter","generateSimpleId","setupListener","document","body","eventListener","ev","target","nodeName","contentEditable","matchedKey","Object","keys","find","key","length","item","handler","stopPropagation","addEventListener","HotkeyManager","constructor","id","add","exists","some","unshift","remove","index","findIndex","splice"],"sources":["HotkeyManager.ts"],"sourcesContent":["import { isHotkey } from \"is-hotkey\";\n\ninterface KeyHandler {\n id: string;\n handler: (e: KeyboardEvent) => void;\n}\n\nconst keyStack: Record<string, KeyHandler[]> = {};\nlet listenerInitialized = false;\nconst filterTags = [\"TEXTAREA\", \"INPUT\"];\n\nconst isContentEditable = (value: any) => {\n return [\"true\", true].includes(value);\n};\n\nlet idCounter = 0;\nconst generateSimpleId = () => `hotkey-${++idCounter}`;\n\nconst setupListener = (): void => {\n if (listenerInitialized || !document.body) {\n return;\n }\n\n const eventListener = (ev: KeyboardEvent) => {\n const target = ev.target as HTMLElement;\n\n if (!target) {\n return;\n }\n if (filterTags.includes(target.nodeName) || isContentEditable(target.contentEditable)) {\n return;\n }\n\n const matchedKey = Object.keys(keyStack).find(key => isHotkey(key, ev));\n if (matchedKey && keyStack[matchedKey]?.length > 0) {\n const item = keyStack[matchedKey][0];\n item.handler(ev);\n ev.stopPropagation();\n }\n };\n\n document.body.addEventListener(\"keydown\", eventListener);\n listenerInitialized = true;\n};\n\nexport class HotkeyManager {\n private readonly id: string;\n\n constructor() {\n this.id = generateSimpleId();\n setupListener();\n }\n\n add(key: string, handler: (e: KeyboardEvent) => void): void {\n keyStack[key] = keyStack[key] || [];\n const exists = keyStack[key].some(item => item.id === this.id);\n if (!exists) {\n keyStack[key].unshift({ id: this.id, handler });\n }\n }\n\n remove(key: string): void {\n if (!keyStack[key]) {\n return;\n }\n\n const index = keyStack[key].findIndex(item => item.id === this.id);\n if (index >= 0) {\n keyStack[key].splice(index, 1);\n }\n }\n}\n"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,WAAW;AAOpC,MAAMC,QAAsC,GAAG,CAAC,CAAC;AACjD,IAAIC,mBAAmB,GAAG,KAAK;AAC/B,MAAMC,UAAU,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC;AAExC,MAAMC,iBAAiB,GAAIC,KAAU,IAAK;EACtC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAACC,QAAQ,CAACD,KAAK,CAAC;AACzC,CAAC;AAED,IAAIE,SAAS,GAAG,CAAC;AACjB,MAAMC,gBAAgB,GAAGA,CAAA,KAAM,UAAU,EAAED,SAAS,EAAE;AAEtD,MAAME,aAAa,GAAGA,CAAA,KAAY;EAC9B,IAAIP,mBAAmB,IAAI,CAACQ,QAAQ,CAACC,IAAI,EAAE;IACvC;EACJ;EAEA,MAAMC,aAAa,GAAIC,EAAiB,IAAK;IACzC,MAAMC,MAAM,GAAGD,EAAE,CAACC,MAAqB;IAEvC,IAAI,CAACA,MAAM,EAAE;MACT;IACJ;IACA,IAAIX,UAAU,CAACG,QAAQ,CAACQ,MAAM,CAACC,QAAQ,CAAC,IAAIX,iBAAiB,CAACU,MAAM,CAACE,eAAe,CAAC,EAAE;MACnF;IACJ;IAEA,MAAMC,UAAU,GAAGC,MAAM,CAACC,IAAI,CAAClB,QAAQ,CAAC,CAACmB,IAAI,CAACC,GAAG,IAAIrB,QAAQ,CAACqB,GAAG,EAAER,EAAE,CAAC,CAAC;IACvE,IAAII,UAAU,IAAIhB,QAAQ,CAACgB,UAAU,CAAC,EAAEK,MAAM,GAAG,CAAC,EAAE;MAChD,MAAMC,IAAI,GAAGtB,QAAQ,CAACgB,UAAU,CAAC,CAAC,CAAC,CAAC;MACpCM,IAAI,CAACC,OAAO,CAACX,EAAE,CAAC;MAChBA,EAAE,CAACY,eAAe,CAAC,CAAC;IACxB;EACJ,CAAC;EAEDf,QAAQ,CAACC,IAAI,CAACe,gBAAgB,CAAC,SAAS,EAAEd,aAAa,CAAC;EACxDV,mBAAmB,GAAG,IAAI;AAC9B,CAAC;AAED,OAAO,MAAMyB,aAAa,CAAC;EAGvBC,WAAWA,CAAA,EAAG;IACV,IAAI,CAACC,EAAE,GAAGrB,gBAAgB,CAAC,CAAC;IAC5BC,aAAa,CAAC,CAAC;EACnB;EAEAqB,GAAGA,CAACT,GAAW,EAAEG,OAAmC,EAAQ;IACxDvB,QAAQ,CAACoB,GAAG,CAAC,GAAGpB,QAAQ,CAACoB,GAAG,CAAC,IAAI,EAAE;IACnC,MAAMU,MAAM,GAAG9B,QAAQ,CAACoB,GAAG,CAAC,CAACW,IAAI,CAACT,IAAI,IAAIA,IAAI,CAACM,EAAE,KAAK,IAAI,CAACA,EAAE,CAAC;IAC9D,IAAI,CAACE,MAAM,EAAE;MACT9B,QAAQ,CAACoB,GAAG,CAAC,CAACY,OAAO,CAAC;QAAEJ,EAAE,EAAE,IAAI,CAACA,EAAE;QAAEL;MAAQ,CAAC,CAAC;IACnD;EACJ;EAEAU,MAAMA,CAACb,GAAW,EAAQ;IACtB,IAAI,CAACpB,QAAQ,CAACoB,GAAG,CAAC,EAAE;MAChB;IACJ;IAEA,MAAMc,KAAK,GAAGlC,QAAQ,CAACoB,GAAG,CAAC,CAACe,SAAS,CAACb,IAAI,IAAIA,IAAI,CAACM,EAAE,KAAK,IAAI,CAACA,EAAE,CAAC;IAClE,IAAIM,KAAK,IAAI,CAAC,EAAE;MACZlC,QAAQ,CAACoB,GAAG,CAAC,CAACgB,MAAM,CAACF,KAAK,EAAE,CAAC,CAAC;IAClC;EACJ;AACJ","ignoreList":[]}