@dynamic-field-kit/core 1.0.1 → 1.0.4

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/README.md CHANGED
@@ -45,7 +45,7 @@ react >= 17
45
45
 
46
46
  The library **does NOT define field types** like:
47
47
  ```ts
48
- "text" | "number" | "select"
48
+ "text" | "number"
49
49
  ```
50
50
 
51
51
  Instead, it exposes an **extendable interface** that applications can augment:
@@ -65,9 +65,9 @@ This pattern is used by mature libraries like **MUI, React Hook Form,** and **Re
65
65
  Create a `.d.ts` file in your app (e.g. src/types/dynamic-field.d.ts):
66
66
 
67
67
  ```ts
68
- import "@dynamic-field-kit/react"
68
+ import "@dynamic-field-kit/core"
69
69
 
70
- declare module "@dynamic-field-kit/react" {
70
+ declare module "@dynamic-field-kit/core" {
71
71
  interface FieldTypeMap {
72
72
  text: string
73
73
  number: number
@@ -80,6 +80,19 @@ declare module "@dynamic-field-kit/react" {
80
80
 
81
81
  ---
82
82
 
83
+ ## FieldRendererProps
84
+
85
+ ```ts
86
+ export interface FieldRendererProps<T = any> {
87
+ value?: T
88
+ onValueChange?: (value: T) => void
89
+ label?: string
90
+ }
91
+ ```
92
+ 👉 A common contract for all field renderers
93
+
94
+ ---
95
+
83
96
  ### FieldDescription
84
97
 
85
98
  A `FieldDescription` defines **what a field is**, not **how it looks**.
@@ -102,11 +115,14 @@ const fields: FieldDescription[] = [
102
115
  ]
103
116
  ```
104
117
 
105
- **Key properties**
106
- - `name` field key in form data
107
- - `type` – renderer key
108
- - `appearCondition` runtime visibility condition
109
- - No domain-specific typing enforced
118
+ **Common Properties**
119
+ | Property | Description |
120
+ |------|------------|
121
+ | name | Field key in form data |
122
+ | type | Field renderer key |
123
+ | label | UI label |
124
+ | value | Default value |
125
+ | appearCondition | Runtime visibility condition |
110
126
 
111
127
  **Field Registry (Render Layer)**
112
128
  The library does **not** ship UI components.
@@ -254,6 +270,10 @@ Renders a single field with value binding.
254
270
  onChange={(value, key) => {}}
255
271
  />
