@akinon/akiform-builder 0.8.0 → 1.0.1

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 (57) hide show
  1. package/dist/cjs/__tests__/akiform-builder.test.d.ts +2 -0
  2. package/dist/cjs/__tests__/akiform-builder.test.d.ts.map +1 -0
  3. package/dist/cjs/__tests__/akiform-builder.test.js +1432 -0
  4. package/dist/cjs/__tests__/field-builder.test.d.ts +2 -0
  5. package/dist/cjs/__tests__/field-builder.test.d.ts.map +1 -0
  6. package/dist/cjs/__tests__/field-builder.test.js +296 -0
  7. package/dist/cjs/index.css +17 -0
  8. package/dist/cjs/src/akiform-builder.d.ts +7 -0
  9. package/dist/cjs/src/akiform-builder.d.ts.map +1 -0
  10. package/dist/cjs/src/akiform-builder.js +458 -0
  11. package/dist/cjs/src/field-builder.d.ts +54 -0
  12. package/dist/cjs/src/field-builder.d.ts.map +1 -0
  13. package/dist/cjs/src/field-builder.js +153 -0
  14. package/dist/cjs/src/i18n/index.d.ts +5 -0
  15. package/dist/cjs/src/i18n/index.d.ts.map +1 -0
  16. package/dist/cjs/src/i18n/index.js +14 -0
  17. package/dist/cjs/src/i18n/translations/en.d.ts +14 -0
  18. package/dist/cjs/src/i18n/translations/en.d.ts.map +1 -0
  19. package/dist/cjs/src/i18n/translations/en.js +15 -0
  20. package/dist/cjs/src/i18n/translations/tr.d.ts +14 -0
  21. package/dist/cjs/src/i18n/translations/tr.d.ts.map +1 -0
  22. package/dist/cjs/src/i18n/translations/tr.js +15 -0
  23. package/dist/cjs/src/index.d.ts +4 -0
  24. package/dist/cjs/src/index.d.ts.map +1 -0
  25. package/dist/cjs/src/index.js +21 -0
  26. package/dist/cjs/src/types.d.ts +106 -0
  27. package/dist/cjs/src/types.d.ts.map +1 -0
  28. package/dist/cjs/src/types.js +2 -0
  29. package/dist/esm/__tests__/akiform-builder.test.d.ts +2 -0
  30. package/dist/esm/__tests__/akiform-builder.test.d.ts.map +1 -0
  31. package/dist/esm/__tests__/akiform-builder.test.js +1430 -0
  32. package/dist/esm/__tests__/field-builder.test.d.ts +2 -0
  33. package/dist/esm/__tests__/field-builder.test.d.ts.map +1 -0
  34. package/dist/esm/__tests__/field-builder.test.js +294 -0
  35. package/dist/esm/index.css +17 -0
  36. package/dist/esm/src/akiform-builder.d.ts +7 -0
  37. package/dist/esm/src/akiform-builder.d.ts.map +1 -0
  38. package/dist/esm/src/akiform-builder.js +455 -0
  39. package/dist/esm/src/field-builder.d.ts +54 -0
  40. package/dist/esm/src/field-builder.d.ts.map +1 -0
  41. package/dist/esm/src/field-builder.js +150 -0
  42. package/dist/esm/src/i18n/index.d.ts +5 -0
  43. package/dist/esm/src/i18n/index.d.ts.map +1 -0
  44. package/dist/esm/src/i18n/index.js +11 -0
  45. package/dist/esm/src/i18n/translations/en.d.ts +14 -0
  46. package/dist/esm/src/i18n/translations/en.d.ts.map +1 -0
  47. package/dist/esm/src/i18n/translations/en.js +13 -0
  48. package/dist/esm/src/i18n/translations/tr.d.ts +14 -0
  49. package/dist/esm/src/i18n/translations/tr.d.ts.map +1 -0
  50. package/dist/esm/src/i18n/translations/tr.js +13 -0
  51. package/dist/esm/src/index.d.ts +4 -0
  52. package/dist/esm/src/index.d.ts.map +1 -0
  53. package/dist/esm/src/index.js +3 -0
  54. package/dist/esm/src/types.d.ts +106 -0
  55. package/dist/esm/src/types.d.ts.map +1 -0
  56. package/dist/esm/src/types.js +1 -0
  57. package/package.json +20 -15
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=field-builder.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-builder.test.d.ts","sourceRoot":"","sources":["../../../__tests__/field-builder.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,296 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const akival_1 = require("@akinon/akival");
4
+ const field_builder_1 = require("../src/field-builder");
5
+ describe('FieldBuilder', () => {
6
+ it('should build a text field with all properties', () => {
7
+ const textField = (0, field_builder_1.field)()
8
+ .key('name')
9
+ .label('Name')
10
+ .type('text')
11
+ .placeholder('Enter your name')
12
+ .defaultValue('John Doe')
13
+ .validation(akival_1.akival.string().required())
14
+ .config({ disabled: false, visible: true })
15
+ .build();
16
+ expect(textField).toEqual({
17
+ key: 'name',
18
+ label: 'Name',
19
+ type: 'text',
20
+ placeholder: 'Enter your name',
21
+ defaultValue: 'John Doe',
22
+ validation: expect.any(Object),
23
+ config: { disabled: false, visible: true }
24
+ });
25
+ });
26
+ it('should build a number field', () => {
27
+ const numberField = (0, field_builder_1.field)()
28
+ .key('age')
29
+ .label('Age')
30
+ .type('number')
31
+ .placeholder('Enter your age')
32
+ .defaultValue(18)
33
+ .validation(akival_1.akival.number().min(18))
34
+ .build();
35
+ expect(numberField).toEqual({
36
+ key: 'age',
37
+ label: 'Age',
38
+ type: 'number',
39
+ placeholder: 'Enter your age',
40
+ defaultValue: 18,
41
+ validation: expect.any(Object)
42
+ });
43
+ });
44
+ it('should build a select field', () => {
45
+ const selectField = (0, field_builder_1.field)()
46
+ .key('country')
47
+ .label('Country')
48
+ .type('select')
49
+ .options([
50
+ { value: 'us', label: 'United States' },
51
+ { value: 'ca', label: 'Canada' }
52
+ ])
53
+ .defaultValue('us')
54
+ .build();
55
+ expect(selectField).toEqual({
56
+ key: 'country',
57
+ label: 'Country',
58
+ type: 'select',
59
+ options: [
60
+ { value: 'us', label: 'United States' },
61
+ { value: 'ca', label: 'Canada' }
62
+ ],
63
+ defaultValue: 'us'
64
+ });
65
+ });
66
+ it('should build a checkbox field', () => {
67
+ const checkboxField = (0, field_builder_1.field)()
68
+ .key('subscribe')
69
+ .label('Subscribe to newsletter')
70
+ .type('checkbox')
71
+ .defaultValue(false)
72
+ .build();
73
+ expect(checkboxField).toEqual({
74
+ key: 'subscribe',
75
+ label: 'Subscribe to newsletter',
76
+ type: 'checkbox',
77
+ defaultValue: false
78
+ });
79
+ });
80
+ it('should build a date field', () => {
81
+ const dateField = (0, field_builder_1.field)()
82
+ .key('birthdate')
83
+ .label('Birth Date')
84
+ .type('date')
85
+ .placeholder('Select your birth date')
86
+ .build();
87
+ expect(dateField).toEqual({
88
+ key: 'birthdate',
89
+ label: 'Birth Date',
90
+ type: 'date',
91
+ placeholder: 'Select your birth date'
92
+ });
93
+ });
94
+ it('should build a textarea field', () => {
95
+ const textareaField = (0, field_builder_1.field)()
96
+ .key('description')
97
+ .label('Description')
98
+ .type('textarea')
99
+ .placeholder('Enter a description')
100
+ .build();
101
+ expect(textareaField).toEqual({
102
+ key: 'description',
103
+ label: 'Description',
104
+ type: 'textarea',
105
+ placeholder: 'Enter a description'
106
+ });
107
+ });
108
+ it('should build a custom field', () => {
109
+ const renderFn = vi.fn();
110
+ const customField = (0, field_builder_1.field)()
111
+ .key('custom')
112
+ .label('Custom Field')
113
+ .type('custom')
114
+ .render(renderFn)
115
+ .build();
116
+ expect(customField).toEqual({
117
+ key: 'custom',
118
+ label: 'Custom Field',
119
+ type: 'custom',
120
+ render: renderFn
121
+ });
122
+ });
123
+ it('should build row and col fields', () => {
124
+ const customField = (0, field_builder_1.field)()
125
+ .type('row')
126
+ .key('mainrow')
127
+ .rowProps({
128
+ align: 'middle'
129
+ })
130
+ .columnFields([
131
+ (0, field_builder_1.field)()
132
+ .type('column')
133
+ .key('col1')
134
+ .columnProps({
135
+ span: 24
136
+ })
137
+ .fields([
138
+ (0, field_builder_1.field)().type('text').key('test1').label('Text label').build()
139
+ ])
140
+ .build()
141
+ ])
142
+ .build();
143
+ expect(customField).toEqual({
144
+ type: 'row',
145
+ key: 'mainrow',
146
+ rowProps: {
147
+ align: 'middle'
148
+ },
149
+ columnFields: [
150
+ {
151
+ type: 'column',
152
+ key: 'col1',
153
+ columnProps: {
154
+ span: 24
155
+ },
156
+ fields: [
157
+ {
158
+ type: 'text',
159
+ key: 'test1',
160
+ label: 'Text label'
161
+ }
162
+ ]
163
+ }
164
+ ]
165
+ });
166
+ });
167
+ it('should throw an error if required properties are missing', () => {
168
+ expect(() => (0, field_builder_1.field)().build()).toThrow('Field must have at least a key and type');
169
+ expect(() => (0, field_builder_1.field)().key('test').build()).toThrow('Field must have at least a key and type');
170
+ expect(() => (0, field_builder_1.field)().type('text').build()).toThrow('Field must have at least a key and type');
171
+ });
172
+ it('should only allow options for select fields', () => {
173
+ const selectField = (0, field_builder_1.field)()
174
+ .key('country')
175
+ .label('Country')
176
+ .type('select')
177
+ .options([
178
+ { value: 'us', label: 'United States' },
179
+ { value: 'ca', label: 'Canada' }
180
+ ])
181
+ .build();
182
+ expect(selectField).toEqual({
183
+ key: 'country',
184
+ label: 'Country',
185
+ type: 'select',
186
+ options: [
187
+ { value: 'us', label: 'United States' },
188
+ { value: 'ca', label: 'Canada' }
189
+ ]
190
+ });
191
+ // @ts-expect-error : We are explicitly waiting .options to throw an error.
192
+ (0, field_builder_1.field)().key('name').label('Name').type('text').options([]);
193
+ });
194
+ it('should only allow render for custom fields', () => {
195
+ const renderFn = vi.fn();
196
+ const customField = (0, field_builder_1.field)()
197
+ .key('custom')
198
+ .label('Custom Field')
199
+ .type('custom')
200
+ .render(renderFn)
201
+ .build();
202
+ expect(customField).toEqual({
203
+ key: 'custom',
204
+ label: 'Custom Field',
205
+ type: 'custom',
206
+ render: renderFn
207
+ });
208
+ // @ts-expect-error : We are explicitly waiting .render to throw an error.
209
+ (0, field_builder_1.field)().key('name').label('Name').type('text').render(vi.fn());
210
+ });
211
+ it('should allow chaining methods in any order', () => {
212
+ const textField = (0, field_builder_1.field)()
213
+ .type('text')
214
+ .key('name')
215
+ .label('Name')
216
+ .placeholder('Enter your name')
217
+ .build();
218
+ expect(textField).toEqual({
219
+ key: 'name',
220
+ label: 'Name',
221
+ type: 'text',
222
+ placeholder: 'Enter your name'
223
+ });
224
+ });
225
+ it('should allow building fields with minimal properties', () => {
226
+ const minimalField = (0, field_builder_1.field)()
227
+ .key('minimal')
228
+ .label('Minimal')
229
+ .type('text')
230
+ .build();
231
+ expect(minimalField).toEqual({
232
+ key: 'minimal',
233
+ label: 'Minimal',
234
+ type: 'text'
235
+ });
236
+ });
237
+ it('should build a field array with fields', () => {
238
+ const fieldArray = (0, field_builder_1.field)()
239
+ .key('addresses')
240
+ .label('Addresses')
241
+ .type('fieldArray')
242
+ .fields([
243
+ (0, field_builder_1.field)().key('street').label('Street').type('text').build(),
244
+ (0, field_builder_1.field)().key('city').label('City').type('text').build()
245
+ ])
246
+ .build();
247
+ expect(fieldArray).toEqual({
248
+ key: 'addresses',
249
+ label: 'Addresses',
250
+ type: 'fieldArray',
251
+ fields: [
252
+ { key: 'street', label: 'Street', type: 'text' },
253
+ { key: 'city', label: 'City', type: 'text' }
254
+ ]
255
+ });
256
+ });
257
+ it('should build a section field with fields', () => {
258
+ const sectionField = (0, field_builder_1.field)()
259
+ .key('personalInfo')
260
+ .label('Personal Information')
261
+ .type('section')
262
+ .fields([
263
+ (0, field_builder_1.field)().key('name').label('Name').type('text').build(),
264
+ (0, field_builder_1.field)().key('age').label('Age').type('number').build()
265
+ ])
266
+ .defaultExpanded(true)
267
+ .build();
268
+ expect(sectionField).toEqual({
269
+ key: 'personalInfo',
270
+ label: 'Personal Information',
271
+ type: 'section',
272
+ fields: [
273
+ { key: 'name', label: 'Name', type: 'text' },
274
+ { key: 'age', label: 'Age', type: 'number' }
275
+ ],
276
+ defaultExpanded: true
277
+ });
278
+ });
279
+ it('should not set fields for non-fieldArray and non-section types', () => {
280
+ const consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
281
+ const textField = (0, field_builder_1.field)()
282
+ .key('name')
283
+ .label('Name')
284
+ .type('text')
285
+ // @ts-expect-error : We are explicitly waiting .fields to throw an error.
286
+ .fields([(0, field_builder_1.field)().key('invalid').label('Invalid').type('text').build()])
287
+ .build();
288
+ expect(textField).toEqual({
289
+ key: 'name',
290
+ label: 'Name',
291
+ type: 'text'
292
+ });
293
+ expect(consoleSpy).toHaveBeenCalledWith("Fields can only be set for 'fieldArray' or 'section' types. Current type: text");
294
+ consoleSpy.mockRestore();
295
+ });
296
+ });
@@ -0,0 +1,17 @@
1
+ .akiform-builder .sr-only {
2
+ display: none;
3
+ }
4
+
5
+ .akiform-builder-field-array {
6
+ padding-bottom: 1rem;
7
+ }
8
+
9
+ .akiform-builder-form-actions {
10
+ display: flex;
11
+ align-items: center;
12
+ gap: 0.5rem;
13
+ }
14
+
15
+ .akiform-builder-action-icon {
16
+ cursor: pointer;
17
+ }
@@ -0,0 +1,7 @@
1
+ import './index.css';
2
+ import { FieldValues } from '@akinon/akiform';
3
+ import React from 'react';
4
+ import { AkiformBuilderProps, AkiformBuilderRef } from './types';
5
+ export declare const THROTTLE_DELAY = 300;
6
+ export declare const AkiformBuilder: React.ForwardRefExoticComponent<AkiformBuilderProps<FieldValues> & React.RefAttributes<AkiformBuilderRef<FieldValues>>>;
7
+ //# sourceMappingURL=akiform-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"akiform-builder.d.ts","sourceRoot":"","sources":["../../../src/akiform-builder.tsx"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAErB,OAAO,EAML,WAAW,EAMZ,MAAM,iBAAiB,CAAC;AAczB,OAAO,KAWN,MAAM,OAAO,CAAC;AAGf,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EAQlB,MAAM,SAAS,CAAC;AAEjB,eAAO,MAAM,cAAc,MAAM,CAAC;AA6WlC,eAAO,MAAM,cAAc,yHA+V1B,CAAC"}