@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.
- package/BindingsApi.d.ts +4 -4
- package/BindingsApi.js +3 -3
- package/BindingsApi.js.map +1 -1
- package/BindingsProcessor.d.ts +1 -1
- package/BindingsProcessor.js.map +1 -1
- package/BindingsProcessor.test.js +2 -1
- package/BindingsProcessor.test.js.map +1 -1
- package/BindingsResolver.d.ts +2 -2
- package/BindingsResolver.js +3 -6
- package/BindingsResolver.js.map +1 -1
- package/BindingsResolver.test.js +4 -3
- package/BindingsResolver.test.js.map +1 -1
- package/ComponentInputTraverser.d.ts +1 -1
- package/ComponentInputTraverser.js.map +1 -1
- package/ComponentManifestToAstConverter.d.ts +1 -1
- package/ComponentManifestToAstConverter.js.map +1 -1
- package/ComponentRegistry.js +30 -0
- package/ComponentRegistry.js.map +1 -1
- package/ComponentResolver.d.ts +2 -2
- package/ComponentResolver.js +3 -3
- package/ComponentResolver.js.map +1 -1
- package/ConstraintEvaluator.d.ts +36 -0
- package/ConstraintEvaluator.js +395 -0
- package/ConstraintEvaluator.js.map +1 -0
- package/ConstraintEvaluator.test.d.ts +1 -0
- package/ConstraintEvaluator.test.js +1456 -0
- package/ConstraintEvaluator.test.js.map +1 -0
- package/ContentSdk.d.ts +13 -7
- package/ContentSdk.js +26 -10
- package/ContentSdk.js.map +1 -1
- package/DocumentStore.d.ts +3 -3
- package/DocumentStore.js +1 -1
- package/DocumentStore.js.map +1 -1
- package/DocumentStoreManager.d.ts +2 -2
- package/DocumentStoreManager.js +1 -1
- package/DocumentStoreManager.js.map +1 -1
- package/EditingSdk.d.ts +4 -4
- package/EditingSdk.js +12 -15
- package/EditingSdk.js.map +1 -1
- package/ElementFactory.d.ts +5 -6
- package/ElementFactory.js +25 -16
- package/ElementFactory.js.map +1 -1
- package/ElementFactory.test.d.ts +1 -0
- package/ElementFactory.test.js +280 -0
- package/ElementFactory.test.js.map +1 -0
- package/HashObject.js +14 -0
- package/HashObject.js.map +1 -1
- package/HotkeyManager.js +1 -1
- package/HotkeyManager.js.map +1 -1
- package/IBindingsUpdater.d.ts +2 -2
- package/IBindingsUpdater.js.map +1 -1
- package/IRedirects.d.ts +5 -0
- package/IRedirects.js +3 -0
- package/IRedirects.js.map +1 -0
- package/InheritanceProcessor.d.ts +4 -4
- package/InheritanceProcessor.js.map +1 -1
- package/InheritanceProcessor.test.js +2 -1
- package/InheritanceProcessor.test.js.map +1 -1
- package/InheritedValueResolver.d.ts +1 -1
- package/InheritedValueResolver.js.map +1 -1
- package/InputBindingsProcessor.d.ts +4 -4
- package/InputBindingsProcessor.js +29 -11
- package/InputBindingsProcessor.js.map +1 -1
- package/InputsBindingsProcessor.test.js +4 -2
- package/InputsBindingsProcessor.test.js.map +1 -1
- package/InputsUpdater.d.ts +5 -5
- package/InputsUpdater.js +2 -2
- package/InputsUpdater.js.map +1 -1
- package/LiveSdk.d.ts +2 -2
- package/LiveSdk.js +1 -1
- package/LiveSdk.js.map +1 -1
- package/Logger.d.ts +2 -1
- package/Logger.js +7 -4
- package/Logger.js.map +1 -1
- package/NullSdk.d.ts +5 -3
- package/NullSdk.js +10 -0
- package/NullSdk.js.map +1 -1
- package/PreviewDocument.js +1 -1
- package/PreviewDocument.js.map +1 -1
- package/PreviewSdk.d.ts +2 -2
- package/PreviewSdk.js +3 -3
- package/PreviewSdk.js.map +1 -1
- package/PreviewViewport.d.ts +1 -2
- package/PreviewViewport.js +1 -21
- package/PreviewViewport.js.map +1 -1
- package/README.md +10 -2
- package/StylesBindingsProcessor.d.ts +2 -2
- package/StylesBindingsProcessor.js +4 -4
- package/StylesBindingsProcessor.js.map +1 -1
- package/StylesUpdater.d.ts +4 -4
- package/StylesUpdater.js +2 -2
- package/StylesUpdater.js.map +1 -1
- package/Theme.d.ts +1 -1
- package/Theme.js +6 -11
- package/Theme.js.map +1 -1
- package/ViewportManager.d.ts +3 -1
- package/ViewportManager.js +8 -1
- package/ViewportManager.js.map +1 -1
- package/constants.d.ts +1 -0
- package/constants.js +2 -1
- package/constants.js.map +1 -1
- package/createElement.d.ts +1 -1
- package/createElement.js.map +1 -1
- package/createInput.d.ts +124 -16
- package/createInput.js +33 -1
- package/createInput.js.map +1 -1
- package/createTheme.d.ts +2 -1
- package/createTheme.js.map +1 -1
- package/dataProviders/ApiClient.d.ts +6 -1
- package/dataProviders/ApiClient.js +19 -8
- package/dataProviders/ApiClient.js.map +1 -1
- package/dataProviders/DefaultDataProvider.d.ts +4 -3
- package/dataProviders/DefaultDataProvider.js +32 -6
- package/dataProviders/DefaultDataProvider.js.map +1 -1
- package/dataProviders/GET_PAGE_BY_ID.d.ts +1 -1
- package/dataProviders/GET_PAGE_BY_ID.js +2 -0
- package/dataProviders/GET_PAGE_BY_ID.js.map +1 -1
- package/dataProviders/GET_PAGE_BY_PATH.d.ts +1 -1
- package/dataProviders/GET_PAGE_BY_PATH.js +2 -0
- package/dataProviders/GET_PAGE_BY_PATH.js.map +1 -1
- package/dataProviders/LIST_PUBLISHED_PAGES.d.ts +1 -1
- package/dataProviders/LIST_PUBLISHED_PAGES.js +15 -4
- package/dataProviders/LIST_PUBLISHED_PAGES.js.map +1 -1
- package/dataProviders/NullDataProvider.d.ts +13 -4
- package/dataProviders/NullDataProvider.js +11 -1
- package/dataProviders/NullDataProvider.js.map +1 -1
- package/dataProviders/RedirectsProvider.d.ts +11 -0
- package/dataProviders/RedirectsProvider.js +32 -0
- package/dataProviders/RedirectsProvider.js.map +1 -0
- package/defaultBreakpoints.d.ts +1 -1
- package/defaultBreakpoints.js.map +1 -1
- package/documentOperations/$addElementReferenceToParent.d.ts +1 -1
- package/documentOperations/$addElementReferenceToParent.js +9 -2
- package/documentOperations/$addElementReferenceToParent.js.map +1 -1
- package/documentOperations/AddElement.d.ts +1 -1
- package/documentOperations/AddElement.js.map +1 -1
- package/documentOperations/AddToParent.d.ts +3 -3
- package/documentOperations/AddToParent.js.map +1 -1
- package/documentOperations/RemoveElement.d.ts +1 -1
- package/documentOperations/RemoveElement.js +9 -0
- package/documentOperations/RemoveElement.js.map +1 -1
- package/documentOperations/SetGlobalInputBinding.d.ts +1 -1
- package/documentOperations/SetGlobalInputBinding.js.map +1 -1
- package/documentOperations/SetGlobalStyleBinding.d.ts +1 -1
- package/documentOperations/SetGlobalStyleBinding.js.map +1 -1
- package/documentOperations/SetInputBindingOverride.d.ts +1 -1
- package/documentOperations/SetInputBindingOverride.js.map +1 -1
- package/documentOperations/SetStyleBindingOverride.d.ts +1 -1
- package/documentOperations/SetStyleBindingOverride.js.map +1 -1
- package/documentOperations/index.d.ts +8 -8
- package/documentOperations/index.js +7 -7
- package/documentOperations/index.js.map +1 -1
- package/findMatchingAstNode.d.ts +1 -1
- package/findMatchingAstNode.js.map +1 -1
- package/generateElementId.d.ts +1 -1
- package/generateElementId.js +0 -1
- package/generateElementId.js.map +1 -1
- package/index.d.ts +3 -3
- package/index.js +2 -3
- package/index.js.map +1 -1
- package/jsonPatch.d.ts +1 -1
- package/messenger/Messenger.js +6 -6
- package/messenger/Messenger.js.map +1 -1
- package/package.json +14 -20
- package/registerComponentGroup.d.ts +1 -1
- package/registerComponentGroup.js +1 -1
- package/registerComponentGroup.js.map +1 -1
- package/types/WebsiteBuilderTheme.d.ts +52 -42
- package/types/WebsiteBuilderTheme.js.map +1 -1
- package/types.d.ts +207 -20
- package/types.js.map +1 -1
- package/lexical/createDefaultLexicalTheme.d.ts +0 -2
- package/lexical/createDefaultLexicalTheme.js +0 -84
- package/lexical/createDefaultLexicalTheme.js.map +0 -1
- package/lexical/createLexicalTheme.d.ts +0 -2
- package/lexical/createLexicalTheme.js +0 -7
- package/lexical/createLexicalTheme.js.map +0 -1
- package/lexical/deepMerge.d.ts +0 -1
- package/lexical/deepMerge.js +0 -23
- package/lexical/deepMerge.js.map +0 -1
- package/types/LexicalEditorTheme.d.ts +0 -2
- package/types/LexicalEditorTheme.js +0 -3
- 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":[]}
|
package/ElementFactory.d.ts
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
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",
|
package/ElementFactory.js.map
CHANGED
|
@@ -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;
|
|
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
package/HotkeyManager.js.map
CHANGED
|
@@ -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,
|
|
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":[]}
|