@xiwebdesign/xicms-core 5.2.0 → 5.4.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/dist/XiCMSProvider.d.ts +11 -2
- package/dist/XiCMSProvider.js +10 -5
- package/dist/XiCMSProvider.js.map +1 -1
- package/dist/admin/blockEditors/GenericEditor.js +18 -8
- package/dist/admin/blockEditors/GenericEditor.js.map +1 -1
- package/dist/admin/blockEditors/index.js +2 -2
- package/dist/admin/blockEditors/index.js.map +1 -1
- package/dist/admin/customBlocks/CustomBlocksPanel.js +12 -2
- package/dist/admin/customBlocks/CustomBlocksPanel.js.map +1 -1
- package/dist/admin/lib/pagesClient.js +4 -1
- package/dist/admin/lib/pagesClient.js.map +1 -1
- package/dist/admin/lib/upload.js +14 -7
- package/dist/admin/lib/upload.js.map +1 -1
- package/dist/admin/media/MediaManager.js +60 -28
- package/dist/admin/media/MediaManager.js.map +1 -1
- package/dist/admin/media/MediaPicker.js +25 -15
- package/dist/admin/media/MediaPicker.js.map +1 -1
- package/dist/admin/pages/PageEditor.d.ts +2 -1
- package/dist/admin/pages/PageEditor.js +16 -2
- package/dist/admin/pages/PageEditor.js.map +1 -1
- package/dist/admin/pages/PagesPanel.js +9 -5
- package/dist/admin/pages/PagesPanel.js.map +1 -1
- package/dist/admin/visual/VisualEditor.js +11 -2
- package/dist/admin/visual/VisualEditor.js.map +1 -1
- package/dist/agentFiles/files.d.ts +15 -3
- package/dist/agentFiles/files.js +57 -0
- package/dist/agentFiles/files.js.map +1 -1
- package/dist/auth/AuthProvider.js +3 -3
- package/dist/auth/AuthProvider.js.map +1 -1
- package/dist/blocks/builtins/Booking.js +1 -1
- package/dist/blocks/builtins/Booking.js.map +1 -1
- package/dist/blocks/builtins/Columns.js +1 -1
- package/dist/blocks/builtins/Columns.js.map +1 -1
- package/dist/blocks/builtins/Embed.js +2 -0
- package/dist/blocks/builtins/Embed.js.map +1 -1
- package/dist/blocks/builtins/Gallery.js +2 -2
- package/dist/blocks/builtins/Gallery.js.map +1 -1
- package/dist/blocks/builtins/Hero.js +46 -7
- package/dist/blocks/builtins/Hero.js.map +1 -1
- package/dist/blocks/builtins/ImageBlock.js +14 -3
- package/dist/blocks/builtins/ImageBlock.js.map +1 -1
- package/dist/blocks/builtins/Jobs.d.ts +2 -2
- package/dist/blocks/builtins/Jobs.js +1 -1
- package/dist/blocks/builtins/Jobs.js.map +1 -1
- package/dist/blocks/builtins/Newsletter.js +18 -5
- package/dist/blocks/builtins/Newsletter.js.map +1 -1
- package/dist/blocks/builtins/Pricing.js +3 -1
- package/dist/blocks/builtins/Pricing.js.map +1 -1
- package/dist/blocks/builtins/Sections.js +4 -4
- package/dist/blocks/builtins/Sections.js.map +1 -1
- package/dist/blocks/builtins/Slider.js +9 -4
- package/dist/blocks/builtins/Slider.js.map +1 -1
- package/dist/blocks/builtins/SymbolRef.js.map +1 -1
- package/dist/blocks/builtins/Video.js +1 -1
- package/dist/blocks/builtins/Video.js.map +1 -1
- package/dist/blocks/builtins/Widgets.js +2 -1
- package/dist/blocks/builtins/Widgets.js.map +1 -1
- package/dist/components/PageView.js +4 -3
- package/dist/components/PageView.js.map +1 -1
- package/dist/demo/index.d.ts +7 -0
- package/dist/demo/index.js +23 -0
- package/dist/demo/index.js.map +1 -0
- package/dist/index.d.ts +2 -4
- package/dist/index.js +0 -20
- package/dist/index.js.map +1 -1
- package/dist/modules/registry.d.ts +3 -4
- package/dist/modules/registry.js +2 -3
- package/dist/modules/registry.js.map +1 -1
- package/dist/schema/blocks.d.ts +27 -90
- package/dist/schema/blocks.js +4 -6
- package/dist/schema/blocks.js.map +1 -1
- package/dist/schema/settings.d.ts +1 -34
- package/dist/schema/settings.js +2 -8
- package/dist/schema/settings.js.map +1 -1
- package/dist/schema/siteConfig.d.ts +3 -71
- package/dist/schema/siteConfig.js +3 -8
- package/dist/schema/siteConfig.js.map +1 -1
- package/dist/schema/symbols.d.ts +2 -2
- package/dist/schema/symbols.js.map +1 -1
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.js +2 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/pages.d.ts +23 -3
- package/dist/server/pages.js +37 -3
- package/dist/server/pages.js.map +1 -1
- package/dist/server/seo.js +5 -3
- package/dist/server/seo.js.map +1 -1
- package/dist/settings/useSiteSettings.d.ts +15 -3
- package/dist/settings/useSiteSettings.js +26 -5
- package/dist/settings/useSiteSettings.js.map +1 -1
- package/dist/styles.css +64 -9
- package/package.json +6 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Publieke runtime-API van @xiwebdesign/xicms-core (lichte client/runtime laag).\n * - Admin (TipTap/Radix) zit in \"@xiwebdesign/xicms-core/admin\".\n * - Server-only code (firebase-admin, sanitize, SEO) zit in \"@xiwebdesign/xicms-core/server\".\n * - Pure schema's in \"@xiwebdesign/xicms-core/schema\".\n */\n\n// Provider & config\nexport { XiCMSProvider } from \"./XiCMSProvider\";\nexport { useSiteConfig } from \"./config\";\n\n// Theming & design-primitieven (maatwerk zonder core te forken).\n// - `defineTheme` maakt een eigen Astryx-thema (tokens + component-overrides) → geef door als\n// XiCMSProvider `astryxTheme`-prop.\n// - De `ui`-primitieven (Card/Stack/Grid/Heading/Text/Btn…) zijn de bouwstenen waarop de ingebouwde\n// blokken draaien; gebruik ze in eigen blokken voor een consistent maar te herstijlen uiterlijk.\nexport { defineTheme, useTheme } from \"@astryxdesign/core/theme\";\nexport type { DefinedTheme } from \"@astryxdesign/core/theme\";\n// Framework-router-integratie: geef `next/link` door als XiCMSProvider `linkComponent`-prop\n// (soepele client-nav + prefetch op alle Astryx-knoppen/links). `useLinkComponent` voor eigen blokken.\nexport { LinkProvider, useLinkComponent } from \"@astryxdesign/core/Link\";\nexport type { LinkComponentType } from \"@astryxdesign/core/Link\";\n// Beeldoptimalisatie: geef `next/image` door als XiCMSProvider `imageComponent`-prop. `Img` is de\n// wrapper die de blokken gebruiken; `useImageComponent` voor eigen blokken.\nexport { Img, ImageProvider, useImageComponent, InlineImageEditProvider } from \"./media/ImageContext\";\nexport type { ImageComponentType, ImgProps } from \"./media/ImageContext\";\nexport * from \"./blocks/ui\";\nexport {\n SiteSettingsProvider,\n useSiteSettings,\n useMergedSiteConfig,\n} from \"./settings/useSiteSettings\";\nexport { SiteFooter } from \"./components/site/SiteFooter\";\nexport { EditorProvider, useEditor } from \"./editor/EditorProvider\";\nexport {\n definePattern,\n instantiatePattern,\n collectPatternTypes,\n builtinPatterns,\n type Pattern,\n type PatternBlock,\n} from \"./patterns\";\nexport { builtinThemePresets, type ThemePreset } from \"./theme/presets\";\nexport { defineSiteConfig } from \"./schema/siteConfig\";\nexport type { SiteConfig, SiteMode } from \"./schema/siteConfig\";\n// 5.0: Field-IR (primo-port), symbolen en custom blocks.\nexport { FieldSchema, FieldsSchema, fieldsToZod, fieldsDefaults, isFieldVisible, isRichTextKey } from \"./schema/fields\";\nexport type { Field, FieldHints, ShowIf } from \"./schema/fields\";\nexport { SymbolSchema } from \"./schema/symbols\";\nexport type {
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * Publieke runtime-API van @xiwebdesign/xicms-core (lichte client/runtime laag).\n * - Admin (TipTap/Radix) zit in \"@xiwebdesign/xicms-core/admin\".\n * - Server-only code (firebase-admin, sanitize, SEO) zit in \"@xiwebdesign/xicms-core/server\".\n * - Pure schema's in \"@xiwebdesign/xicms-core/schema\".\n */\n\n// Provider & config\nexport { XiCMSProvider } from \"./XiCMSProvider\";\nexport { useSiteConfig } from \"./config\";\n\n// Theming & design-primitieven (maatwerk zonder core te forken).\n// - `defineTheme` maakt een eigen Astryx-thema (tokens + component-overrides) → geef door als\n// XiCMSProvider `astryxTheme`-prop.\n// - De `ui`-primitieven (Card/Stack/Grid/Heading/Text/Btn…) zijn de bouwstenen waarop de ingebouwde\n// blokken draaien; gebruik ze in eigen blokken voor een consistent maar te herstijlen uiterlijk.\nexport { defineTheme, useTheme } from \"@astryxdesign/core/theme\";\nexport type { DefinedTheme } from \"@astryxdesign/core/theme\";\n// Framework-router-integratie: geef `next/link` door als XiCMSProvider `linkComponent`-prop\n// (soepele client-nav + prefetch op alle Astryx-knoppen/links). `useLinkComponent` voor eigen blokken.\nexport { LinkProvider, useLinkComponent } from \"@astryxdesign/core/Link\";\nexport type { LinkComponentType } from \"@astryxdesign/core/Link\";\n// Beeldoptimalisatie: geef `next/image` door als XiCMSProvider `imageComponent`-prop. `Img` is de\n// wrapper die de blokken gebruiken; `useImageComponent` voor eigen blokken.\nexport { Img, ImageProvider, useImageComponent, InlineImageEditProvider } from \"./media/ImageContext\";\nexport type { ImageComponentType, ImgProps } from \"./media/ImageContext\";\nexport * from \"./blocks/ui\";\nexport {\n SiteSettingsProvider,\n useSiteSettings,\n useMergedSiteConfig,\n} from \"./settings/useSiteSettings\";\nexport { SiteFooter } from \"./components/site/SiteFooter\";\nexport { EditorProvider, useEditor } from \"./editor/EditorProvider\";\nexport {\n definePattern,\n instantiatePattern,\n collectPatternTypes,\n builtinPatterns,\n type Pattern,\n type PatternBlock,\n} from \"./patterns\";\nexport { builtinThemePresets, type ThemePreset } from \"./theme/presets\";\nexport { defineSiteConfig } from \"./schema/siteConfig\";\nexport type { SiteConfig, SiteMode } from \"./schema/siteConfig\";\n// 5.0: Field-IR (primo-port), symbolen en custom blocks.\nexport { FieldSchema, FieldsSchema, fieldsToZod, fieldsDefaults, isFieldVisible, isRichTextKey } from \"./schema/fields\";\nexport type { Field, FieldHints, ShowIf } from \"./schema/fields\";\nexport { SymbolSchema } from \"./schema/symbols\";\nexport type { SymbolDefinition, StoredSymbol } from \"./schema/symbols\";\nexport { CustomBlockSchema } from \"./schema/customBlocks\";\nexport type { CustomBlock, CustomBlock as CustomBlockData } from \"./schema/customBlocks\";\nexport { customBlockToDefinition } from \"./blocks/customTemplate/definition\";\nexport { interpretTemplate, scopeCss } from \"./blocks/customTemplate/interpret\";\n// 5.0: localisatie — overlay-model (primo's locale-per-waarde, additief vertaald).\nexport {\n siteLocales,\n parseLocaleSlugs,\n localizedPath,\n localizePage,\n localizeBlocks,\n pruneTranslations,\n TranslationsSchema,\n} from \"./i18n/overlay\";\nexport type { Translations, LocaleConfig } from \"./i18n/overlay\";\nexport type { ThemeTokens, NavItem, SiteSettings, PublicSiteSettings, FormsSender } from \"./schema/settings\";\nexport type { Seo } from \"./schema/seo\";\nexport type { Page, PageStatus } from \"./schema/pages\";\nexport type { FormDefinition, FormField } from \"./schema/forms\";\n\n// Auth\nexport { AuthProvider, useAuth } from \"./auth/AuthProvider\";\nexport { LoginForm } from \"./auth/LoginForm\";\nexport {\n roleForSite,\n canEdit,\n canManageSite,\n isSuperadmin,\n type Role,\n type XiClaims,\n} from \"./auth/roles\";\n\n// De legacy inline-laag (ContentProvider/useContent + EditableText/EditableRichText/EditableImage,\n// het v1 platte `cms/content`-model) is in 5.0 VERWIJDERD, zoals bij de deprecatie aangekondigd.\n// Inline bewerken loopt via het block-model: markeer tekstvelden met `data-xicms-edit` in de Render.\nexport type { NewsArticle, MediaItem, MediaVariant } from \"./content/types\";\n\nexport { EditBar } from \"./components/EditBar\";\nexport { ResponsiveImage } from \"./components/ResponsiveImage\";\nexport { PageView } from \"./components/PageView\";\nexport { NewsList, NewsArticleView, useNews } from \"./components/News\";\n\n// Block-systeem (runtime: registry + renderer; editors zitten in /admin)\nexport {\n defineBlock,\n createRegistry,\n mergeRegistry,\n validateBlocks,\n buildBlockAddOptions,\n type BlockDefinition,\n type BlockRegistry,\n type BlockRenderProps,\n type BlockEditorProps,\n type BlockCategory,\n} from \"./blocks/registry\";\nexport { BlockRenderer } from \"./blocks/BlockRenderer\";\nexport { RegistryProvider, useRegistry } from \"./blocks/context\";\nexport { builtinBlocks, ConsentEmbed } from \"./blocks/builtins\";\nexport { PageRenderer } from \"./render/PageRenderer\";\nexport { PublishedPage } from \"./render/PublishedPage\";\n\n// Module-systeem (XiCMS 3.0): modules bundelen blocks + instellingen; per site aan/uit + te stylen.\nexport {\n defineModule,\n resolveModules,\n isModuleActive,\n ModulesProvider,\n useModules,\n useModuleActive,\n useModuleSettings,\n applyBlockOverrides,\n moduleIdForBlockType,\n builtinModules,\n validateModuleContract,\n assertModuleContract,\n useConsent,\n ConsentBanner,\n ConsentGate,\n ConsentReopenLink,\n type ConsentState,\n type ConsentSettings,\n type ConsentCategory,\n type ModuleDefinition,\n type ModuleSiteSetting,\n type ModulesSiteConfig,\n type Capability,\n type ResolvedModules,\n type BlockOverride,\n type BlockOverrides,\n} from \"./modules\";\n\n// Demo-lock\nexport { DemoLock } from \"./lock/DemoLock\";\n\n// Demo-bewerkmodus (lokaal-only) leeft op het subpad `@xiwebdesign/xicms-core/demo` — dit zijn\n// demo-store-internals die niet in de publieke runtime-API thuishoren (klantsites gebruiken ze nooit;\n// alleen de XiCMS.nl-showcase). DemoStudio wordt intern door XiCMSProvider gerenderd.\n\n// Firebase (client)\nexport {\n getFirebaseApp,\n getFirebaseAuth,\n getDb,\n getBucket,\n isFirebaseConfigured,\n} from \"./firebase/client\";\nexport { initAppCheck } from \"./firebase/appcheck\";\n"],"mappings":"AAQA,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;AAO9B,SAAS,aAAa,gBAAgB;AAItC,SAAS,cAAc,wBAAwB;AAI/C,SAAS,KAAK,eAAe,mBAAmB,+BAA+B;AAE/E,cAAc;AACd;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,kBAAkB;AAC3B,SAAS,gBAAgB,iBAAiB;AAC1C;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AACP,SAAS,2BAA6C;AACtD,SAAS,wBAAwB;AAGjC,SAAS,aAAa,cAAc,aAAa,gBAAgB,gBAAgB,qBAAqB;AAEtG,SAAS,oBAAoB;AAE7B,SAAS,yBAAyB;AAElC,SAAS,+BAA+B;AACxC,SAAS,mBAAmB,gBAAgB;AAE5C;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAQP,SAAS,cAAc,eAAe;AACtC,SAAS,iBAAiB;AAC1B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AAOP,SAAS,eAAe;AACxB,SAAS,uBAAuB;AAChC,SAAS,gBAAgB;AACzB,SAAS,UAAU,iBAAiB,eAAe;AAGnD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAMK;AACP,SAAS,qBAAqB;AAC9B,SAAS,kBAAkB,mBAAmB;AAC9C,SAAS,eAAe,oBAAoB;AAC5C,SAAS,oBAAoB;AAC7B,SAAS,qBAAqB;AAG9B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAWK;AAGP,SAAS,gBAAgB;AAOzB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,oBAAoB;","names":[]}
|
|
@@ -19,17 +19,16 @@ export interface ResolvedModules {
|
|
|
19
19
|
* Is een module actief? Precedentie:
|
|
20
20
|
* 1. `core: true` -> altijd actief.
|
|
21
21
|
* 2. expliciet `modules[id]` -> boolean of `{ enabled }`.
|
|
22
|
-
* 3.
|
|
23
|
-
*
|
|
22
|
+
* 3. `defaultEnabled` -> default true.
|
|
23
|
+
* (De legacy `features`-brug uit 2.x is in 5.4 verwijderd — gebruik `modules`.)
|
|
24
24
|
*/
|
|
25
|
-
export declare function isModuleActive(def: ModuleDefinition, modules?: ModulesSiteConfig
|
|
25
|
+
export declare function isModuleActive(def: ModuleDefinition, modules?: ModulesSiteConfig): boolean;
|
|
26
26
|
/**
|
|
27
27
|
* Stelt de actieve modules samen. `defs` = ingebouwde + (optioneel) klant-modules; latere
|
|
28
28
|
* definities met dezelfde `id` overschrijven eerdere (zo kan een site een built-in vervangen).
|
|
29
29
|
*/
|
|
30
30
|
export declare function resolveModules(defs: ModuleDefinition[], opts?: {
|
|
31
31
|
modules?: ModulesSiteConfig;
|
|
32
|
-
features?: Record<string, boolean | undefined>;
|
|
33
32
|
/**
|
|
34
33
|
* Per-site instellingen uit Firestore (`settings/public.modules`), bewerkt in /beheer. Worden
|
|
35
34
|
* OVER `modules` (uit SiteConfig) gelegd. Precedentie: core > firestore > SiteConfig > default.
|
package/dist/modules/registry.js
CHANGED
|
@@ -16,14 +16,13 @@ function mergeModuleConfig(a, b) {
|
|
|
16
16
|
function settingFor(id, modules) {
|
|
17
17
|
return modules?.[id];
|
|
18
18
|
}
|
|
19
|
-
function isModuleActive(def, modules
|
|
19
|
+
function isModuleActive(def, modules) {
|
|
20
20
|
if (def.core) return true;
|
|
21
21
|
const explicit = settingFor(def.id, modules);
|
|
22
22
|
if (typeof explicit === "boolean") return explicit;
|
|
23
23
|
if (explicit && typeof explicit === "object" && typeof explicit.enabled === "boolean") {
|
|
24
24
|
return explicit.enabled;
|
|
25
25
|
}
|
|
26
|
-
if (def.featureKey && features && features[def.featureKey] === false) return false;
|
|
27
26
|
return def.defaultEnabled ?? true;
|
|
28
27
|
}
|
|
29
28
|
function configFor(id, modules) {
|
|
@@ -45,7 +44,7 @@ function resolveModules(defs, opts) {
|
|
|
45
44
|
const resolvedDefs = order.map((id) => byId.get(id));
|
|
46
45
|
for (const id of order) {
|
|
47
46
|
const def = byId.get(id);
|
|
48
|
-
if (!isModuleActive(def, merged
|
|
47
|
+
if (!isModuleActive(def, merged)) continue;
|
|
49
48
|
activeIds.add(id);
|
|
50
49
|
if (def.blocks) blocks.push(...def.blocks);
|
|
51
50
|
settings[id] = resolveSettings(def, configFor(id, merged));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/modules/registry.ts"],"sourcesContent":["/**\n * Module-resolutie: bepaalt welke modules actief zijn voor een site en levert daaruit de\n * block-lijst en de samengestelde instellingen. Pure logica (geen React/Firebase): bruikbaar op\n * server (publieke rendering) én client (provider).\n */\nimport type { BlockDefinition } from \"../blocks/registry\";\nimport type { ModuleDefinition, ModulesSiteConfig, ModuleSiteSetting } from \"./types\";\n\nexport interface ResolvedModules {\n /** Actieve module-ids. */\n activeIds: Set<string>;\n /** Blocks van alle actieve modules (volgorde = module-volgorde). */\n blocks: BlockDefinition[];\n /** Per actieve module: defaultSettings gemerged met de per-site config. */\n settings: Record<string, Record<string, unknown>>;\n /** Alle bekende module-definities (gededupliceerd) — voor het instellingenpaneel. */\n defs: ModuleDefinition[];\n}\n\n/** Voegt twee module-config-bronnen samen op id (b overschrijft a). */\nfunction mergeModuleConfig(\n a: ModulesSiteConfig | undefined,\n b: ModulesSiteConfig | undefined,\n): ModulesSiteConfig {\n const out: ModulesSiteConfig = { ...(a ?? {}) };\n for (const [id, setting] of Object.entries(b ?? {})) {\n const prev = out[id];\n if (\n prev &&\n typeof prev === \"object\" &&\n typeof setting === \"object\" &&\n setting !== null\n ) {\n out[id] = {\n enabled: setting.enabled ?? prev.enabled,\n config: { ...(prev.config ?? {}), ...(setting.config ?? {}) },\n };\n } else {\n out[id] = setting;\n }\n }\n return out;\n}\n\nfunction settingFor(\n id: string,\n modules: ModulesSiteConfig | undefined,\n): ModuleSiteSetting | undefined {\n return modules?.[id];\n}\n\n/**\n * Is een module actief? Precedentie:\n * 1. `core: true` -> altijd actief.\n * 2. expliciet `modules[id]` -> boolean of `{ enabled }`.\n * 3.
|
|
1
|
+
{"version":3,"sources":["../../src/modules/registry.ts"],"sourcesContent":["/**\n * Module-resolutie: bepaalt welke modules actief zijn voor een site en levert daaruit de\n * block-lijst en de samengestelde instellingen. Pure logica (geen React/Firebase): bruikbaar op\n * server (publieke rendering) én client (provider).\n */\nimport type { BlockDefinition } from \"../blocks/registry\";\nimport type { ModuleDefinition, ModulesSiteConfig, ModuleSiteSetting } from \"./types\";\n\nexport interface ResolvedModules {\n /** Actieve module-ids. */\n activeIds: Set<string>;\n /** Blocks van alle actieve modules (volgorde = module-volgorde). */\n blocks: BlockDefinition[];\n /** Per actieve module: defaultSettings gemerged met de per-site config. */\n settings: Record<string, Record<string, unknown>>;\n /** Alle bekende module-definities (gededupliceerd) — voor het instellingenpaneel. */\n defs: ModuleDefinition[];\n}\n\n/** Voegt twee module-config-bronnen samen op id (b overschrijft a). */\nfunction mergeModuleConfig(\n a: ModulesSiteConfig | undefined,\n b: ModulesSiteConfig | undefined,\n): ModulesSiteConfig {\n const out: ModulesSiteConfig = { ...(a ?? {}) };\n for (const [id, setting] of Object.entries(b ?? {})) {\n const prev = out[id];\n if (\n prev &&\n typeof prev === \"object\" &&\n typeof setting === \"object\" &&\n setting !== null\n ) {\n out[id] = {\n enabled: setting.enabled ?? prev.enabled,\n config: { ...(prev.config ?? {}), ...(setting.config ?? {}) },\n };\n } else {\n out[id] = setting;\n }\n }\n return out;\n}\n\nfunction settingFor(\n id: string,\n modules: ModulesSiteConfig | undefined,\n): ModuleSiteSetting | undefined {\n return modules?.[id];\n}\n\n/**\n * Is een module actief? Precedentie:\n * 1. `core: true` -> altijd actief.\n * 2. expliciet `modules[id]` -> boolean of `{ enabled }`.\n * 3. `defaultEnabled` -> default true.\n * (De legacy `features`-brug uit 2.x is in 5.4 verwijderd — gebruik `modules`.)\n */\nexport function isModuleActive(def: ModuleDefinition, modules?: ModulesSiteConfig): boolean {\n if (def.core) return true;\n\n const explicit = settingFor(def.id, modules);\n if (typeof explicit === \"boolean\") return explicit;\n if (explicit && typeof explicit === \"object\" && typeof explicit.enabled === \"boolean\") {\n return explicit.enabled;\n }\n\n return def.defaultEnabled ?? true;\n}\n\nfunction configFor(\n id: string,\n modules?: ModulesSiteConfig,\n): Record<string, unknown> | undefined {\n const s = settingFor(id, modules);\n if (s && typeof s === \"object\" && s.config) return s.config;\n return undefined;\n}\n\n/**\n * Stelt de actieve modules samen. `defs` = ingebouwde + (optioneel) klant-modules; latere\n * definities met dezelfde `id` overschrijven eerdere (zo kan een site een built-in vervangen).\n */\nexport function resolveModules(\n defs: ModuleDefinition[],\n opts?: {\n modules?: ModulesSiteConfig;\n /**\n * Per-site instellingen uit Firestore (`settings/public.modules`), bewerkt in /beheer. Worden\n * OVER `modules` (uit SiteConfig) gelegd. Precedentie: core > firestore > SiteConfig > default.\n */\n firestoreModules?: ModulesSiteConfig;\n },\n): ResolvedModules {\n // Dedup op id (laatste wint), volgorde behouden van eerste verschijning.\n const byId = new Map<string, ModuleDefinition>();\n const order: string[] = [];\n for (const d of defs) {\n if (!byId.has(d.id)) order.push(d.id);\n byId.set(d.id, d);\n }\n\n const merged = mergeModuleConfig(opts?.modules, opts?.firestoreModules);\n\n const activeIds = new Set<string>();\n const blocks: BlockDefinition[] = [];\n const settings: Record<string, Record<string, unknown>> = {};\n const resolvedDefs: ModuleDefinition[] = order.map((id) => byId.get(id)!);\n\n for (const id of order) {\n const def = byId.get(id)!;\n if (!isModuleActive(def, merged)) continue;\n activeIds.add(id);\n if (def.blocks) blocks.push(...def.blocks);\n settings[id] = resolveSettings(def, configFor(id, merged));\n }\n\n return { activeIds, blocks, settings, defs: resolvedDefs };\n}\n\n/**\n * Stelt de runtime-instellingen van één module samen: `defaultSettings` ⊕ per-site `config`,\n * daarna door het `settingsSchema` gehaald (indien aanwezig). Zo worden schema-`.default()`s\n * daadwerkelijk geïnjecteerd en wordt ongeldige config gevalideerd i.p.v. blind doorgegeven.\n * Bij een schema-fout valt dit terug op de ongevalideerde merge (mét console-waarschuwing) —\n * nooit stil een module z'n instellingen afpakken.\n */\nfunction resolveSettings(\n def: ModuleDefinition,\n config: Record<string, unknown> | undefined,\n): Record<string, unknown> {\n const merged = { ...(def.defaultSettings ?? {}), ...(config ?? {}) };\n if (!def.settingsSchema) return merged;\n const res = def.settingsSchema.safeParse(merged);\n if (res.success) return res.data as Record<string, unknown>;\n if (typeof console !== \"undefined\") {\n console.warn(\n `[xicms] instellingen van module \"${def.id}\" voldoen niet aan het settingsSchema; ongevalideerde waarden gebruikt.`,\n res.error.issues,\n );\n }\n return merged;\n}\n\n/** Geeft het module-id dat een block-type levert (voor \"module staat uit\"-waarschuwingen). */\nexport function moduleIdForBlockType(defs: ModuleDefinition[], type: string): string | undefined {\n for (const d of defs) {\n if (d.blocks?.some((b) => b.type === type)) return d.id;\n }\n return undefined;\n}\n"],"mappings":"AAoBA,SAAS,kBACP,GACA,GACmB;AACnB,QAAM,MAAyB,EAAE,GAAI,KAAK,CAAC,EAAG;AAC9C,aAAW,CAAC,IAAI,OAAO,KAAK,OAAO,QAAQ,KAAK,CAAC,CAAC,GAAG;AACnD,UAAM,OAAO,IAAI,EAAE;AACnB,QACE,QACA,OAAO,SAAS,YAChB,OAAO,YAAY,YACnB,YAAY,MACZ;AACA,UAAI,EAAE,IAAI;AAAA,QACR,SAAS,QAAQ,WAAW,KAAK;AAAA,QACjC,QAAQ,EAAE,GAAI,KAAK,UAAU,CAAC,GAAI,GAAI,QAAQ,UAAU,CAAC,EAAG;AAAA,MAC9D;AAAA,IACF,OAAO;AACL,UAAI,EAAE,IAAI;AAAA,IACZ;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,WACP,IACA,SAC+B;AAC/B,SAAO,UAAU,EAAE;AACrB;AASO,SAAS,eAAe,KAAuB,SAAsC;AAC1F,MAAI,IAAI,KAAM,QAAO;AAErB,QAAM,WAAW,WAAW,IAAI,IAAI,OAAO;AAC3C,MAAI,OAAO,aAAa,UAAW,QAAO;AAC1C,MAAI,YAAY,OAAO,aAAa,YAAY,OAAO,SAAS,YAAY,WAAW;AACrF,WAAO,SAAS;AAAA,EAClB;AAEA,SAAO,IAAI,kBAAkB;AAC/B;AAEA,SAAS,UACP,IACA,SACqC;AACrC,QAAM,IAAI,WAAW,IAAI,OAAO;AAChC,MAAI,KAAK,OAAO,MAAM,YAAY,EAAE,OAAQ,QAAO,EAAE;AACrD,SAAO;AACT;AAMO,SAAS,eACd,MACA,MAQiB;AAEjB,QAAM,OAAO,oBAAI,IAA8B;AAC/C,QAAM,QAAkB,CAAC;AACzB,aAAW,KAAK,MAAM;AACpB,QAAI,CAAC,KAAK,IAAI,EAAE,EAAE,EAAG,OAAM,KAAK,EAAE,EAAE;AACpC,SAAK,IAAI,EAAE,IAAI,CAAC;AAAA,EAClB;AAEA,QAAM,SAAS,kBAAkB,MAAM,SAAS,MAAM,gBAAgB;AAEtE,QAAM,YAAY,oBAAI,IAAY;AAClC,QAAM,SAA4B,CAAC;AACnC,QAAM,WAAoD,CAAC;AAC3D,QAAM,eAAmC,MAAM,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,CAAE;AAExE,aAAW,MAAM,OAAO;AACtB,UAAM,MAAM,KAAK,IAAI,EAAE;AACvB,QAAI,CAAC,eAAe,KAAK,MAAM,EAAG;AAClC,cAAU,IAAI,EAAE;AAChB,QAAI,IAAI,OAAQ,QAAO,KAAK,GAAG,IAAI,MAAM;AACzC,aAAS,EAAE,IAAI,gBAAgB,KAAK,UAAU,IAAI,MAAM,CAAC;AAAA,EAC3D;AAEA,SAAO,EAAE,WAAW,QAAQ,UAAU,MAAM,aAAa;AAC3D;AASA,SAAS,gBACP,KACA,QACyB;AACzB,QAAM,SAAS,EAAE,GAAI,IAAI,mBAAmB,CAAC,GAAI,GAAI,UAAU,CAAC,EAAG;AACnE,MAAI,CAAC,IAAI,eAAgB,QAAO;AAChC,QAAM,MAAM,IAAI,eAAe,UAAU,MAAM;AAC/C,MAAI,IAAI,QAAS,QAAO,IAAI;AAC5B,MAAI,OAAO,YAAY,aAAa;AAClC,YAAQ;AAAA,MACN,oCAAoC,IAAI,EAAE;AAAA,MAC1C,IAAI,MAAM;AAAA,IACZ;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,qBAAqB,MAA0B,MAAkC;AAC/F,aAAW,KAAK,MAAM;AACpB,QAAI,EAAE,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI,EAAG,QAAO,EAAE;AAAA,EACvD;AACA,SAAO;AACT;","names":[]}
|