@waypointjs/core 0.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/LICENSE +21 -0
- package/dist/index.cjs +785 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +385 -0
- package/dist/index.d.ts +385 -0
- package/dist/index.js +758 -0
- package/dist/index.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/conditions.ts","../src/tree-resolver.ts","../src/runtime-store.ts","../src/zod-generator.ts","../src/validate-schema.ts","../src/url.ts"],"names":["createStore","persist","createJSONStorage","z"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ConditionGroup, ConditionOperator, ConditionRule } from \"./schema\";\n\n// ---------------------------------------------------------------------------\n// Data context\n// ---------------------------------------------------------------------------\n\n/**\n * All journey data, keyed by stepId then fieldId.\n * Example: { personal: { age: 25, name: \"Alice\" }, billing: { plan: \"pro\" } }\n */\nexport type JourneyData = Record<string, Record<string, unknown>>;\n\n/**\n * External variables injected at runtime.\n * Example: { isPremium: true, userId: \"abc-123\" }\n */\nexport type ExternalVars = Record<string, unknown>;\n\n// ---------------------------------------------------------------------------\n// Path resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolves a field path to its value from the data context.\n * - \"stepId.fieldId\" → journey data\n * - \"$ext.varId\" → external variable\n */\nexport function resolveFieldValue(\n path: string,\n data: JourneyData,\n externalVars: ExternalVars\n): unknown {\n if (path.startsWith(\"$ext.\")) {\n const varId = path.slice(5);\n return externalVars[varId];\n }\n\n const dotIndex = path.indexOf(\".\");\n if (dotIndex === -1) return undefined;\n\n const stepId = path.slice(0, dotIndex);\n const fieldId = path.slice(dotIndex + 1);\n return data[stepId]?.[fieldId];\n}\n\n// ---------------------------------------------------------------------------\n// Operator evaluation\n// ---------------------------------------------------------------------------\n\nfunction evaluateOperator(\n operator: ConditionOperator,\n actual: unknown,\n expected: unknown\n): boolean {\n switch (operator) {\n case \"exists\":\n return actual !== undefined && actual !== null && actual !== \"\";\n\n case \"notExists\":\n return actual === undefined || actual === null || actual === \"\";\n\n case \"equals\":\n return actual === expected;\n\n case \"notEquals\":\n return actual !== expected;\n\n case \"greaterThan\":\n return typeof actual === \"number\" && typeof expected === \"number\"\n ? actual > expected\n : Number(actual) > Number(expected);\n\n case \"greaterThanOrEqual\":\n return typeof actual === \"number\" && typeof expected === \"number\"\n ? actual >= expected\n : Number(actual) >= Number(expected);\n\n case \"lessThan\":\n return typeof actual === \"number\" && typeof expected === \"number\"\n ? actual < expected\n : Number(actual) < Number(expected);\n\n case \"lessThanOrEqual\":\n return typeof actual === \"number\" && typeof expected === \"number\"\n ? actual <= expected\n : Number(actual) <= Number(expected);\n\n case \"contains\":\n if (typeof actual === \"string\" && typeof expected === \"string\") {\n return actual.includes(expected);\n }\n if (Array.isArray(actual)) {\n return actual.includes(expected);\n }\n return false;\n\n case \"notContains\":\n if (typeof actual === \"string\" && typeof expected === \"string\") {\n return !actual.includes(expected);\n }\n if (Array.isArray(actual)) {\n return !actual.includes(expected);\n }\n return true;\n\n case \"in\":\n return Array.isArray(expected) && expected.includes(actual);\n\n case \"notIn\":\n return Array.isArray(expected) && !expected.includes(actual);\n\n case \"matches\":\n if (typeof actual !== \"string\" || typeof expected !== \"string\") return false;\n try {\n return new RegExp(expected).test(actual);\n } catch {\n return false;\n }\n\n default:\n return false;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Rule & group evaluation\n// ---------------------------------------------------------------------------\n\nfunction evaluateRule(\n rule: ConditionRule,\n data: JourneyData,\n externalVars: ExternalVars\n): boolean {\n const actual = resolveFieldValue(rule.field, data, externalVars);\n return evaluateOperator(rule.operator, actual, rule.value);\n}\n\n/**\n * Evaluates a condition group against the current data context.\n * Returns true if the group's conditions are satisfied.\n */\nexport function evaluateConditionGroup(\n group: ConditionGroup,\n data: JourneyData,\n externalVars: ExternalVars\n): boolean {\n const ruleResults = group.rules.map((rule) =>\n evaluateRule(rule, data, externalVars)\n );\n\n const groupResults = (group.groups ?? []).map((subGroup) =>\n evaluateConditionGroup(subGroup, data, externalVars)\n );\n\n const allResults = [...ruleResults, ...groupResults];\n\n if (allResults.length === 0) return true;\n\n return group.combinator === \"and\"\n ? allResults.every(Boolean)\n : allResults.some(Boolean);\n}\n\n/**\n * Convenience: returns true if no condition is defined (always visible),\n * or if the condition group evaluates to true.\n */\nexport function isVisible(\n visibleWhen: ConditionGroup | undefined,\n data: JourneyData,\n externalVars: ExternalVars\n): boolean {\n if (!visibleWhen) return true;\n return evaluateConditionGroup(visibleWhen, data, externalVars);\n}\n","import type { ExternalVariable, FieldDefinition, StepDefinition, WaypointSchema } from \"./schema\";\nimport { type ExternalVars, type JourneyData, isVisible, resolveFieldValue } from \"./conditions\";\n\n// ---------------------------------------------------------------------------\n// Resolved types\n// ---------------------------------------------------------------------------\n\n/** A field after condition evaluation */\nexport interface ResolvedField {\n definition: FieldDefinition;\n /** Whether the field is currently visible */\n visible: boolean;\n /** Whether all dependsOn paths have a non-empty value */\n dependenciesMet: boolean;\n}\n\n/** A step after condition evaluation */\nexport interface ResolvedStep {\n definition: StepDefinition;\n /** Whether this step is currently in the active tree */\n visible: boolean;\n /** Visible fields for this step, in definition order */\n fields: ResolvedField[];\n}\n\n/** Result returned by resolveTree */\nexport interface ResolvedTree {\n /** Ordered list of visible steps */\n steps: ResolvedStep[];\n /** Steps hidden by conditions — data preserved in tmp store */\n hiddenSteps: ResolvedStep[];\n /** Errors: external variables required but missing */\n missingExternalVars: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Dependency check\n// ---------------------------------------------------------------------------\n\nfunction areDependenciesMet(\n dependsOn: string[] | undefined,\n data: JourneyData,\n externalVars: ExternalVars\n): boolean {\n if (!dependsOn || dependsOn.length === 0) return true;\n return dependsOn.every((path) => {\n const value = resolveFieldValue(path, data, externalVars);\n return value !== undefined && value !== null && value !== \"\";\n });\n}\n\n// ---------------------------------------------------------------------------\n// External variable validation\n// ---------------------------------------------------------------------------\n\nfunction findMissingBlockingVars(\n externalVariables: ExternalVariable[] | undefined,\n externalVars: ExternalVars,\n visibleSteps: StepDefinition[]\n): string[] {\n if (!externalVariables || externalVariables.length === 0) return [];\n\n const visibleStepIds = new Set(visibleSteps.map((s) => s.id));\n\n return externalVariables\n .filter((extVar) => {\n if (!extVar.blocking) return false;\n\n // Only check if this variable is actually used by a visible step\n const usedInVisibleStep = extVar.usedIn?.some(\n (ref) => visibleStepIds.has(ref.stepId)\n );\n if (!usedInVisibleStep) return false;\n\n const value = externalVars[extVar.id];\n return value === undefined || value === null;\n })\n .map((extVar) => extVar.id);\n}\n\n// ---------------------------------------------------------------------------\n// Core resolver\n// ---------------------------------------------------------------------------\n\n/**\n * Resolves the journey tree against current data and external variables.\n *\n * - Steps with a falsy `visibleWhen` are moved to `hiddenSteps`\n * - Fields within each visible step are evaluated for visibility and dependencies\n * - Missing blocking external variables are reported\n *\n * This function is pure: same inputs always produce same outputs.\n */\nexport function resolveTree(\n schema: WaypointSchema,\n data: JourneyData,\n externalVars: ExternalVars\n): ResolvedTree {\n const visibleSteps: ResolvedStep[] = [];\n const hiddenSteps: ResolvedStep[] = [];\n\n for (const stepDef of schema.steps) {\n const stepVisible = isVisible(stepDef.visibleWhen, data, externalVars);\n\n const resolvedFields: ResolvedField[] = stepDef.fields.map((fieldDef) => ({\n definition: fieldDef,\n visible: isVisible(fieldDef.visibleWhen, data, externalVars),\n dependenciesMet: areDependenciesMet(fieldDef.dependsOn, data, externalVars),\n }));\n\n const resolvedStep: ResolvedStep = {\n definition: stepDef,\n visible: stepVisible,\n fields: resolvedFields,\n };\n\n if (stepVisible) {\n visibleSteps.push(resolvedStep);\n } else {\n hiddenSteps.push(resolvedStep);\n }\n }\n\n const missingExternalVars = findMissingBlockingVars(\n schema.externalVariables,\n externalVars,\n visibleSteps.map((s) => s.definition)\n );\n\n return {\n steps: visibleSteps,\n hiddenSteps,\n missingExternalVars,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Navigation helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Returns the index of the step with the given id in the resolved (visible) tree.\n * Returns -1 if not found.\n */\nexport function findStepIndex(steps: ResolvedStep[], stepId: string): number {\n return steps.findIndex((s) => s.definition.id === stepId);\n}\n\n/**\n * Returns the next visible step after the given stepId, or undefined if last.\n */\nexport function getNextStep(\n steps: ResolvedStep[],\n currentStepId: string\n): ResolvedStep | undefined {\n const index = findStepIndex(steps, currentStepId);\n if (index === -1 || index === steps.length - 1) return undefined;\n return steps[index + 1];\n}\n\n/**\n * Returns the previous visible step before the given stepId, or undefined if first.\n */\nexport function getPreviousStep(\n steps: ResolvedStep[],\n currentStepId: string\n): ResolvedStep | undefined {\n const index = findStepIndex(steps, currentStepId);\n if (index <= 0) return undefined;\n return steps[index - 1];\n}\n\n/**\n * Calculates progress (0–100) based on the resolved visible tree.\n * Uses the index of the current step in the visible tree.\n */\nexport function calculateProgress(\n steps: ResolvedStep[],\n currentStepId: string\n): number {\n if (steps.length === 0) return 0;\n const index = findStepIndex(steps, currentStepId);\n if (index === -1) return 0;\n return Math.round(((index + 1) / (steps.length + 1)) * 100);\n}\n\n/**\n * Given journey data, finds the deepest step the user can access:\n * the last step in the visible tree for which all visible fields\n * have their dependencies met.\n */\nexport function findLastValidStep(\n steps: ResolvedStep[],\n data: JourneyData,\n _externalVars: ExternalVars\n): ResolvedStep | undefined {\n let lastValid: ResolvedStep | undefined;\n\n for (const step of steps) {\n const visibleFields = step.fields.filter((f) => f.visible);\n const allDepsMet = visibleFields.every((f) => f.dependenciesMet);\n\n // A step is \"reachable\" if all its visible required fields' deps are met\n if (allDepsMet) {\n // Check if the step itself has data filled\n const stepData = data[step.definition.id];\n const hasData =\n stepData !== undefined && Object.keys(stepData).length > 0;\n\n if (hasData || step === steps[0]) {\n lastValid = step;\n } else {\n break;\n }\n } else {\n break;\n }\n }\n\n return lastValid ?? steps[0];\n}\n","import { createStore } from \"zustand/vanilla\";\nimport { persist, createJSONStorage } from \"zustand/middleware\";\n\nimport type { WaypointSchema } from \"./schema\";\nimport {\n resolveTree,\n calculateProgress,\n getNextStep,\n getPreviousStep,\n} from \"./tree-resolver\";\nimport type { ResolvedStep, ResolvedTree } from \"./tree-resolver\";\n\n// ---------------------------------------------------------------------------\n// State + Actions\n// ---------------------------------------------------------------------------\n\nexport interface WaypointRuntimeState {\n schema: WaypointSchema | null;\n /** { stepId: { fieldId: value } } */\n data: Record<string, Record<string, unknown>>;\n /** { varId: value } */\n externalVars: Record<string, unknown>;\n currentStepId: string | null;\n /** Step IDs visited in order */\n history: string[];\n isSubmitting: boolean;\n /** True once onComplete has been called (all steps validated) */\n completed: boolean;\n}\n\nexport interface WaypointRuntimeActions {\n /**\n * Fresh start: sets schema + data and navigates to the first step (or startStepId).\n * Always resets navigation state (currentStepId, history).\n */\n init(\n schema: WaypointSchema,\n options?: {\n data?: Record<string, Record<string, unknown>>;\n externalVars?: Record<string, unknown>;\n startStepId?: string;\n }\n ): void;\n\n /**\n * Resume a previously-started journey.\n * Updates schema + externalVars but preserves data, currentStepId and history\n * as they were persisted (e.g. from localStorage).\n */\n resume(schema: WaypointSchema, externalVars?: Record<string, unknown>): void;\n\n setFieldValue(stepId: string, fieldId: string, value: unknown): void;\n setStepData(stepId: string, data: Record<string, unknown>): void;\n setExternalVar(varId: string, value: unknown): void;\n setCurrentStep(stepId: string): void;\n setIsSubmitting(b: boolean): void;\n setCompleted(b: boolean): void;\n /**\n * Truncates history to include only steps up to and including stepId.\n * Called before navigating forward so stale steps from a previous path are removed.\n */\n truncateHistoryAt(stepId: string): void;\n reset(): void;\n}\n\nexport type WaypointRuntimeStore = WaypointRuntimeState & WaypointRuntimeActions;\n\n// ---------------------------------------------------------------------------\n// What the persist middleware saves to localStorage\n// ---------------------------------------------------------------------------\n\ninterface PersistedSlice {\n /** The schema id that was active — used to detect stale persisted data */\n schemaId: string | null;\n data: WaypointRuntimeState[\"data\"];\n currentStepId: WaypointRuntimeState[\"currentStepId\"];\n history: WaypointRuntimeState[\"history\"];\n completed: WaypointRuntimeState[\"completed\"];\n}\n\n// ---------------------------------------------------------------------------\n// Computed helpers (pure functions — no hooks)\n// ---------------------------------------------------------------------------\n\nexport function getResolvedTree(state: WaypointRuntimeState): ResolvedTree {\n if (!state.schema) {\n return { steps: [], hiddenSteps: [], missingExternalVars: [] };\n }\n return resolveTree(state.schema, state.data, state.externalVars);\n}\n\nexport function getCurrentStep(state: WaypointRuntimeState): ResolvedStep | undefined {\n if (!state.currentStepId) return undefined;\n return getResolvedTree(state).steps.find(\n (s) => s.definition.id === state.currentStepId\n );\n}\n\nexport function getNextStepFromState(state: WaypointRuntimeState): ResolvedStep | undefined {\n if (!state.currentStepId) return undefined;\n const tree = getResolvedTree(state);\n return getNextStep(tree.steps, state.currentStepId);\n}\n\nexport function getPreviousStepFromState(state: WaypointRuntimeState): ResolvedStep | undefined {\n if (!state.currentStepId) return undefined;\n const tree = getResolvedTree(state);\n return getPreviousStep(tree.steps, state.currentStepId);\n}\n\nexport function calculateProgressFromState(state: WaypointRuntimeState): number {\n if (!state.currentStepId) return 0;\n const tree = getResolvedTree(state);\n return calculateProgress(tree.steps, state.currentStepId);\n}\n\nexport function getMissingBlockingVars(state: WaypointRuntimeState): string[] {\n return getResolvedTree(state).missingExternalVars;\n}\n\n// ---------------------------------------------------------------------------\n// Initial state\n// ---------------------------------------------------------------------------\n\nconst initialState: WaypointRuntimeState = {\n schema: null,\n data: {},\n externalVars: {},\n currentStepId: null,\n history: [],\n isSubmitting: false,\n completed: false,\n};\n\n// ---------------------------------------------------------------------------\n// Store factory\n// ---------------------------------------------------------------------------\n\nexport interface CreateRuntimeStoreOptions {\n persistenceMode?: string;\n schemaId?: string;\n}\n\nfunction buildStateCreator() {\n return (\n set: (\n partial:\n | Partial<WaypointRuntimeStore>\n | ((state: WaypointRuntimeStore) => Partial<WaypointRuntimeStore>)\n ) => void,\n _get: () => WaypointRuntimeStore\n ): WaypointRuntimeStore => ({\n ...initialState,\n\n init(schema, options = {}) {\n const { data = {}, externalVars = {}, startStepId } = options;\n const firstStepId = startStepId ?? schema.steps[0]?.id ?? null;\n set({\n schema,\n data,\n externalVars,\n currentStepId: firstStepId,\n history: firstStepId ? [firstStepId] : [],\n isSubmitting: false,\n completed: false,\n });\n },\n\n resume(schema, externalVars = {}) {\n // Preserve data, currentStepId, history and completed — only update schema + externalVars.\n set((state) => ({\n schema,\n externalVars: { ...state.externalVars, ...externalVars },\n isSubmitting: false,\n }));\n },\n\n setFieldValue(stepId, fieldId, value) {\n set((state) => ({\n data: {\n ...state.data,\n [stepId]: { ...state.data[stepId], [fieldId]: value },\n },\n }));\n },\n\n setStepData(stepId, data) {\n set((state) => ({\n data: { ...state.data, [stepId]: data },\n }));\n },\n\n setExternalVar(varId, value) {\n set((state) => ({\n externalVars: { ...state.externalVars, [varId]: value },\n }));\n },\n\n setCurrentStep(stepId) {\n set((state) => ({\n currentStepId: stepId,\n history: state.history.includes(stepId)\n ? state.history\n : [...state.history, stepId],\n }));\n },\n\n setIsSubmitting(b) {\n set({ isSubmitting: b });\n },\n\n setCompleted(b) {\n set({ completed: b });\n },\n\n truncateHistoryAt(stepId) {\n set((state) => {\n const idx = state.history.indexOf(stepId);\n if (idx === -1 || idx === state.history.length - 1) return state;\n return { history: state.history.slice(0, idx + 1) };\n });\n },\n\n reset() {\n set(initialState);\n },\n });\n}\n\n/**\n * Creates a new runtime store instance (vanilla Zustand, no React dependency).\n *\n * Each schema gets its own isolated store — multiple `<WaypointRunner>` instances\n * with different schemas can coexist simultaneously without sharing state.\n *\n * @param options.persistenceMode - If \"zustand\", activates localStorage persistence\n * @param options.schemaId - Used to build the persistence key (and to validate resume)\n */\nexport function createRuntimeStore(options: CreateRuntimeStoreOptions = {}) {\n const { persistenceMode, schemaId } = options;\n\n if (persistenceMode === \"zustand\") {\n const storageKey = schemaId\n ? `waypoint-runtime-${schemaId}`\n : \"waypoint-runtime\";\n\n return createStore<WaypointRuntimeStore>()(\n persist(buildStateCreator(), {\n name: storageKey,\n storage: createJSONStorage(() => {\n // SSR-safe: fall back to an in-memory noop if localStorage is unavailable\n if (typeof window === \"undefined\") {\n return {\n getItem: () => null,\n setItem: () => {},\n removeItem: () => {},\n };\n }\n return window.localStorage;\n }),\n partialize: (state): PersistedSlice => ({\n // Persist the schema id so WaypointRunner can verify the saved data\n // belongs to this schema (guards against stale data from a renamed schema).\n schemaId: state.schema?.id ?? null,\n data: state.data,\n currentStepId: state.currentStepId,\n history: state.history,\n completed: state.completed,\n }),\n })\n );\n }\n\n return createStore<WaypointRuntimeStore>()(buildStateCreator());\n}\n\n// ---------------------------------------------------------------------------\n// Resume detection helper (used by WaypointRunner)\n// ---------------------------------------------------------------------------\n\n/**\n * Returns true if the store has valid persisted state for the given schema id.\n * Used by WaypointRunner to decide whether to call `resume()` or `init()`.\n *\n * Relies on the fact that localStorage hydration is synchronous, so by the time\n * the first `useEffect` runs, the persisted slice is already merged into state.\n */\nexport function hasPersistedState(\n store: ReturnType<typeof createRuntimeStore>,\n schemaId: string\n): boolean {\n const state = store.getState();\n // The persist middleware merges the PersistedSlice fields directly onto the state object,\n // adding `schemaId` as an extra field not declared in WaypointRuntimeState.\n const persistedSchemaId = (state as unknown as Record<string, unknown>)[\"schemaId\"] as\n | string\n | null\n | undefined;\n return (\n persistedSchemaId === schemaId &&\n state.currentStepId !== null &&\n !state.completed\n );\n}\n\nexport type RuntimeStore = ReturnType<typeof createRuntimeStore>;\n","import { z } from \"zod\";\n\nimport type { FieldDefinition } from \"./schema\";\nimport type { ResolvedField } from \"./tree-resolver\";\n\n// ---------------------------------------------------------------------------\n// Custom validator registry\n// ---------------------------------------------------------------------------\n\nconst customValidatorRegistry: Record<string, (value: unknown) => boolean> = {};\n\n/**\n * Register a custom validator function by id.\n * Used for ValidationRule type=\"custom\" with a matching customValidatorId.\n */\nexport function registerCustomValidator(\n id: string,\n fn: (value: unknown) => boolean\n): void {\n customValidatorRegistry[id] = fn;\n}\n\n// ---------------------------------------------------------------------------\n// Field schema builder\n// ---------------------------------------------------------------------------\n\nfunction buildFieldSchema(field: FieldDefinition): z.ZodTypeAny {\n const rules = field.validation ?? [];\n const isRequired = rules.some((r) => r.type === \"required\");\n const isNumeric = field.type === \"number\";\n const isCheckbox = field.type === \"checkbox\";\n const isMultiSelect = field.type === \"multiselect\";\n\n if (isCheckbox) {\n const base = z.boolean();\n return isRequired ? base : base.optional();\n }\n\n if (isMultiSelect) {\n const base = z.array(z.string());\n return isRequired ? base.min(1, rules.find((r) => r.type === \"required\")?.message ?? \"Required\") : base.optional();\n }\n\n if (isNumeric) {\n let numSchema = z.coerce.number({\n invalid_type_error: \"Must be a number\",\n });\n\n for (const rule of rules) {\n if (rule.type === \"min\") {\n const n = Number(rule.value);\n if (!isNaN(n)) numSchema = numSchema.gte(n, rule.message) as typeof numSchema;\n } else if (rule.type === \"max\") {\n const n = Number(rule.value);\n if (!isNaN(n)) numSchema = numSchema.lte(n, rule.message) as typeof numSchema;\n }\n }\n\n return isRequired ? numSchema : numSchema.optional();\n }\n\n // String-based fields — build base schema first (ZodString methods only),\n // then apply .refine() transforms last (they return ZodEffects, not ZodString).\n let strSchema = z.string();\n\n const refineRules: Array<{ id: string; message: string }> = [];\n\n for (const rule of rules) {\n switch (rule.type) {\n case \"required\":\n strSchema = strSchema.min(1, rule.message);\n break;\n case \"minLength\": {\n const n = Number(rule.value);\n if (!isNaN(n)) strSchema = strSchema.min(n, rule.message);\n break;\n }\n case \"maxLength\": {\n const n = Number(rule.value);\n if (!isNaN(n)) strSchema = strSchema.max(n, rule.message);\n break;\n }\n case \"email\":\n strSchema = strSchema.email(rule.message);\n break;\n case \"url\":\n strSchema = strSchema.url(rule.message);\n break;\n case \"regex\":\n if (rule.value !== undefined && rule.value !== null) {\n strSchema = strSchema.regex(new RegExp(String(rule.value)), rule.message);\n }\n break;\n case \"custom\":\n if (rule.customValidatorId && customValidatorRegistry[rule.customValidatorId]) {\n refineRules.push({ id: rule.customValidatorId, message: rule.message });\n }\n break;\n }\n }\n\n // Apply optional before refines (ZodString → ZodOptional or keep as ZodString)\n let finalSchema: z.ZodTypeAny = isRequired ? strSchema : strSchema.optional();\n\n // Append custom .refine() calls (return ZodEffects, safe as ZodTypeAny)\n for (const { id, message } of refineRules) {\n finalSchema = finalSchema.refine(\n (val) => Boolean(customValidatorRegistry[id]?.(val)),\n message\n );\n }\n\n return finalSchema;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Builds a Zod object schema from a list of resolved fields.\n *\n * - Only visible fields are included in the schema.\n * - Fields without a `required` validation rule are wrapped in `.optional()`.\n * - Numeric fields use `z.coerce.number()` so string inputs are coerced.\n */\nexport function buildZodSchema(\n fields: ResolvedField[]\n): z.ZodObject<z.ZodRawShape> {\n const shape: z.ZodRawShape = {};\n\n for (const resolvedField of fields) {\n if (!resolvedField.visible) continue;\n shape[resolvedField.definition.id] = buildFieldSchema(resolvedField.definition);\n }\n\n return z.object(shape);\n}\n","/**\n * Runtime validation for WaypointSchema JSON.\n *\n * Validates structure and basic constraints without relying on TypeScript types.\n * Designed to be used at import time (builder) and at boot time (runtime).\n */\n\nimport type { WaypointSchema } from \"./schema\";\n\n// ---------------------------------------------------------------------------\n// Result type\n// ---------------------------------------------------------------------------\n\nexport interface SchemaValidationResult {\n valid: boolean;\n errors: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst SUPPORTED_VERSIONS = [\"1\"] as const;\n\nconst VALID_PERSISTENCE_MODES = new Set([\"zustand\", \"backend-step\", \"backend-manual\"]);\n\nconst VALID_EXT_VAR_TYPES = new Set([\"string\", \"number\", \"boolean\", \"object\"]);\n\nconst VALID_CONDITION_OPERATORS = new Set([\n \"equals\", \"notEquals\",\n \"greaterThan\", \"greaterThanOrEqual\",\n \"lessThan\", \"lessThanOrEqual\",\n \"contains\", \"notContains\",\n \"in\", \"notIn\",\n \"exists\", \"notExists\",\n \"matches\",\n]);\n\nconst VALID_VALIDATION_TYPES = new Set([\n \"required\", \"min\", \"max\", \"minLength\", \"maxLength\", \"email\", \"url\", \"regex\", \"custom\",\n]);\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Validates a raw parsed JSON value as a WaypointSchema.\n *\n * Returns `{ valid: true, errors: [] }` when the schema is acceptable.\n * Returns `{ valid: false, errors: [...] }` with a list of human-readable errors otherwise.\n */\nexport function validateSchema(raw: unknown): SchemaValidationResult {\n const errors: string[] = [];\n\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) {\n return { valid: false, errors: [\"Root must be a JSON object\"] };\n }\n\n const obj = raw as Record<string, unknown>;\n\n // ── Top-level required fields ────────────────────────────────────────────\n\n // version\n if (!(\"version\" in obj)) {\n errors.push('Missing required field \"version\"');\n } else if (!SUPPORTED_VERSIONS.includes(obj.version as typeof SUPPORTED_VERSIONS[number])) {\n errors.push(`Unsupported version \"${obj.version}\". Supported: ${SUPPORTED_VERSIONS.join(\", \")}`);\n }\n\n // id\n if (!(\"id\" in obj) || typeof obj.id !== \"string\" || !obj.id.trim()) {\n errors.push('Field \"id\" must be a non-empty string');\n }\n\n // name\n if (!(\"name\" in obj) || typeof obj.name !== \"string\" || !obj.name.trim()) {\n errors.push('Field \"name\" must be a non-empty string');\n }\n\n // steps\n if (!(\"steps\" in obj) || !Array.isArray(obj.steps)) {\n errors.push('Field \"steps\" must be an array');\n } else {\n validateSteps(obj.steps, errors);\n }\n\n // persistenceMode (optional)\n if (\"persistenceMode\" in obj && !VALID_PERSISTENCE_MODES.has(obj.persistenceMode as string)) {\n errors.push(\n `Invalid \"persistenceMode\" \"${obj.persistenceMode}\". Must be one of: ${[...VALID_PERSISTENCE_MODES].join(\", \")}`,\n );\n }\n\n // externalVariables (optional)\n if (\"externalVariables\" in obj) {\n if (!Array.isArray(obj.externalVariables)) {\n errors.push('\"externalVariables\" must be an array');\n } else {\n validateExternalVariables(obj.externalVariables, errors);\n }\n }\n\n // customTypes (optional)\n if (\"customTypes\" in obj && !Array.isArray(obj.customTypes)) {\n errors.push('\"customTypes\" must be an array');\n }\n\n return { valid: errors.length === 0, errors };\n}\n\n// ---------------------------------------------------------------------------\n// Internal helpers\n// ---------------------------------------------------------------------------\n\nfunction validateSteps(steps: unknown[], errors: string[]) {\n const seenIds = new Set<string>();\n\n steps.forEach((step, i) => {\n const prefix = `steps[${i}]`;\n\n if (!step || typeof step !== \"object\" || Array.isArray(step)) {\n errors.push(`${prefix}: must be an object`);\n return;\n }\n\n const s = step as Record<string, unknown>;\n\n // id\n if (typeof s.id !== \"string\" || !s.id.trim()) {\n errors.push(`${prefix}: \"id\" must be a non-empty string`);\n } else if (seenIds.has(s.id)) {\n errors.push(`${prefix}: duplicate step id \"${s.id}\"`);\n } else {\n seenIds.add(s.id);\n }\n\n // title\n if (typeof s.title !== \"string\" || !s.title.trim()) {\n errors.push(`${prefix}: \"title\" must be a non-empty string`);\n }\n\n // url\n if (typeof s.url !== \"string\" || !s.url.trim()) {\n errors.push(`${prefix}: \"url\" must be a non-empty string`);\n }\n\n // fields\n if (!Array.isArray(s.fields)) {\n errors.push(`${prefix}: \"fields\" must be an array`);\n } else {\n validateFields(s.fields, s.id as string, prefix, errors);\n }\n\n // visibleWhen (optional)\n if (\"visibleWhen\" in s) {\n validateConditionGroup(s.visibleWhen, `${prefix}.visibleWhen`, errors);\n }\n });\n}\n\nfunction validateFields(\n fields: unknown[],\n stepId: string,\n parentPrefix: string,\n errors: string[],\n) {\n const seenIds = new Set<string>();\n\n fields.forEach((field, i) => {\n const prefix = `${parentPrefix}.fields[${i}]`;\n\n if (!field || typeof field !== \"object\" || Array.isArray(field)) {\n errors.push(`${prefix}: must be an object`);\n return;\n }\n\n const f = field as Record<string, unknown>;\n\n // id\n if (typeof f.id !== \"string\" || !f.id.trim()) {\n errors.push(`${prefix}: \"id\" must be a non-empty string`);\n } else if (seenIds.has(f.id)) {\n errors.push(`${prefix}: duplicate field id \"${f.id}\" in step \"${stepId}\"`);\n } else {\n seenIds.add(f.id as string);\n }\n\n // type\n if (typeof f.type !== \"string\" || !f.type.trim()) {\n errors.push(`${prefix}: \"type\" must be a non-empty string`);\n }\n\n // label\n if (typeof f.label !== \"string\" || !f.label.trim()) {\n errors.push(`${prefix}: \"label\" must be a non-empty string`);\n }\n\n // options (optional)\n if (\"options\" in f && !Array.isArray(f.options)) {\n errors.push(`${prefix}: \"options\" must be an array`);\n }\n\n // validation (optional)\n if (\"validation\" in f) {\n if (!Array.isArray(f.validation)) {\n errors.push(`${prefix}: \"validation\" must be an array`);\n } else {\n validateValidationRules(f.validation, prefix, errors);\n }\n }\n\n // dependsOn (optional)\n if (\"dependsOn\" in f) {\n if (!Array.isArray(f.dependsOn)) {\n errors.push(`${prefix}: \"dependsOn\" must be an array`);\n } else {\n for (const dep of f.dependsOn as unknown[]) {\n if (typeof dep !== \"string\") {\n errors.push(`${prefix}: each \"dependsOn\" entry must be a string`);\n }\n }\n }\n }\n\n // visibleWhen (optional)\n if (\"visibleWhen\" in f) {\n validateConditionGroup(f.visibleWhen, `${prefix}.visibleWhen`, errors);\n }\n });\n}\n\nfunction validateConditionGroup(group: unknown, prefix: string, errors: string[]) {\n if (!group || typeof group !== \"object\" || Array.isArray(group)) {\n errors.push(`${prefix}: must be an object`);\n return;\n }\n\n const g = group as Record<string, unknown>;\n\n if (g.combinator !== \"and\" && g.combinator !== \"or\") {\n errors.push(`${prefix}: \"combinator\" must be \"and\" or \"or\"`);\n }\n\n if (!Array.isArray(g.rules)) {\n errors.push(`${prefix}: \"rules\" must be an array`);\n } else {\n (g.rules as unknown[]).forEach((rule, i) => {\n validateConditionRule(rule, `${prefix}.rules[${i}]`, errors);\n });\n }\n\n if (\"groups\" in g && Array.isArray(g.groups)) {\n (g.groups as unknown[]).forEach((nested, i) => {\n validateConditionGroup(nested, `${prefix}.groups[${i}]`, errors);\n });\n }\n}\n\nfunction validateConditionRule(rule: unknown, prefix: string, errors: string[]) {\n if (!rule || typeof rule !== \"object\" || Array.isArray(rule)) {\n errors.push(`${prefix}: must be an object`);\n return;\n }\n\n const r = rule as Record<string, unknown>;\n\n if (typeof r.field !== \"string\" || !r.field.trim()) {\n errors.push(`${prefix}: \"field\" must be a non-empty string`);\n }\n\n if (!VALID_CONDITION_OPERATORS.has(r.operator as string)) {\n errors.push(\n `${prefix}: invalid operator \"${r.operator}\". Must be one of: ${[...VALID_CONDITION_OPERATORS].join(\", \")}`,\n );\n }\n}\n\nfunction validateValidationRules(rules: unknown[], parentPrefix: string, errors: string[]) {\n rules.forEach((rule, i) => {\n const prefix = `${parentPrefix}.validation[${i}]`;\n\n if (!rule || typeof rule !== \"object\" || Array.isArray(rule)) {\n errors.push(`${prefix}: must be an object`);\n return;\n }\n\n const r = rule as Record<string, unknown>;\n\n if (!VALID_VALIDATION_TYPES.has(r.type as string)) {\n errors.push(\n `${prefix}: invalid type \"${r.type}\". Must be one of: ${[...VALID_VALIDATION_TYPES].join(\", \")}`,\n );\n }\n\n if (typeof r.message !== \"string\" || !r.message.trim()) {\n errors.push(`${prefix}: \"message\" must be a non-empty string`);\n }\n });\n}\n\nfunction validateExternalVariables(vars: unknown[], errors: string[]) {\n const seenIds = new Set<string>();\n\n vars.forEach((v, i) => {\n const prefix = `externalVariables[${i}]`;\n\n if (!v || typeof v !== \"object\" || Array.isArray(v)) {\n errors.push(`${prefix}: must be an object`);\n return;\n }\n\n const ev = v as Record<string, unknown>;\n\n if (typeof ev.id !== \"string\" || !ev.id.trim()) {\n errors.push(`${prefix}: \"id\" must be a non-empty string`);\n } else if (seenIds.has(ev.id)) {\n errors.push(`${prefix}: duplicate external variable id \"${ev.id}\"`);\n } else {\n seenIds.add(ev.id as string);\n }\n\n if (typeof ev.label !== \"string\" || !ev.label.trim()) {\n errors.push(`${prefix}: \"label\" must be a non-empty string`);\n }\n\n if (!VALID_EXT_VAR_TYPES.has(ev.type as string)) {\n errors.push(\n `${prefix}: invalid type \"${ev.type}\". Must be one of: ${[...VALID_EXT_VAR_TYPES].join(\", \")}`,\n );\n }\n\n if (typeof ev.blocking !== \"boolean\") {\n errors.push(`${prefix}: \"blocking\" must be a boolean`);\n }\n });\n}\n\n/**\n * Convenience: assert a schema is valid, throw with all errors if not.\n * Useful in tests or runtime boot checks.\n */\nexport function assertSchema(raw: unknown): asserts raw is WaypointSchema {\n const result = validateSchema(raw);\n if (!result.valid) {\n throw new Error(`Invalid WaypointSchema:\\n${result.errors.map((e) => ` - ${e}`).join(\"\\n\")}`);\n }\n}\n","import type { WaypointParams } from \"./types\";\n\ninterface StepDefinition {\n step: string;\n url: string;\n}\n\n/**\n * Utility class for URL template formatting and validation.\n * Templates use `{{PARAM_NAME}}` syntax.\n *\n * @example\n * URLTemplateEngine.format(\"/users/{{USER_ID}}/posts/{{POST_ID}}\", { USER_ID: \"42\", POST_ID: \"hello\" })\n * // => \"/users/42/posts/hello\"\n */\nexport class URLTemplateEngine {\n private static readonly PLACEHOLDER_PATTERN = /\\{\\{([^}]+)\\}\\}/g;\n\n /**\n * Replace all `{{PARAM}}` placeholders in a template with the provided values.\n * Missing params are left as-is.\n */\n static format(template: string, params: WaypointParams): string {\n return template.replace(this.PLACEHOLDER_PATTERN, (match, key) => {\n const value = params[key];\n if (value === undefined || value === null) {\n console.log(`Waypoint: missing parameter \"${key}\" in URL: ${template}`);\n return match;\n }\n return String(value);\n });\n }\n\n /**\n * Extract all placeholder names from a URL template.\n */\n static extractPlaceholders(template: string): string[] {\n const matches = template.match(this.PLACEHOLDER_PATTERN);\n return matches ? matches.map((m) => m.replace(/[{}]/g, \"\")) : [];\n }\n\n /**\n * Validate that all placeholders in the template have corresponding params.\n */\n static validate(\n template: string,\n params: WaypointParams\n ): { isValid: boolean; missingParams: string[] } {\n const placeholders = this.extractPlaceholders(template);\n const missingParams = placeholders.filter((key) => params[key] === undefined);\n return { isValid: missingParams.length === 0, missingParams };\n }\n}\n\n// ── Private URL matching helpers (used by hooks) ──────────────────────────────\n\nfunction doesPatternMatchURL(pathname: string, urlPattern: string): boolean {\n const regexPattern = urlPattern\n .replace(/\\{\\{([^}]+)\\}\\}/g, \"([^/]+)\")\n .replace(/\\//g, \"\\\\/\");\n return new RegExp(`^${regexPattern}$`).test(pathname);\n}\n\nfunction doesPatternPartiallyMatch(\n pathname: string,\n urlPattern: string\n): boolean {\n const patternBase = urlPattern\n .replace(/\\{\\{[^}]+\\}\\}/g, \"*\")\n .split(\"/\")\n .filter((segment) => segment !== \"*\" && segment !== \"\");\n\n const pathSegments = pathname.split(\"/\").filter((s) => s !== \"\");\n\n let patternIndex = 0;\n for (const seg of pathSegments) {\n if (\n patternIndex < patternBase.length &&\n seg === patternBase[patternIndex]\n ) {\n patternIndex++;\n }\n }\n return patternIndex === patternBase.length;\n}\n\nfunction extractParamsFromPattern(\n pathname: string,\n urlPattern: string\n): WaypointParams {\n const params: WaypointParams = {};\n const placeholders: string[] = [];\n\n const regexPattern = urlPattern.replace(\n /\\{\\{([^}]+)\\}\\}/g,\n (_match, paramName) => {\n placeholders.push(paramName);\n return \"([^/]+)\";\n }\n );\n\n const regex = new RegExp(`^${regexPattern.replace(/\\//g, \"\\\\/\")}$`);\n const matches = pathname.match(regex);\n\n if (matches) {\n for (let i = 1; i < matches.length; i++) {\n const paramName = placeholders[i - 1];\n const paramValue = matches[i];\n if (paramName.includes(\"_ID\") && /^\\d+$/.test(paramValue)) {\n params[paramName] = parseInt(paramValue, 10);\n } else {\n params[paramName] = paramValue;\n }\n }\n }\n\n return params;\n}\n\nexport function findMatchingStep(\n pathname: string,\n allSteps: StepDefinition[]\n): StepDefinition | null {\n for (const step of allSteps) {\n if (doesPatternMatchURL(pathname, step.url)) return step;\n }\n for (const step of allSteps) {\n if (doesPatternPartiallyMatch(pathname, step.url)) return step;\n }\n return null;\n}\n\nexport function extractURLParamsFromTree(\n pathname: string,\n allSteps: StepDefinition[]\n): WaypointParams {\n const matching = findMatchingStep(pathname, allSteps);\n if (!matching) return {};\n return extractParamsFromPattern(pathname, matching.url);\n}\n\nexport function extractOnlyMissingParams(\n pathname: string,\n allSteps: StepDefinition[],\n missingParamNames: string[]\n): WaypointParams {\n if (missingParamNames.length === 0) return {};\n const matching = findMatchingStep(pathname, allSteps);\n if (!matching) return {};\n\n const all = extractParamsFromPattern(pathname, matching.url);\n const filtered: WaypointParams = {};\n for (const name of missingParamNames) {\n if (all[name] !== undefined) filtered[name] = all[name];\n }\n return filtered;\n}\n\nexport function mergeContextParams(\n userParams: WaypointParams = {},\n pathname: string,\n allSteps: StepDefinition[],\n targetURL?: string\n): WaypointParams {\n let urlParams: WaypointParams = {};\n if (targetURL) {\n const required = URLTemplateEngine.extractPlaceholders(targetURL);\n const missing = required.filter((p) => userParams[p] === undefined);\n urlParams = extractOnlyMissingParams(pathname, allSteps, missing);\n } else {\n urlParams = extractURLParamsFromTree(pathname, allSteps);\n }\n return { ...urlParams, ...userParams };\n}\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
import * as zustand_vanilla from 'zustand/vanilla';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Waypoint JSON Schema — v1
|
|
6
|
+
*
|
|
7
|
+
* Auto-sufficient tree definition generated by @waypointjs/builder.
|
|
8
|
+
* Versioned to allow non-breaking evolution.
|
|
9
|
+
*/
|
|
10
|
+
type ConditionOperator = "equals" | "notEquals" | "greaterThan" | "greaterThanOrEqual" | "lessThan" | "lessThanOrEqual" | "contains" | "notContains" | "in" | "notIn" | "exists" | "notExists" | "matches";
|
|
11
|
+
/**
|
|
12
|
+
* A single condition rule.
|
|
13
|
+
* `field` is a dot-path: "stepId.fieldId" for journey data, or "$ext.varId" for external variables.
|
|
14
|
+
*/
|
|
15
|
+
interface ConditionRule {
|
|
16
|
+
field: string;
|
|
17
|
+
operator: ConditionOperator;
|
|
18
|
+
value?: unknown;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* A condition group — rules combined with AND or OR.
|
|
22
|
+
* Rules within a group are combined with `combinator`.
|
|
23
|
+
* Groups can be nested via `groups`.
|
|
24
|
+
*/
|
|
25
|
+
interface ConditionGroup {
|
|
26
|
+
combinator: "and" | "or";
|
|
27
|
+
rules: ConditionRule[];
|
|
28
|
+
groups?: ConditionGroup[];
|
|
29
|
+
}
|
|
30
|
+
type ValidationRuleType = "required" | "min" | "max" | "minLength" | "maxLength" | "email" | "url" | "regex" | "custom";
|
|
31
|
+
interface ValidationRule {
|
|
32
|
+
type: ValidationRuleType;
|
|
33
|
+
/** Value for min/max/minLength/maxLength/regex rules */
|
|
34
|
+
value?: string | number;
|
|
35
|
+
/** Error message shown to the user */
|
|
36
|
+
message: string;
|
|
37
|
+
/** For "custom" type: identifier of the validator function registered at runtime */
|
|
38
|
+
customValidatorId?: string;
|
|
39
|
+
}
|
|
40
|
+
type BuiltinFieldType = "text" | "number" | "email" | "password" | "tel" | "url" | "textarea" | "select" | "multiselect" | "checkbox" | "radio" | "date" | "file";
|
|
41
|
+
/** Field type — either a builtin or a custom type id registered at runtime */
|
|
42
|
+
type FieldType = BuiltinFieldType | (string & {});
|
|
43
|
+
interface SelectOption {
|
|
44
|
+
label: string;
|
|
45
|
+
value: string | number;
|
|
46
|
+
}
|
|
47
|
+
interface FieldDefinition {
|
|
48
|
+
id: string;
|
|
49
|
+
type: FieldType;
|
|
50
|
+
label: string;
|
|
51
|
+
placeholder?: string;
|
|
52
|
+
defaultValue?: unknown;
|
|
53
|
+
/** Options for select/multiselect/radio fields */
|
|
54
|
+
options?: SelectOption[];
|
|
55
|
+
validation?: ValidationRule[];
|
|
56
|
+
/** Controls visibility of this field within its step */
|
|
57
|
+
visibleWhen?: ConditionGroup;
|
|
58
|
+
/** Data dependencies: fields/variables that must have a value before this field is accessible */
|
|
59
|
+
dependsOn?: string[];
|
|
60
|
+
}
|
|
61
|
+
interface StepDefinition$1 {
|
|
62
|
+
id: string;
|
|
63
|
+
title: string;
|
|
64
|
+
/** URL pattern for this step — supports {{PARAM}} placeholders */
|
|
65
|
+
url: string;
|
|
66
|
+
fields: FieldDefinition[];
|
|
67
|
+
/** Controls visibility/insertion of this step in the resolved tree */
|
|
68
|
+
visibleWhen?: ConditionGroup;
|
|
69
|
+
/** Whether this step can be used as a resume point */
|
|
70
|
+
enableResumeFromHere?: boolean;
|
|
71
|
+
}
|
|
72
|
+
interface ExternalVariable {
|
|
73
|
+
id: string;
|
|
74
|
+
label: string;
|
|
75
|
+
/** JavaScript type hint */
|
|
76
|
+
type: "string" | "number" | "boolean" | "object";
|
|
77
|
+
/** If true, Waypoint will throw at runtime if this variable is missing before it is needed */
|
|
78
|
+
blocking: boolean;
|
|
79
|
+
/** Steps / fields that depend on this variable — informational, used by the builder */
|
|
80
|
+
usedIn?: Array<{
|
|
81
|
+
stepId: string;
|
|
82
|
+
fieldId?: string;
|
|
83
|
+
}>;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* A custom field type registered in the builder.
|
|
87
|
+
* `metadata` is passed through as-is so the backend can enrich it.
|
|
88
|
+
*/
|
|
89
|
+
interface CustomTypeDefinition {
|
|
90
|
+
id: string;
|
|
91
|
+
label: string;
|
|
92
|
+
/** Icon name or URL — used by the builder UI */
|
|
93
|
+
icon?: string;
|
|
94
|
+
/** Default validation rules applied when this type is used */
|
|
95
|
+
defaultValidation?: ValidationRule[];
|
|
96
|
+
/** Arbitrary metadata — enrichable by the backend */
|
|
97
|
+
metadata?: Record<string, unknown>;
|
|
98
|
+
}
|
|
99
|
+
type PersistenceMode = "zustand" | "backend-step" | "backend-manual";
|
|
100
|
+
interface WaypointSchema {
|
|
101
|
+
/** Schema version — increment on breaking changes */
|
|
102
|
+
version: "1";
|
|
103
|
+
/** Unique identifier for this journey definition */
|
|
104
|
+
id: string;
|
|
105
|
+
/** Human-readable name */
|
|
106
|
+
name: string;
|
|
107
|
+
/** Ordered list of steps — order reflects default display order */
|
|
108
|
+
steps: StepDefinition$1[];
|
|
109
|
+
/** External variables this journey depends on */
|
|
110
|
+
externalVariables?: ExternalVariable[];
|
|
111
|
+
/** Custom field types registered for this journey */
|
|
112
|
+
customTypes?: CustomTypeDefinition[];
|
|
113
|
+
/** Default persistence mode */
|
|
114
|
+
persistenceMode?: PersistenceMode;
|
|
115
|
+
/** Arbitrary metadata */
|
|
116
|
+
metadata?: Record<string, unknown>;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* All journey data, keyed by stepId then fieldId.
|
|
121
|
+
* Example: { personal: { age: 25, name: "Alice" }, billing: { plan: "pro" } }
|
|
122
|
+
*/
|
|
123
|
+
type JourneyData = Record<string, Record<string, unknown>>;
|
|
124
|
+
/**
|
|
125
|
+
* External variables injected at runtime.
|
|
126
|
+
* Example: { isPremium: true, userId: "abc-123" }
|
|
127
|
+
*/
|
|
128
|
+
type ExternalVars = Record<string, unknown>;
|
|
129
|
+
/**
|
|
130
|
+
* Resolves a field path to its value from the data context.
|
|
131
|
+
* - "stepId.fieldId" → journey data
|
|
132
|
+
* - "$ext.varId" → external variable
|
|
133
|
+
*/
|
|
134
|
+
declare function resolveFieldValue(path: string, data: JourneyData, externalVars: ExternalVars): unknown;
|
|
135
|
+
/**
|
|
136
|
+
* Evaluates a condition group against the current data context.
|
|
137
|
+
* Returns true if the group's conditions are satisfied.
|
|
138
|
+
*/
|
|
139
|
+
declare function evaluateConditionGroup(group: ConditionGroup, data: JourneyData, externalVars: ExternalVars): boolean;
|
|
140
|
+
/**
|
|
141
|
+
* Convenience: returns true if no condition is defined (always visible),
|
|
142
|
+
* or if the condition group evaluates to true.
|
|
143
|
+
*/
|
|
144
|
+
declare function isVisible(visibleWhen: ConditionGroup | undefined, data: JourneyData, externalVars: ExternalVars): boolean;
|
|
145
|
+
|
|
146
|
+
/** A field after condition evaluation */
|
|
147
|
+
interface ResolvedField {
|
|
148
|
+
definition: FieldDefinition;
|
|
149
|
+
/** Whether the field is currently visible */
|
|
150
|
+
visible: boolean;
|
|
151
|
+
/** Whether all dependsOn paths have a non-empty value */
|
|
152
|
+
dependenciesMet: boolean;
|
|
153
|
+
}
|
|
154
|
+
/** A step after condition evaluation */
|
|
155
|
+
interface ResolvedStep {
|
|
156
|
+
definition: StepDefinition$1;
|
|
157
|
+
/** Whether this step is currently in the active tree */
|
|
158
|
+
visible: boolean;
|
|
159
|
+
/** Visible fields for this step, in definition order */
|
|
160
|
+
fields: ResolvedField[];
|
|
161
|
+
}
|
|
162
|
+
/** Result returned by resolveTree */
|
|
163
|
+
interface ResolvedTree {
|
|
164
|
+
/** Ordered list of visible steps */
|
|
165
|
+
steps: ResolvedStep[];
|
|
166
|
+
/** Steps hidden by conditions — data preserved in tmp store */
|
|
167
|
+
hiddenSteps: ResolvedStep[];
|
|
168
|
+
/** Errors: external variables required but missing */
|
|
169
|
+
missingExternalVars: string[];
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Resolves the journey tree against current data and external variables.
|
|
173
|
+
*
|
|
174
|
+
* - Steps with a falsy `visibleWhen` are moved to `hiddenSteps`
|
|
175
|
+
* - Fields within each visible step are evaluated for visibility and dependencies
|
|
176
|
+
* - Missing blocking external variables are reported
|
|
177
|
+
*
|
|
178
|
+
* This function is pure: same inputs always produce same outputs.
|
|
179
|
+
*/
|
|
180
|
+
declare function resolveTree(schema: WaypointSchema, data: JourneyData, externalVars: ExternalVars): ResolvedTree;
|
|
181
|
+
/**
|
|
182
|
+
* Returns the index of the step with the given id in the resolved (visible) tree.
|
|
183
|
+
* Returns -1 if not found.
|
|
184
|
+
*/
|
|
185
|
+
declare function findStepIndex(steps: ResolvedStep[], stepId: string): number;
|
|
186
|
+
/**
|
|
187
|
+
* Returns the next visible step after the given stepId, or undefined if last.
|
|
188
|
+
*/
|
|
189
|
+
declare function getNextStep(steps: ResolvedStep[], currentStepId: string): ResolvedStep | undefined;
|
|
190
|
+
/**
|
|
191
|
+
* Returns the previous visible step before the given stepId, or undefined if first.
|
|
192
|
+
*/
|
|
193
|
+
declare function getPreviousStep(steps: ResolvedStep[], currentStepId: string): ResolvedStep | undefined;
|
|
194
|
+
/**
|
|
195
|
+
* Calculates progress (0–100) based on the resolved visible tree.
|
|
196
|
+
* Uses the index of the current step in the visible tree.
|
|
197
|
+
*/
|
|
198
|
+
declare function calculateProgress(steps: ResolvedStep[], currentStepId: string): number;
|
|
199
|
+
/**
|
|
200
|
+
* Given journey data, finds the deepest step the user can access:
|
|
201
|
+
* the last step in the visible tree for which all visible fields
|
|
202
|
+
* have their dependencies met.
|
|
203
|
+
*/
|
|
204
|
+
declare function findLastValidStep(steps: ResolvedStep[], data: JourneyData, _externalVars: ExternalVars): ResolvedStep | undefined;
|
|
205
|
+
|
|
206
|
+
interface WaypointRuntimeState {
|
|
207
|
+
schema: WaypointSchema | null;
|
|
208
|
+
/** { stepId: { fieldId: value } } */
|
|
209
|
+
data: Record<string, Record<string, unknown>>;
|
|
210
|
+
/** { varId: value } */
|
|
211
|
+
externalVars: Record<string, unknown>;
|
|
212
|
+
currentStepId: string | null;
|
|
213
|
+
/** Step IDs visited in order */
|
|
214
|
+
history: string[];
|
|
215
|
+
isSubmitting: boolean;
|
|
216
|
+
/** True once onComplete has been called (all steps validated) */
|
|
217
|
+
completed: boolean;
|
|
218
|
+
}
|
|
219
|
+
interface WaypointRuntimeActions {
|
|
220
|
+
/**
|
|
221
|
+
* Fresh start: sets schema + data and navigates to the first step (or startStepId).
|
|
222
|
+
* Always resets navigation state (currentStepId, history).
|
|
223
|
+
*/
|
|
224
|
+
init(schema: WaypointSchema, options?: {
|
|
225
|
+
data?: Record<string, Record<string, unknown>>;
|
|
226
|
+
externalVars?: Record<string, unknown>;
|
|
227
|
+
startStepId?: string;
|
|
228
|
+
}): void;
|
|
229
|
+
/**
|
|
230
|
+
* Resume a previously-started journey.
|
|
231
|
+
* Updates schema + externalVars but preserves data, currentStepId and history
|
|
232
|
+
* as they were persisted (e.g. from localStorage).
|
|
233
|
+
*/
|
|
234
|
+
resume(schema: WaypointSchema, externalVars?: Record<string, unknown>): void;
|
|
235
|
+
setFieldValue(stepId: string, fieldId: string, value: unknown): void;
|
|
236
|
+
setStepData(stepId: string, data: Record<string, unknown>): void;
|
|
237
|
+
setExternalVar(varId: string, value: unknown): void;
|
|
238
|
+
setCurrentStep(stepId: string): void;
|
|
239
|
+
setIsSubmitting(b: boolean): void;
|
|
240
|
+
setCompleted(b: boolean): void;
|
|
241
|
+
/**
|
|
242
|
+
* Truncates history to include only steps up to and including stepId.
|
|
243
|
+
* Called before navigating forward so stale steps from a previous path are removed.
|
|
244
|
+
*/
|
|
245
|
+
truncateHistoryAt(stepId: string): void;
|
|
246
|
+
reset(): void;
|
|
247
|
+
}
|
|
248
|
+
type WaypointRuntimeStore = WaypointRuntimeState & WaypointRuntimeActions;
|
|
249
|
+
declare function getResolvedTree(state: WaypointRuntimeState): ResolvedTree;
|
|
250
|
+
declare function getCurrentStep(state: WaypointRuntimeState): ResolvedStep | undefined;
|
|
251
|
+
declare function getNextStepFromState(state: WaypointRuntimeState): ResolvedStep | undefined;
|
|
252
|
+
declare function getPreviousStepFromState(state: WaypointRuntimeState): ResolvedStep | undefined;
|
|
253
|
+
declare function calculateProgressFromState(state: WaypointRuntimeState): number;
|
|
254
|
+
declare function getMissingBlockingVars(state: WaypointRuntimeState): string[];
|
|
255
|
+
interface CreateRuntimeStoreOptions {
|
|
256
|
+
persistenceMode?: string;
|
|
257
|
+
schemaId?: string;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Creates a new runtime store instance (vanilla Zustand, no React dependency).
|
|
261
|
+
*
|
|
262
|
+
* Each schema gets its own isolated store — multiple `<WaypointRunner>` instances
|
|
263
|
+
* with different schemas can coexist simultaneously without sharing state.
|
|
264
|
+
*
|
|
265
|
+
* @param options.persistenceMode - If "zustand", activates localStorage persistence
|
|
266
|
+
* @param options.schemaId - Used to build the persistence key (and to validate resume)
|
|
267
|
+
*/
|
|
268
|
+
declare function createRuntimeStore(options?: CreateRuntimeStoreOptions): zustand_vanilla.StoreApi<WaypointRuntimeStore>;
|
|
269
|
+
/**
|
|
270
|
+
* Returns true if the store has valid persisted state for the given schema id.
|
|
271
|
+
* Used by WaypointRunner to decide whether to call `resume()` or `init()`.
|
|
272
|
+
*
|
|
273
|
+
* Relies on the fact that localStorage hydration is synchronous, so by the time
|
|
274
|
+
* the first `useEffect` runs, the persisted slice is already merged into state.
|
|
275
|
+
*/
|
|
276
|
+
declare function hasPersistedState(store: ReturnType<typeof createRuntimeStore>, schemaId: string): boolean;
|
|
277
|
+
type RuntimeStore = ReturnType<typeof createRuntimeStore>;
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Register a custom validator function by id.
|
|
281
|
+
* Used for ValidationRule type="custom" with a matching customValidatorId.
|
|
282
|
+
*/
|
|
283
|
+
declare function registerCustomValidator(id: string, fn: (value: unknown) => boolean): void;
|
|
284
|
+
/**
|
|
285
|
+
* Builds a Zod object schema from a list of resolved fields.
|
|
286
|
+
*
|
|
287
|
+
* - Only visible fields are included in the schema.
|
|
288
|
+
* - Fields without a `required` validation rule are wrapped in `.optional()`.
|
|
289
|
+
* - Numeric fields use `z.coerce.number()` so string inputs are coerced.
|
|
290
|
+
*/
|
|
291
|
+
declare function buildZodSchema(fields: ResolvedField[]): z.ZodObject<z.ZodRawShape>;
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Runtime validation for WaypointSchema JSON.
|
|
295
|
+
*
|
|
296
|
+
* Validates structure and basic constraints without relying on TypeScript types.
|
|
297
|
+
* Designed to be used at import time (builder) and at boot time (runtime).
|
|
298
|
+
*/
|
|
299
|
+
|
|
300
|
+
interface SchemaValidationResult {
|
|
301
|
+
valid: boolean;
|
|
302
|
+
errors: string[];
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Validates a raw parsed JSON value as a WaypointSchema.
|
|
306
|
+
*
|
|
307
|
+
* Returns `{ valid: true, errors: [] }` when the schema is acceptable.
|
|
308
|
+
* Returns `{ valid: false, errors: [...] }` with a list of human-readable errors otherwise.
|
|
309
|
+
*/
|
|
310
|
+
declare function validateSchema(raw: unknown): SchemaValidationResult;
|
|
311
|
+
/**
|
|
312
|
+
* Convenience: assert a schema is valid, throw with all errors if not.
|
|
313
|
+
* Useful in tests or runtime boot checks.
|
|
314
|
+
*/
|
|
315
|
+
declare function assertSchema(raw: unknown): asserts raw is WaypointSchema;
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* A single step within a journey tree category.
|
|
319
|
+
*/
|
|
320
|
+
interface JourneyTreeStep {
|
|
321
|
+
/**
|
|
322
|
+
* When true, automatically enables canResumeToDeepestStep when this step is reached.
|
|
323
|
+
*/
|
|
324
|
+
enableResumeFromHere?: boolean;
|
|
325
|
+
/** Unique step identifier */
|
|
326
|
+
step: string;
|
|
327
|
+
/** URL template — supports {{PARAM}} placeholders */
|
|
328
|
+
url: string;
|
|
329
|
+
}
|
|
330
|
+
/** A logical grouping of steps */
|
|
331
|
+
interface JourneyTreeCategory {
|
|
332
|
+
category: string;
|
|
333
|
+
steps: JourneyTreeStep[];
|
|
334
|
+
}
|
|
335
|
+
/** The full navigation tree for a journey, ordered list of categories */
|
|
336
|
+
type JourneyTreeType = JourneyTreeCategory[];
|
|
337
|
+
/** Generic URL parameters map — keys are placeholder names, values are strings or numbers */
|
|
338
|
+
type WaypointParams = Record<string, string | number | undefined>;
|
|
339
|
+
/** Runtime state for a single journey */
|
|
340
|
+
interface JourneyState {
|
|
341
|
+
canResumeToDeepestStep: boolean;
|
|
342
|
+
currentStep: string | null;
|
|
343
|
+
deepestStepVisited: string;
|
|
344
|
+
history: string[];
|
|
345
|
+
progress: number;
|
|
346
|
+
tree: JourneyTreeType;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
interface StepDefinition {
|
|
350
|
+
step: string;
|
|
351
|
+
url: string;
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Utility class for URL template formatting and validation.
|
|
355
|
+
* Templates use `{{PARAM_NAME}}` syntax.
|
|
356
|
+
*
|
|
357
|
+
* @example
|
|
358
|
+
* URLTemplateEngine.format("/users/{{USER_ID}}/posts/{{POST_ID}}", { USER_ID: "42", POST_ID: "hello" })
|
|
359
|
+
* // => "/users/42/posts/hello"
|
|
360
|
+
*/
|
|
361
|
+
declare class URLTemplateEngine {
|
|
362
|
+
private static readonly PLACEHOLDER_PATTERN;
|
|
363
|
+
/**
|
|
364
|
+
* Replace all `{{PARAM}}` placeholders in a template with the provided values.
|
|
365
|
+
* Missing params are left as-is.
|
|
366
|
+
*/
|
|
367
|
+
static format(template: string, params: WaypointParams): string;
|
|
368
|
+
/**
|
|
369
|
+
* Extract all placeholder names from a URL template.
|
|
370
|
+
*/
|
|
371
|
+
static extractPlaceholders(template: string): string[];
|
|
372
|
+
/**
|
|
373
|
+
* Validate that all placeholders in the template have corresponding params.
|
|
374
|
+
*/
|
|
375
|
+
static validate(template: string, params: WaypointParams): {
|
|
376
|
+
isValid: boolean;
|
|
377
|
+
missingParams: string[];
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
declare function findMatchingStep(pathname: string, allSteps: StepDefinition[]): StepDefinition | null;
|
|
381
|
+
declare function extractURLParamsFromTree(pathname: string, allSteps: StepDefinition[]): WaypointParams;
|
|
382
|
+
declare function extractOnlyMissingParams(pathname: string, allSteps: StepDefinition[], missingParamNames: string[]): WaypointParams;
|
|
383
|
+
declare function mergeContextParams(userParams: WaypointParams | undefined, pathname: string, allSteps: StepDefinition[], targetURL?: string): WaypointParams;
|
|
384
|
+
|
|
385
|
+
export { type BuiltinFieldType, type ConditionGroup, type ConditionOperator, type ConditionRule, type CreateRuntimeStoreOptions, type CustomTypeDefinition, type ExternalVariable, type ExternalVars, type FieldDefinition, type FieldType, type JourneyData, type JourneyState, type JourneyTreeStep, type JourneyTreeType, type PersistenceMode, type ResolvedField, type ResolvedStep, type ResolvedTree, type RuntimeStore, type SchemaValidationResult, type SelectOption, type StepDefinition$1 as StepDefinition, URLTemplateEngine, type ValidationRule, type ValidationRuleType, type WaypointParams, type WaypointRuntimeActions, type WaypointRuntimeState, type WaypointRuntimeStore, type WaypointSchema, assertSchema, buildZodSchema, calculateProgress, calculateProgressFromState, createRuntimeStore, evaluateConditionGroup, extractOnlyMissingParams, extractURLParamsFromTree, findLastValidStep, findMatchingStep, findStepIndex, getCurrentStep, getMissingBlockingVars, getNextStep, getNextStepFromState, getPreviousStep, getPreviousStepFromState, getResolvedTree, hasPersistedState, isVisible, mergeContextParams, registerCustomValidator, resolveFieldValue, resolveTree, validateSchema };
|