meno-core 1.0.53 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +1 -3
- package/bin/cli.ts +66 -261
- package/build-astro.ts +150 -128
- package/dist/bin/cli.js +42 -185
- package/dist/bin/cli.js.map +2 -2
- package/dist/chunks/chunk-2AR55GYH.js +42 -0
- package/dist/chunks/chunk-2AR55GYH.js.map +7 -0
- package/dist/chunks/{chunk-JGWFTO6P.js → chunk-2IIQK7T3.js} +2624 -1389
- package/dist/chunks/chunk-2IIQK7T3.js.map +7 -0
- package/dist/chunks/chunk-4ZRU52J2.js +169 -0
- package/dist/chunks/chunk-4ZRU52J2.js.map +7 -0
- package/dist/chunks/{chunk-UB44F4Z2.js → chunk-5X4HCN7J.js} +5 -7
- package/dist/chunks/chunk-5X4HCN7J.js.map +7 -0
- package/dist/chunks/{chunk-WQFG7PAH.js → chunk-7CCVOL5M.js} +15 -19
- package/dist/chunks/chunk-7CCVOL5M.js.map +7 -0
- package/dist/chunks/{chunk-YBLHKYFF.js → chunk-AR7LHIFY.js} +8 -2
- package/dist/chunks/chunk-AR7LHIFY.js.map +7 -0
- package/dist/chunks/{chunk-O3NAGJP4.js → chunk-NUP7H7D3.js} +135 -41
- package/dist/chunks/chunk-NUP7H7D3.js.map +7 -0
- package/dist/chunks/{chunk-X754AHS5.js → chunk-QWTQZHG3.js} +194 -90
- package/dist/chunks/chunk-QWTQZHG3.js.map +7 -0
- package/dist/chunks/{chunk-H3GJ4H2U.js → chunk-XTKNX4FW.js} +216 -87
- package/dist/chunks/chunk-XTKNX4FW.js.map +7 -0
- package/dist/chunks/{fs-JGINUXGL.js → fs-G3ANWEFP.js} +2 -2
- package/dist/lib/client/index.js +1003 -475
- package/dist/lib/client/index.js.map +3 -3
- package/dist/lib/server/index.js +14393 -6371
- package/dist/lib/server/index.js.map +4 -4
- package/dist/lib/shared/index.js +342 -101
- package/dist/lib/shared/index.js.map +4 -4
- package/dist/lib/shared/richtext/index.js +1 -1
- package/dist/lib/test-utils/index.js +64 -80
- package/dist/lib/test-utils/index.js.map +2 -2
- package/entries/client-router.tsx +10 -8
- package/lib/client/ClientInitializer.ts +8 -8
- package/lib/client/ErrorBoundary.test.tsx +246 -186
- package/lib/client/ErrorBoundary.tsx +183 -132
- package/lib/client/componentRegistry.test.ts +96 -108
- package/lib/client/componentRegistry.ts +1 -3
- package/lib/client/contexts/ThemeContext.tsx +3 -2
- package/lib/client/core/ComponentBuilder.test.ts +663 -560
- package/lib/client/core/ComponentBuilder.ts +427 -155
- package/lib/client/core/ComponentRenderer.test.tsx +2 -4
- package/lib/client/core/ComponentRenderer.tsx +46 -33
- package/lib/client/core/builders/embedBuilder.ts +242 -54
- package/lib/client/core/builders/linkBuilder.ts +72 -45
- package/lib/client/core/builders/linkNodeBuilder.ts +79 -54
- package/lib/client/core/builders/listBuilder.ts +155 -89
- package/lib/client/core/builders/localeListBuilder.ts +97 -62
- package/lib/client/core/builders/types.ts +5 -5
- package/lib/client/core/cmsTemplateProcessor.ts +8 -9
- 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 +47 -30
- package/lib/client/hmrCssReload.ts +49 -14
- package/lib/client/hmrWebSocket.ts +14 -19
- package/lib/client/hooks/useColorVariables.test.ts +21 -21
- package/lib/client/hooks/useColorVariables.ts +23 -18
- package/lib/client/hooks/usePropertyAutocomplete.ts +4 -6
- package/lib/client/hooks/useVariables.ts +6 -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 +47 -49
- package/lib/client/meno-filter/MenoFilter.ts +14 -15
- package/lib/client/meno-filter/bindings.ts +18 -43
- package/lib/client/meno-filter/init.ts +4 -4
- package/lib/client/meno-filter/renderer.ts +30 -32
- package/lib/client/meno-filter/script.generated.ts +1 -3
- package/lib/client/meno-filter/ui.ts +4 -6
- package/lib/client/meno-filter/updates.ts +18 -23
- package/lib/client/meno-filter/utils.ts +1 -1
- package/lib/client/navigation.test.ts +174 -178
- package/lib/client/navigation.ts +0 -1
- package/lib/client/responsiveStyleResolver.knownTokens.test.ts +71 -0
- package/lib/client/responsiveStyleResolver.test.ts +234 -232
- package/lib/client/responsiveStyleResolver.ts +74 -20
- package/lib/client/routing/RouteLoader.test.ts +24 -25
- package/lib/client/routing/RouteLoader.ts +27 -35
- package/lib/client/routing/Router.tsx +210 -153
- package/lib/client/scripts/ScriptExecutor.test.ts +157 -158
- package/lib/client/scripts/ScriptExecutor.ts +18 -36
- package/lib/client/services/PrefetchService.test.ts +3 -3
- package/lib/client/services/PrefetchService.ts +23 -29
- package/lib/client/styleProcessor.test.ts +9 -9
- package/lib/client/styleProcessor.ts +24 -15
- package/lib/client/styles/StyleInjector.test.ts +122 -115
- package/lib/client/styles/StyleInjector.ts +10 -7
- package/lib/client/styles/UtilityClassCollector.ts +62 -28
- package/lib/client/styles/cspNonce.test.ts +2 -5
- package/lib/client/templateEngine.test.ts +554 -488
- package/lib/client/templateEngine.ts +203 -73
- package/lib/client/theme.test.ts +1 -1
- 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 +4 -5
- package/lib/server/__integration__/ssr-rendering.test.ts +47 -37
- package/lib/server/__integration__/static-assets.test.ts +3 -3
- package/lib/server/__integration__/test-helpers.ts +87 -74
- package/lib/server/ab/generateFunctions.ts +12 -10
- package/lib/server/astro/cmsPageEmitter.ts +26 -42
- package/lib/server/astro/componentEmitter.ts +35 -43
- package/lib/server/astro/cssCollector.ts +10 -26
- package/lib/server/astro/nodeToAstro.test.ts +1754 -34
- package/lib/server/astro/nodeToAstro.ts +232 -216
- package/lib/server/astro/normalizeOrphanTemplateProps.test.ts +115 -119
- package/lib/server/astro/normalizeOrphanTemplateProps.ts +11 -18
- 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 +17 -20
- package/lib/server/createServer.ts +7 -19
- package/lib/server/cssGenerator.test.ts +35 -44
- package/lib/server/cssGenerator.ts +8 -19
- package/lib/server/fileWatcher.test.ts +164 -13
- package/lib/server/fileWatcher.ts +209 -124
- package/lib/server/index.ts +14 -17
- package/lib/server/jsonLoader.test.ts +39 -2
- package/lib/server/jsonLoader.ts +39 -34
- package/lib/server/middleware/cors.test.ts +21 -21
- package/lib/server/middleware/cors.ts +28 -4
- package/lib/server/middleware/errorHandler.test.ts +7 -5
- package/lib/server/middleware/errorHandler.ts +3 -8
- package/lib/server/middleware/index.ts +0 -1
- package/lib/server/middleware/logger.test.ts +10 -8
- package/lib/server/middleware/logger.ts +17 -29
- package/lib/server/migrateTemplates.ts +3 -3
- package/lib/server/pageCache.test.ts +76 -77
- package/lib/server/pageCache.ts +0 -1
- package/lib/server/projectContext.ts +5 -4
- package/lib/server/providers/fileSystemCMSProvider.test.ts +142 -99
- package/lib/server/providers/fileSystemCMSProvider.ts +62 -38
- package/lib/server/routes/api/cms.test.ts +26 -14
- package/lib/server/routes/api/cms.ts +9 -14
- package/lib/server/routes/api/colors.test.ts +2 -2
- package/lib/server/routes/api/components.ts +31 -35
- package/lib/server/routes/api/config.ts +3 -4
- package/lib/server/routes/api/core-routes.ts +49 -76
- package/lib/server/routes/api/enums.test.ts +2 -2
- package/lib/server/routes/api/functions.ts +9 -17
- 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 +3 -5
- package/lib/server/routes/api/variables.ts +1 -1
- package/lib/server/routes/index.ts +25 -28
- package/lib/server/routes/pages.ts +35 -31
- package/lib/server/routes/static.ts +17 -6
- package/lib/server/runtime/bundler.ts +98 -61
- package/lib/server/runtime/fs.ts +16 -26
- package/lib/server/runtime/httpServer.ts +8 -12
- package/lib/server/services/ColorService.test.ts +3 -3
- package/lib/server/services/ColorService.ts +37 -29
- package/lib/server/services/EnumService.test.ts +4 -8
- package/lib/server/services/EnumService.ts +11 -3
- package/lib/server/services/VariableService.test.ts +8 -12
- package/lib/server/services/VariableService.ts +11 -3
- package/lib/server/services/cmsService.test.ts +158 -120
- package/lib/server/services/cmsService.ts +36 -146
- package/lib/server/services/componentService.test.ts +125 -45
- package/lib/server/services/componentService.ts +70 -46
- package/lib/server/services/configService.test.ts +22 -45
- package/lib/server/services/configService.ts +50 -27
- package/lib/server/services/fileWatcherService.ts +42 -8
- package/lib/server/services/index.ts +0 -1
- package/lib/server/services/pageService.test.ts +8 -10
- package/lib/server/services/pageService.ts +32 -18
- package/lib/server/ssr/attributeBuilder.ts +18 -8
- package/lib/server/ssr/buildErrorOverlay.ts +11 -12
- package/lib/server/ssr/clientDataInjector.ts +7 -21
- package/lib/server/ssr/cmsSSRProcessor.ts +4 -8
- 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 +9 -14
- package/lib/server/ssr/htmlGenerator.test.ts +120 -44
- package/lib/server/ssr/htmlGenerator.ts +126 -91
- package/lib/server/ssr/imageMetadata.test.ts +3 -1
- package/lib/server/ssr/imageMetadata.ts +27 -21
- package/lib/server/ssr/jsCollector.test.ts +8 -18
- package/lib/server/ssr/jsCollector.ts +3 -8
- package/lib/server/ssr/liveReloadIntegration.test.ts +76 -36
- 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 +316 -256
- package/lib/server/ssr/ssrRenderer.ts +795 -243
- package/lib/server/ssrRenderer.test.ts +1048 -954
- package/lib/server/utils/jsonLineMapper.test.ts +28 -28
- package/lib/server/utils/jsonLineMapper.ts +7 -7
- package/lib/server/validateStyleCoverage.ts +18 -21
- package/lib/server/websocketManager.ts +28 -19
- package/lib/shared/attributeNodeUtils.test.ts +15 -15
- package/lib/shared/attributeNodeUtils.ts +5 -12
- package/lib/shared/breakpoints.test.ts +5 -5
- package/lib/shared/breakpoints.ts +4 -11
- package/lib/shared/cmsQuery.test.ts +81 -0
- package/lib/shared/cmsQuery.ts +92 -0
- package/lib/shared/cmsQueryParser.test.ts +50 -42
- package/lib/shared/cmsQueryParser.ts +60 -38
- package/lib/shared/colorConversions.ts +9 -9
- package/lib/shared/colorVariableUtils.test.ts +27 -5
- package/lib/shared/colorVariableUtils.ts +21 -12
- package/lib/shared/componentRefs.ts +1 -5
- package/lib/shared/constants.test.ts +3 -3
- package/lib/shared/constants.ts +8 -8
- package/lib/shared/cssGeneration.test.ts +285 -144
- package/lib/shared/cssGeneration.ts +217 -531
- package/lib/shared/cssNamedColors.ts +152 -30
- package/lib/shared/cssProperties.test.ts +69 -70
- package/lib/shared/cssProperties.ts +298 -114
- package/lib/shared/elementClassName.test.ts +109 -109
- package/lib/shared/elementClassName.ts +3 -3
- package/lib/shared/elementUtils.ts +12 -16
- package/lib/shared/errorLogger.test.ts +12 -12
- 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 +145 -0
- package/lib/shared/expressionEvaluator.ts +52 -24
- package/lib/shared/fontLoader.test.ts +32 -18
- package/lib/shared/fontLoader.ts +2 -2
- package/lib/shared/friendlyError.ts +2 -3
- package/lib/shared/gradientUtils.test.ts +3 -7
- package/lib/shared/gradientUtils.ts +17 -14
- package/lib/shared/hrefRefs.test.ts +2 -2
- package/lib/shared/hrefRefs.ts +2 -10
- package/lib/shared/i18n.test.ts +4 -4
- package/lib/shared/i18n.ts +18 -38
- package/lib/shared/index.ts +27 -0
- package/lib/shared/inlineSvgStyleRules.ts +14 -13
- package/lib/shared/interactiveStyleMappings.test.ts +32 -54
- package/lib/shared/interactiveStyleMappings.ts +11 -24
- package/lib/shared/interactiveStyles.test.ts +165 -188
- package/lib/shared/interfaces/contentProvider.ts +1 -1
- package/lib/shared/itemTemplateUtils.test.ts +11 -17
- package/lib/shared/itemTemplateUtils.ts +27 -39
- package/lib/shared/jsonRepair.ts +16 -10
- package/lib/shared/libraryLoader.test.ts +21 -55
- package/lib/shared/libraryLoader.ts +7 -22
- package/lib/shared/linkUtils.ts +1 -1
- package/lib/shared/logger.test.ts +66 -0
- package/lib/shared/logger.ts +94 -0
- package/lib/shared/markdown.ts +25 -0
- package/lib/shared/netlifyLocale404.test.ts +179 -0
- package/lib/shared/netlifyLocale404.ts +110 -0
- package/lib/shared/nodeUtils.test.ts +28 -16
- package/lib/shared/nodeUtils.ts +76 -23
- package/lib/shared/pathArrayUtils.test.ts +1 -2
- package/lib/shared/pathArrayUtils.ts +1 -1
- package/lib/shared/pathSecurity.ts +2 -2
- package/lib/shared/pathUtils.test.ts +4 -6
- package/lib/shared/pathUtils.ts +42 -49
- 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 +17 -20
- package/lib/shared/paths/PathUtils.ts +13 -13
- package/lib/shared/paths/PathValidator.test.ts +2 -15
- package/lib/shared/paths/PathValidator.ts +12 -10
- package/lib/shared/paths/index.ts +1 -2
- package/lib/shared/permissions.test.ts +168 -0
- package/lib/shared/permissions.ts +162 -0
- package/lib/shared/propResolver.test.ts +240 -244
- package/lib/shared/propResolver.ts +15 -26
- package/lib/shared/pxToRem.test.ts +7 -6
- package/lib/shared/pxToRem.ts +2 -5
- package/lib/shared/registry/BaseNodeTypeRegistry.test.ts +12 -6
- package/lib/shared/registry/ClientRegistry.ts +0 -2
- package/lib/shared/registry/ComponentRegistry.test.ts +46 -32
- package/lib/shared/registry/ComponentRegistry.ts +12 -9
- package/lib/shared/registry/NodeTypeDefinition.ts +16 -9
- package/lib/shared/registry/RegistryManager.ts +1 -2
- package/lib/shared/registry/SSRRegistry.ts +0 -2
- package/lib/shared/registry/createNodeType.ts +7 -9
- package/lib/shared/registry/defineNodeType.ts +2 -6
- package/lib/shared/registry/fieldPresets.ts +3 -1
- package/lib/shared/registry/index.ts +0 -1
- package/lib/shared/registry/nodeTypes/ComponentInstanceNodeType.ts +14 -15
- package/lib/shared/registry/nodeTypes/CustomNodeType.ts +103 -0
- package/lib/shared/registry/nodeTypes/EmbedNodeType.ts +18 -11
- package/lib/shared/registry/nodeTypes/HtmlNodeType.ts +48 -19
- package/lib/shared/registry/nodeTypes/IslandNodeType.ts +129 -0
- package/lib/shared/registry/nodeTypes/LinkNodeType.ts +21 -19
- package/lib/shared/registry/nodeTypes/ListNodeType.ts +117 -77
- package/lib/shared/registry/nodeTypes/LocaleListNodeType.ts +27 -21
- package/lib/shared/registry/nodeTypes/MarkdownNodeType.ts +78 -0
- package/lib/shared/registry/nodeTypes/SlotMarkerType.ts +12 -8
- package/lib/shared/registry/nodeTypes/index.ts +26 -3
- package/lib/shared/responsiveScaling.test.ts +16 -34
- package/lib/shared/responsiveScaling.ts +61 -42
- package/lib/shared/responsiveStyleUtils.test.ts +0 -1
- package/lib/shared/responsiveStyleUtils.ts +11 -13
- package/lib/shared/richtext/htmlToTiptap.test.ts +139 -130
- package/lib/shared/richtext/htmlToTiptap.ts +2 -4
- 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 +18 -20
- package/lib/shared/styleUtils.test.ts +87 -61
- package/lib/shared/styleUtils.ts +5 -6
- package/lib/shared/themeDefaults.test.ts +11 -14
- package/lib/shared/themeDefaults.ts +3 -4
- package/lib/shared/tree/PathBuilder.test.ts +63 -145
- package/lib/shared/tree/PathBuilder.ts +59 -47
- package/lib/shared/treePathUtils.test.ts +51 -12
- package/lib/shared/treePathUtils.ts +91 -60
- package/lib/shared/types/api.ts +105 -8
- package/lib/shared/types/cms.test.ts +34 -0
- package/lib/shared/types/cms.ts +90 -34
- package/lib/shared/types/comment.ts +49 -16
- package/lib/shared/types/components.ts +51 -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 +25 -2
- package/lib/shared/types/permissions.ts +139 -0
- package/lib/shared/types/styles.ts +0 -1
- package/lib/shared/types/variables.test.ts +4 -13
- package/lib/shared/types/variables.ts +51 -30
- package/lib/shared/types.ts +1 -2
- package/lib/shared/utilityClassConfig.ts +751 -321
- package/lib/shared/utilityClassMapper.durability.test.ts +117 -0
- package/lib/shared/utilityClassMapper.test.ts +433 -95
- package/lib/shared/utilityClassMapper.ts +322 -249
- package/lib/shared/utilityClassNames.test.ts +38 -0
- package/lib/shared/utilityClassNames.ts +458 -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/index.ts +1 -0
- package/lib/shared/validation/permissionsValidators.test.ts +49 -0
- package/lib/shared/validation/permissionsValidators.ts +49 -0
- package/lib/shared/validation/propValidator.test.ts +19 -21
- package/lib/shared/validation/propValidator.ts +13 -18
- package/lib/shared/validation/schemas.test.ts +64 -32
- package/lib/shared/validation/schemas.ts +616 -345
- package/lib/shared/validation/validators.test.ts +3 -8
- package/lib/shared/validation/validators.ts +89 -68
- package/lib/shared/viewportUnits.integration.test.ts +14 -10
- package/lib/shared/viewportUnits.test.ts +24 -23
- package/lib/shared/viewportUnits.ts +12 -5
- package/lib/test-utils/dom-setup.ts +1 -1
- package/lib/test-utils/factories/ConsoleMockFactory.ts +10 -14
- package/lib/test-utils/factories/DomMockFactory.ts +17 -23
- 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 +6 -10
- package/lib/test-utils/factories/StoreMockFactory.ts +18 -29
- 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 +13 -19
- package/lib/test-utils/mocks.ts +6 -4
- package/package.json +3 -5
- package/scripts/build-for-publish.mjs +2 -4
- package/scripts/build-meno-filter.ts +4 -7
- package/tsconfig.json +1 -0
- package/vite.config.ts +4 -4
- package/build-next.ts +0 -1361
- package/build-static.test.ts +0 -424
- package/build-static.ts +0 -1074
- package/dist/build-static.js +0 -36
- package/dist/chunks/chunk-2MHDV5BF.js +0 -251
- package/dist/chunks/chunk-2MHDV5BF.js.map +0 -7
- package/dist/chunks/chunk-AZQYF6KE.js +0 -559
- package/dist/chunks/chunk-AZQYF6KE.js.map +0 -7
- package/dist/chunks/chunk-GZHGVVW3.js +0 -322
- package/dist/chunks/chunk-GZHGVVW3.js.map +0 -7
- package/dist/chunks/chunk-H3GJ4H2U.js.map +0 -7
- package/dist/chunks/chunk-I7YIGZXT.js +0 -467
- package/dist/chunks/chunk-I7YIGZXT.js.map +0 -7
- package/dist/chunks/chunk-IGYR22T6.js +0 -6192
- package/dist/chunks/chunk-IGYR22T6.js.map +0 -7
- package/dist/chunks/chunk-JGP5A3Y5.js +0 -1136
- 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 +0 -77
- package/dist/chunks/chunk-QB2LNO4W.js.map +0 -7
- package/dist/chunks/chunk-R6XHAFBF.js +0 -3821
- 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 +0 -7
- package/dist/chunks/constants-STK2YBIW.js +0 -46
- package/dist/chunks/constants-STK2YBIW.js.map +0 -7
- package/dist/chunks/fs-JGINUXGL.js.map +0 -7
- package/dist/entries/server-router.js +0 -67
- package/dist/entries/server-router.js.map +0 -7
- package/entries/server-router.tsx +0 -81
- package/lib/server/providers/fileSystemPageProvider.ts +0 -160
- package/lib/server/webflow/buildWebflow.ts +0 -635
- package/lib/server/webflow/index.ts +0 -23
- package/lib/server/webflow/nodeToWebflow.test.ts +0 -3170
- package/lib/server/webflow/nodeToWebflow.ts +0 -2435
- package/lib/server/webflow/styleMapper.test.ts +0 -389
- package/lib/server/webflow/styleMapper.ts +0 -695
- package/lib/server/webflow/templateWrapper.ts +0 -49
- package/lib/server/webflow/types.ts +0 -396
- /package/dist/{build-static.js.map → chunks/fs-G3ANWEFP.js.map} +0 -0
|
@@ -1,16 +1,17 @@
|
|
|
1
|
-
import { test, expect, describe, beforeEach, afterEach, mock } from
|
|
2
|
-
import { StyleInjector } from
|
|
3
|
-
import { ComponentRegistry } from
|
|
4
|
-
import { ElementRegistry } from
|
|
5
|
-
import
|
|
1
|
+
import { test, expect, describe, beforeEach, afterEach, mock } from 'bun:test';
|
|
2
|
+
import { StyleInjector } from './StyleInjector';
|
|
3
|
+
import { ComponentRegistry } from '../componentRegistry';
|
|
4
|
+
import { ElementRegistry } from '../elementRegistry';
|
|
5
|
+
import { InteractiveStylesRegistry } from '../InteractiveStylesRegistry';
|
|
6
|
+
import type { ComponentDefinition } from '../../shared/types';
|
|
6
7
|
import {
|
|
7
8
|
createTypedMockHTMLElement,
|
|
8
9
|
createTypedMockDocument,
|
|
9
10
|
type TypedMockDocument,
|
|
10
11
|
type TypedMockHTMLElement,
|
|
11
|
-
} from
|
|
12
|
+
} from '../../test-utils/factories/DomMockFactory';
|
|
12
13
|
|
|
13
|
-
describe(
|
|
14
|
+
describe('StyleInjector', () => {
|
|
14
15
|
let componentRegistry: ComponentRegistry;
|
|
15
16
|
let elementRegistry: ElementRegistry;
|
|
16
17
|
let styleInjector: StyleInjector;
|
|
@@ -22,18 +23,23 @@ describe("StyleInjector", () => {
|
|
|
22
23
|
// Save original document
|
|
23
24
|
originalDocument = global.document;
|
|
24
25
|
|
|
26
|
+
// InteractiveStylesRegistry is a process-global singleton; earlier test
|
|
27
|
+
// files in the same run may have left entries in it, which inject() would
|
|
28
|
+
// pick up and write into our mocked style tag. Clear it for isolation.
|
|
29
|
+
InteractiveStylesRegistry.clear();
|
|
30
|
+
|
|
25
31
|
componentRegistry = new ComponentRegistry();
|
|
26
32
|
elementRegistry = new ElementRegistry();
|
|
27
33
|
styleInjector = new StyleInjector({
|
|
28
34
|
componentRegistry,
|
|
29
35
|
elementRegistry,
|
|
30
|
-
styleId:
|
|
36
|
+
styleId: 'component-css',
|
|
31
37
|
});
|
|
32
38
|
|
|
33
39
|
// Create typed mock style tag
|
|
34
40
|
mockStyleTag = createTypedMockHTMLElement({
|
|
35
|
-
tagName:
|
|
36
|
-
id:
|
|
41
|
+
tagName: 'STYLE',
|
|
42
|
+
id: 'component-css',
|
|
37
43
|
});
|
|
38
44
|
|
|
39
45
|
// Create typed mock document
|
|
@@ -41,7 +47,7 @@ describe("StyleInjector", () => {
|
|
|
41
47
|
|
|
42
48
|
// Configure createElement to return our mock style tag
|
|
43
49
|
mockDocument.createElement.mockImplementation((tag: string) => {
|
|
44
|
-
if (tag ===
|
|
50
|
+
if (tag === 'style') {
|
|
45
51
|
return mockStyleTag;
|
|
46
52
|
}
|
|
47
53
|
return createTypedMockHTMLElement({ tagName: tag });
|
|
@@ -54,12 +60,14 @@ describe("StyleInjector", () => {
|
|
|
54
60
|
afterEach(() => {
|
|
55
61
|
// Clean up any style tags
|
|
56
62
|
styleInjector.clear();
|
|
63
|
+
// Don't leak our own registry state to later test files
|
|
64
|
+
InteractiveStylesRegistry.clear();
|
|
57
65
|
// Restore original document
|
|
58
66
|
global.document = originalDocument;
|
|
59
67
|
});
|
|
60
68
|
|
|
61
|
-
describe(
|
|
62
|
-
test(
|
|
69
|
+
describe('constructor', () => {
|
|
70
|
+
test('should create instance with default styleId', () => {
|
|
63
71
|
const injector = new StyleInjector({
|
|
64
72
|
componentRegistry,
|
|
65
73
|
elementRegistry,
|
|
@@ -67,146 +75,146 @@ describe("StyleInjector", () => {
|
|
|
67
75
|
expect(injector).toBeInstanceOf(StyleInjector);
|
|
68
76
|
});
|
|
69
77
|
|
|
70
|
-
test(
|
|
78
|
+
test('should create instance with custom styleId', () => {
|
|
71
79
|
const injector = new StyleInjector({
|
|
72
80
|
componentRegistry,
|
|
73
81
|
elementRegistry,
|
|
74
|
-
styleId:
|
|
82
|
+
styleId: 'custom-style-id',
|
|
75
83
|
});
|
|
76
84
|
expect(injector).toBeInstanceOf(StyleInjector);
|
|
77
85
|
});
|
|
78
86
|
});
|
|
79
87
|
|
|
80
|
-
describe(
|
|
88
|
+
describe('inject', () => {
|
|
81
89
|
// Note: This test passes in isolation but may fail in full suite due to
|
|
82
90
|
// DOM state pollution from other tests (generateUtilityCSS scans document.body)
|
|
83
|
-
test.skip(
|
|
91
|
+
test.skip('should inject CSS without templates (test isolation issue in full suite)', () => {
|
|
84
92
|
const componentDef: ComponentDefinition = {
|
|
85
|
-
type:
|
|
93
|
+
type: 'component',
|
|
86
94
|
component: {
|
|
87
95
|
interface: {},
|
|
88
|
-
structure: { type:
|
|
89
|
-
css:
|
|
96
|
+
structure: { type: 'node', tag: 'div' },
|
|
97
|
+
css: '.test { color: red; }',
|
|
90
98
|
},
|
|
91
99
|
};
|
|
92
100
|
|
|
93
|
-
componentRegistry.register(
|
|
101
|
+
componentRegistry.register('TestComponent', componentDef);
|
|
94
102
|
|
|
95
103
|
styleInjector.inject();
|
|
96
104
|
|
|
97
|
-
expect(mockDocument.createElement).toHaveBeenCalledWith(
|
|
105
|
+
expect(mockDocument.createElement).toHaveBeenCalledWith('style');
|
|
98
106
|
expect(mockDocument.head.appendChild).toHaveBeenCalled();
|
|
99
|
-
expect(mockStyleTag.textContent).toContain(
|
|
100
|
-
expect(mockStyleTag.textContent).toContain(
|
|
107
|
+
expect(mockStyleTag.textContent).toContain('.test { color: red; }');
|
|
108
|
+
expect(mockStyleTag.textContent).toContain('Component: TestComponent');
|
|
101
109
|
});
|
|
102
110
|
|
|
103
111
|
// Template-based tests require full ElementRegistry from @meno/studio
|
|
104
112
|
// These are integration tests that should be run in the studio package
|
|
105
|
-
test.skip(
|
|
113
|
+
test.skip('should inject CSS with templates per instance (requires @meno/studio ElementRegistry)', () => {
|
|
106
114
|
const componentDef: ComponentDefinition = {
|
|
107
|
-
type:
|
|
115
|
+
type: 'component',
|
|
108
116
|
component: {
|
|
109
117
|
interface: {},
|
|
110
|
-
structure: { type:
|
|
111
|
-
css:
|
|
118
|
+
structure: { type: 'node', tag: 'div' },
|
|
119
|
+
css: '.test { color: {{color}}; }',
|
|
112
120
|
},
|
|
113
121
|
};
|
|
114
122
|
|
|
115
|
-
componentRegistry.register(
|
|
123
|
+
componentRegistry.register('TestComponent', componentDef);
|
|
116
124
|
|
|
117
125
|
// Register component instances with props using typed mocks
|
|
118
|
-
const mockElement1 = createTypedMockHTMLElement({ tagName:
|
|
119
|
-
const mockElement2 = createTypedMockHTMLElement({ tagName:
|
|
120
|
-
elementRegistry.register([0], mockElement1 as unknown as HTMLElement,
|
|
121
|
-
color:
|
|
126
|
+
const mockElement1 = createTypedMockHTMLElement({ tagName: 'DIV' });
|
|
127
|
+
const mockElement2 = createTypedMockHTMLElement({ tagName: 'DIV' });
|
|
128
|
+
elementRegistry.register([0], mockElement1 as unknown as HTMLElement, 'TestComponent', true, {
|
|
129
|
+
color: 'red',
|
|
122
130
|
});
|
|
123
|
-
elementRegistry.register([1], mockElement2 as unknown as HTMLElement,
|
|
124
|
-
color:
|
|
131
|
+
elementRegistry.register([1], mockElement2 as unknown as HTMLElement, 'TestComponent', true, {
|
|
132
|
+
color: 'blue',
|
|
125
133
|
});
|
|
126
134
|
|
|
127
135
|
styleInjector.inject();
|
|
128
136
|
|
|
129
|
-
expect(mockDocument.createElement).toHaveBeenCalledWith(
|
|
137
|
+
expect(mockDocument.createElement).toHaveBeenCalledWith('style');
|
|
130
138
|
expect(mockDocument.head.appendChild).toHaveBeenCalled();
|
|
131
|
-
expect(mockStyleTag.textContent).toContain(
|
|
132
|
-
expect(mockStyleTag.textContent).toContain(
|
|
133
|
-
expect(mockStyleTag.textContent).toContain(
|
|
139
|
+
expect(mockStyleTag.textContent).toContain('color: red');
|
|
140
|
+
expect(mockStyleTag.textContent).toContain('color: blue');
|
|
141
|
+
expect(mockStyleTag.textContent).toContain('(instance)');
|
|
134
142
|
});
|
|
135
143
|
|
|
136
|
-
test.skip(
|
|
144
|
+
test.skip('should handle multiple components with mixed template/non-template CSS (requires @meno/studio ElementRegistry)', () => {
|
|
137
145
|
const componentDef1: ComponentDefinition = {
|
|
138
|
-
type:
|
|
146
|
+
type: 'component',
|
|
139
147
|
component: {
|
|
140
148
|
interface: {},
|
|
141
|
-
structure: { type:
|
|
142
|
-
css:
|
|
149
|
+
structure: { type: 'node', tag: 'div' },
|
|
150
|
+
css: '.test1 { color: red; }',
|
|
143
151
|
},
|
|
144
152
|
};
|
|
145
153
|
|
|
146
154
|
const componentDef2: ComponentDefinition = {
|
|
147
|
-
type:
|
|
155
|
+
type: 'component',
|
|
148
156
|
component: {
|
|
149
157
|
interface: {},
|
|
150
|
-
structure: { type:
|
|
151
|
-
css:
|
|
158
|
+
structure: { type: 'node', tag: 'div' },
|
|
159
|
+
css: '.test2 { color: {{color}}; }',
|
|
152
160
|
},
|
|
153
161
|
};
|
|
154
162
|
|
|
155
|
-
componentRegistry.register(
|
|
156
|
-
componentRegistry.register(
|
|
163
|
+
componentRegistry.register('Component1', componentDef1);
|
|
164
|
+
componentRegistry.register('Component2', componentDef2);
|
|
157
165
|
|
|
158
|
-
const mockElement = createTypedMockHTMLElement({ tagName:
|
|
159
|
-
elementRegistry.register([0], mockElement as unknown as HTMLElement,
|
|
160
|
-
color:
|
|
166
|
+
const mockElement = createTypedMockHTMLElement({ tagName: 'DIV' });
|
|
167
|
+
elementRegistry.register([0], mockElement as unknown as HTMLElement, 'Component2', true, {
|
|
168
|
+
color: 'blue',
|
|
161
169
|
});
|
|
162
170
|
|
|
163
171
|
styleInjector.inject();
|
|
164
172
|
|
|
165
|
-
expect(mockStyleTag.textContent).toContain(
|
|
166
|
-
expect(mockStyleTag.textContent).toContain(
|
|
167
|
-
expect(mockStyleTag.textContent).toContain(
|
|
168
|
-
expect(mockStyleTag.textContent).toContain(
|
|
173
|
+
expect(mockStyleTag.textContent).toContain('Component: Component1');
|
|
174
|
+
expect(mockStyleTag.textContent).toContain('Component: Component2');
|
|
175
|
+
expect(mockStyleTag.textContent).toContain('.test1 { color: red; }');
|
|
176
|
+
expect(mockStyleTag.textContent).toContain('color: blue');
|
|
169
177
|
});
|
|
170
178
|
|
|
171
|
-
test(
|
|
179
|
+
test('should reuse existing style tag (in-place update)', () => {
|
|
172
180
|
const existingStyle = createTypedMockHTMLElement({
|
|
173
|
-
tagName:
|
|
174
|
-
id:
|
|
181
|
+
tagName: 'STYLE',
|
|
182
|
+
id: 'component-css',
|
|
175
183
|
});
|
|
176
184
|
|
|
177
185
|
mockDocument.getElementById.mockReturnValue(existingStyle);
|
|
178
186
|
|
|
179
187
|
const componentDef: ComponentDefinition = {
|
|
180
|
-
type:
|
|
188
|
+
type: 'component',
|
|
181
189
|
component: {
|
|
182
190
|
interface: {},
|
|
183
|
-
structure: { type:
|
|
184
|
-
css:
|
|
191
|
+
structure: { type: 'node', tag: 'div' },
|
|
192
|
+
css: '.test { color: red; }',
|
|
185
193
|
},
|
|
186
194
|
};
|
|
187
195
|
|
|
188
|
-
componentRegistry.register(
|
|
196
|
+
componentRegistry.register('TestComponent', componentDef);
|
|
189
197
|
|
|
190
198
|
styleInjector.inject();
|
|
191
199
|
|
|
192
200
|
// Should look up existing tag and update textContent in-place (no createElement)
|
|
193
|
-
expect(mockDocument.getElementById).toHaveBeenCalledWith(
|
|
194
|
-
expect(existingStyle.textContent).toContain(
|
|
201
|
+
expect(mockDocument.getElementById).toHaveBeenCalledWith('component-css');
|
|
202
|
+
expect(existingStyle.textContent).toContain('.test { color: red; }');
|
|
195
203
|
expect(mockDocument.createElement).not.toHaveBeenCalled();
|
|
196
204
|
});
|
|
197
205
|
|
|
198
206
|
// Note: This test passes in isolation but may fail in full suite due to
|
|
199
207
|
// DOM state pollution from other tests (generateUtilityCSS scans document.body)
|
|
200
|
-
test.skip(
|
|
208
|
+
test.skip('should not inject CSS if no components have CSS (test isolation issue in full suite)', () => {
|
|
201
209
|
const componentDef: ComponentDefinition = {
|
|
202
|
-
type:
|
|
210
|
+
type: 'component',
|
|
203
211
|
component: {
|
|
204
212
|
interface: {},
|
|
205
|
-
structure: { type:
|
|
213
|
+
structure: { type: 'node', tag: 'div' },
|
|
206
214
|
},
|
|
207
215
|
};
|
|
208
216
|
|
|
209
|
-
componentRegistry.register(
|
|
217
|
+
componentRegistry.register('TestComponent', componentDef);
|
|
210
218
|
|
|
211
219
|
styleInjector.inject();
|
|
212
220
|
|
|
@@ -214,53 +222,53 @@ describe("StyleInjector", () => {
|
|
|
214
222
|
expect(mockDocument.head.appendChild).not.toHaveBeenCalled();
|
|
215
223
|
});
|
|
216
224
|
|
|
217
|
-
test.skip(
|
|
225
|
+
test.skip('should handle template processing errors gracefully (requires @meno/studio ElementRegistry)', () => {
|
|
218
226
|
const componentDef: ComponentDefinition = {
|
|
219
|
-
type:
|
|
227
|
+
type: 'component',
|
|
220
228
|
component: {
|
|
221
229
|
interface: {},
|
|
222
|
-
structure: { type:
|
|
223
|
-
css:
|
|
230
|
+
structure: { type: 'node', tag: 'div' },
|
|
231
|
+
css: '.test { color: {{invalid.prop}}; }',
|
|
224
232
|
},
|
|
225
233
|
};
|
|
226
234
|
|
|
227
|
-
componentRegistry.register(
|
|
235
|
+
componentRegistry.register('TestComponent', componentDef);
|
|
228
236
|
|
|
229
|
-
const mockElement = createTypedMockHTMLElement({ tagName:
|
|
230
|
-
elementRegistry.register([0], mockElement as unknown as HTMLElement,
|
|
231
|
-
color:
|
|
237
|
+
const mockElement = createTypedMockHTMLElement({ tagName: 'DIV' });
|
|
238
|
+
elementRegistry.register([0], mockElement as unknown as HTMLElement, 'TestComponent', true, {
|
|
239
|
+
color: 'red',
|
|
232
240
|
});
|
|
233
241
|
|
|
234
242
|
// Should not throw, should fallback to original CSS
|
|
235
243
|
expect(() => styleInjector.inject()).not.toThrow();
|
|
236
|
-
expect(mockStyleTag.textContent).toContain(
|
|
244
|
+
expect(mockStyleTag.textContent).toContain('Component: TestComponent');
|
|
237
245
|
});
|
|
238
246
|
|
|
239
|
-
test(
|
|
247
|
+
test('should handle missing component props gracefully', () => {
|
|
240
248
|
const componentDef: ComponentDefinition = {
|
|
241
|
-
type:
|
|
249
|
+
type: 'component',
|
|
242
250
|
component: {
|
|
243
251
|
interface: {},
|
|
244
|
-
structure: { type:
|
|
245
|
-
css:
|
|
252
|
+
structure: { type: 'node', tag: 'div' },
|
|
253
|
+
css: '.test { color: {{color}}; }',
|
|
246
254
|
},
|
|
247
255
|
};
|
|
248
256
|
|
|
249
|
-
componentRegistry.register(
|
|
257
|
+
componentRegistry.register('TestComponent', componentDef);
|
|
250
258
|
|
|
251
259
|
// Register element without props
|
|
252
|
-
const mockElement = createTypedMockHTMLElement({ tagName:
|
|
253
|
-
elementRegistry.register([0], mockElement as unknown as HTMLElement,
|
|
260
|
+
const mockElement = createTypedMockHTMLElement({ tagName: 'DIV' });
|
|
261
|
+
elementRegistry.register([0], mockElement as unknown as HTMLElement, 'TestComponent', true);
|
|
254
262
|
|
|
255
263
|
// Should not throw
|
|
256
264
|
expect(() => styleInjector.inject()).not.toThrow();
|
|
257
265
|
});
|
|
258
266
|
|
|
259
|
-
test(
|
|
267
|
+
test('should handle errors during injection gracefully', () => {
|
|
260
268
|
// Force an error by making getAll throw
|
|
261
269
|
const originalGetAll = componentRegistry.getAll.bind(componentRegistry);
|
|
262
270
|
componentRegistry.getAll = mock(() => {
|
|
263
|
-
throw new Error(
|
|
271
|
+
throw new Error('Test error');
|
|
264
272
|
});
|
|
265
273
|
|
|
266
274
|
// Should not throw - should handle error gracefully
|
|
@@ -271,15 +279,15 @@ describe("StyleInjector", () => {
|
|
|
271
279
|
});
|
|
272
280
|
});
|
|
273
281
|
|
|
274
|
-
describe(
|
|
275
|
-
test(
|
|
282
|
+
describe('clear', () => {
|
|
283
|
+
test('should remove all style tags if they exist', () => {
|
|
276
284
|
const existingComponentStyle = createTypedMockHTMLElement({
|
|
277
|
-
tagName:
|
|
278
|
-
id:
|
|
285
|
+
tagName: 'STYLE',
|
|
286
|
+
id: 'component-css',
|
|
279
287
|
});
|
|
280
288
|
const existingInteractiveStyle = createTypedMockHTMLElement({
|
|
281
|
-
tagName:
|
|
282
|
-
id:
|
|
289
|
+
tagName: 'STYLE',
|
|
290
|
+
id: 'interactive-styles',
|
|
283
291
|
});
|
|
284
292
|
|
|
285
293
|
mockDocument.getElementById
|
|
@@ -289,63 +297,63 @@ describe("StyleInjector", () => {
|
|
|
289
297
|
styleInjector.clear();
|
|
290
298
|
|
|
291
299
|
// component-css and interactive-styles are removed directly
|
|
292
|
-
expect(mockDocument.getElementById).toHaveBeenCalledWith(
|
|
293
|
-
expect(mockDocument.getElementById).toHaveBeenCalledWith(
|
|
300
|
+
expect(mockDocument.getElementById).toHaveBeenCalledWith('component-css');
|
|
301
|
+
expect(mockDocument.getElementById).toHaveBeenCalledWith('interactive-styles');
|
|
294
302
|
expect(existingComponentStyle.remove).toHaveBeenCalled();
|
|
295
303
|
expect(existingInteractiveStyle.remove).toHaveBeenCalled();
|
|
296
304
|
// utility-css removal is delegated to UtilityClassCollector.destroy()
|
|
297
305
|
});
|
|
298
306
|
|
|
299
|
-
test(
|
|
307
|
+
test('should not throw if style tags do not exist', () => {
|
|
300
308
|
mockDocument.getElementById.mockReturnValue(null);
|
|
301
309
|
|
|
302
310
|
expect(() => styleInjector.clear()).not.toThrow();
|
|
303
311
|
});
|
|
304
312
|
});
|
|
305
313
|
|
|
306
|
-
describe(
|
|
307
|
-
test(
|
|
314
|
+
describe('exists', () => {
|
|
315
|
+
test('should return true if style tag exists', () => {
|
|
308
316
|
const existingStyle = createTypedMockHTMLElement({
|
|
309
|
-
tagName:
|
|
310
|
-
id:
|
|
317
|
+
tagName: 'STYLE',
|
|
318
|
+
id: 'component-css',
|
|
311
319
|
});
|
|
312
320
|
|
|
313
321
|
mockDocument.getElementById.mockReturnValueOnce(existingStyle);
|
|
314
322
|
|
|
315
323
|
expect(styleInjector.exists()).toBe(true);
|
|
316
|
-
expect(mockDocument.getElementById).toHaveBeenCalledWith(
|
|
324
|
+
expect(mockDocument.getElementById).toHaveBeenCalledWith('component-css');
|
|
317
325
|
});
|
|
318
326
|
|
|
319
|
-
test(
|
|
327
|
+
test('should return false if style tag does not exist', () => {
|
|
320
328
|
mockDocument.getElementById.mockReturnValueOnce(null);
|
|
321
329
|
|
|
322
330
|
expect(styleInjector.exists()).toBe(false);
|
|
323
|
-
expect(mockDocument.getElementById).toHaveBeenCalledWith(
|
|
331
|
+
expect(mockDocument.getElementById).toHaveBeenCalledWith('component-css');
|
|
324
332
|
});
|
|
325
333
|
});
|
|
326
334
|
|
|
327
|
-
describe(
|
|
328
|
-
test.skip(
|
|
335
|
+
describe('integration', () => {
|
|
336
|
+
test.skip('should handle full injection cycle (requires @meno/studio ElementRegistry)', () => {
|
|
329
337
|
const componentDef: ComponentDefinition = {
|
|
330
|
-
type:
|
|
338
|
+
type: 'component',
|
|
331
339
|
component: {
|
|
332
340
|
interface: {},
|
|
333
|
-
structure: { type:
|
|
334
|
-
css:
|
|
341
|
+
structure: { type: 'node', tag: 'div' },
|
|
342
|
+
css: '.test { color: {{color}}; }',
|
|
335
343
|
},
|
|
336
344
|
};
|
|
337
345
|
|
|
338
|
-
componentRegistry.register(
|
|
346
|
+
componentRegistry.register('TestComponent', componentDef);
|
|
339
347
|
|
|
340
|
-
const mockElement = createTypedMockHTMLElement({ tagName:
|
|
341
|
-
elementRegistry.register([0], mockElement as unknown as HTMLElement,
|
|
342
|
-
color:
|
|
348
|
+
const mockElement = createTypedMockHTMLElement({ tagName: 'DIV' });
|
|
349
|
+
elementRegistry.register([0], mockElement as unknown as HTMLElement, 'TestComponent', true, {
|
|
350
|
+
color: 'green',
|
|
343
351
|
});
|
|
344
352
|
|
|
345
353
|
// Inject - should create style tag
|
|
346
354
|
mockDocument.getElementById.mockReturnValueOnce(null); // No existing tag
|
|
347
355
|
styleInjector.inject();
|
|
348
|
-
expect(mockDocument.createElement).toHaveBeenCalledWith(
|
|
356
|
+
expect(mockDocument.createElement).toHaveBeenCalledWith('style');
|
|
349
357
|
expect(mockDocument.head.appendChild).toHaveBeenCalled();
|
|
350
358
|
|
|
351
359
|
// Verify exists() works after injection
|
|
@@ -354,8 +362,8 @@ describe("StyleInjector", () => {
|
|
|
354
362
|
|
|
355
363
|
// Clear - should remove style tag
|
|
356
364
|
const styleTagWithRemove = createTypedMockHTMLElement({
|
|
357
|
-
tagName:
|
|
358
|
-
id:
|
|
365
|
+
tagName: 'STYLE',
|
|
366
|
+
id: 'component-css',
|
|
359
367
|
});
|
|
360
368
|
mockDocument.getElementById.mockReturnValueOnce(styleTagWithRemove);
|
|
361
369
|
styleInjector.clear();
|
|
@@ -367,4 +375,3 @@ describe("StyleInjector", () => {
|
|
|
367
375
|
});
|
|
368
376
|
});
|
|
369
377
|
});
|
|
370
|
-
|
|
@@ -13,7 +13,11 @@ import type { ElementRegistry } from '../elementRegistry';
|
|
|
13
13
|
import { hasTemplates, processCodeTemplates } from '../templateEngine';
|
|
14
14
|
import { generateAllInteractiveCSS } from '../../shared/cssGeneration';
|
|
15
15
|
import { rewriteViewportUnits } from '../../shared/viewportUnits';
|
|
16
|
-
import {
|
|
16
|
+
import {
|
|
17
|
+
getCachedBreakpointConfig,
|
|
18
|
+
getCachedRemConversionConfig,
|
|
19
|
+
getCachedResponsiveScalesConfig,
|
|
20
|
+
} from '../responsiveStyleResolver';
|
|
17
21
|
import { DEFAULT_BREAKPOINTS } from '../../shared/breakpoints';
|
|
18
22
|
import { InteractiveStylesRegistry } from '../InteractiveStylesRegistry';
|
|
19
23
|
import { UtilityClassCollector } from './UtilityClassCollector';
|
|
@@ -36,7 +40,7 @@ function simpleHash(str: string): number {
|
|
|
36
40
|
let hash = 0;
|
|
37
41
|
for (let i = 0; i < str.length; i++) {
|
|
38
42
|
const char = str.charCodeAt(i);
|
|
39
|
-
hash = (
|
|
43
|
+
hash = (hash << 5) - hash + char;
|
|
40
44
|
hash |= 0; // Convert to 32-bit integer
|
|
41
45
|
}
|
|
42
46
|
return hash;
|
|
@@ -111,7 +115,7 @@ export class StyleInjector {
|
|
|
111
115
|
const processedCSS = processCodeTemplates(originalCSS, props);
|
|
112
116
|
processedCSSBlocks.push(`/* Component: ${name} (instance) */\n${processedCSS}`);
|
|
113
117
|
}
|
|
114
|
-
} catch (
|
|
118
|
+
} catch (_error) {
|
|
115
119
|
processedCSSBlocks.push(`/* Component: ${name} */\n${originalCSS}`);
|
|
116
120
|
}
|
|
117
121
|
}
|
|
@@ -133,9 +137,8 @@ export class StyleInjector {
|
|
|
133
137
|
// If something removed the tag externally (e.g. a hot-reload pass that
|
|
134
138
|
// wiped <head>), the hash short-circuit would otherwise leave the page
|
|
135
139
|
// unstyled until the CSS itself changed.
|
|
136
|
-
const existing =
|
|
137
|
-
? document.getElementById(this.styleId) as HTMLStyleElement | null
|
|
138
|
-
: null;
|
|
140
|
+
const existing =
|
|
141
|
+
typeof document !== 'undefined' ? (document.getElementById(this.styleId) as HTMLStyleElement | null) : null;
|
|
139
142
|
if (hash === this.previousComponentCSSHash && existing) return;
|
|
140
143
|
this.previousComponentCSSHash = hash;
|
|
141
144
|
|
|
@@ -167,7 +170,7 @@ export class StyleInjector {
|
|
|
167
170
|
const remConversionConfig = getCachedRemConversionConfig() || undefined;
|
|
168
171
|
const responsiveScalesConfig = getCachedResponsiveScalesConfig() || undefined;
|
|
169
172
|
const interactiveCSS = rewriteViewportUnits(
|
|
170
|
-
generateAllInteractiveCSS(interactiveStylesMap, breakpointConfig, remConversionConfig, responsiveScalesConfig)
|
|
173
|
+
generateAllInteractiveCSS(interactiveStylesMap, breakpointConfig, remConversionConfig, responsiveScalesConfig),
|
|
171
174
|
);
|
|
172
175
|
if (!interactiveCSS) return;
|
|
173
176
|
|