@dynamic-field-kit/core 1.0.1 → 1.0.3
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 +32 -9
- package/dist/index.d.mts +5 -5
- package/dist/index.d.ts +5 -5
- package/dist/index.js +7 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +6 -3
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
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"
|
|
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/
|
|
68
|
+
import "@dynamic-field-kit/core"
|
|
69
69
|
|
|
70
|
-
declare module "@dynamic-field-kit/
|
|
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
|
-
**
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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
|
|
19
|
+
type FieldRenderer<T = any> = (props: FieldRendererProps<T>) => JSX.Element;
|
|
20
20
|
declare class FieldRegistry {
|
|
21
|
-
private
|
|
22
|
-
register<
|
|
23
|
-
get(type:
|
|
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
|
|
19
|
+
type FieldRenderer<T = any> = (props: FieldRendererProps<T>) => JSX.Element;
|
|
20
20
|
declare class FieldRegistry {
|
|
21
|
-
private
|
|
22
|
-
register<
|
|
23
|
-
get(type:
|
|
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
|
-
|
|
31
|
+
// ❗ INTERNAL = string, KHÔNG constrain
|
|
32
|
+
this.registry = {};
|
|
31
33
|
}
|
|
34
|
+
// ✅ Type safety ở API
|
|
32
35
|
register(type, renderer) {
|
|
33
|
-
this.
|
|
36
|
+
this.registry[type] = renderer;
|
|
34
37
|
}
|
|
35
38
|
get(type) {
|
|
36
|
-
return this.
|
|
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,
|
|
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
|
-
|
|
4
|
+
// ❗ INTERNAL = string, KHÔNG constrain
|
|
5
|
+
this.registry = {};
|
|
5
6
|
}
|
|
7
|
+
// ✅ Type safety ở API
|
|
6
8
|
register(type, renderer) {
|
|
7
|
-
this.
|
|
9
|
+
this.registry[type] = renderer;
|
|
8
10
|
}
|
|
9
11
|
get(type) {
|
|
10
|
-
return this.
|
|
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
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/fieldRegistry.ts"],"sourcesContent":["import { JSX } from \"react\"\r\nimport { FieldRendererProps,
|
|
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":[]}
|