extended-dynamic-forms 0.1.20 → 0.1.22

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.
Files changed (63) hide show
  1. package/README.md +60 -4
  2. package/dist/ExtendedForm.d.ts +4 -0
  3. package/dist/WizardForm.d.ts +26 -0
  4. package/dist/components/arrays/ArrayFieldItemTemplate.d.ts +3 -0
  5. package/dist/components/arrays/ArrayFieldTemplate.d.ts +3 -0
  6. package/dist/components/arrays/index.d.ts +2 -0
  7. package/dist/components/fields/AddressField.d.ts +3 -0
  8. package/dist/components/fields/CurrencyField.d.ts +4 -0
  9. package/dist/components/fields/PhoneField.d.ts +4 -0
  10. package/dist/components/index.d.ts +24 -0
  11. package/dist/components/templates/FieldTemplate.d.ts +4 -0
  12. package/dist/components/templates/SubmitButton.d.ts +4 -0
  13. package/dist/components/templates/index.d.ts +2 -0
  14. package/dist/conditionals/ConditionalActions.d.ts +13 -0
  15. package/dist/conditionals/ConditionalContext.d.ts +32 -0
  16. package/dist/conditionals/DynamicArrayConditionalEngine.d.ts +77 -0
  17. package/dist/conditionals/SimpleConditionalEngine.d.ts +41 -0
  18. package/dist/conditionals/SmartJsonRulesTransformer.d.ts +10 -0
  19. package/dist/conditionals/index.d.ts +7 -0
  20. package/dist/conditionals/v2/createConditionalEngineHook.d.ts +3 -0
  21. package/dist/conditionals/v2/engines/schemaEngineConfig.d.ts +4 -0
  22. package/dist/conditionals/v2/engines/uiEngineConfig.d.ts +4 -0
  23. package/dist/conditionals/v2/engines/validationEngineConfig.d.ts +13 -0
  24. package/dist/conditionals/v2/hooks/useConditionalSchema.d.ts +4 -0
  25. package/dist/conditionals/v2/hooks/useConditionalUi.d.ts +4 -0
  26. package/dist/conditionals/v2/hooks/useConditionalValidation.d.ts +4 -0
  27. package/dist/conditionals/v2/index.d.ts +10 -0
  28. package/dist/conditionals/v2/migration.d.ts +76 -0
  29. package/dist/conditionals/v2/types.d.ts +37 -0
  30. package/dist/conditionals/v2/utils/dynamicArrayItems.d.ts +59 -0
  31. package/dist/conditionals/v2/utils/jsonPatch.d.ts +9 -0
  32. package/dist/events/FormEventContext.d.ts +19 -0
  33. package/dist/events/FormEventHub.d.ts +27 -0
  34. package/dist/events/FormEventManager.d.ts +10 -0
  35. package/dist/events/index.d.ts +4 -0
  36. package/dist/hooks/index.d.ts +1 -0
  37. package/dist/hooks/useFormDevTools.d.ts +48 -0
  38. package/dist/index.d.ts +15 -0
  39. package/dist/index.es.js +20325 -0
  40. package/dist/index.umd.js +172 -0
  41. package/dist/layouts/index.d.ts +2 -0
  42. package/dist/layouts/wizard/ProgressIndicator.d.ts +10 -0
  43. package/dist/layouts/wizard/StepNavigation.d.ts +11 -0
  44. package/dist/layouts/wizard/WizardLayout.d.ts +31 -0
  45. package/dist/layouts/wizard/WizardNavigation.d.ts +16 -0
  46. package/dist/layouts/wizard/WizardObjectFieldTemplate.d.ts +4 -0
  47. package/dist/layouts/wizard/WizardSectionTemplate.d.ts +11 -0
  48. package/dist/layouts/wizard/index.d.ts +7 -0
  49. package/dist/types/index.d.ts +88 -0
  50. package/dist/utils/formDataUtils.d.ts +22 -0
  51. package/dist/utils/index.d.ts +4 -0
  52. package/dist/utils/schemaUtils.d.ts +24 -0
  53. package/dist/utils/validationUtils.d.ts +26 -0
  54. package/dist/vanilla-entry.d.ts +208 -0
  55. package/dist/widgets/date/DateWidget.d.ts +4 -0
  56. package/dist/widgets/enhanced/EnhancedWidgets.d.ts +36 -0
  57. package/dist/widgets/file/FileWidget.d.ts +4 -0
  58. package/dist/widgets/index.d.ts +33 -0
  59. package/dist/widgets/input/ColorWidget.d.ts +4 -0
  60. package/dist/widgets/input/RangeWidget.d.ts +4 -0
  61. package/dist/widgets/input/RatingWidget.d.ts +4 -0
  62. package/package.json +2 -2
  63. package/dist/extended-dynamic-forms.standalone.js +0 -882