256
272
  ```
273
+
274
+ ## Demo
275
+ - [Examples](https://github.com/vannt-dev/dynamic-field-kit-demo)
276
+
257
277
  ---
258
278
 
259
279
  ## 🏗 Architecture
@@ -273,4 +293,7 @@ This library intentionally does not include:
273
293
  -Built-in UI components
274
294
  -Form state management library
275
295
 
276
- It is a **form engine**, not a full form framework.
296
+ It is a **form engine**, not a full form framework.
297
+
298
+ ## 📄 License
299
+ MIT © vannt-dev
package/dist/index.d.mts CHANGED
@@ -16,12 +16,12 @@ interface FieldDescription<T extends FieldTypeKey = FieldTypeKey> {
16
16
  appearCondition?: (data: Properties) => boolean;
17
17
  }
18
18
 
19
- type Renderer = (props: FieldRendererProps<any>) => JSX.Element;
19
+ type FieldRenderer<T = any> = (props: FieldRendererProps<T>) => JSX.Element;
20
20
  declare class FieldRegistry {
21
- private map;
22
- register<T extends FieldTypeKey>(type: T, renderer: (props: FieldRendererProps) => JSX.Element): void;
23
- get(type: FieldTypeKey): Renderer | undefined;
21
+ private registry;
22
+ register<K extends keyof FieldTypeMap>(type: K, renderer: FieldRenderer<FieldTypeMap[K]>): void;
23
+ get<K extends keyof FieldTypeMap>(type: K): FieldRenderer<FieldTypeMap[K]> | undefined;
24
24
  }
25
25
  declare const fieldRegistry: FieldRegistry;
26
26
 
27
- export { type FieldDescription, type FieldRendererProps, type FieldTypeKey, type FieldTypeMap, type Properties, fieldRegistry };
27
+ export { type FieldDescription, FieldRegistry, type FieldRenderer, type FieldRendererProps, type FieldTypeKey, type FieldTypeMap, type Properties, fieldRegistry };
package/dist/index.d.ts CHANGED
@@ -16,12 +16,12 @@ interface FieldDescription<T extends FieldTypeKey = FieldTypeKey> {
16
16
  appearCondition?: (data: Properties) => boolean;
17
17
  }
18
18
 
19
- type Renderer = (props: FieldRendererProps<any>) => JSX.Element;
19
+ type FieldRenderer<T = any> = (props: FieldRendererProps<T>) => JSX.Element;
20
20
  declare class FieldRegistry {
21
- private map;
22
- register<T extends FieldTypeKey>(type: T, renderer: (props: FieldRendererProps) => JSX.Element): void;
23
- get(type: FieldTypeKey): Renderer | undefined;
21
+ private registry;
22
+ register<K extends keyof FieldTypeMap>(type: K, renderer: FieldRenderer<FieldTypeMap[K]>): void;
23
+ get<K extends keyof FieldTypeMap>(type: K): FieldRenderer<FieldTypeMap[K]> | undefined;
24
24
  }
25
25
  declare const fieldRegistry: FieldRegistry;
26
26
 
27
- export { type FieldDescription, type FieldRendererProps, type FieldTypeKey, type FieldTypeMap, type Properties, fieldRegistry };
27
+ export { type FieldDescription, FieldRegistry, type FieldRenderer, type FieldRendererProps, type FieldTypeKey, type FieldTypeMap, type Properties, fieldRegistry };
package/dist/index.js CHANGED
@@ -20,6 +20,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/index.ts
21
21
  var index_exports = {};
22
22
  __export(index_exports, {
23
+ FieldRegistry: () => FieldRegistry,
23
24
  fieldRegistry: () => fieldRegistry
24
25
  });
25
26
  module.exports = __toCommonJS(index_exports);
@@ -27,18 +28,21 @@ module.exports = __toCommonJS(index_exports);
27
28
  // src/fieldRegistry.ts
28
29
  var FieldRegistry = class {
29
30
  constructor() {
30
- this.map = /* @__PURE__ */ new Map();
31
+ // INTERNAL = string, KHÔNG constrain
32
+ this.registry = {};
31
33
  }
34
+ // ✅ Type safety ở API
32
35
  register(type, renderer) {
33
- this.map.set(type, renderer);
36
+ this.registry[type] = renderer;
34
37
  }
35
38
  get(type) {
36
- return this.map.get(type);
39
+ return this.registry[type];
37
40
  }
38
41
  };
39
42
  var fieldRegistry = new FieldRegistry();
40
43
  // Annotate the CommonJS export names for ESM import in node:
41
44
  0 && (module.exports = {
45
+ FieldRegistry,
42
46
  fieldRegistry
43
47
  });
44
48
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/fieldRegistry.ts"],"sourcesContent":["export * from \"./types\"\r\nexport * from \"./fieldRegistry\"\r\n","import { JSX } from \"react\"\r\nimport { FieldRendererProps, FieldTypeKey } from \"./types\"\r\n\r\ntype Renderer = (props: FieldRendererProps<any>) => JSX.Element\r\n\r\nclass FieldRegistry {\r\n private map = new Map<FieldTypeKey, Renderer>()\r\n\r\n register<T extends FieldTypeKey>(\r\n type: T,\r\n renderer: (props: FieldRendererProps) => JSX.Element\r\n ) {\r\n this.map.set(type, renderer)\r\n }\r\n\r\n get(type: FieldTypeKey) {\r\n return this.map.get(type)\r\n }\r\n}\r\n\r\nexport const fieldRegistry = new FieldRegistry()\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACKA,IAAM,gBAAN,MAAoB;AAAA,EAApB;AACI,SAAQ,MAAM,oBAAI,IAA4B;AAAA;AAAA,EAE9C,SACI,MACA,UACF;AACE,SAAK,IAAI,IAAI,MAAM,QAAQ;AAAA,EAC/B;AAAA,EAEA,IAAI,MAAoB;AACpB,WAAO,KAAK,IAAI,IAAI,IAAI;AAAA,EAC5B;AACJ;AAEO,IAAM,gBAAgB,IAAI,cAAc;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/fieldRegistry.ts"],"sourcesContent":["export * from \"./types\"\r\nexport * from \"./fieldRegistry\"\r\n","import { JSX } from \"react\"\r\nimport type { FieldRendererProps, FieldTypeMap } from \"./types\"\r\n\r\nexport type FieldRenderer<T = any> = (props: FieldRendererProps<T>) => JSX.Element\r\n\r\nexport class FieldRegistry {\r\n // INTERNAL = string, KHÔNG constrain\r\n private registry: Record<string, FieldRenderer<any>> = {}\r\n\r\n // ✅ Type safety ở API\r\n register<K extends keyof FieldTypeMap>(\r\n type: K,\r\n renderer: FieldRenderer<FieldTypeMap[K]>\r\n ) {\r\n this.registry[type as string] = renderer\r\n }\r\n\r\n get<K extends keyof FieldTypeMap>(\r\n type: K\r\n ): FieldRenderer<FieldTypeMap[K]> | undefined {\r\n return this.registry[type as string]\r\n }\r\n}\r\n\r\nexport const fieldRegistry = new FieldRegistry()\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACKO,IAAM,gBAAN,MAAoB;AAAA,EAApB;AAEH;AAAA,SAAQ,WAA+C,CAAC;AAAA;AAAA;AAAA,EAGxD,SACI,MACA,UACF;AACE,SAAK,SAAS,IAAc,IAAI;AAAA,EACpC;AAAA,EAEA,IACI,MAC0C;AAC1C,WAAO,KAAK,SAAS,IAAc;AAAA,EACvC;AACJ;AAEO,IAAM,gBAAgB,IAAI,cAAc;","names":[]}
package/dist/index.mjs CHANGED
@@ -1,17 +1,20 @@
1
1
  // src/fieldRegistry.ts
2
2
  var FieldRegistry = class {
3
3
  constructor() {
4
- this.map = /* @__PURE__ */ new Map();
4
+ // INTERNAL = string, KHÔNG constrain
5
+ this.registry = {};
5
6
  }
7
+ // ✅ Type safety ở API
6
8
  register(type, renderer) {
7
- this.map.set(type, renderer);
9
+ this.registry[type] = renderer;
8
10
  }
9
11
  get(type) {
10
- return this.map.get(type);
12
+ return this.registry[type];
11
13
  }
12
14
  };
13
15
  var fieldRegistry = new FieldRegistry();
14
16
  export {
17
+ FieldRegistry,
15
18
  fieldRegistry
16
19
  };
17
20
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/fieldRegistry.ts"],"sourcesContent":["import { JSX } from \"react\"\r\nimport { FieldRendererProps, FieldTypeKey } from \"./types\"\r\n\r\ntype Renderer = (props: FieldRendererProps<any>) => JSX.Element\r\n\r\nclass FieldRegistry {\r\n private map = new Map<FieldTypeKey, Renderer>()\r\n\r\n register<T extends FieldTypeKey>(\r\n type: T,\r\n renderer: (props: FieldRendererProps) => JSX.Element\r\n ) {\r\n this.map.set(type, renderer)\r\n }\r\n\r\n get(type: FieldTypeKey) {\r\n return this.map.get(type)\r\n }\r\n}\r\n\r\nexport const fieldRegistry = new FieldRegistry()\r\n"],"mappings":";AAKA,IAAM,gBAAN,MAAoB;AAAA,EAApB;AACI,SAAQ,MAAM,oBAAI,IAA4B;AAAA;AAAA,EAE9C,SACI,MACA,UACF;AACE,SAAK,IAAI,IAAI,MAAM,QAAQ;AAAA,EAC/B;AAAA,EAEA,IAAI,MAAoB;AACpB,WAAO,KAAK,IAAI,IAAI,IAAI;AAAA,EAC5B;AACJ;AAEO,IAAM,gBAAgB,IAAI,cAAc;","names":[]}
1
+ {"version":3,"sources":["../src/fieldRegistry.ts"],"sourcesContent":["import { JSX } from \"react\"\r\nimport type { FieldRendererProps, FieldTypeMap } from \"./types\"\r\n\r\nexport type FieldRenderer<T = any> = (props: FieldRendererProps<T>) => JSX.Element\r\n\r\nexport class FieldRegistry {\r\n // INTERNAL = string, KHÔNG constrain\r\n private registry: Record<string, FieldRenderer<any>> = {}\r\n\r\n // ✅ Type safety ở API\r\n register<K extends keyof FieldTypeMap>(\r\n type: K,\r\n renderer: FieldRenderer<FieldTypeMap[K]>\r\n ) {\r\n this.registry[type as string] = renderer\r\n }\r\n\r\n get<K extends keyof FieldTypeMap>(\r\n type: K\r\n ): FieldRenderer<FieldTypeMap[K]> | undefined {\r\n return this.registry[type as string]\r\n }\r\n}\r\n\r\nexport const fieldRegistry = new FieldRegistry()\r\n"],"mappings":";AAKO,IAAM,gBAAN,MAAoB;AAAA,EAApB;AAEH;AAAA,SAAQ,WAA+C,CAAC;AAAA;AAAA;AAAA,EAGxD,SACI,MACA,UACF;AACE,SAAK,SAAS,IAAc,IAAI;AAAA,EACpC;AAAA,EAEA,IACI,MAC0C;AAC1C,WAAO,KAAK,SAAS,IAAc;AAAA,EACvC;AACJ;AAEO,IAAM,gBAAgB,IAAI,cAAc;","names":[]}
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@dynamic-field-kit/core",
3
- "version": "1.0.1",
3
+ "version": "1.0.4",
4
4
  "description": "Core types and field registry for dynamic-field-kit",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.cjs",
7
- "module": "dist/index.mjs",
7
+ "module": "dist/index.js",
8
8
  "types": "dist/index.d.ts",
9
9
  "sideEffects": false,
10
10
  "files": [