@waypointjs/core 0.1.4 → 0.1.5

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/index.cjs CHANGED
@@ -65,24 +65,29 @@ function evaluateOperator(operator, actual, expected) {
65
65
  return false;
66
66
  }
67
67
  }
68
- function evaluateRule(rule, data, externalVars) {
68
+ function evaluateRule(rule, data, externalVars, externalEnums) {
69
69
  const actual = resolveFieldValue(rule.field, data, externalVars);
70
+ if ((rule.operator === "inEnum" || rule.operator === "notInEnum") && externalEnums) {
71
+ const enumDef = externalEnums.find((e) => e.id === String(rule.value));
72
+ const values = enumDef?.values.map((v) => String(v.value)) ?? [];
73
+ return rule.operator === "inEnum" ? values.includes(String(actual)) : !values.includes(String(actual));
74
+ }
70
75
  return evaluateOperator(rule.operator, actual, rule.value);
71
76
  }
72
- function evaluateConditionGroup(group, data, externalVars) {
77
+ function evaluateConditionGroup(group, data, externalVars, externalEnums) {
73
78
  const ruleResults = group.rules.map(
74
- (rule) => evaluateRule(rule, data, externalVars)
79
+ (rule) => evaluateRule(rule, data, externalVars, externalEnums)
75
80
  );
76
81
  const groupResults = (group.groups ?? []).map(
77
- (subGroup) => evaluateConditionGroup(subGroup, data, externalVars)
82
+ (subGroup) => evaluateConditionGroup(subGroup, data, externalVars, externalEnums)
78
83
  );
79
84
  const allResults = [...ruleResults, ...groupResults];
80
85
  if (allResults.length === 0) return true;
81
86
  return group.combinator === "and" ? allResults.every(Boolean) : allResults.some(Boolean);
82
87
  }
83
- function isVisible(visibleWhen, data, externalVars) {
88
+ function isVisible(visibleWhen, data, externalVars, externalEnums) {
84
89
  if (!visibleWhen) return true;
85
- return evaluateConditionGroup(visibleWhen, data, externalVars);
90
+ return evaluateConditionGroup(visibleWhen, data, externalVars, externalEnums);
86
91
  }
87
92
 
88
93
  // src/tree-resolver.ts
@@ -106,16 +111,24 @@ function findMissingBlockingVars(externalVariables, externalVars, visibleSteps)
106
111
  return value === void 0 || value === null;
107
112
  }).map((extVar) => extVar.id);
108
113
  }