package/README.md CHANGED
@@ -66,13 +66,14 @@ const uiRules: UiRule[] = [{
66
66
 
67
67
  ### 🧙‍♂️ Multi-Step Wizard Forms
68
68
  - Automatic step detection from schema structure
69
- - Step-aware conditional logic
69
+ - **Full conditional logic support** with step-aware rule processing
70
70
  - Built-in progress indicators and navigation
71
71
  - Per-step validation
72
+ - Supports both v1 conditions (deprecated) and v2 Three Pillars architecture
72
73
 
73
74
  **Step-Aware Conditional Logic**
74
75
 
75
- The `WizardForm` automatically scopes conditional logic to the current step. Use v2 `UiRule`s with field prefixes:
76
+ The `WizardForm` automatically filters and transforms conditional rules to work within the current step's context. This means you can define conditions that reference fields across different steps, and the wizard will intelligently apply only the relevant rules for the active step:
76
77
 
77
78
  ```tsx
78
79
  // Define steps with prefixed field names to avoid collisions
@@ -161,6 +162,28 @@ const uiRules: UiRule[] = [{
161
162
  </html>
162
163
  ```
163
164
 
165
+ **Important Notes on Conditional Logic in Vanilla JS:**
166
+ - **Only v1 conditions are supported** - The Three Pillars v2 architecture requires React hooks
167
+ - Use the `conditionals` prop with v1 format: `{ rules: [...] }`
168
+ - Subject to v1's O(M×N) performance for array conditionals
169
+ - For v2 benefits, use the React-based API instead
170
+
171
+ ```javascript
172
+ // Vanilla JS supports only v1 conditionals
173
+ ExtendedDynamicForms.createForm({
174
+ container: '#my-form',
175
+ schema: schema,
176
+ conditionals: {
177
+ rules: [
178
+ {
179
+ conditions: { showField: true },
180
+ event: { type: 'show', params: { field: 'conditionalField' } }
181
+ }
182
+ ]
183
+ }
184
+ });
185
+ ```
186
+
164
187
  **Perfect for:**
165
188
  - WordPress/Drupal integrations
166
189
  - Legacy applications
@@ -524,7 +547,7 @@ const migrationReport = generateMigrationReport(v1Rules, {
524
547
 
525
548
  ### Simple Wizard Form (Recommended)
526
549
 
527
- The `WizardForm` component automatically detects multi-step forms and handles navigation. Use it with Three Pillars v2:
550
+ The `WizardForm` component automatically detects multi-step forms and handles navigation. It fully supports conditional logic through either v1 conditions (deprecated) or the recommended Three Pillars v2 architecture:
528
551
 
529
552
  ```tsx
530
553
  import { useState } from 'react';
@@ -532,9 +555,22 @@ import { WizardForm } from 'extended-dynamic-forms';
532
555
  import { useConditionalUi, UiRule } from 'extended-dynamic-forms/conditionals/v2';
533
556
  import schema from './schema.json';
534
557
  import baseUiSchema from './ui-schema.json';
535
- import uiRules from './ui-rules'; // Your v2 UI rules
536
558
  import webhooks from './webhooks.json';
537
559
 
560
+ // Example: v2 Three Pillars approach (recommended)
561
+ const uiRules: UiRule[] = [
562
+ {
563
+ name: 'Show tax ID in company step when listed',
564
+ condition: (formData) => formData.STEP_COMPANY?.isListedCompany === true,
565
+ effect: [{ op: 'remove', path: '/STEP_COMPANY/taxId/ui:widget' }]
566
+ },
567
+ {
568
+ name: 'Show shareholding percentage for directors with shares',
569
+ condition: (formData) => formData.STEP_DIRECTORS?.directors?.some(d => d.hasShareholding),
570
+ effect: [{ op: 'remove', path: '/STEP_DIRECTORS/directors/items/shareholdingPercentage/ui:widget' }]
571
+ }
572
+ ];
573
+
538
574
  function App() {
539
575
  const [formData, setFormData] = useState({});
540
576
  const conditionalUiSchema = useConditionalUi(uiRules, baseUiSchema, formData);
@@ -550,6 +586,26 @@ function App() {
550
586
  />
551
587
  );
552
588
  }
589
+
590
+ // Alternative: v1 conditions approach (deprecated but still supported)
591
+ const v1Conditions = [
592
+ {
593
+ conditions: { "STEP_COMPANY.isListedCompany": true },
594
+ event: { type: "show", params: { field: "STEP_COMPANY.taxId" } }
595
+ },
596
+ {
597
+ conditions: { "STEP_DIRECTORS.directors[*].hasShareholding": true },
598
+ event: { type: "require", params: { field: "STEP_DIRECTORS.directors[*].shareholdingPercentage" } }
599
+ }
600
+ ];
601
+
602
+ // Pass v1 conditions directly to WizardForm
603
+ <WizardForm
604
+ schema={schema}
605
+ uiSchema={uiSchema}
606
+ conditions={v1Conditions} // WizardForm handles step-aware transformation
607
+ onSubmit={(data) => console.log('Submitted:', data.formData)}
608
+ />
553
609
  ```
554
610
 
555
611
  ### Basic Form with Three Pillars v2
@@ -0,0 +1,4 @@
1
+ import { default as React } from 'react';
2
+ import { ExtendedFormProps } from './types';
3
+
4
+ export declare const ExtendedForm: React.ForwardRefExoticComponent<Omit<ExtendedFormProps, "ref"> & React.RefAttributes<any>>;
@@ -0,0 +1,26 @@
1
+ import { WebhookConfig } from './types';
2
+
3
+ export interface WizardStep {
4
+ id: string;
5
+ title: string;
6
+ description?: string;
7
+ }
8
+ export interface WizardFormProps {
9
+ schema: any;
10
+ uiSchema: any;
11
+ conditions?: any[];
12
+ webhooks?: WebhookConfig[];
13
+ formData?: any;
14
+ onSubmit?: (data: any) => void;
15
+ onStepChange?: (step: number, data: any) => void;
16
+ onFieldFocus?: (event: any) => void;
17
+ onFieldBlur?: (event: any) => void;
18
+ onFieldChange?: (event: any) => void;
19
+ showProgressBar?: boolean;
20
+ showStepDescription?: boolean;
21
+ submitButtonText?: string;
22
+ liveValidate?: boolean;
23
+ showErrorList?: boolean;
24
+ }
25
+ export declare function WizardForm({ schema, uiSchema, conditions, // JSON Rules Engine format conditions
26
+ webhooks, formData: initialFormData, onSubmit, onStepChange, onFieldFocus, onFieldBlur, onFieldChange, showProgressBar, showStepDescription, submitButtonText, liveValidate, showErrorList, }: WizardFormProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import { ArrayFieldItemTemplateType } from '@rjsf/utils';
2
+
3
+ export declare const ArrayFieldItemTemplate: (props: ArrayFieldItemTemplateType) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import { ArrayFieldTemplateProps } from '@rjsf/utils';
2
+
3
+ export declare const ArrayFieldTemplate: (props: ArrayFieldTemplateProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,2 @@
1
+ export { ArrayFieldTemplate } from './ArrayFieldTemplate';
2
+ export { ArrayFieldItemTemplate } from './ArrayFieldItemTemplate';
@@ -0,0 +1,3 @@
1
+ import { FieldProps } from '@rjsf/utils';
2
+
3
+ export declare const AddressField: React.FC<FieldProps>;
@@ -0,0 +1,4 @@
1
+ import { default as React } from 'react';
2
+ import { FieldProps } from '@rjsf/utils';
3
+
4
+ export declare const CurrencyField: React.FC<FieldProps>;
@@ -0,0 +1,4 @@
1
+ import { default as React } from 'react';
2
+ import { FieldProps } from '@rjsf/utils';
3
+
4
+ export declare const PhoneField: React.FC<FieldProps>;
@@ -0,0 +1,24 @@
1
+ import { AddressField } from './fields/AddressField';
2
+ import { PhoneField } from './fields/PhoneField';
3
+ import { CurrencyField } from './fields/CurrencyField';
4
+ import { ArrayFieldTemplate, ArrayFieldItemTemplate } from './arrays';
5
+ import { WizardObjectFieldTemplate, WizardSectionTemplate } from '../layouts/wizard';
6
+ import { SubmitButton } from './templates/SubmitButton';
7
+ import { FieldTemplate } from './templates/FieldTemplate';
8
+
9
+ export declare const customFields: {
10
+ address: import('react').FC<import('@rjsf/utils').FieldProps<any, import('@rjsf/utils').RJSFSchema, any>>;
11
+ phone: import('react').FC<import('@rjsf/utils').FieldProps<any, import('@rjsf/utils').RJSFSchema, any>>;
12
+ currency: import('react').FC<import('@rjsf/utils').FieldProps<any, import('@rjsf/utils').RJSFSchema, any>>;
13
+ };
14
+ export declare const customTemplates: {
15
+ FieldTemplate: import('react').FC<import('@rjsf/utils').FieldTemplateProps>;
16
+ ArrayFieldTemplate: (props: import('@rjsf/utils').ArrayFieldTemplateProps) => import("react/jsx-runtime").JSX.Element;
17
+ ArrayFieldItemTemplate: (props: import('@rjsf/utils').ArrayFieldItemTemplateType) => import("react/jsx-runtime").JSX.Element;
18
+ WizardObjectFieldTemplate: import('react').FC<import('@rjsf/utils').ObjectFieldTemplateProps>;
19
+ WizardSectionTemplate: import('react').FC<import('../layouts/wizard/WizardSectionTemplate').WizardSectionTemplateProps>;
20
+ ButtonTemplates: {
21
+ SubmitButton: import('react').FC<import('@rjsf/utils').SubmitButtonProps>;
22
+ };
23
+ };
24
+ export { AddressField, PhoneField, CurrencyField, FieldTemplate, ArrayFieldTemplate, ArrayFieldItemTemplate, WizardObjectFieldTemplate, WizardSectionTemplate, SubmitButton, };
@@ -0,0 +1,4 @@
1
+ import { default as React } from 'react';
2
+ import { FieldTemplateProps } from '@rjsf/utils';
3
+
4
+ export declare const FieldTemplate: React.FC<FieldTemplateProps>;
@@ -0,0 +1,4 @@
1
+ import { default as React } from 'react';
2
+ import { SubmitButtonProps } from '@rjsf/utils';
3
+
4
+ export declare const SubmitButton: React.FC<SubmitButtonProps>;
@@ -0,0 +1,2 @@
1
+ export { FieldTemplate } from './FieldTemplate';
2
+ export { SubmitButton } from './SubmitButton';
@@ -0,0 +1,13 @@
1
+ import { ConditionalAction, ConditionalActions } from '../types';
2
+
3
+ declare const remove: ConditionalAction;
4
+ declare const require: ConditionalAction;
5
+ declare const uiAppend: ConditionalAction;
6
+ declare const uiOverride: ConditionalAction;
7
+ declare const uiReplace: ConditionalAction;
8
+ declare const enable: ConditionalAction;
9
+ declare const disable: ConditionalAction;
10
+ declare const optional: ConditionalAction;
11
+ declare const show: ConditionalAction;
12
+ export declare const defaultActions: ConditionalActions;
13
+ export { remove, require, uiAppend, uiOverride, uiReplace, enable, disable, optional, show, };
@@ -0,0 +1,32 @@
1
+ import { default as React } from 'react';
2
+ import { RJSFSchema, UiSchema } from '@rjsf/utils';
3
+ import { ConditionalRule, ConditionalConfig, ConditionalState } from '../types';
4
+ import { DynamicArrayConditionalEngine } from './DynamicArrayConditionalEngine';
5
+
6
+ interface ConditionalContextType {
7
+ state: ConditionalState;
8
+ processor: DynamicArrayConditionalEngine | null;
9
+ processConditionals: (formData: any) => Promise<void>;
10
+ updateRules: (rules: ConditionalRule[]) => void;
11
+ addAction: (actionType: string, actionFunction: any) => void;
12
+ removeAction: (actionType: string) => void;
13
+ getAvailableActions: () => string[];
14
+ }
15
+ export interface ConditionalProviderProps {
16
+ children: React.ReactNode;
17
+ schema: RJSFSchema;
18
+ uiSchema?: UiSchema;
19
+ config?: ConditionalConfig;
20
+ onSchemaChange?: (schemas: {
21
+ schema: RJSFSchema;
22
+ uiSchema: UiSchema;
23
+ }) => void;
24
+ }
25
+ export declare const ConditionalProvider: React.FC<ConditionalProviderProps>;
26
+ export declare const useConditionals: () => ConditionalContextType;
27
+ export declare const useConditionalSchema: () => {
28
+ schema: RJSFSchema;
29
+ uiSchema: UiSchema;
30
+ isProcessing: boolean;
31
+ };
32
+ export {};
@@ -0,0 +1,77 @@
1
+ import { RJSFSchema, UiSchema } from '@rjsf/utils';
2
+ import { ConditionalRule, ConditionalEvent, ConditionalActions, ConditionalEngineInstance } from '../types';
3
+
4
+ export declare class DynamicArrayConditionalEngine implements ConditionalEngineInstance {
5
+ private originalRules;
6
+ private engine;
7
+ private expandedRules;
8
+ constructor(rules: ConditionalRule[], schema: RJSFSchema, uiSchema?: UiSchema, extraActions?: ConditionalActions);
9
+ /**
10
+ * Expand array patterns like directors[*] based on actual form data
11
+ */
12
+ expandArrayPatterns(rules: ConditionalRule[], formData: any): ConditionalRule[];
13
+ /**
14
+ * Check if a rule contains array patterns like [*]
15
+ */
16
+ private hasArrayPatterns;
17
+ /**
18
+ * Expand a single rule that contains array patterns
19
+ */
20
+ private expandSingleRule;
21
+ /**
22
+ * Find all array patterns like "directors[*]" in a rule
23
+ */
24
+ private findArrayPatterns;
25
+ /**
26
+ * Expand a rule for a specific array index
27
+ */
28
+ private expandRuleForIndex;
29
+ /**
30
+ * Get nested value from object using dot notation
31
+ */
32
+ private getNestedValue;
33
+ /**
34
+ * Pre-process uiSchema to ensure array items have proper template structure
35
+ */
36
+ private preprocessUiSchemaForArrays;
37
+ /**
38
+ * Main processing method - implement ConditionalEngineInstance interface
39
+ */
40
+ processFormData(formData: any): Promise<{
41
+ schema: RJSFSchema;
42
+ uiSchema: UiSchema;
43
+ formData: any;
44
+ }>;
45
+ /**
46
+ * Get the original unexpanded rules
47
+ */
48
+ getOriginalRules(): ConditionalRule[];
49
+ /**
50
+ * Get the current expanded rules
51
+ */
52
+ getCurrentRules(): ConditionalRule[];
53
+ /**
54
+ * Manually set rules (useful for testing)
55
+ */
56
+ setRules(rules: ConditionalRule[]): void;
57
+ /**
58
+ * Add a rule to the engine (implement ConditionalEngineInstance interface)
59
+ */
60
+ addRule(rule: ConditionalRule): void;
61
+ /**
62
+ * Run the conditional engine and return events (implement ConditionalEngineInstance interface)
63
+ */
64
+ run(formData: any): Promise<ConditionalEvent[]>;
65
+ /**
66
+ * Add an action to the engine (for ConditionalContext compatibility)
67
+ */
68
+ addAction(actionType: string, actionFunction: any): void;
69
+ /**
70
+ * Remove an action from the engine (for ConditionalContext compatibility)
71
+ */
72
+ removeAction(actionType: string): void;
73
+ /**
74
+ * Get available actions (for ConditionalContext compatibility)
75
+ */
76
+ getAvailableActions(): string[];
77
+ }
@@ -0,0 +1,41 @@
1
+ import { RJSFSchema, UiSchema } from '@rjsf/utils';
2
+ import { ConditionalRule, ConditionalEvent, ConditionalActions, ConditionalEngineInstance } from '../types';
3
+
4
+ export declare class SimpleConditionalEngine implements ConditionalEngineInstance {
5
+ private rules;
6
+ private actions;
7
+ private originalSchema;
8
+ private originalUiSchema;
9
+ constructor(rules: ConditionalRule[], schema: RJSFSchema, uiSchema?: UiSchema, extraActions?: ConditionalActions);
10
+ /**
11
+ * Get nested value from object using dot notation with array index support
12
+ */
13
+ private getNestedValue;
14
+ /**
15
+ * Evaluate a single condition against form data
16
+ */
17
+ private evaluateCondition;
18
+ /**
19
+ * Evaluate field-level condition
20
+ */
21
+ private evaluateFieldCondition;
22
+ addRule(rule: ConditionalRule): void;
23
+ run(formData: any): Promise<ConditionalEvent[]>;
24
+ processEvents(events: ConditionalEvent[], schema: RJSFSchema, uiSchema: UiSchema, formData: any): {
25
+ schema: RJSFSchema;
26
+ uiSchema: UiSchema;
27
+ };
28
+ processFormData(formData: any): Promise<{
29
+ schema: RJSFSchema;
30
+ uiSchema: UiSchema;
31
+ formData: any;
32
+ }>;
33
+ runAndProcess(formData: any, schema: RJSFSchema, uiSchema: UiSchema): Promise<{
34
+ schema: RJSFSchema;
35
+ uiSchema: UiSchema;
36
+ events: ConditionalEvent[];
37
+ }>;
38
+ getAvailableActions(): string[];
39
+ addAction(actionType: string, actionFunction: any): void;
40
+ removeAction(actionType: string): void;
41
+ }
@@ -0,0 +1,10 @@
1
+ import { ConditionalRule } from '../types';
2
+
3
+ /**
4
+ * Smart transformation of JSON Rules Engine rules to internal format
5
+ *
6
+ * Handles show/hide pairs intelligently by converting them to single remove rules
7
+ * Also handles rules that are already in internal format
8
+ */
9
+ export declare function smartTransformJsonRulesEngine(rules: any[]): ConditionalRule[];
10
+ export { smartTransformJsonRulesEngine as transformJsonRulesEngine };
@@ -0,0 +1,7 @@
1
+ export { SimpleConditionalEngine as ConditionalProcessor } from './SimpleConditionalEngine';
2
+ export { SimpleConditionalEngine } from './SimpleConditionalEngine';
3
+ export { DynamicArrayConditionalEngine } from './DynamicArrayConditionalEngine';
4
+ export { defaultActions, remove, require, uiAppend, uiOverride, uiReplace, enable, disable, optional, show, } from './ConditionalActions';
5
+ export { smartTransformJsonRulesEngine as transformJsonRulesEngine } from './SmartJsonRulesTransformer';
6
+ export { smartTransformJsonRulesEngine } from './SmartJsonRulesTransformer';
7
+ export { default as Engine } from 'json-rules-engine-simplified';
@@ -0,0 +1,3 @@
1
+ import { EngineConfig, ConditionalEngineHook } from './types';
2
+
3
+ export declare function createConditionalEngineHook<T>(config: EngineConfig<T>): ConditionalEngineHook<T>;
@@ -0,0 +1,4 @@
1
+ import { EngineConfig, SchemaEffect } from '../types';
2
+ import { RJSFSchema } from '@rjsf/utils';
3
+
4
+ export declare const schemaEngineConfig: EngineConfig<SchemaEffect[], RJSFSchema>;
@@ -0,0 +1,4 @@
1
+ import { EngineConfig, UiEffect } from '../types';
2
+ import { UiSchema } from '@rjsf/utils';
3
+
4
+ export declare const uiEngineConfig: EngineConfig<UiEffect[], UiSchema>;
@@ -0,0 +1,13 @@
1
+ import { EngineConfig, ValidationEffect } from '../types';
2
+ import { ErrorSchema } from '@rjsf/utils';
3
+
4
+ export interface ValidationConfig {
5
+ rules: ValidationEffect[];
6
+ }
7
+ export declare const validationEngineConfig: EngineConfig<ValidationEffect, ValidationConfig>;
8
+ /**
9
+ * Creates a custom validation function compatible with RJSF
10
+ * @param validationConfig The validation configuration containing active rules
11
+ * @returns A validation function that can be passed to RJSF's customValidate prop
12
+ */
13
+ export declare function createCustomValidate(validationConfig: ValidationConfig): (formData: any, errors: ErrorSchema) => ErrorSchema;
@@ -0,0 +1,4 @@
1
+ import { Rule, SchemaEffect } from '../types';
2
+
3
+ export declare const useConditionalSchema: import('..').ConditionalEngineHook<SchemaEffect[]>;
4
+ export type SchemaRule = Rule<SchemaEffect[]>;
@@ -0,0 +1,4 @@
1
+ import { Rule, UiEffect } from '../types';
2
+
3
+ export declare const useConditionalUi: import('..').ConditionalEngineHook<UiEffect[]>;
4
+ export type UiRule = Rule<UiEffect[]>;
@@ -0,0 +1,4 @@
1
+ import { Rule, ValidationEffect } from '../types';
2
+
3
+ export declare const useConditionalValidation: import('..').ConditionalEngineHook<ValidationEffect>;
4
+ export type ValidationRule = Rule<ValidationEffect>;
@@ -0,0 +1,10 @@
1
+ export { createConditionalEngineHook } from './createConditionalEngineHook';
2
+ export type { Rule, EngineConfig, ConditionalEngineHook, UiEffect, SchemaEffect, ValidationEffect, } from './types';
3
+ export { useConditionalUi, type UiRule } from './hooks/useConditionalUi';
4
+ export { useConditionalSchema, type SchemaRule, } from './hooks/useConditionalSchema';
5
+ export { useConditionalValidation, type ValidationRule, } from './hooks/useConditionalValidation';
6
+ export { createDynamicArrayItemsUiSchema, mergeItemUiSchema, arrayItemPatterns, type ArrayItemsFunction, type ArrayItemConditionalFn, } from './utils/dynamicArrayItems';
7
+ export { uiEngineConfig } from './engines/uiEngineConfig';
8
+ export { schemaEngineConfig } from './engines/schemaEngineConfig';
9
+ export { validationEngineConfig, createCustomValidate, } from './engines/validationEngineConfig';
10
+ export * from './migration';
@@ -0,0 +1,76 @@
1
+ import { UiRule } from './hooks/useConditionalUi';
2
+ import { SchemaRule } from './hooks/useConditionalSchema';
3
+
4
+ interface V1Rule {
5
+ conditions: Record<string, any>;
6
+ event: {
7
+ type: string;
8
+ params?: any;
9
+ };
10
+ order?: number;
11
+ }
12
+ interface JsonRulesEngineRule {
13
+ conditions: {
14
+ all?: JsonRulesEngineCondition[];
15
+ any?: JsonRulesEngineCondition[];
16
+ };
17
+ event: {
18
+ type: string;
19
+ params?: any;
20
+ };
21
+ }
22
+ interface JsonRulesEngineCondition {
23
+ fact: string;
24
+ operator: string;
25
+ value: any;
26
+ all?: JsonRulesEngineCondition[];
27
+ any?: JsonRulesEngineCondition[];
28
+ }
29
+ export interface MigrationReport {
30
+ totalRules: number;
31
+ migratedRules: number;
32
+ manualReviewRequired: Array<{
33
+ rule: any;
34
+ reason: string;
35
+ suggestion: string;
36
+ }>;
37
+ warnings: string[];
38
+ }
39
+ /**
40
+ * Analyzes v1 rules and suggests which pillar they belong to
41
+ */
42
+ export declare function analyzeRules(rules: V1Rule[]): {
43
+ uiRules: V1Rule[];
44
+ schemaRules: V1Rule[];
45
+ validationRules: V1Rule[];
46
+ unknown: V1Rule[];
47
+ };
48
+ /**
49
+ * Migrates v1 rules to v2 UI rules
50
+ */
51
+ export declare function migrateV1ToUiRules(rules: V1Rule[]): {
52
+ rules: UiRule[];
53
+ report: MigrationReport;
54
+ };
55
+ /**
56
+ * Migrates v1 rules to v2 Schema rules
57
+ */
58
+ export declare function migrateV1ToSchemaRules(rules: V1Rule[]): {
59
+ rules: SchemaRule[];
60
+ report: MigrationReport;
61
+ };
62
+ /**
63
+ * Migrates JSON Rules Engine format to Three Pillars format
64
+ */
65
+ export declare function migrateJsonRulesEngine(rules: JsonRulesEngineRule[]): {
66
+ uiRules: UiRule[];
67
+ report: MigrationReport;
68
+ };
69
+ /**
70
+ * Generates a comprehensive migration report
71
+ */
72
+ export declare function generateMigrationReport(v1Rules: V1Rule[], options?: {
73
+ includeExamples?: boolean;
74
+ outputFormat?: 'markdown' | 'json';
75
+ }): string;
76
+ export {};
@@ -0,0 +1,37 @@
1
+ import { ErrorSchema } from '@rjsf/utils';
2
+
3
+ export interface Rule<T> {
4
+ name: string;
5
+ condition: (formData: any) => boolean;
6
+ effect: T;
7
+ order?: number;
8
+ }
9
+ export interface EngineConfig<T, C = any> {
10
+ applyEffects: (effects: T[], baseConfig: C, formData: any) => C;
11
+ defaultConfig: () => C;
12
+ }
13
+ export type ConditionalEngineHook<T, C = any> = (rules: Rule<T>[], baseConfig: C, formData: any) => C;
14
+ export interface UiEffect {
15
+ op: 'add' | 'remove' | 'replace';
16
+ path: string;
17
+ value?: any;
18
+ }
19
+ export interface SchemaEffect {
20
+ op: 'add' | 'remove' | 'replace';
21
+ path: string;
22
+ value?: any;
23
+ }
24
+ export interface ValidationEffect {
25
+ /**
26
+ * Name of the validation rule for debugging purposes
27
+ */
28
+ name: string;
29
+ /**
30
+ * Determines if this validation should be applied based on current form data
31
+ */
32
+ isActive: (formData: any) => boolean;
33
+ /**
34
+ * Applies validation logic and adds errors to the ErrorSchema
35
+ */
36
+ validate: (errors: ErrorSchema, formData: any) => void;
37
+ }
@@ -0,0 +1,59 @@
1
+ import { UiSchema } from '@rjsf/utils';
2
+
3
+ /**
4
+ * Function type for dynamic uiSchema.items in RJSF fork
5
+ * This enables O(n) performance for array conditionals
6
+ */
7
+ export type ArrayItemsFunction = (itemData: any, index: number, formContext?: any) => UiSchema;
8
+ /**
9
+ * Function type for conditional logic applied to array items
10
+ */
11
+ export type ArrayItemConditionalFn = (itemData: any, index: number, formContext?: any) => Partial<UiSchema>;
12
+ /**
13
+ * Creates a dynamic uiSchema.items function for array fields
14
+ *
15
+ * @param baseItemUiSchema - Base UI schema applied to all array items
16
+ * @param conditionalLogic - Function that returns conditional UI schema modifications
17
+ * @returns Function compatible with RJSF fork's dynamic uiSchema.items
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * const directorsUiSchema = {
22
+ * items: createDynamicArrayItemsUiSchema(
23
+ * { 'ui:order': ['name', 'hasShareholding', 'shareholdingPercentage'] },
24
+ * (itemData) => {
25
+ * if (!itemData?.hasShareholding) {
26
+ * return { shareholdingPercentage: { 'ui:widget': 'hidden' } };
27
+ * }
28
+ * return {};
29
+ * }
30
+ * )
31
+ * };
32
+ * ```
33
+ */
34
+ export declare function createDynamicArrayItemsUiSchema(baseItemUiSchema: UiSchema, conditionalLogic: ArrayItemConditionalFn): ArrayItemsFunction;
35
+ /**
36
+ * Safely merges UI schemas with proper handling of nested properties
37
+ *
38
+ * @param base - Base UI schema
39
+ * @param overrides - Conditional UI schema overrides
40
+ * @returns Merged UI schema
41
+ */
42
+ export declare function mergeItemUiSchema(base: UiSchema, overrides: Partial<UiSchema>): UiSchema;
43
+ /**
44
+ * Helper to create common conditional patterns
45
+ */
46
+ export declare const arrayItemPatterns: {
47
+ /**
48
+ * Show/hide a field based on a condition
49
+ */
50
+ hideField: (fieldName: string, condition: (itemData: any) => boolean) => ArrayItemConditionalFn;
51
+ /**
52
+ * Make a field required based on a condition
53
+ */
54
+ requireField: (fieldName: string, condition: (itemData: any) => boolean) => ArrayItemConditionalFn;
55
+ /**
56
+ * Apply styles to first/last items
57
+ */
58
+ applyIndexStyles: (totalItems: number) => ArrayItemConditionalFn;
59
+ };
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Simple JSON Patch-like utility for applying operations to objects
3
+ * Supports add, remove, and replace operations with JSONPath-like syntax
4
+ */
5
+ export declare function applyPatch(target: any, operations: Array<{
6
+ op: string;
7
+ path: string;
8
+ value?: any;
9
+ }>): any;