meno-core 1.0.53 → 1.0.54
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/.claude/settings.local.json +1 -3
- package/bin/cli.ts +48 -57
- package/build-astro.ts +131 -113
- package/build-next.ts +109 -96
- package/build-static.test.ts +39 -10
- package/build-static.ts +120 -122
- package/dist/bin/cli.js +34 -38
- package/dist/bin/cli.js.map +2 -2
- package/dist/build-static.js +12 -11
- package/dist/chunks/chunk-2AR55GYH.js +42 -0
- package/dist/chunks/chunk-2AR55GYH.js.map +7 -0
- package/dist/chunks/{chunk-IGYR22T6.js → chunk-2FN4UOVO.js} +512 -239
- package/dist/chunks/chunk-2FN4UOVO.js.map +7 -0
- package/dist/chunks/chunk-3XER4E5W.js +168 -0
- package/dist/chunks/chunk-3XER4E5W.js.map +7 -0
- package/dist/chunks/{chunk-X754AHS5.js → chunk-5ETZFREW.js} +9 -12
- package/dist/chunks/chunk-5ETZFREW.js.map +7 -0
- package/dist/chunks/{chunk-2MHDV5BF.js → chunk-7E4IF5L7.js} +15 -21
- package/dist/chunks/chunk-7E4IF5L7.js.map +7 -0
- package/dist/chunks/{chunk-JGWFTO6P.js → chunk-7HWQUVTU.js} +1578 -1349
- package/dist/chunks/chunk-7HWQUVTU.js.map +7 -0
- package/dist/chunks/{chunk-O3NAGJP4.js → chunk-AE3QK5QW.js} +110 -21
- package/dist/chunks/chunk-AE3QK5QW.js.map +7 -0
- package/dist/chunks/{chunk-GZHGVVW3.js → chunk-F6KTJYGV.js} +7 -7
- package/dist/chunks/chunk-F6KTJYGV.js.map +7 -0
- package/dist/chunks/{chunk-WQFG7PAH.js → chunk-FZITJSSS.js} +2 -6
- package/dist/chunks/chunk-FZITJSSS.js.map +7 -0
- package/dist/chunks/{chunk-QB2LNO4W.js → chunk-GSYYA5GX.js} +2 -2
- package/dist/chunks/chunk-GSYYA5GX.js.map +7 -0
- package/dist/chunks/{chunk-YBLHKYFF.js → chunk-HIZMY3EP.js} +1 -1
- package/dist/chunks/chunk-HIZMY3EP.js.map +7 -0
- package/dist/chunks/{chunk-AZQYF6KE.js → chunk-I2WEGYA7.js} +41 -176
- package/dist/chunks/chunk-I2WEGYA7.js.map +7 -0
- package/dist/chunks/{chunk-I7YIGZXT.js → chunk-JNO3CNLJ.js} +6 -9
- package/dist/chunks/chunk-JNO3CNLJ.js.map +7 -0
- package/dist/chunks/{chunk-UB44F4Z2.js → chunk-NVRBTSQG.js} +2 -4
- package/dist/chunks/chunk-NVRBTSQG.js.map +7 -0
- package/dist/chunks/{chunk-JGP5A3Y5.js → chunk-Q4OBWKXG.js} +40 -33
- package/dist/chunks/chunk-Q4OBWKXG.js.map +7 -0
- package/dist/chunks/{chunk-R6XHAFBF.js → chunk-QTE32Y53.js} +250 -242
- package/dist/chunks/chunk-QTE32Y53.js.map +7 -0
- package/dist/chunks/{chunk-H3GJ4H2U.js → chunk-STDY3OVM.js} +214 -85
- package/dist/chunks/chunk-STDY3OVM.js.map +7 -0
- package/dist/chunks/configService-PRJZF7Y6.js +14 -0
- package/dist/chunks/{constants-STK2YBIW.js → constants-KIQEYMAM.js} +2 -2
- package/dist/chunks/{fs-JGINUXGL.js → fs-ZI5JEU7V.js} +2 -2
- package/dist/entries/server-router.js +14 -19
- package/dist/entries/server-router.js.map +2 -2
- package/dist/lib/client/index.js +638 -332
- package/dist/lib/client/index.js.map +2 -2
- package/dist/lib/server/index.js +177 -235
- package/dist/lib/server/index.js.map +2 -2
- package/dist/lib/shared/index.js +80 -44
- package/dist/lib/shared/index.js.map +2 -2
- package/dist/lib/shared/richtext/index.js +1 -1
- package/dist/lib/test-utils/index.js +38 -60
- package/dist/lib/test-utils/index.js.map +2 -2
- package/entries/client-router.tsx +10 -8
- package/entries/server-router.tsx +1 -7
- package/lib/client/ClientInitializer.ts +8 -8
- package/lib/client/ErrorBoundary.test.tsx +146 -143
- package/lib/client/ErrorBoundary.tsx +175 -127
- package/lib/client/componentRegistry.test.ts +96 -108
- package/lib/client/componentRegistry.ts +1 -2
- package/lib/client/contexts/ThemeContext.tsx +3 -2
- package/lib/client/core/ComponentBuilder.test.ts +513 -560
- package/lib/client/core/ComponentBuilder.ts +318 -146
- package/lib/client/core/ComponentRenderer.test.tsx +1 -2
- package/lib/client/core/ComponentRenderer.tsx +46 -33
- package/lib/client/core/builders/embedBuilder.ts +241 -53
- package/lib/client/core/builders/linkBuilder.ts +71 -44
- package/lib/client/core/builders/linkNodeBuilder.ts +78 -53
- package/lib/client/core/builders/listBuilder.ts +115 -86
- package/lib/client/core/builders/localeListBuilder.ts +95 -60
- package/lib/client/core/builders/types.ts +5 -5
- package/lib/client/core/cmsTemplateProcessor.ts +7 -7
- package/lib/client/elementRegistry.ts +3 -3
- package/lib/client/fontFamiliesService.test.ts +2 -10
- package/lib/client/fontFamiliesService.ts +3 -3
- package/lib/client/hmr/HMRManager.tsx +8 -0
- package/lib/client/hmrCssReload.ts +14 -8
- package/lib/client/hmrWebSocket.ts +9 -14
- package/lib/client/hooks/useColorVariables.test.ts +21 -21
- package/lib/client/hooks/useColorVariables.ts +12 -10
- package/lib/client/hooks/usePropertyAutocomplete.ts +3 -5
- package/lib/client/hooks/useVariables.ts +4 -4
- package/lib/client/hydration/HydrationUtils.test.ts +24 -25
- package/lib/client/hydration/HydrationUtils.ts +3 -4
- package/lib/client/i18nConfigService.test.ts +2 -7
- package/lib/client/i18nConfigService.ts +2 -2
- package/lib/client/meno-filter/MenoFilter.test.ts +19 -21
- package/lib/client/meno-filter/MenoFilter.ts +5 -9
- package/lib/client/meno-filter/bindings.ts +15 -40
- package/lib/client/meno-filter/init.ts +1 -1
- package/lib/client/meno-filter/renderer.ts +23 -29
- package/lib/client/meno-filter/script.generated.ts +1 -3
- package/lib/client/meno-filter/ui.ts +3 -5
- package/lib/client/meno-filter/updates.ts +15 -21
- package/lib/client/navigation.test.ts +159 -159
- package/lib/client/navigation.ts +0 -1
- package/lib/client/responsiveStyleResolver.test.ts +230 -228
- package/lib/client/responsiveStyleResolver.ts +13 -16
- package/lib/client/routing/RouteLoader.test.ts +23 -24
- package/lib/client/routing/RouteLoader.ts +22 -35
- package/lib/client/routing/Router.tsx +31 -3
- package/lib/client/scripts/ScriptExecutor.test.ts +157 -158
- package/lib/client/scripts/ScriptExecutor.ts +15 -33
- package/lib/client/services/PrefetchService.test.ts +2 -2
- package/lib/client/services/PrefetchService.ts +10 -24
- package/lib/client/styleProcessor.test.ts +9 -9
- package/lib/client/styleProcessor.ts +18 -15
- package/lib/client/styles/StyleInjector.test.ts +122 -115
- package/lib/client/styles/StyleInjector.ts +9 -6
- package/lib/client/styles/UtilityClassCollector.ts +19 -26
- package/lib/client/styles/cspNonce.test.ts +2 -5
- package/lib/client/templateEngine.test.ts +554 -482
- package/lib/client/templateEngine.ts +200 -64
- package/lib/client/theme.ts +0 -1
- package/lib/client/utils/toast.ts +0 -1
- package/lib/server/__integration__/api-routes.test.ts +8 -4
- package/lib/server/__integration__/cms-integration.test.ts +1 -4
- package/lib/server/__integration__/server-lifecycle.test.ts +2 -5
- package/lib/server/__integration__/ssr-rendering.test.ts +47 -37
- package/lib/server/__integration__/static-assets.test.ts +1 -1
- package/lib/server/__integration__/test-helpers.ts +84 -70
- package/lib/server/ab/generateFunctions.ts +12 -10
- package/lib/server/astro/cmsPageEmitter.ts +23 -38
- package/lib/server/astro/componentEmitter.ts +25 -36
- package/lib/server/astro/cssCollector.ts +10 -26
- package/lib/server/astro/nodeToAstro.test.ts +1750 -30
- package/lib/server/astro/nodeToAstro.ts +198 -187
- package/lib/server/astro/normalizeOrphanTemplateProps.test.ts +105 -109
- package/lib/server/astro/normalizeOrphanTemplateProps.ts +4 -12
- package/lib/server/astro/pageEmitter.ts +9 -13
- package/lib/server/astro/tailwindMapper.test.ts +10 -37
- package/lib/server/astro/tailwindMapper.ts +33 -40
- package/lib/server/astro/templateTransformer.ts +14 -17
- package/lib/server/createServer.ts +5 -17
- package/lib/server/cssGenerator.test.ts +35 -44
- package/lib/server/cssGenerator.ts +6 -17
- package/lib/server/fileWatcher.test.ts +124 -10
- package/lib/server/fileWatcher.ts +124 -118
- package/lib/server/index.ts +7 -1
- package/lib/server/jsonLoader.test.ts +39 -2
- package/lib/server/jsonLoader.ts +33 -31
- package/lib/server/middleware/cors.test.ts +20 -20
- package/lib/server/middleware/cors.ts +28 -4
- package/lib/server/middleware/errorHandler.test.ts +5 -3
- package/lib/server/middleware/errorHandler.ts +3 -8
- package/lib/server/middleware/index.ts +0 -1
- package/lib/server/middleware/logger.test.ts +7 -5
- package/lib/server/middleware/logger.ts +10 -22
- package/lib/server/pageCache.test.ts +76 -77
- package/lib/server/pageCache.ts +0 -1
- package/lib/server/projectContext.ts +4 -3
- package/lib/server/providers/fileSystemCMSProvider.test.ts +124 -95
- package/lib/server/providers/fileSystemCMSProvider.ts +35 -20
- package/lib/server/providers/fileSystemPageProvider.test.ts +84 -0
- package/lib/server/providers/fileSystemPageProvider.ts +31 -12
- package/lib/server/routes/api/cms.test.ts +26 -14
- package/lib/server/routes/api/cms.ts +9 -14
- package/lib/server/routes/api/components.ts +30 -34
- package/lib/server/routes/api/config.ts +0 -1
- package/lib/server/routes/api/core-routes.ts +47 -74
- package/lib/server/routes/api/functions.ts +8 -16
- package/lib/server/routes/api/index.ts +3 -6
- package/lib/server/routes/api/pages.ts +8 -11
- package/lib/server/routes/api/shared.test.ts +1 -1
- package/lib/server/routes/api/shared.ts +12 -9
- package/lib/server/routes/api/variables.test.ts +1 -3
- package/lib/server/routes/api/variables.ts +1 -1
- package/lib/server/routes/index.ts +23 -26
- package/lib/server/routes/pages.ts +34 -29
- package/lib/server/routes/static.ts +16 -4
- package/lib/server/runtime/bundler.ts +47 -32
- package/lib/server/runtime/fs.ts +3 -13
- package/lib/server/runtime/httpServer.ts +5 -9
- package/lib/server/services/ColorService.ts +32 -27
- package/lib/server/services/EnumService.test.ts +2 -6
- package/lib/server/services/EnumService.ts +7 -2
- package/lib/server/services/VariableService.test.ts +1 -5
- package/lib/server/services/VariableService.ts +6 -1
- package/lib/server/services/cmsService.test.ts +116 -78
- package/lib/server/services/cmsService.ts +24 -54
- package/lib/server/services/componentService.test.ts +122 -36
- package/lib/server/services/componentService.ts +54 -38
- package/lib/server/services/configService.test.ts +9 -31
- package/lib/server/services/configService.ts +20 -27
- package/lib/server/services/fileWatcherService.ts +40 -6
- package/lib/server/services/index.ts +0 -1
- package/lib/server/services/pageService.test.ts +1 -3
- package/lib/server/services/pageService.ts +14 -13
- package/lib/server/ssr/attributeBuilder.ts +16 -6
- package/lib/server/ssr/buildErrorOverlay.ts +11 -12
- package/lib/server/ssr/clientDataInjector.ts +7 -21
- package/lib/server/ssr/cmsSSRProcessor.ts +3 -6
- package/lib/server/ssr/cssCollector.ts +1 -1
- package/lib/server/ssr/errorOverlay.test.ts +1 -1
- package/lib/server/ssr/errorOverlay.ts +3 -9
- package/lib/server/ssr/htmlGenerator.nonce.test.ts +3 -9
- package/lib/server/ssr/htmlGenerator.test.ts +120 -43
- package/lib/server/ssr/htmlGenerator.ts +120 -85
- package/lib/server/ssr/imageMetadata.test.ts +3 -1
- package/lib/server/ssr/imageMetadata.ts +25 -19
- package/lib/server/ssr/jsCollector.test.ts +3 -13
- package/lib/server/ssr/jsCollector.ts +3 -8
- package/lib/server/ssr/liveReloadIntegration.test.ts +69 -28
- package/lib/server/ssr/metaTagGenerator.ts +2 -2
- package/lib/server/ssr/ssrRenderer.branches.test.ts +1103 -0
- package/lib/server/ssr/ssrRenderer.test.ts +196 -246
- package/lib/server/ssr/ssrRenderer.ts +609 -225
- package/lib/server/ssrRenderer.test.ts +1044 -950
- package/lib/server/utils/jsonLineMapper.test.ts +28 -28
- package/lib/server/utils/jsonLineMapper.ts +1 -1
- package/lib/server/validateStyleCoverage.ts +18 -20
- package/lib/server/webflow/buildWebflow.ts +41 -53
- package/lib/server/webflow/nodeToWebflow.test.ts +150 -218
- package/lib/server/webflow/nodeToWebflow.ts +195 -258
- package/lib/server/webflow/styleMapper.test.ts +15 -56
- package/lib/server/webflow/styleMapper.ts +33 -41
- package/lib/server/webflow/types.ts +1 -8
- package/lib/server/websocketManager.ts +16 -19
- package/lib/shared/attributeNodeUtils.test.ts +15 -15
- package/lib/shared/attributeNodeUtils.ts +5 -12
- package/lib/shared/breakpoints.ts +4 -11
- package/lib/shared/cmsQueryParser.test.ts +50 -42
- package/lib/shared/cmsQueryParser.ts +49 -31
- package/lib/shared/colorVariableUtils.test.ts +5 -5
- package/lib/shared/colorVariableUtils.ts +3 -8
- package/lib/shared/componentRefs.ts +1 -5
- package/lib/shared/constants.test.ts +3 -3
- package/lib/shared/constants.ts +4 -8
- package/lib/shared/cssGeneration.test.ts +262 -144
- package/lib/shared/cssGeneration.ts +189 -516
- package/lib/shared/cssNamedColors.ts +152 -30
- package/lib/shared/cssProperties.test.ts +5 -6
- package/lib/shared/cssProperties.ts +296 -112
- package/lib/shared/elementClassName.test.ts +109 -109
- package/lib/shared/elementClassName.ts +1 -1
- package/lib/shared/elementUtils.ts +12 -16
- package/lib/shared/errorLogger.ts +2 -10
- package/lib/shared/errors.test.ts +2 -13
- package/lib/shared/errors.ts +2 -8
- package/lib/shared/expressionEvaluator.test.ts +119 -0
- package/lib/shared/expressionEvaluator.ts +43 -24
- package/lib/shared/fontLoader.test.ts +19 -5
- package/lib/shared/friendlyError.ts +2 -3
- package/lib/shared/gradientUtils.test.ts +1 -5
- package/lib/shared/gradientUtils.ts +2 -6
- package/lib/shared/hrefRefs.ts +2 -10
- package/lib/shared/i18n.test.ts +1 -1
- package/lib/shared/i18n.ts +13 -34
- package/lib/shared/index.ts +4 -0
- package/lib/shared/inlineSvgStyleRules.ts +2 -4
- package/lib/shared/interactiveStyleMappings.test.ts +11 -33
- package/lib/shared/interactiveStyleMappings.ts +9 -16
- package/lib/shared/interactiveStyles.test.ts +165 -188
- package/lib/shared/interfaces/contentProvider.ts +1 -1
- package/lib/shared/itemTemplateUtils.test.ts +6 -12
- package/lib/shared/itemTemplateUtils.ts +19 -35
- package/lib/shared/jsonRepair.ts +8 -2
- package/lib/shared/libraryLoader.test.ts +15 -49
- package/lib/shared/libraryLoader.ts +7 -22
- package/lib/shared/netlifyLocale404.test.ts +179 -0
- package/lib/shared/netlifyLocale404.ts +110 -0
- package/lib/shared/nodeUtils.test.ts +24 -16
- package/lib/shared/nodeUtils.ts +49 -19
- package/lib/shared/pathArrayUtils.test.ts +1 -2
- package/lib/shared/pathArrayUtils.ts +1 -1
- package/lib/shared/pathSecurity.ts +1 -1
- package/lib/shared/pathUtils.test.ts +4 -6
- package/lib/shared/pathUtils.ts +42 -48
- package/lib/shared/paths/Path.test.ts +2 -2
- package/lib/shared/paths/Path.ts +0 -1
- package/lib/shared/paths/PathConverter.test.ts +1 -1
- package/lib/shared/paths/PathConverter.ts +14 -17
- package/lib/shared/paths/PathUtils.ts +9 -10
- package/lib/shared/paths/PathValidator.test.ts +2 -15
- package/lib/shared/paths/PathValidator.ts +11 -9
- package/lib/shared/paths/index.ts +1 -2
- package/lib/shared/propResolver.test.ts +240 -244
- package/lib/shared/propResolver.ts +14 -25
- package/lib/shared/pxToRem.test.ts +7 -6
- package/lib/shared/pxToRem.ts +2 -5
- package/lib/shared/registry/BaseNodeTypeRegistry.test.ts +9 -5
- package/lib/shared/registry/ClientRegistry.ts +0 -1
- package/lib/shared/registry/ComponentRegistry.test.ts +43 -29
- package/lib/shared/registry/ComponentRegistry.ts +9 -11
- package/lib/shared/registry/NodeTypeDefinition.ts +15 -8
- package/lib/shared/registry/RegistryManager.ts +1 -2
- package/lib/shared/registry/SSRRegistry.ts +0 -1
- package/lib/shared/registry/createNodeType.ts +7 -9
- package/lib/shared/registry/defineNodeType.ts +2 -6
- package/lib/shared/registry/index.ts +0 -1
- package/lib/shared/registry/nodeTypes/ComponentInstanceNodeType.ts +14 -15
- package/lib/shared/registry/nodeTypes/EmbedNodeType.ts +18 -11
- package/lib/shared/registry/nodeTypes/HtmlNodeType.ts +47 -18
- package/lib/shared/registry/nodeTypes/LinkNodeType.ts +21 -19
- package/lib/shared/registry/nodeTypes/ListNodeType.ts +78 -74
- package/lib/shared/registry/nodeTypes/LocaleListNodeType.ts +27 -21
- package/lib/shared/registry/nodeTypes/SlotMarkerType.ts +6 -7
- package/lib/shared/registry/nodeTypes/index.ts +10 -2
- package/lib/shared/responsiveScaling.test.ts +15 -31
- package/lib/shared/responsiveScaling.ts +55 -37
- package/lib/shared/responsiveStyleUtils.ts +11 -13
- package/lib/shared/richtext/htmlToTiptap.test.ts +23 -14
- package/lib/shared/richtext/htmlToTiptap.ts +1 -3
- package/lib/shared/richtext/tiptapToHtml.test.ts +5 -6
- package/lib/shared/richtext/types.ts +1 -8
- package/lib/shared/slugTranslator.test.ts +13 -13
- package/lib/shared/slugTranslator.ts +12 -16
- package/lib/shared/slugify.ts +9 -15
- package/lib/shared/styleNodeUtils.test.ts +8 -8
- package/lib/shared/styleNodeUtils.ts +5 -10
- package/lib/shared/styleUtils.test.ts +87 -61
- package/lib/shared/styleUtils.ts +5 -6
- package/lib/shared/themeDefaults.test.ts +11 -11
- package/lib/shared/themeDefaults.ts +3 -4
- package/lib/shared/tree/PathBuilder.test.ts +62 -138
- package/lib/shared/tree/PathBuilder.ts +49 -39
- package/lib/shared/treePathUtils.test.ts +2 -10
- package/lib/shared/treePathUtils.ts +54 -59
- package/lib/shared/types/api.ts +1 -2
- package/lib/shared/types/cms.ts +25 -21
- package/lib/shared/types/comment.ts +49 -16
- package/lib/shared/types/components.ts +27 -25
- package/lib/shared/types/errors.test.ts +1 -6
- package/lib/shared/types/errors.ts +3 -7
- package/lib/shared/types/experiments.ts +28 -28
- package/lib/shared/types/index.ts +2 -2
- package/lib/shared/types/styles.ts +0 -1
- package/lib/shared/types/variables.test.ts +4 -13
- package/lib/shared/types/variables.ts +48 -27
- package/lib/shared/types.ts +1 -2
- package/lib/shared/utilityClassConfig.ts +648 -321
- package/lib/shared/utilityClassMapper.test.ts +203 -92
- package/lib/shared/utilityClassMapper.ts +188 -246
- package/lib/shared/utilityClassNames.ts +326 -0
- package/lib/shared/utils.test.ts +2 -10
- package/lib/shared/utils.ts +19 -10
- package/lib/shared/validation/cmsValidators.ts +2 -1
- package/lib/shared/validation/commentValidators.test.ts +53 -0
- package/lib/shared/validation/commentValidators.ts +12 -1
- package/lib/shared/validation/propValidator.test.ts +18 -20
- package/lib/shared/validation/propValidator.ts +12 -17
- package/lib/shared/validation/schemas.test.ts +24 -33
- package/lib/shared/validation/schemas.ts +469 -344
- package/lib/shared/validation/validators.test.ts +1 -6
- package/lib/shared/validation/validators.ts +89 -68
- package/lib/shared/viewportUnits.integration.test.ts +14 -10
- package/lib/shared/viewportUnits.test.ts +11 -23
- package/lib/test-utils/dom-setup.ts +1 -1
- package/lib/test-utils/factories/ConsoleMockFactory.ts +3 -7
- package/lib/test-utils/factories/DomMockFactory.ts +7 -19
- package/lib/test-utils/factories/EventMockFactory.ts +7 -13
- package/lib/test-utils/factories/FetchMockFactory.ts +39 -57
- package/lib/test-utils/factories/ServerMockFactory.ts +5 -9
- package/lib/test-utils/factories/StoreMockFactory.ts +14 -25
- package/lib/test-utils/fixtures.ts +45 -45
- package/lib/test-utils/helpers/asyncHelpers.test.ts +15 -18
- package/lib/test-utils/helpers/asyncHelpers.ts +11 -20
- package/lib/test-utils/helpers.ts +1 -5
- package/lib/test-utils/index.ts +0 -4
- package/lib/test-utils/mockFactories.ts +12 -18
- package/lib/test-utils/mocks.ts +4 -2
- package/package.json +1 -1
- package/scripts/build-meno-filter.ts +1 -4
- package/vite.config.ts +4 -4
- package/dist/chunks/chunk-2MHDV5BF.js.map +0 -7
- package/dist/chunks/chunk-AZQYF6KE.js.map +0 -7
- package/dist/chunks/chunk-GZHGVVW3.js.map +0 -7
- package/dist/chunks/chunk-H3GJ4H2U.js.map +0 -7
- package/dist/chunks/chunk-I7YIGZXT.js.map +0 -7
- package/dist/chunks/chunk-IGYR22T6.js.map +0 -7
- package/dist/chunks/chunk-JGP5A3Y5.js.map +0 -7
- package/dist/chunks/chunk-JGWFTO6P.js.map +0 -7
- package/dist/chunks/chunk-O3NAGJP4.js.map +0 -7
- package/dist/chunks/chunk-QB2LNO4W.js.map +0 -7
- package/dist/chunks/chunk-R6XHAFBF.js.map +0 -7
- package/dist/chunks/chunk-UB44F4Z2.js.map +0 -7
- package/dist/chunks/chunk-WQFG7PAH.js.map +0 -7
- package/dist/chunks/chunk-X754AHS5.js.map +0 -7
- package/dist/chunks/chunk-YBLHKYFF.js.map +0 -7
- package/dist/chunks/configService-R3OGU2UD.js +0 -13
- /package/dist/chunks/{configService-R3OGU2UD.js.map → configService-PRJZF7Y6.js.map} +0 -0
- /package/dist/chunks/{constants-STK2YBIW.js.map → constants-KIQEYMAM.js.map} +0 -0
- /package/dist/chunks/{fs-JGINUXGL.js.map → fs-ZI5JEU7V.js.map} +0 -0
|
@@ -32,11 +32,7 @@ describe('PathBuilder - post-slot element path calculation', () => {
|
|
|
32
32
|
// Component structure: Header (0), Slot (1), Footer (2)
|
|
33
33
|
const componentStructure = {
|
|
34
34
|
tag: 'div',
|
|
35
|
-
children: [
|
|
36
|
-
{ tag: 'header', children: 'Header' },
|
|
37
|
-
{ type: 'slot' },
|
|
38
|
-
{ tag: 'footer', children: 'Footer' },
|
|
39
|
-
],
|
|
35
|
+
children: [{ tag: 'header', children: 'Header' }, { type: 'slot' }, { tag: 'footer', children: 'Footer' }],
|
|
40
36
|
};
|
|
41
37
|
|
|
42
38
|
// Editing component with 3 children in the slot
|
|
@@ -55,13 +51,11 @@ describe('PathBuilder - post-slot element path calculation', () => {
|
|
|
55
51
|
const paths = buildTreePathsWithRendered(
|
|
56
52
|
wrapAsComponentData(componentStructure),
|
|
57
53
|
undefined, // no registry needed for this test
|
|
58
|
-
navigationHistory
|
|
54
|
+
navigationHistory,
|
|
59
55
|
);
|
|
60
56
|
|
|
61
57
|
// Find footer path (logical [0, 2])
|
|
62
|
-
const footerPathData = paths.find(
|
|
63
|
-
(p) => p.path.length === 2 && p.path[0] === 0 && p.path[1] === 2
|
|
64
|
-
);
|
|
58
|
+
const footerPathData = paths.find((p) => p.path.length === 2 && p.path[0] === 0 && p.path[1] === 2);
|
|
65
59
|
|
|
66
60
|
expect(footerPathData).toBeDefined();
|
|
67
61
|
// Footer should be at rendered [0, 4] because:
|
|
@@ -73,11 +67,7 @@ describe('PathBuilder - post-slot element path calculation', () => {
|
|
|
73
67
|
it('should not offset pre-slot elements', () => {
|
|
74
68
|
const componentStructure = {
|
|
75
69
|
tag: 'div',
|
|
76
|
-
children: [
|
|
77
|
-
{ tag: 'header', children: 'Header' },
|
|
78
|
-
{ type: 'slot' },
|
|
79
|
-
{ tag: 'footer', children: 'Footer' },
|
|
80
|
-
],
|
|
70
|
+
children: [{ tag: 'header', children: 'Header' }, { type: 'slot' }, { tag: 'footer', children: 'Footer' }],
|
|
81
71
|
};
|
|
82
72
|
|
|
83
73
|
const navigationHistory: NavigationContext[] = [
|
|
@@ -91,16 +81,10 @@ describe('PathBuilder - post-slot element path calculation', () => {
|
|
|
91
81
|
},
|
|
92
82
|
];
|
|
93
83
|
|
|
94
|
-
const paths = buildTreePathsWithRendered(
|
|
95
|
-
wrapAsComponentData(componentStructure),
|
|
96
|
-
undefined,
|
|
97
|
-
navigationHistory
|
|
98
|
-
);
|
|
84
|
+
const paths = buildTreePathsWithRendered(wrapAsComponentData(componentStructure), undefined, navigationHistory);
|
|
99
85
|
|
|
100
86
|
// Find header path (logical [0, 0])
|
|
101
|
-
const headerPathData = paths.find(
|
|
102
|
-
(p) => p.path.length === 2 && p.path[0] === 0 && p.path[1] === 0
|
|
103
|
-
);
|
|
87
|
+
const headerPathData = paths.find((p) => p.path.length === 2 && p.path[0] === 0 && p.path[1] === 0);
|
|
104
88
|
|
|
105
89
|
expect(headerPathData).toBeDefined();
|
|
106
90
|
// Header should stay at rendered [0, 0] - no offset for pre-slot elements
|
|
@@ -110,11 +94,7 @@ describe('PathBuilder - post-slot element path calculation', () => {
|
|
|
110
94
|
it('should handle empty slot (no offset needed)', () => {
|
|
111
95
|
const componentStructure = {
|
|
112
96
|
tag: 'div',
|
|
113
|
-
children: [
|
|
114
|
-
{ tag: 'header', children: 'Header' },
|
|
115
|
-
{ type: 'slot' },
|
|
116
|
-
{ tag: 'footer', children: 'Footer' },
|
|
117
|
-
],
|
|
97
|
+
children: [{ tag: 'header', children: 'Header' }, { type: 'slot' }, { tag: 'footer', children: 'Footer' }],
|
|
118
98
|
};
|
|
119
99
|
|
|
120
100
|
const navigationHistory: NavigationContext[] = [
|
|
@@ -125,16 +105,10 @@ describe('PathBuilder - post-slot element path calculation', () => {
|
|
|
125
105
|
},
|
|
126
106
|
];
|
|
127
107
|
|
|
128
|
-
const paths = buildTreePathsWithRendered(
|
|
129
|
-
wrapAsComponentData(componentStructure),
|
|
130
|
-
undefined,
|
|
131
|
-
navigationHistory
|
|
132
|
-
);
|
|
108
|
+
const paths = buildTreePathsWithRendered(wrapAsComponentData(componentStructure), undefined, navigationHistory);
|
|
133
109
|
|
|
134
110
|
// Find footer path (logical [0, 2])
|
|
135
|
-
const footerPathData = paths.find(
|
|
136
|
-
(p) => p.path.length === 2 && p.path[0] === 0 && p.path[1] === 2
|
|
137
|
-
);
|
|
111
|
+
const footerPathData = paths.find((p) => p.path.length === 2 && p.path[0] === 0 && p.path[1] === 2);
|
|
138
112
|
|
|
139
113
|
expect(footerPathData).toBeDefined();
|
|
140
114
|
// With empty slot, footer stays at rendered [0, 2] (no offset)
|
|
@@ -155,7 +129,7 @@ describe('PathBuilder - post-slot element path calculation', () => {
|
|
|
155
129
|
{ type: 'component', component: 'Section' }, // 1
|
|
156
130
|
{ type: 'component', component: 'Section' }, // 2
|
|
157
131
|
{ type: 'component', component: 'Section' }, // 3
|
|
158
|
-
{ type: 'slot' },
|
|
132
|
+
{ type: 'slot' }, // 4 - CaseStudyLayout's slot
|
|
159
133
|
{ type: 'component', component: 'CtaSection' }, // 5 - after slot
|
|
160
134
|
],
|
|
161
135
|
};
|
|
@@ -163,23 +137,26 @@ describe('PathBuilder - post-slot element path calculation', () => {
|
|
|
163
137
|
// Mock registry with Layout structure
|
|
164
138
|
// Layout has slot at [0, 1, 0] (div → main → slot)
|
|
165
139
|
const mockRegistry = new Map([
|
|
166
|
-
[
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
140
|
+
[
|
|
141
|
+
'Layout',
|
|
142
|
+
{
|
|
143
|
+
component: {
|
|
144
|
+
structure: {
|
|
145
|
+
tag: 'div',
|
|
146
|
+
children: [
|
|
147
|
+
{ component: 'Navigation' }, // 0
|
|
148
|
+
{
|
|
149
|
+
tag: 'main',
|
|
150
|
+
children: [
|
|
151
|
+
{ type: 'slot' }, // slot at index 0 within main
|
|
152
|
+
],
|
|
153
|
+
}, // 1
|
|
154
|
+
{ component: 'Footer' }, // 2
|
|
155
|
+
],
|
|
156
|
+
},
|
|
180
157
|
},
|
|
181
158
|
},
|
|
182
|
-
|
|
159
|
+
],
|
|
183
160
|
]);
|
|
184
161
|
|
|
185
162
|
// Editing CaseStudyLayout from a page that passes 1 child to slot
|
|
@@ -187,22 +164,18 @@ describe('PathBuilder - post-slot element path calculation', () => {
|
|
|
187
164
|
{
|
|
188
165
|
componentInstancePath: [0],
|
|
189
166
|
componentInstanceRenderedPath: [0],
|
|
190
|
-
instanceChildren: [
|
|
191
|
-
{ component: 'Section', children: 'Instance content' },
|
|
192
|
-
] as any, // 1 child passed to CaseStudyLayout's slot
|
|
167
|
+
instanceChildren: [{ component: 'Section', children: 'Instance content' }] as any, // 1 child passed to CaseStudyLayout's slot
|
|
193
168
|
},
|
|
194
169
|
];
|
|
195
170
|
|
|
196
171
|
const paths = buildTreePathsWithRendered(
|
|
197
172
|
wrapAsComponentData(componentStructure),
|
|
198
173
|
mockRegistry,
|
|
199
|
-
navigationHistory
|
|
174
|
+
navigationHistory,
|
|
200
175
|
);
|
|
201
176
|
|
|
202
177
|
// Find CtaSection path (logical [0, 5])
|
|
203
|
-
const ctaSectionPathData = paths.find(
|
|
204
|
-
(p) => p.path.length === 2 && p.path[0] === 0 && p.path[1] === 5
|
|
205
|
-
);
|
|
178
|
+
const ctaSectionPathData = paths.find((p) => p.path.length === 2 && p.path[0] === 0 && p.path[1] === 5);
|
|
206
179
|
|
|
207
180
|
expect(ctaSectionPathData).toBeDefined();
|
|
208
181
|
|
|
@@ -222,22 +195,25 @@ describe('PathBuilder - post-slot element path calculation', () => {
|
|
|
222
195
|
component: 'Layout',
|
|
223
196
|
children: [
|
|
224
197
|
{ type: 'component', component: 'Section' }, // 0
|
|
225
|
-
{ type: 'slot' },
|
|
198
|
+
{ type: 'slot' }, // 1 - slot
|
|
226
199
|
{ type: 'component', component: 'CtaSection' }, // 2 - after slot
|
|
227
200
|
],
|
|
228
201
|
};
|
|
229
202
|
|
|
230
203
|
const mockRegistry = new Map([
|
|
231
|
-
[
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
204
|
+
[
|
|
205
|
+
'Layout',
|
|
206
|
+
{
|
|
207
|
+
component: {
|
|
208
|
+
structure: {
|
|
209
|
+
tag: 'div',
|
|
210
|
+
children: [
|
|
211
|
+
{ type: 'slot' }, // Layout's slot at [0, 0]
|
|
212
|
+
],
|
|
213
|
+
},
|
|
238
214
|
},
|
|
239
215
|
},
|
|
240
|
-
|
|
216
|
+
],
|
|
241
217
|
]);
|
|
242
218
|
|
|
243
219
|
// 3 children passed to slot
|
|
@@ -245,24 +221,18 @@ describe('PathBuilder - post-slot element path calculation', () => {
|
|
|
245
221
|
{
|
|
246
222
|
componentInstancePath: [0],
|
|
247
223
|
componentInstanceRenderedPath: [0],
|
|
248
|
-
instanceChildren: [
|
|
249
|
-
{ tag: 'p' },
|
|
250
|
-
{ tag: 'p' },
|
|
251
|
-
{ tag: 'p' },
|
|
252
|
-
] as any,
|
|
224
|
+
instanceChildren: [{ tag: 'p' }, { tag: 'p' }, { tag: 'p' }] as any,
|
|
253
225
|
},
|
|
254
226
|
];
|
|
255
227
|
|
|
256
228
|
const paths = buildTreePathsWithRendered(
|
|
257
229
|
wrapAsComponentData(componentStructure),
|
|
258
230
|
mockRegistry,
|
|
259
|
-
navigationHistory
|
|
231
|
+
navigationHistory,
|
|
260
232
|
);
|
|
261
233
|
|
|
262
234
|
// Find CtaSection path (logical [0, 2])
|
|
263
|
-
const ctaSectionPathData = paths.find(
|
|
264
|
-
(p) => p.path.length === 2 && p.path[0] === 0 && p.path[1] === 2
|
|
265
|
-
);
|
|
235
|
+
const ctaSectionPathData = paths.find((p) => p.path.length === 2 && p.path[0] === 0 && p.path[1] === 2);
|
|
266
236
|
|
|
267
237
|
expect(ctaSectionPathData).toBeDefined();
|
|
268
238
|
|
|
@@ -284,11 +254,7 @@ describe('PathBuilder - post-slot element path calculation', () => {
|
|
|
284
254
|
// Card structure: Header (0), Slot (1), Footer (2)
|
|
285
255
|
const cardStructure = {
|
|
286
256
|
tag: 'div',
|
|
287
|
-
children: [
|
|
288
|
-
{ tag: 'div', children: 'Card Header' },
|
|
289
|
-
{ type: 'slot' },
|
|
290
|
-
{ tag: 'div', children: 'Card Footer' },
|
|
291
|
-
],
|
|
257
|
+
children: [{ tag: 'div', children: 'Card Header' }, { type: 'slot' }, { tag: 'div', children: 'Card Footer' }],
|
|
292
258
|
};
|
|
293
259
|
|
|
294
260
|
// Navigation history: first entered Section, then Card
|
|
@@ -316,16 +282,10 @@ describe('PathBuilder - post-slot element path calculation', () => {
|
|
|
316
282
|
},
|
|
317
283
|
];
|
|
318
284
|
|
|
319
|
-
const paths = buildTreePathsWithRendered(
|
|
320
|
-
wrapAsComponentData(cardStructure),
|
|
321
|
-
undefined,
|
|
322
|
-
navigationHistory
|
|
323
|
-
);
|
|
285
|
+
const paths = buildTreePathsWithRendered(wrapAsComponentData(cardStructure), undefined, navigationHistory);
|
|
324
286
|
|
|
325
287
|
// Find Card's footer (logical [0, 2])
|
|
326
|
-
const footerPathData = paths.find(
|
|
327
|
-
(p) => p.path.length === 2 && p.path[0] === 0 && p.path[1] === 2
|
|
328
|
-
);
|
|
288
|
+
const footerPathData = paths.find((p) => p.path.length === 2 && p.path[0] === 0 && p.path[1] === 2);
|
|
329
289
|
|
|
330
290
|
expect(footerPathData).toBeDefined();
|
|
331
291
|
|
|
@@ -342,11 +302,7 @@ describe('PathBuilder - post-slot element path calculation', () => {
|
|
|
342
302
|
|
|
343
303
|
const componentC = {
|
|
344
304
|
tag: 'div',
|
|
345
|
-
children: [
|
|
346
|
-
{ tag: 'span', children: 'C Header' },
|
|
347
|
-
{ type: 'slot' },
|
|
348
|
-
{ tag: 'span', children: 'C Footer' },
|
|
349
|
-
],
|
|
305
|
+
children: [{ tag: 'span', children: 'C Header' }, { type: 'slot' }, { tag: 'span', children: 'C Footer' }],
|
|
350
306
|
};
|
|
351
307
|
|
|
352
308
|
// Each componentInstancePath is relative to the current view:
|
|
@@ -368,25 +324,14 @@ describe('PathBuilder - post-slot element path calculation', () => {
|
|
|
368
324
|
{
|
|
369
325
|
componentInstancePath: [0, 0], // C is first child in B's slot
|
|
370
326
|
componentInstanceRenderedPath: [0, 0],
|
|
371
|
-
instanceChildren: [
|
|
372
|
-
{ tag: 'div' },
|
|
373
|
-
{ tag: 'div' },
|
|
374
|
-
{ tag: 'div' },
|
|
375
|
-
{ tag: 'div' },
|
|
376
|
-
] as any, // C has 4 children
|
|
327
|
+
instanceChildren: [{ tag: 'div' }, { tag: 'div' }, { tag: 'div' }, { tag: 'div' }] as any, // C has 4 children
|
|
377
328
|
},
|
|
378
329
|
];
|
|
379
330
|
|
|
380
|
-
const paths = buildTreePathsWithRendered(
|
|
381
|
-
wrapAsComponentData(componentC),
|
|
382
|
-
undefined,
|
|
383
|
-
navigationHistory
|
|
384
|
-
);
|
|
331
|
+
const paths = buildTreePathsWithRendered(wrapAsComponentData(componentC), undefined, navigationHistory);
|
|
385
332
|
|
|
386
333
|
// Find C's footer (logical [0, 2])
|
|
387
|
-
const footerPathData = paths.find(
|
|
388
|
-
(p) => p.path.length === 2 && p.path[0] === 0 && p.path[1] === 2
|
|
389
|
-
);
|
|
334
|
+
const footerPathData = paths.find((p) => p.path.length === 2 && p.path[0] === 0 && p.path[1] === 2);
|
|
390
335
|
|
|
391
336
|
expect(footerPathData).toBeDefined();
|
|
392
337
|
|
|
@@ -406,15 +351,11 @@ describe('computeCumulativeInstancePath', () => {
|
|
|
406
351
|
});
|
|
407
352
|
|
|
408
353
|
it('returns the first entry path verbatim when there is one entry', () => {
|
|
354
|
+
expect(computeCumulativeInstancePath([{ componentInstancePath: [0], componentInstanceRenderedPath: [0] }])).toEqual(
|
|
355
|
+
[0],
|
|
356
|
+
);
|
|
409
357
|
expect(
|
|
410
|
-
computeCumulativeInstancePath([
|
|
411
|
-
{ componentInstancePath: [0], componentInstanceRenderedPath: [0] },
|
|
412
|
-
]),
|
|
413
|
-
).toEqual([0]);
|
|
414
|
-
expect(
|
|
415
|
-
computeCumulativeInstancePath([
|
|
416
|
-
{ componentInstancePath: [0, 2], componentInstanceRenderedPath: [0, 2] },
|
|
417
|
-
]),
|
|
358
|
+
computeCumulativeInstancePath([{ componentInstancePath: [0, 2], componentInstanceRenderedPath: [0, 2] }]),
|
|
418
359
|
).toEqual([0, 2]);
|
|
419
360
|
});
|
|
420
361
|
|
|
@@ -436,10 +377,7 @@ describe('computeCumulativeInstancePath', () => {
|
|
|
436
377
|
|
|
437
378
|
it('falls back to componentInstancePath when componentInstanceRenderedPath is missing', () => {
|
|
438
379
|
expect(
|
|
439
|
-
computeCumulativeInstancePath([
|
|
440
|
-
{ componentInstancePath: [0, 2] },
|
|
441
|
-
{ componentInstancePath: [0, 1] },
|
|
442
|
-
]),
|
|
380
|
+
computeCumulativeInstancePath([{ componentInstancePath: [0, 2] }, { componentInstancePath: [0, 1] }]),
|
|
443
381
|
).toEqual([0, 2, 1]);
|
|
444
382
|
});
|
|
445
383
|
});
|
|
@@ -467,16 +405,10 @@ describe('slotRenderedPaths on slot entries', () => {
|
|
|
467
405
|
},
|
|
468
406
|
];
|
|
469
407
|
|
|
470
|
-
const paths = buildTreePathsWithRendered(
|
|
471
|
-
wrapAsComponentData(layoutStructure),
|
|
472
|
-
undefined,
|
|
473
|
-
navigationHistory,
|
|
474
|
-
);
|
|
408
|
+
const paths = buildTreePathsWithRendered(wrapAsComponentData(layoutStructure), undefined, navigationHistory);
|
|
475
409
|
|
|
476
410
|
// Slot's logical path is [0, 1] (second child of structure root).
|
|
477
|
-
const slotEntry = paths.find(
|
|
478
|
-
(p) => p.path.length === 2 && p.path[0] === 0 && p.path[1] === 1,
|
|
479
|
-
);
|
|
411
|
+
const slotEntry = paths.find((p) => p.path.length === 2 && p.path[0] === 0 && p.path[1] === 1);
|
|
480
412
|
expect(slotEntry).toBeDefined();
|
|
481
413
|
expect(slotEntry!.renderedPath).toEqual([0, 1]);
|
|
482
414
|
// With 7 instance children, the slot occupies positions 1..7 under the
|
|
@@ -503,16 +435,8 @@ describe('slotRenderedPaths on slot entries', () => {
|
|
|
503
435
|
instanceChildren: [{ type: 'component' as const, component: 'Only' }] as any,
|
|
504
436
|
},
|
|
505
437
|
];
|
|
506
|
-
const noChildrenPaths = buildTreePathsWithRendered(
|
|
507
|
-
|
|
508
|
-
undefined,
|
|
509
|
-
noChildren,
|
|
510
|
-
);
|
|
511
|
-
const oneChildPaths = buildTreePathsWithRendered(
|
|
512
|
-
wrapAsComponentData(layoutStructure),
|
|
513
|
-
undefined,
|
|
514
|
-
oneChild,
|
|
515
|
-
);
|
|
438
|
+
const noChildrenPaths = buildTreePathsWithRendered(wrapAsComponentData(layoutStructure), undefined, noChildren);
|
|
439
|
+
const oneChildPaths = buildTreePathsWithRendered(wrapAsComponentData(layoutStructure), undefined, oneChild);
|
|
516
440
|
|
|
517
441
|
const slotEntryNo = noChildrenPaths.find((p) => p.path.length === 2 && p.path[1] === 1);
|
|
518
442
|
const slotEntryOne = oneChildPaths.find((p) => p.path.length === 2 && p.path[1] === 1);
|
|
@@ -16,8 +16,8 @@ import { isComponentNode, isSlotMarker, isLocaleListNode, isCMSListNode, isListN
|
|
|
16
16
|
* Node path data containing both logical and rendered paths
|
|
17
17
|
*/
|
|
18
18
|
export interface NodePathData {
|
|
19
|
-
path: Path;
|
|
20
|
-
renderedPath: Path;
|
|
19
|
+
path: Path; // Logical path in data structure
|
|
20
|
+
renderedPath: Path; // Path adjusted for component structure wrapping
|
|
21
21
|
/**
|
|
22
22
|
* For slot markers being edited from inside their host component: the
|
|
23
23
|
* page-absolute rendered paths of every DOM position the slot occupies
|
|
@@ -50,6 +50,9 @@ function findSlotMarkerPath(structure: any, currentPath: Path = [0]): Path | nul
|
|
|
50
50
|
for (let i = 0; i < structure.children.length; i++) {
|
|
51
51
|
const child = structure.children[i];
|
|
52
52
|
|
|
53
|
+
// Text children can't be (or contain) slot markers
|
|
54
|
+
if (typeof child === 'string') continue;
|
|
55
|
+
|
|
53
56
|
if (isSlotMarker(child)) {
|
|
54
57
|
return [...currentPath, i];
|
|
55
58
|
}
|
|
@@ -86,7 +89,7 @@ function calculateRenderedPath(
|
|
|
86
89
|
logicalPath: Path,
|
|
87
90
|
currentNode: any,
|
|
88
91
|
globalComponentRegistry: any,
|
|
89
|
-
navigationHistory?: NavigationContext[]
|
|
92
|
+
navigationHistory?: NavigationContext[],
|
|
90
93
|
): Path {
|
|
91
94
|
if (!currentNode || logicalPath.length === 0) {
|
|
92
95
|
return logicalPath;
|
|
@@ -135,7 +138,7 @@ function calculateRenderedPath(
|
|
|
135
138
|
// Build rendered path incrementally by walking through the logical path
|
|
136
139
|
// and checking if each parent is a component with a nested slot
|
|
137
140
|
let renderedPath: Path = [0];
|
|
138
|
-
let node = currentNode;
|
|
141
|
+
let node: ComponentNode | null | undefined = currentNode;
|
|
139
142
|
|
|
140
143
|
for (let i = 1; i < logicalPath.length; i++) {
|
|
141
144
|
let childIndex = logicalPath[i];
|
|
@@ -181,7 +184,9 @@ function calculateRenderedPath(
|
|
|
181
184
|
renderedPath = [...renderedPath, childIndex];
|
|
182
185
|
}
|
|
183
186
|
|
|
184
|
-
|
|
187
|
+
// Text children have no children of their own — the next iteration's
|
|
188
|
+
// hasChildren() check breaks out, same as before, but keep `node` typed.
|
|
189
|
+
node = typeof childNode === 'string' ? undefined : childNode;
|
|
185
190
|
}
|
|
186
191
|
|
|
187
192
|
return renderedPath;
|
|
@@ -197,16 +202,16 @@ function calculateRenderedPath(
|
|
|
197
202
|
* CMS item context for elements inside CMS List(s)
|
|
198
203
|
*/
|
|
199
204
|
export interface CMSItemContext {
|
|
200
|
-
itemIndexPath: number[];
|
|
201
|
-
listPaths: Path[];
|
|
205
|
+
itemIndexPath: number[]; // e.g., [0] for single list, [0, 2] for nested
|
|
206
|
+
listPaths: Path[]; // Parallel array of list node paths
|
|
202
207
|
}
|
|
203
208
|
|
|
204
209
|
export interface NavigationContext {
|
|
205
|
-
file?: any;
|
|
210
|
+
file?: any; // FileItem - optional as not all contexts have file
|
|
206
211
|
componentInstancePath: Path | null;
|
|
207
|
-
componentInstanceRenderedPath?: Path | null;
|
|
208
|
-
instanceChildren?: Array<ComponentNode | string>;
|
|
209
|
-
cmsItemContext?: CMSItemContext | null;
|
|
212
|
+
componentInstanceRenderedPath?: Path | null; // Rendered path for accurate DOM queries
|
|
213
|
+
instanceChildren?: Array<ComponentNode | string>; // Children of the component instance (for path offset calculation)
|
|
214
|
+
cmsItemContext?: CMSItemContext | null; // CMS context when editing component inside CMS List
|
|
210
215
|
}
|
|
211
216
|
|
|
212
217
|
/**
|
|
@@ -218,16 +223,13 @@ export interface NavigationContext {
|
|
|
218
223
|
* buildTreePathsWithRendered prepends, and to know how many leading elements
|
|
219
224
|
* to strip when extracting a component-internal path back out.
|
|
220
225
|
*/
|
|
221
|
-
export function computeCumulativeInstancePath(
|
|
222
|
-
navigationHistory: NavigationContext[] | undefined,
|
|
223
|
-
): Path | null {
|
|
226
|
+
export function computeCumulativeInstancePath(navigationHistory: NavigationContext[] | undefined): Path | null {
|
|
224
227
|
if (!navigationHistory || navigationHistory.length === 0) return null;
|
|
225
228
|
let cumulative: Path | null =
|
|
226
229
|
navigationHistory[0].componentInstanceRenderedPath ?? navigationHistory[0].componentInstancePath;
|
|
227
230
|
if (!cumulative) return null;
|
|
228
231
|
for (let i = 1; i < navigationHistory.length; i++) {
|
|
229
|
-
const next =
|
|
230
|
-
navigationHistory[i].componentInstanceRenderedPath ?? navigationHistory[i].componentInstancePath;
|
|
232
|
+
const next = navigationHistory[i].componentInstanceRenderedPath ?? navigationHistory[i].componentInstancePath;
|
|
231
233
|
if (next) {
|
|
232
234
|
cumulative = [...cumulative, ...next.slice(1)];
|
|
233
235
|
}
|
|
@@ -264,7 +266,7 @@ export function computeCumulativeInstancePath(
|
|
|
264
266
|
export function buildTreePathsWithRendered(
|
|
265
267
|
pageData: PageData,
|
|
266
268
|
globalComponentRegistry?: any,
|
|
267
|
-
navigationHistory?: NavigationContext[]
|
|
269
|
+
navigationHistory?: NavigationContext[],
|
|
268
270
|
): NodePathData[] {
|
|
269
271
|
const rootData = getRootData(pageData);
|
|
270
272
|
if (!rootData) return [];
|
|
@@ -281,9 +283,9 @@ export function buildTreePathsWithRendered(
|
|
|
281
283
|
// post-slot offset (the LAST navigation entry's instanceChildren).
|
|
282
284
|
const hostInstanceChildrenCount =
|
|
283
285
|
navigationHistory && navigationHistory.length > 0
|
|
284
|
-
?
|
|
285
|
-
|
|
286
|
-
|
|
286
|
+
? Array.isArray(navigationHistory[navigationHistory.length - 1].instanceChildren)
|
|
287
|
+
? navigationHistory[navigationHistory.length - 1].instanceChildren!.length
|
|
288
|
+
: 0
|
|
287
289
|
: 0;
|
|
288
290
|
|
|
289
291
|
function traverse(node: ComponentNode, currentPath: Path = [0]): void {
|
|
@@ -308,8 +310,8 @@ export function buildTreePathsWithRendered(
|
|
|
308
310
|
: undefined;
|
|
309
311
|
|
|
310
312
|
result.push({
|
|
311
|
-
path: currentPath,
|
|
312
|
-
renderedPath: adjustedRenderedPath,
|
|
313
|
+
path: currentPath, // Keep logical path component-relative
|
|
314
|
+
renderedPath: adjustedRenderedPath, // Adjust rendered path for page-relative queries
|
|
313
315
|
...(slotRenderedPaths ? { slotRenderedPaths } : {}),
|
|
314
316
|
});
|
|
315
317
|
|
|
@@ -321,7 +323,15 @@ export function buildTreePathsWithRendered(
|
|
|
321
323
|
if (
|
|
322
324
|
typeof child === 'object' &&
|
|
323
325
|
child !== null &&
|
|
324
|
-
('tag' in child ||
|
|
326
|
+
('tag' in child ||
|
|
327
|
+
'component' in child ||
|
|
328
|
+
'html' in child ||
|
|
329
|
+
'src' in child ||
|
|
330
|
+
'href' in child ||
|
|
331
|
+
isLocaleListNode(child) ||
|
|
332
|
+
isCMSListNode(child) ||
|
|
333
|
+
isListNode(child) ||
|
|
334
|
+
(cumulativeInstancePath && isSlotMarker(child)))
|
|
325
335
|
) {
|
|
326
336
|
const childPath = [...currentPath, index];
|
|
327
337
|
traverse(child as ComponentNode, childPath);
|
|
@@ -365,7 +375,7 @@ function expandSlotRenderedPaths(slotRenderedPath: Path, instanceChildrenCount:
|
|
|
365
375
|
export function buildComponentTreePaths(
|
|
366
376
|
componentStructure: ComponentNode,
|
|
367
377
|
globalComponentRegistry?: any,
|
|
368
|
-
navigationHistory?: NavigationContext[]
|
|
378
|
+
navigationHistory?: NavigationContext[],
|
|
369
379
|
): NodePathData[] {
|
|
370
380
|
const result: NodePathData[] = [];
|
|
371
381
|
|
|
@@ -374,9 +384,9 @@ export function buildComponentTreePaths(
|
|
|
374
384
|
|
|
375
385
|
const hostInstanceChildrenCount =
|
|
376
386
|
navigationHistory && navigationHistory.length > 0
|
|
377
|
-
?
|
|
378
|
-
|
|
379
|
-
|
|
387
|
+
? Array.isArray(navigationHistory[navigationHistory.length - 1].instanceChildren)
|
|
388
|
+
? navigationHistory[navigationHistory.length - 1].instanceChildren!.length
|
|
389
|
+
: 0
|
|
380
390
|
: 0;
|
|
381
391
|
|
|
382
392
|
function traverse(node: ComponentNode, currentPath: Path = [0]): void {
|
|
@@ -409,7 +419,15 @@ export function buildComponentTreePaths(
|
|
|
409
419
|
if (
|
|
410
420
|
typeof child === 'object' &&
|
|
411
421
|
child !== null &&
|
|
412
|
-
('tag' in child ||
|
|
422
|
+
('tag' in child ||
|
|
423
|
+
'component' in child ||
|
|
424
|
+
'html' in child ||
|
|
425
|
+
'src' in child ||
|
|
426
|
+
'href' in child ||
|
|
427
|
+
isLocaleListNode(child) ||
|
|
428
|
+
isCMSListNode(child) ||
|
|
429
|
+
isListNode(child) ||
|
|
430
|
+
isSlotMarker(child))
|
|
413
431
|
) {
|
|
414
432
|
const childPath = [...currentPath, index];
|
|
415
433
|
traverse(child as ComponentNode, childPath);
|
|
@@ -425,24 +443,16 @@ export function buildComponentTreePaths(
|
|
|
425
443
|
/**
|
|
426
444
|
* Find NodePathData by logical path
|
|
427
445
|
*/
|
|
428
|
-
export function findPathData(
|
|
429
|
-
pathsData: NodePathData[],
|
|
430
|
-
searchPath: Path
|
|
431
|
-
): NodePathData | undefined {
|
|
446
|
+
export function findPathData(pathsData: NodePathData[], searchPath: Path): NodePathData | undefined {
|
|
432
447
|
return pathsData.find(
|
|
433
|
-
(item) =>
|
|
434
|
-
item.path.length === searchPath.length &&
|
|
435
|
-
item.path.every((val, idx) => val === searchPath[idx])
|
|
448
|
+
(item) => item.path.length === searchPath.length && item.path.every((val, idx) => val === searchPath[idx]),
|
|
436
449
|
);
|
|
437
450
|
}
|
|
438
451
|
|
|
439
452
|
/**
|
|
440
453
|
* Get all ancestors for a path (including the path itself)
|
|
441
454
|
*/
|
|
442
|
-
export function getPathAncestors(
|
|
443
|
-
pathsData: NodePathData[],
|
|
444
|
-
searchPath: Path
|
|
445
|
-
): NodePathData[] {
|
|
455
|
+
export function getPathAncestors(pathsData: NodePathData[], searchPath: Path): NodePathData[] {
|
|
446
456
|
const ancestors: NodePathData[] = [];
|
|
447
457
|
|
|
448
458
|
for (let i = 1; i <= searchPath.length; i++) {
|
|
@@ -243,11 +243,7 @@ describe('extractStructureWithoutStyles', () => {
|
|
|
243
243
|
});
|
|
244
244
|
|
|
245
245
|
describe('calculateInsertionIndex', () => {
|
|
246
|
-
const mockChildren = [
|
|
247
|
-
createNode({ tag: 'p' }),
|
|
248
|
-
createNode({ tag: 'span' }),
|
|
249
|
-
createNode({ tag: 'div' }),
|
|
250
|
-
];
|
|
246
|
+
const mockChildren = [createNode({ tag: 'p' }), createNode({ tag: 'span' }), createNode({ tag: 'div' })];
|
|
251
247
|
const emptyNodeDataMap = new Map<string, ComponentNode | string>();
|
|
252
248
|
|
|
253
249
|
test('should use childIndex when provided', () => {
|
|
@@ -521,11 +517,7 @@ describe('edge cases', () => {
|
|
|
521
517
|
|
|
522
518
|
test('should handle mixed children (nodes and strings)', () => {
|
|
523
519
|
const pageData = createPageData({
|
|
524
|
-
children: [
|
|
525
|
-
'text before',
|
|
526
|
-
createNode({ tag: 'span' }),
|
|
527
|
-
'text after',
|
|
528
|
-
],
|
|
520
|
+
children: ['text before', createNode({ tag: 'span' }), 'text after'],
|
|
529
521
|
});
|
|
530
522
|
|
|
531
523
|
// Path to span should work
|