109
- function resolveTree(schema, data, externalVars) {
114
+ function resolveTree(schema, data, externalVars, externalEnums) {
110
115
  const visibleSteps = [];
111
116
  const hiddenSteps = [];
112
117
  for (const stepDef of schema.steps) {
113
- const stepVisible = isVisible(stepDef.visibleWhen, data, externalVars);
114
- const resolvedFields = stepDef.fields.map((fieldDef) => ({
115
- definition: fieldDef,
116
- visible: isVisible(fieldDef.visibleWhen, data, externalVars),
117
- dependenciesMet: areDependenciesMet(fieldDef.dependsOn, data, externalVars)
118
- }));
118
+ const stepVisible = isVisible(stepDef.visibleWhen, data, externalVars, externalEnums);
119
+ const resolvedFields = stepDef.fields.map((fieldDef) => {
120
+ let resolvedOptions;
121
+ if (fieldDef.externalEnumId && externalEnums) {
122
+ const enumDef = externalEnums.find((e) => e.id === fieldDef.externalEnumId);
123
+ resolvedOptions = enumDef?.values;
124
+ }
125
+ return {
126
+ definition: fieldDef,
127
+ visible: isVisible(fieldDef.visibleWhen, data, externalVars, externalEnums),
128
+ dependenciesMet: areDependenciesMet(fieldDef.dependsOn, data, externalVars),
129
+ resolvedOptions
130
+ };
131
+ });
119
132
  const resolvedStep = {
120
133
  definition: stepDef,
121
134
  visible: stepVisible,
@@ -322,7 +335,7 @@ var customValidatorRegistry = {};
322
335
  function registerCustomValidator(id, fn) {
323
336
  customValidatorRegistry[id] = fn;
324
337
  }
325
- function buildFieldSchema(field) {
338
+ function buildFieldSchema(field, externalEnums) {
326
339
  const rules = field.validation ?? [];
327
340
  const isRequired = rules.some((r) => r.type === "required");
328
341
  const isNumeric = field.type === "number";
@@ -341,12 +354,24 @@ function buildFieldSchema(field) {
341
354
  invalid_type_error: "Must be a number"
342
355
  });
343
356
  for (const rule of rules) {
344
- if (rule.type === "min") {
357
+ if (rule.type === "min" || rule.type === "greaterThanOrEqual") {
345
358
  const n = Number(rule.value);
346
359
  if (!isNaN(n)) numSchema = numSchema.gte(n, rule.message);
347
- } else if (rule.type === "max") {
360
+ } else if (rule.type === "max" || rule.type === "lessThanOrEqual") {
348
361
  const n = Number(rule.value);
349
362
  if (!isNaN(n)) numSchema = numSchema.lte(n, rule.message);
363
+ } else if (rule.type === "greaterThan") {
364
+ const n = Number(rule.value);
365
+ if (!isNaN(n)) numSchema = numSchema.gt(n, rule.message);
366
+ } else if (rule.type === "lessThan") {
367
+ const n = Number(rule.value);
368
+ if (!isNaN(n)) numSchema = numSchema.lt(n, rule.message);
369
+ } else if (rule.type === "equals") {
370
+ const n = Number(rule.value);
371
+ if (!isNaN(n)) numSchema = numSchema.refine((v) => v === n, rule.message);
372
+ } else if (rule.type === "notEquals") {
373
+ const n = Number(rule.value);
374
+ if (!isNaN(n)) numSchema = numSchema.refine((v) => v !== n, rule.message);
350
375
  }
351
376
  }
352
377
  return isRequired ? numSchema : numSchema.optional();
@@ -379,27 +404,96 @@ function buildFieldSchema(field) {
379
404
  strSchema = strSchema.regex(new RegExp(String(rule.value)), rule.message);
380
405
  }
381
406
  break;
407
+ case "equals":
408
+ if (rule.value !== void 0) {
409
+ const eq = String(rule.value);
410
+ refineRules.push({ fn: (v) => String(v) === eq, message: rule.message });
411
+ }
412
+ break;
413
+ case "notEquals":
414
+ if (rule.value !== void 0) {
415
+ const neq = String(rule.value);
416
+ refineRules.push({ fn: (v) => String(v) !== neq, message: rule.message });
417
+ }
418
+ break;
419
+ case "greaterThan":
420
+ if (rule.value !== void 0) {
421
+ const gt = Number(rule.value);
422
+ refineRules.push({ fn: (v) => Number(v) > gt, message: rule.message });
423
+ }
424
+ break;
425
+ case "greaterThanOrEqual":
426
+ if (rule.value !== void 0) {
427
+ const gte = Number(rule.value);
428
+ refineRules.push({ fn: (v) => Number(v) >= gte, message: rule.message });
429
+ }
430
+ break;
431
+ case "lessThan":
432
+ if (rule.value !== void 0) {
433
+ const lt = Number(rule.value);
434
+ refineRules.push({ fn: (v) => Number(v) < lt, message: rule.message });
435
+ }
436
+ break;
437
+ case "lessThanOrEqual":
438
+ if (rule.value !== void 0) {
439
+ const lte = Number(rule.value);
440
+ refineRules.push({ fn: (v) => Number(v) <= lte, message: rule.message });
441
+ }
442
+ break;
443
+ case "contains":
444
+ if (rule.value !== void 0) {
445
+ const sub = String(rule.value);
446
+ refineRules.push({ fn: (v) => String(v).includes(sub), message: rule.message });
447
+ }
448
+ break;
449
+ case "notContains":
450
+ if (rule.value !== void 0) {
451
+ const nsub = String(rule.value);
452
+ refineRules.push({ fn: (v) => !String(v).includes(nsub), message: rule.message });
453
+ }
454
+ break;
455
+ case "matches":
456
+ if (rule.value !== void 0 && rule.value !== null) {
457
+ const rx = new RegExp(String(rule.value));
458
+ refineRules.push({ fn: (v) => rx.test(String(v)), message: rule.message });
459
+ }
460
+ break;
461
+ case "inEnum":
462
+ if (rule.value && externalEnums) {
463
+ const enumDef = externalEnums.find((e) => e.id === String(rule.value));
464
+ if (enumDef) {
465
+ const values = enumDef.values.map((v) => String(v.value));
466
+ refineRules.push({ fn: (v) => values.includes(String(v)), message: rule.message });
467
+ }
468
+ }
469
+ break;
470
+ case "notInEnum":
471
+ if (rule.value && externalEnums) {
472
+ const enumDef = externalEnums.find((e) => e.id === String(rule.value));
473
+ if (enumDef) {
474
+ const values = enumDef.values.map((v) => String(v.value));
475
+ refineRules.push({ fn: (v) => !values.includes(String(v)), message: rule.message });
476
+ }
477
+ }
478
+ break;
382
479
  case "custom":
383
480
  if (rule.customValidatorId && customValidatorRegistry[rule.customValidatorId]) {
384
- refineRules.push({ id: rule.customValidatorId, message: rule.message });
481
+ refineRules.push({ fn: (v) => Boolean(customValidatorRegistry[rule.customValidatorId]?.(v)), message: rule.message });
385
482
  }
386
483
  break;
387
484
  }
388
485
  }
389
486
  let finalSchema = isRequired ? strSchema : strSchema.optional();
390
- for (const { id, message } of refineRules) {
391
- finalSchema = finalSchema.refine(
392
- (val) => Boolean(customValidatorRegistry[id]?.(val)),
393
- message
394
- );
487
+ for (const { fn, message } of refineRules) {
488
+ finalSchema = finalSchema.refine(fn, message);
395
489
  }
396
490
  return finalSchema;
397
491
  }
398
- function buildZodSchema(fields) {
492
+ function buildZodSchema(fields, externalEnums) {
399
493
  const shape = {};
400
494
  for (const resolvedField of fields) {
401
495
  if (!resolvedField.visible) continue;
402
- shape[resolvedField.definition.id] = buildFieldSchema(resolvedField.definition);
496
+ shape[resolvedField.definition.id] = buildFieldSchema(resolvedField.definition, externalEnums);
403
497
  }
404
498
  return zod.z.object(shape);
405
499
  }
@@ -1 +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"]}
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, ExternalEnum } 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 externalEnums?: ExternalEnum[]\n): boolean {\n const actual = resolveFieldValue(rule.field, data, externalVars);\n\n if ((rule.operator === \"inEnum\" || rule.operator === \"notInEnum\") && externalEnums) {\n const enumDef = externalEnums.find((e) => e.id === String(rule.value));\n const values = enumDef?.values.map((v) => String(v.value)) ?? [];\n return rule.operator === \"inEnum\"\n ? values.includes(String(actual))\n : !values.includes(String(actual));\n }\n\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 externalEnums?: ExternalEnum[]\n): boolean {\n const ruleResults = group.rules.map((rule) =>\n evaluateRule(rule, data, externalVars, externalEnums)\n );\n\n const groupResults = (group.groups ?? []).map((subGroup) =>\n evaluateConditionGroup(subGroup, data, externalVars, externalEnums)\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 externalEnums?: ExternalEnum[]\n): boolean {\n if (!visibleWhen) return true;\n return evaluateConditionGroup(visibleWhen, data, externalVars, externalEnums);\n}\n","import type { ExternalEnum, ExternalVariable, FieldDefinition, SelectOption, 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 * Resolved options from an external enum.\n * Set when `definition.externalEnumId` matches an enum in the provided `externalEnums`.\n * Use `field.resolvedOptions ?? field.definition.options` when rendering.\n */\n resolvedOptions?: SelectOption[];\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 externalEnums?: ExternalEnum[]\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, externalEnums);\n\n const resolvedFields: ResolvedField[] = stepDef.fields.map((fieldDef) => {\n let resolvedOptions: SelectOption[] | undefined;\n if (fieldDef.externalEnumId && externalEnums) {\n const enumDef = externalEnums.find((e) => e.id === fieldDef.externalEnumId);\n resolvedOptions = enumDef?.values;\n }\n return {\n definition: fieldDef,\n visible: isVisible(fieldDef.visibleWhen, data, externalVars, externalEnums),\n dependenciesMet: areDependenciesMet(fieldDef.dependsOn, data, externalVars),\n resolvedOptions,\n };\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 { ExternalEnum, 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, externalEnums?: ExternalEnum[]): 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\" || rule.type === \"greaterThanOrEqual\") {\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\" || rule.type === \"lessThanOrEqual\") {\n const n = Number(rule.value);\n if (!isNaN(n)) numSchema = numSchema.lte(n, rule.message) as typeof numSchema;\n } else if (rule.type === \"greaterThan\") {\n const n = Number(rule.value);\n if (!isNaN(n)) numSchema = numSchema.gt(n, rule.message) as typeof numSchema;\n } else if (rule.type === \"lessThan\") {\n const n = Number(rule.value);\n if (!isNaN(n)) numSchema = numSchema.lt(n, rule.message) as typeof numSchema;\n } else if (rule.type === \"equals\") {\n const n = Number(rule.value);\n if (!isNaN(n)) numSchema = numSchema.refine((v) => v === n, rule.message) as unknown as typeof numSchema;\n } else if (rule.type === \"notEquals\") {\n const n = Number(rule.value);\n if (!isNaN(n)) numSchema = numSchema.refine((v) => v !== n, rule.message) as unknown 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<{ fn: (v: unknown) => boolean; 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 \"equals\":\n if (rule.value !== undefined) {\n const eq = String(rule.value);\n refineRules.push({ fn: (v: unknown) => String(v) === eq, message: rule.message });\n }\n break;\n case \"notEquals\":\n if (rule.value !== undefined) {\n const neq = String(rule.value);\n refineRules.push({ fn: (v: unknown) => String(v) !== neq, message: rule.message });\n }\n break;\n case \"greaterThan\":\n if (rule.value !== undefined) {\n const gt = Number(rule.value);\n refineRules.push({ fn: (v: unknown) => Number(v) > gt, message: rule.message });\n }\n break;\n case \"greaterThanOrEqual\":\n if (rule.value !== undefined) {\n const gte = Number(rule.value);\n refineRules.push({ fn: (v: unknown) => Number(v) >= gte, message: rule.message });\n }\n break;\n case \"lessThan\":\n if (rule.value !== undefined) {\n const lt = Number(rule.value);\n refineRules.push({ fn: (v: unknown) => Number(v) < lt, message: rule.message });\n }\n break;\n case \"lessThanOrEqual\":\n if (rule.value !== undefined) {\n const lte = Number(rule.value);\n refineRules.push({ fn: (v: unknown) => Number(v) <= lte, message: rule.message });\n }\n break;\n case \"contains\":\n if (rule.value !== undefined) {\n const sub = String(rule.value);\n refineRules.push({ fn: (v: unknown) => String(v).includes(sub), message: rule.message });\n }\n break;\n case \"notContains\":\n if (rule.value !== undefined) {\n const nsub = String(rule.value);\n refineRules.push({ fn: (v: unknown) => !String(v).includes(nsub), message: rule.message });\n }\n break;\n case \"matches\":\n if (rule.value !== undefined && rule.value !== null) {\n const rx = new RegExp(String(rule.value));\n refineRules.push({ fn: (v: unknown) => rx.test(String(v)), message: rule.message });\n }\n break;\n case \"inEnum\":\n if (rule.value && externalEnums) {\n const enumDef = externalEnums.find((e) => e.id === String(rule.value));\n if (enumDef) {\n const values = enumDef.values.map((v) => String(v.value));\n refineRules.push({ fn: (v: unknown) => values.includes(String(v)), message: rule.message });\n }\n }\n break;\n case \"notInEnum\":\n if (rule.value && externalEnums) {\n const enumDef = externalEnums.find((e) => e.id === String(rule.value));\n if (enumDef) {\n const values = enumDef.values.map((v) => String(v.value));\n refineRules.push({ fn: (v: unknown) => !values.includes(String(v)), message: rule.message });\n }\n }\n break;\n case \"custom\":\n if (rule.customValidatorId && customValidatorRegistry[rule.customValidatorId]) {\n refineRules.push({ fn: (v: unknown) => Boolean(customValidatorRegistry[rule.customValidatorId!]?.(v)), 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 { fn, message } of refineRules) {\n finalSchema = finalSchema.refine(fn, message);\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 externalEnums?: ExternalEnum[]\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, externalEnums);\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"]}