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
|
@@ -51,7 +51,7 @@ export interface TypedMockMouseEvent extends MouseEvent {
|
|
|
51
51
|
|
|
52
52
|
export function createTypedKeyboardEvent(
|
|
53
53
|
type: 'keydown' | 'keyup' | 'keypress',
|
|
54
|
-
options: MockKeyboardEventOptions
|
|
54
|
+
options: MockKeyboardEventOptions,
|
|
55
55
|
): TypedMockKeyboardEvent {
|
|
56
56
|
const event = new KeyboardEvent(type, {
|
|
57
57
|
key: options.key,
|
|
@@ -118,8 +118,7 @@ export const KeyboardShortcuts = {
|
|
|
118
118
|
delete: () => createTypedKeyboardEvent('keydown', { key: 'Backspace' }),
|
|
119
119
|
enter: () => createTypedKeyboardEvent('keydown', { key: 'Enter' }),
|
|
120
120
|
escape: () => createTypedKeyboardEvent('keydown', { key: 'Escape' }),
|
|
121
|
-
tab: (shift = false) =>
|
|
122
|
-
createTypedKeyboardEvent('keydown', { key: 'Tab', shiftKey: shift }),
|
|
121
|
+
tab: (shift = false) => createTypedKeyboardEvent('keydown', { key: 'Tab', shiftKey: shift }),
|
|
123
122
|
arrowUp: () => createTypedKeyboardEvent('keydown', { key: 'ArrowUp' }),
|
|
124
123
|
arrowDown: () => createTypedKeyboardEvent('keydown', { key: 'ArrowDown' }),
|
|
125
124
|
arrowLeft: () => createTypedKeyboardEvent('keydown', { key: 'ArrowLeft' }),
|
|
@@ -140,7 +139,7 @@ export function createTypedMouseEvent(
|
|
|
140
139
|
| 'mouseover'
|
|
141
140
|
| 'mouseout'
|
|
142
141
|
| 'contextmenu',
|
|
143
|
-
options: MockMouseEventOptions = {}
|
|
142
|
+
options: MockMouseEventOptions = {},
|
|
144
143
|
): TypedMockMouseEvent {
|
|
145
144
|
const event = new MouseEvent(type, {
|
|
146
145
|
button: options.button ?? 0,
|
|
@@ -176,7 +175,7 @@ export function createTypedMouseEvent(
|
|
|
176
175
|
export function createTypedCustomEvent<T = unknown>(
|
|
177
176
|
type: string,
|
|
178
177
|
detail?: T,
|
|
179
|
-
options: { bubbles?: boolean; cancelable?: boolean } = {}
|
|
178
|
+
options: { bubbles?: boolean; cancelable?: boolean } = {},
|
|
180
179
|
): CustomEvent<T> {
|
|
181
180
|
return new CustomEvent(type, {
|
|
182
181
|
detail,
|
|
@@ -199,9 +198,7 @@ export interface MockMessageEventOptions<T = unknown> {
|
|
|
199
198
|
source?: MessageEventSource | null;
|
|
200
199
|
}
|
|
201
200
|
|
|
202
|
-
export function createTypedMessageEvent<T = unknown>(
|
|
203
|
-
options: MockMessageEventOptions<T>
|
|
204
|
-
): MessageEvent<T> {
|
|
201
|
+
export function createTypedMessageEvent<T = unknown>(options: MockMessageEventOptions<T>): MessageEvent<T> {
|
|
205
202
|
return new MessageEvent('message', {
|
|
206
203
|
data: options.data,
|
|
207
204
|
origin: options.origin ?? 'http://localhost',
|
|
@@ -213,7 +210,7 @@ export function createTypedMessageEvent<T = unknown>(
|
|
|
213
210
|
|
|
214
211
|
export function createTypedFocusEvent(
|
|
215
212
|
type: 'focus' | 'blur' | 'focusin' | 'focusout',
|
|
216
|
-
options: { relatedTarget?: EventTarget | null } = {}
|
|
213
|
+
options: { relatedTarget?: EventTarget | null } = {},
|
|
217
214
|
): FocusEvent {
|
|
218
215
|
return new FocusEvent(type, {
|
|
219
216
|
bubbles: type === 'focusin' || type === 'focusout',
|
|
@@ -230,10 +227,7 @@ export interface MockInputEventOptions {
|
|
|
230
227
|
isComposing?: boolean;
|
|
231
228
|
}
|
|
232
229
|
|
|
233
|
-
export function createTypedInputEvent(
|
|
234
|
-
type: 'input' | 'beforeinput',
|
|
235
|
-
options: MockInputEventOptions = {}
|
|
236
|
-
): InputEvent {
|
|
230
|
+
export function createTypedInputEvent(type: 'input' | 'beforeinput', options: MockInputEventOptions = {}): InputEvent {
|
|
237
231
|
return new InputEvent(type, {
|
|
238
232
|
data: options.data ?? null,
|
|
239
233
|
inputType: options.inputType ?? 'insertText',
|
|
@@ -35,10 +35,7 @@ export interface TypedFetchMock {
|
|
|
35
35
|
/** Reset call history */
|
|
36
36
|
_reset: () => void;
|
|
37
37
|
/** Add a response for a URL pattern */
|
|
38
|
-
_addResponse: (
|
|
39
|
-
pattern: string | RegExp,
|
|
40
|
-
response: MockFetchResponse | (() => MockFetchResponse)
|
|
41
|
-
) => void;
|
|
38
|
+
_addResponse: (pattern: string | RegExp, response: MockFetchResponse | (() => MockFetchResponse)) => void;
|
|
42
39
|
}
|
|
43
40
|
|
|
44
41
|
// ========== Response Factory ==========
|
|
@@ -55,9 +52,7 @@ function createMockResponse(config: MockFetchResponse): Response {
|
|
|
55
52
|
json: config.json ?? (() => Promise.resolve({})),
|
|
56
53
|
text: config.text ?? (() => Promise.resolve('')),
|
|
57
54
|
blob: config.blob ?? (() => Promise.resolve(new Blob())),
|
|
58
|
-
clone:
|
|
59
|
-
return createMockResponse(config);
|
|
60
|
-
},
|
|
55
|
+
clone: () => createMockResponse(config),
|
|
61
56
|
arrayBuffer: () => Promise.resolve(new ArrayBuffer(0)),
|
|
62
57
|
formData: () => Promise.resolve(new FormData()),
|
|
63
58
|
body: null,
|
|
@@ -74,55 +69,47 @@ export function createTypedFetchMock(config: FetchMockConfig = {}): TypedFetchMo
|
|
|
74
69
|
const calls: Array<{ url: string; options?: RequestInit }> = [];
|
|
75
70
|
const responses = new Map(config.responses || []);
|
|
76
71
|
|
|
77
|
-
const mockFn = mock(
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
calls.push({ url, options: init });
|
|
72
|
+
const mockFn = mock(async (input: RequestInfo | URL, init?: RequestInit): Promise<Response> => {
|
|
73
|
+
const url = typeof input === 'string' ? input : input.toString();
|
|
74
|
+
calls.push({ url, options: init });
|
|
81
75
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
76
|
+
if (config.delay) {
|
|
77
|
+
await new Promise((resolve) => setTimeout(resolve, config.delay));
|
|
78
|
+
}
|
|
85
79
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
| MockFetchResponse
|
|
89
|
-
| (() => MockFetchResponse)
|
|
90
|
-
| undefined;
|
|
91
|
-
|
|
92
|
-
for (const [pattern, response] of responses) {
|
|
93
|
-
if (typeof pattern === 'string' && url === pattern) {
|
|
94
|
-
responseConfig = response;
|
|
95
|
-
break;
|
|
96
|
-
}
|
|
97
|
-
if (typeof pattern === 'string' && url.includes(pattern)) {
|
|
98
|
-
responseConfig = response;
|
|
99
|
-
break;
|
|
100
|
-
}
|
|
101
|
-
if (pattern instanceof RegExp && pattern.test(url)) {
|
|
102
|
-
responseConfig = response;
|
|
103
|
-
break;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
80
|
+
// Find matching response
|
|
81
|
+
let responseConfig: MockFetchResponse | (() => MockFetchResponse) | undefined;
|
|
106
82
|
|
|
107
|
-
|
|
108
|
-
|
|
83
|
+
for (const [pattern, response] of responses) {
|
|
84
|
+
if (typeof pattern === 'string' && url === pattern) {
|
|
85
|
+
responseConfig = response;
|
|
86
|
+
break;
|
|
109
87
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
88
|
+
if (typeof pattern === 'string' && url.includes(pattern)) {
|
|
89
|
+
responseConfig = response;
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
if (pattern instanceof RegExp && pattern.test(url)) {
|
|
93
|
+
responseConfig = response;
|
|
94
|
+
break;
|
|
116
95
|
}
|
|
96
|
+
}
|
|
117
97
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
: responseConfig;
|
|
98
|
+
if (!responseConfig && config.defaultResponse) {
|
|
99
|
+
responseConfig = config.defaultResponse;
|
|
100
|
+
}
|
|
122
101
|
|
|
123
|
-
|
|
102
|
+
if (!responseConfig) {
|
|
103
|
+
if (config.throwOnUnmatched) {
|
|
104
|
+
throw new Error(`Unmatched fetch request: ${url}`);
|
|
105
|
+
}
|
|
106
|
+
return createMockResponse({ status: 404, ok: false });
|
|
124
107
|
}
|
|
125
|
-
|
|
108
|
+
|
|
109
|
+
const resolvedConfig = typeof responseConfig === 'function' ? responseConfig() : responseConfig;
|
|
110
|
+
|
|
111
|
+
return createMockResponse(resolvedConfig);
|
|
112
|
+
}) as unknown as TypedFetchMock;
|
|
126
113
|
|
|
127
114
|
mockFn._calls = calls;
|
|
128
115
|
mockFn._reset = () => {
|
|
@@ -140,10 +127,7 @@ export function createTypedFetchMock(config: FetchMockConfig = {}): TypedFetchMo
|
|
|
140
127
|
/**
|
|
141
128
|
* Create a fetch mock that returns JSON data
|
|
142
129
|
*/
|
|
143
|
-
export function createJsonFetchMock<T>(
|
|
144
|
-
responseData: T,
|
|
145
|
-
options: Partial<MockFetchResponse> = {}
|
|
146
|
-
): TypedFetchMock {
|
|
130
|
+
export function createJsonFetchMock<T>(responseData: T, options: Partial<MockFetchResponse> = {}): TypedFetchMock {
|
|
147
131
|
return createTypedFetchMock({
|
|
148
132
|
defaultResponse: {
|
|
149
133
|
status: 200,
|
|
@@ -158,11 +142,9 @@ export function createJsonFetchMock<T>(
|
|
|
158
142
|
/**
|
|
159
143
|
* Create a fetch mock that returns an error
|
|
160
144
|
*/
|
|
161
|
-
export function createErrorFetchMock(
|
|
162
|
-
error: Error | string = 'Network error'
|
|
163
|
-
): TypedFetchMock {
|
|
145
|
+
export function createErrorFetchMock(error: Error | string = 'Network error'): TypedFetchMock {
|
|
164
146
|
const mockFn = mock(() =>
|
|
165
|
-
Promise.reject(typeof error === 'string' ? new Error(error) : error)
|
|
147
|
+
Promise.reject(typeof error === 'string' ? new Error(error) : error),
|
|
166
148
|
) as unknown as TypedFetchMock;
|
|
167
149
|
|
|
168
150
|
mockFn._calls = [];
|
|
@@ -176,7 +158,7 @@ export function createErrorFetchMock(
|
|
|
176
158
|
* Create a fetch mock that returns different responses based on URL
|
|
177
159
|
*/
|
|
178
160
|
export function createRoutedFetchMock(
|
|
179
|
-
routes: Record<string, MockFetchResponse | (() => MockFetchResponse)
|
|
161
|
+
routes: Record<string, MockFetchResponse | (() => MockFetchResponse)>,
|
|
180
162
|
): TypedFetchMock {
|
|
181
163
|
const responses = new Map<string, MockFetchResponse | (() => MockFetchResponse)>();
|
|
182
164
|
for (const [url, response] of Object.entries(routes)) {
|
|
@@ -24,9 +24,7 @@ export interface TypedMockPageProvider extends PageProvider {
|
|
|
24
24
|
* Create a typed mock PageProvider
|
|
25
25
|
* @param initialPages - Initial page content map (path -> content)
|
|
26
26
|
*/
|
|
27
|
-
export function createTypedMockPageProvider(
|
|
28
|
-
initialPages: Record<string, string> = {}
|
|
29
|
-
): TypedMockPageProvider {
|
|
27
|
+
export function createTypedMockPageProvider(initialPages: Record<string, string> = {}): TypedMockPageProvider {
|
|
30
28
|
const pages = { ...initialPages };
|
|
31
29
|
|
|
32
30
|
const provider: TypedMockPageProvider = {
|
|
@@ -63,7 +61,7 @@ export interface TypedMockComponentProvider extends ComponentProvider {
|
|
|
63
61
|
* Create a typed mock ComponentProvider
|
|
64
62
|
*/
|
|
65
63
|
export function createTypedMockComponentProvider(
|
|
66
|
-
initialComponents: Map<string, ComponentDefinition> = new Map()
|
|
64
|
+
initialComponents: Map<string, ComponentDefinition> = new Map(),
|
|
67
65
|
): TypedMockComponentProvider {
|
|
68
66
|
const components = new Map(initialComponents);
|
|
69
67
|
const js = new Map<string, string>();
|
|
@@ -98,7 +96,7 @@ export interface TypedMockComponentServiceFs extends ComponentServiceFs {
|
|
|
98
96
|
* Create a typed mock file system for ComponentService
|
|
99
97
|
*/
|
|
100
98
|
export function createTypedMockComponentServiceFs(
|
|
101
|
-
initialFiles: Record<string, string> = {}
|
|
99
|
+
initialFiles: Record<string, string> = {},
|
|
102
100
|
): TypedMockComponentServiceFs {
|
|
103
101
|
const files = { ...initialFiles };
|
|
104
102
|
|
|
@@ -126,7 +124,7 @@ export interface TypedMockComponentLoader extends ComponentLoader {
|
|
|
126
124
|
* Create a typed mock component loader
|
|
127
125
|
*/
|
|
128
126
|
export function createTypedMockComponentLoader(
|
|
129
|
-
components: Map<string, ComponentDefinition> = new Map()
|
|
127
|
+
components: Map<string, ComponentDefinition> = new Map(),
|
|
130
128
|
): TypedMockComponentLoader {
|
|
131
129
|
const storedComponents = new Map(components);
|
|
132
130
|
|
|
@@ -158,9 +156,7 @@ export interface TypedMockFs {
|
|
|
158
156
|
* Create a comprehensive mock file system (similar to fs/promises)
|
|
159
157
|
* @param initialFiles - Initial file content map (path -> content)
|
|
160
158
|
*/
|
|
161
|
-
export function createTypedMockFs(
|
|
162
|
-
initialFiles: Record<string, string> = {}
|
|
163
|
-
): TypedMockFs {
|
|
159
|
+
export function createTypedMockFs(initialFiles: Record<string, string> = {}): TypedMockFs {
|
|
164
160
|
const files = { ...initialFiles };
|
|
165
161
|
|
|
166
162
|
const makeError = (code: string, message: string) => {
|
|
@@ -186,7 +182,7 @@ export function createTypedMockFs(
|
|
|
186
182
|
delete files[path];
|
|
187
183
|
}),
|
|
188
184
|
readdir: mock(async (dir: string) => {
|
|
189
|
-
const normalizedDir = dir.endsWith('/') ? dir : dir
|
|
185
|
+
const normalizedDir = dir.endsWith('/') ? dir : `${dir}/`;
|
|
190
186
|
const entries = new Set<string>();
|
|
191
187
|
for (const path of Object.keys(files)) {
|
|
192
188
|
if (path.startsWith(normalizedDir)) {
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import { mock } from 'bun:test';
|
|
7
|
-
import type { ComponentNode,
|
|
7
|
+
import type { ComponentNode, PageData } from '../../shared/types';
|
|
8
8
|
import type { Path } from '../../shared/pathArrayUtils';
|
|
9
9
|
|
|
10
10
|
// ========== FileStore Types ==========
|
|
@@ -48,14 +48,13 @@ export interface MockFileStoreActions {
|
|
|
48
48
|
clearError: ReturnType<typeof mock>;
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
-
export type TypedMockFileStore = MockFileStoreState &
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
51
|
+
export type TypedMockFileStore = MockFileStoreState &
|
|
52
|
+
MockFileStoreActions & {
|
|
53
|
+
/** Get current state (for assertions) */
|
|
54
|
+
getState: () => MockFileStoreState;
|
|
55
|
+
};
|
|
55
56
|
|
|
56
|
-
export function createTypedMockFileStore(
|
|
57
|
-
initialState: Partial<MockFileStoreState> = {}
|
|
58
|
-
): TypedMockFileStore {
|
|
57
|
+
export function createTypedMockFileStore(initialState: Partial<MockFileStoreState> = {}): TypedMockFileStore {
|
|
59
58
|
const state: MockFileStoreState = {
|
|
60
59
|
files: [],
|
|
61
60
|
selectedFile: null,
|
|
@@ -137,7 +136,7 @@ export type TypedMockSelectionStore = MockSelectionStoreState &
|
|
|
137
136
|
};
|
|
138
137
|
|
|
139
138
|
export function createTypedMockSelectionStore(
|
|
140
|
-
initialState: Partial<MockSelectionStoreState> = {}
|
|
139
|
+
initialState: Partial<MockSelectionStoreState> = {},
|
|
141
140
|
): TypedMockSelectionStore {
|
|
142
141
|
const state: MockSelectionStoreState = {
|
|
143
142
|
selectedTreeItem: null,
|
|
@@ -208,9 +207,7 @@ export type TypedMockNodeStore = MockNodeStoreState &
|
|
|
208
207
|
getState: () => MockNodeStoreState;
|
|
209
208
|
};
|
|
210
209
|
|
|
211
|
-
export function createTypedMockNodeStore(
|
|
212
|
-
initialState: Partial<MockNodeStoreState> = {}
|
|
213
|
-
): TypedMockNodeStore {
|
|
210
|
+
export function createTypedMockNodeStore(initialState: Partial<MockNodeStoreState> = {}): TypedMockNodeStore {
|
|
214
211
|
const state: MockNodeStoreState = {
|
|
215
212
|
pageData: null,
|
|
216
213
|
isDirty: false,
|
|
@@ -225,19 +222,19 @@ export function createTypedMockNodeStore(
|
|
|
225
222
|
state.isDirty = false;
|
|
226
223
|
store.isDirty = false;
|
|
227
224
|
}),
|
|
228
|
-
updateNode: mock((
|
|
225
|
+
updateNode: mock((_path: Path, _updates: Partial<ComponentNode>) => {
|
|
229
226
|
state.isDirty = true;
|
|
230
227
|
store.isDirty = true;
|
|
231
228
|
}),
|
|
232
|
-
deleteNode: mock((
|
|
229
|
+
deleteNode: mock((_path: Path) => {
|
|
233
230
|
state.isDirty = true;
|
|
234
231
|
store.isDirty = true;
|
|
235
232
|
}),
|
|
236
|
-
addNode: mock((
|
|
233
|
+
addNode: mock((_parentPath: Path, _node: ComponentNode, _index?: number) => {
|
|
237
234
|
state.isDirty = true;
|
|
238
235
|
store.isDirty = true;
|
|
239
236
|
}),
|
|
240
|
-
moveNode: mock((
|
|
237
|
+
moveNode: mock((_fromPath: Path, _toPath: Path) => {
|
|
241
238
|
state.isDirty = true;
|
|
242
239
|
store.isDirty = true;
|
|
243
240
|
}),
|
|
@@ -275,7 +272,7 @@ export type TypedMockComponentStore = MockComponentStoreState &
|
|
|
275
272
|
};
|
|
276
273
|
|
|
277
274
|
export function createTypedMockComponentStore(
|
|
278
|
-
initialState: Partial<MockComponentStoreState> = {}
|
|
275
|
+
initialState: Partial<MockComponentStoreState> = {},
|
|
279
276
|
): TypedMockComponentStore {
|
|
280
277
|
const state: MockComponentStoreState = {
|
|
281
278
|
components: new Map(),
|
|
@@ -336,12 +333,8 @@ export interface TypedMockEditorServices {
|
|
|
336
333
|
export function createTypedMockEditorServices(): TypedMockEditorServices {
|
|
337
334
|
return {
|
|
338
335
|
fileService: {
|
|
339
|
-
loadAllFiles: mock(() =>
|
|
340
|
-
|
|
341
|
-
),
|
|
342
|
-
loadFileData: mock(() =>
|
|
343
|
-
Promise.resolve({ component: { type: 'div', children: [] } })
|
|
344
|
-
),
|
|
336
|
+
loadAllFiles: mock(() => Promise.resolve({ pages: [], components: [] })),
|
|
337
|
+
loadFileData: mock(() => Promise.resolve({ component: { type: 'div', children: [] } })),
|
|
345
338
|
saveFileData: mock(() => Promise.resolve()),
|
|
346
339
|
saveComponentJS: mock(() => Promise.resolve()),
|
|
347
340
|
saveComponentCSS: mock(() => Promise.resolve()),
|
|
@@ -359,12 +352,8 @@ export function createTypedMockEditorServices(): TypedMockEditorServices {
|
|
|
359
352
|
},
|
|
360
353
|
fileStoreService: {
|
|
361
354
|
loadFiles: mock(() => Promise.resolve()),
|
|
362
|
-
selectFile: mock(() =>
|
|
363
|
-
|
|
364
|
-
),
|
|
365
|
-
reloadSelectedFilePreservingSelection: mock(() =>
|
|
366
|
-
Promise.resolve({ component: { type: 'div', children: [] } })
|
|
367
|
-
),
|
|
355
|
+
selectFile: mock(() => Promise.resolve({ component: { type: 'div', children: [] } })),
|
|
356
|
+
reloadSelectedFilePreservingSelection: mock(() => Promise.resolve({ component: { type: 'div', children: [] } })),
|
|
368
357
|
},
|
|
369
358
|
};
|
|
370
359
|
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Common test data and fixtures for reuse across tests
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import type { Path } from
|
|
6
|
+
import type { Path } from '../shared/pathArrayUtils';
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Common test paths
|
|
@@ -24,14 +24,14 @@ export const TEST_PATHS = {
|
|
|
24
24
|
* Common component names for testing
|
|
25
25
|
*/
|
|
26
26
|
export const TEST_COMPONENTS = {
|
|
27
|
-
BUTTON:
|
|
28
|
-
CARD:
|
|
29
|
-
HEADER:
|
|
30
|
-
FOOTER:
|
|
31
|
-
LAYOUT:
|
|
32
|
-
GRID:
|
|
33
|
-
FORM:
|
|
34
|
-
INPUT:
|
|
27
|
+
BUTTON: 'Button',
|
|
28
|
+
CARD: 'Card',
|
|
29
|
+
HEADER: 'Header',
|
|
30
|
+
FOOTER: 'Footer',
|
|
31
|
+
LAYOUT: 'Layout',
|
|
32
|
+
GRID: 'Grid',
|
|
33
|
+
FORM: 'Form',
|
|
34
|
+
INPUT: 'Input',
|
|
35
35
|
};
|
|
36
36
|
|
|
37
37
|
/**
|
|
@@ -39,48 +39,48 @@ export const TEST_COMPONENTS = {
|
|
|
39
39
|
*/
|
|
40
40
|
export const SAMPLE_STRUCTURES = {
|
|
41
41
|
button: {
|
|
42
|
-
type:
|
|
42
|
+
type: 'button',
|
|
43
43
|
props: {
|
|
44
|
-
className:
|
|
45
|
-
onClick:
|
|
44
|
+
className: 'btn',
|
|
45
|
+
onClick: 'handleClick',
|
|
46
46
|
},
|
|
47
|
-
children: [
|
|
47
|
+
children: ['Click me'],
|
|
48
48
|
},
|
|
49
49
|
card: {
|
|
50
|
-
type:
|
|
50
|
+
type: 'div',
|
|
51
51
|
props: {
|
|
52
|
-
className:
|
|
52
|
+
className: 'card',
|
|
53
53
|
},
|
|
54
54
|
children: [
|
|
55
55
|
{
|
|
56
|
-
type:
|
|
57
|
-
props: { className:
|
|
58
|
-
children: [
|
|
56
|
+
type: 'h3',
|
|
57
|
+
props: { className: 'card-title' },
|
|
58
|
+
children: ['Card Title'],
|
|
59
59
|
},
|
|
60
60
|
{
|
|
61
|
-
type:
|
|
62
|
-
props: { className:
|
|
63
|
-
children: [
|
|
61
|
+
type: 'div',
|
|
62
|
+
props: { className: 'card-content' },
|
|
63
|
+
children: ['Card content here'],
|
|
64
64
|
},
|
|
65
65
|
],
|
|
66
66
|
},
|
|
67
67
|
layout: {
|
|
68
|
-
type:
|
|
68
|
+
type: 'div',
|
|
69
69
|
props: {
|
|
70
|
-
className:
|
|
70
|
+
className: 'layout',
|
|
71
71
|
},
|
|
72
72
|
children: [
|
|
73
73
|
{
|
|
74
|
-
type:
|
|
75
|
-
children: [
|
|
74
|
+
type: 'header',
|
|
75
|
+
children: ['Header'],
|
|
76
76
|
},
|
|
77
77
|
{
|
|
78
|
-
type:
|
|
79
|
-
children: [
|
|
78
|
+
type: 'main',
|
|
79
|
+
children: ['Content'],
|
|
80
80
|
},
|
|
81
81
|
{
|
|
82
|
-
type:
|
|
83
|
-
children: [
|
|
82
|
+
type: 'footer',
|
|
83
|
+
children: ['Footer'],
|
|
84
84
|
},
|
|
85
85
|
],
|
|
86
86
|
},
|
|
@@ -91,21 +91,21 @@ export const SAMPLE_STRUCTURES = {
|
|
|
91
91
|
*/
|
|
92
92
|
export const SAMPLE_PROPS = {
|
|
93
93
|
buttonPrimary: {
|
|
94
|
-
variant:
|
|
95
|
-
size:
|
|
94
|
+
variant: 'primary',
|
|
95
|
+
size: 'md',
|
|
96
96
|
disabled: false,
|
|
97
97
|
},
|
|
98
98
|
buttonSecondary: {
|
|
99
|
-
variant:
|
|
100
|
-
size:
|
|
99
|
+
variant: 'secondary',
|
|
100
|
+
size: 'lg',
|
|
101
101
|
disabled: false,
|
|
102
102
|
},
|
|
103
103
|
cardVariant: {
|
|
104
|
-
variant:
|
|
104
|
+
variant: 'elevated',
|
|
105
105
|
compact: false,
|
|
106
106
|
},
|
|
107
107
|
layoutProps: {
|
|
108
|
-
spacing:
|
|
108
|
+
spacing: 'default',
|
|
109
109
|
responsive: true,
|
|
110
110
|
},
|
|
111
111
|
};
|
|
@@ -114,12 +114,12 @@ export const SAMPLE_PROPS = {
|
|
|
114
114
|
* Error messages for testing error handling
|
|
115
115
|
*/
|
|
116
116
|
export const ERROR_MESSAGES = {
|
|
117
|
-
RENDER_ERROR:
|
|
118
|
-
STRUCTURE_MISSING:
|
|
119
|
-
INVALID_PROP_TYPE:
|
|
120
|
-
TEMPLATE_ERROR:
|
|
121
|
-
COMPONENT_NOT_FOUND:
|
|
122
|
-
PATH_RESOLUTION:
|
|
117
|
+
RENDER_ERROR: 'Component render failed',
|
|
118
|
+
STRUCTURE_MISSING: 'Component structure missing',
|
|
119
|
+
INVALID_PROP_TYPE: 'Invalid prop type',
|
|
120
|
+
TEMPLATE_ERROR: 'Template evaluation error',
|
|
121
|
+
COMPONENT_NOT_FOUND: 'Component not found',
|
|
122
|
+
PATH_RESOLUTION: 'Failed to resolve path',
|
|
123
123
|
};
|
|
124
124
|
|
|
125
125
|
/**
|
|
@@ -127,8 +127,8 @@ export const ERROR_MESSAGES = {
|
|
|
127
127
|
*/
|
|
128
128
|
export const DEFAULT_TEST_CONFIG = {
|
|
129
129
|
timeout: 5000,
|
|
130
|
-
scrollBehavior:
|
|
131
|
-
outlineColor:
|
|
132
|
-
outlineWidth:
|
|
133
|
-
outlineStyle:
|
|
130
|
+
scrollBehavior: 'smooth' as const,
|
|
131
|
+
outlineColor: '#007acc',
|
|
132
|
+
outlineWidth: '2px',
|
|
133
|
+
outlineStyle: 'solid' as const,
|
|
134
134
|
};
|
|
@@ -1,31 +1,26 @@
|
|
|
1
1
|
import { describe, test, expect } from 'bun:test';
|
|
2
|
-
import {
|
|
3
|
-
waitFor,
|
|
4
|
-
flushPromises,
|
|
5
|
-
wait,
|
|
6
|
-
createDeferred,
|
|
7
|
-
retry,
|
|
8
|
-
createCallCounter,
|
|
9
|
-
} from './asyncHelpers';
|
|
2
|
+
import { waitFor, flushPromises, wait, createDeferred, retry, createCallCounter } from './asyncHelpers';
|
|
10
3
|
|
|
11
4
|
describe('asyncHelpers', () => {
|
|
12
5
|
describe('waitFor', () => {
|
|
13
6
|
test('resolves when condition is true', async () => {
|
|
14
7
|
let value = false;
|
|
15
|
-
setTimeout(() => {
|
|
8
|
+
setTimeout(() => {
|
|
9
|
+
value = true;
|
|
10
|
+
}, 50);
|
|
16
11
|
await waitFor(() => value);
|
|
17
12
|
expect(value).toBe(true);
|
|
18
13
|
});
|
|
19
14
|
|
|
20
15
|
test('throws on timeout', async () => {
|
|
21
|
-
await expect(
|
|
22
|
-
waitFor(() => false, { timeout: 100 })
|
|
23
|
-
).rejects.toThrow('timed out');
|
|
16
|
+
await expect(waitFor(() => false, { timeout: 100 })).rejects.toThrow('timed out');
|
|
24
17
|
});
|
|
25
18
|
|
|
26
19
|
test('handles async conditions', async () => {
|
|
27
20
|
let value = false;
|
|
28
|
-
setTimeout(() => {
|
|
21
|
+
setTimeout(() => {
|
|
22
|
+
value = true;
|
|
23
|
+
}, 50);
|
|
29
24
|
await waitFor(async () => value);
|
|
30
25
|
expect(value).toBe(true);
|
|
31
26
|
});
|
|
@@ -34,7 +29,9 @@ describe('asyncHelpers', () => {
|
|
|
34
29
|
describe('flushPromises', () => {
|
|
35
30
|
test('waits for microtask queue', async () => {
|
|
36
31
|
let resolved = false;
|
|
37
|
-
Promise.resolve().then(() => {
|
|
32
|
+
Promise.resolve().then(() => {
|
|
33
|
+
resolved = true;
|
|
34
|
+
});
|
|
38
35
|
expect(resolved).toBe(false);
|
|
39
36
|
await flushPromises();
|
|
40
37
|
expect(resolved).toBe(true);
|
|
@@ -85,10 +82,10 @@ describe('asyncHelpers', () => {
|
|
|
85
82
|
});
|
|
86
83
|
|
|
87
84
|
test('throws after max attempts', async () => {
|
|
88
|
-
const fn = () => {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
).rejects.toThrow('Always fails');
|
|
85
|
+
const fn = () => {
|
|
86
|
+
throw new Error('Always fails');
|
|
87
|
+
};
|
|
88
|
+
await expect(retry(fn, { maxAttempts: 2, delay: 10 })).rejects.toThrow('Always fails');
|
|
92
89
|
});
|
|
93
90
|
});
|
|
94
91
|
|