import type { ZodType, z } from "zod"; import { LifecycleHookTypes } from "./constants"; import type { AuthClaimsFn, BootCheckFn, ClaimKeyDefinition, ConfigKeyDefinition, ConfigSeedDef, EntityDefinition, EntityProjectionExtension, EventMigrationDef, ExtensionSelectorDef, FeatureMetricDef, JobDefinition, LifecycleHookFn, MultiStreamProjectionDefinition, NotificationDefinition, OwnedFn, PhasedHook, PostDeleteHookFn, PostQueryHookFn, PostSaveHookFn, PreDeleteHookFn, ProjectionDefinition, QueryHandlerDef, ReferenceDataDef, RegistrarExtensionDef, RegistrarExtensionRegistration, RelationDefinition, SearchPayloadContributorFn, SecretKeyDefinition, StoreTableEntry, StreamHandlerDef, TranslationKeys, TreeActionDef, UiHints, ValidationHookFn, WriteHandlerDef, } from "./types"; import type { HttpRouteDefinition } from "./types/http-route"; import type { ContentCollectionDefinition, NavDefinition } from "./types/nav"; import type { ScreenDefinition } from "./types/screen"; import type { WorkspaceDefinition } from "./types/workspace"; const LIFECYCLE_TYPES = Object.values(LifecycleHookTypes); // Bundles every Record/Set/array/scalar defineFeature populates while the // registrar's ~40 methods run — hoisted out of defineFeature's closure so a // future move-diff (extracting each method into its own module) can thread // it explicitly. Every field is held BY REFERENCE — no destructured copies. export type FeatureBuilderState = { requires: string[]; optionalRequires: string[]; requiredProjections: Set; requiredSteps: Set; entities: Record; entityTables: Record; relations: Record>; writeHandlers: Record; queryHandlers: Record; streamHandlers: Record; validationHooks: Record; lifecycleHooks: Record[]>>; phasedLifecycleHooks: Record< "postSave" | "preDelete" | "postDelete", Record[]> >; configKeys: Record; configSeeds: ConfigSeedDef[]; jobs: Record; events: Record; eventMigrations: Record; configReads: string[]; entityPostSave: Record[]>; entityPreDelete: Record[]>; entityPostDelete: Record[]>; entityPostQuery: Record[]>; searchPayloadExtensions: Record[]>; notifications: Record; registrarExtensions: Record; extensionUsages: RegistrarExtensionRegistration[]; extensionSelectors: ExtensionSelectorDef[]; exposedApis: Set; usedApis: Set; bootChecks: BootCheckFn[]; referenceData: ReferenceDataDef[]; handlerEntityMappings: Record; metrics: Record; secretKeys: Record; projections: Record; multiStreamProjections: Record; entityProjectionExtensions: Record; storeTables: Record; authClaimsHooks: AuthClaimsFn[]; claimKeys: Record; screens: Record; navs: Record; contentCollections: Record; workspaces: Record; httpRoutes: Record; translations: TranslationKeys; isSystemScoped: boolean; toggleableDefault: boolean | undefined; description: string | undefined; uiHints: UiHints | undefined; treeActions: Readonly> | undefined; envSchema: z.ZodObject | undefined; }; export function createInitialFeatureBuilderState(): FeatureBuilderState { const lifecycleHooks: Record[]>> = {}; for (const t of LIFECYCLE_TYPES) { lifecycleHooks[t] = {}; } return { requires: [], optionalRequires: [], requiredProjections: new Set(), requiredSteps: new Set(), entities: {}, entityTables: {}, relations: {}, writeHandlers: {}, queryHandlers: {}, streamHandlers: {}, validationHooks: {}, lifecycleHooks, phasedLifecycleHooks: { postSave: {}, preDelete: {}, postDelete: {} }, configKeys: {}, configSeeds: [], jobs: {}, events: {}, eventMigrations: {}, configReads: [], entityPostSave: {}, entityPreDelete: {}, entityPostDelete: {}, entityPostQuery: {}, searchPayloadExtensions: {}, notifications: {}, registrarExtensions: {}, extensionUsages: [], extensionSelectors: [], exposedApis: new Set(), usedApis: new Set(), bootChecks: [], referenceData: [], handlerEntityMappings: {}, metrics: {}, secretKeys: {}, projections: {}, multiStreamProjections: {}, entityProjectionExtensions: {}, storeTables: {}, authClaimsHooks: [], claimKeys: {}, screens: {}, navs: {}, contentCollections: {}, workspaces: {}, httpRoutes: {}, translations: {}, isSystemScoped: false, toggleableDefault: undefined, description: undefined, uiHints: undefined, treeActions: undefined, envSchema: undefined, }; }