@sealcode/sealgen 0.18.10 → 0.19.2
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/.xunit +74 -69
- package/@types/add-crud.d.sync-conflict-20250918-184311-TFDLWFG.ts +1 -0
- package/@types/builders/colors-builder.d.sync-conflict-20250918-184323-TFDLWFG.ts +10 -0
- package/@types/builders/colors-builder.d.ts +1 -1
- package/@types/builders/fonts-builder.d.sync-conflict-20250918-184322-TFDLWFG.ts +7 -0
- package/@types/builders/fonts-builder.d.ts +1 -1
- package/@types/controllers/table-add-button.d.ts +6 -0
- package/@types/controllers/table-add-button.stimulus.d.ts +6 -0
- package/@types/crud-field-snippets.d.sync-conflict-20250918-184323-TFDLWFG.ts +1 -0
- package/@types/crud-field-snippets.d.ts +1 -3
- package/@types/forms/controls/array.d.sync-conflict-20250918-184306-TFDLWFG.ts +33 -0
- package/@types/forms/controls/array.d.ts +1 -3
- package/@types/forms/controls/array.sync-conflict-20250918-222045-TFDLWFG.d.ts +33 -0
- package/@types/forms/controls/autocomplete.d.sync-conflict-20250918-222042-TFDLWFG.ts +22 -0
- package/@types/forms/controls/autocomplete.d.ts +1 -1
- package/@types/forms/controls/checkbox-group.d.sync-conflict-20250918-184319-TFDLWFG.ts +21 -0
- package/@types/forms/controls/checkbox-group.d.ts +3 -3
- package/@types/forms/controls/checkboxed-list-input.d.sync-conflict-20250918-184323-TFDLWFG.ts +21 -0
- package/@types/forms/controls/checkboxed-list-input.d.ts +3 -3
- package/@types/forms/controls/controls.d.ts +2 -2
- package/@types/forms/controls/derived-frame.d.sync-conflict-20250918-184314-TFDLWFG.ts +19 -0
- package/@types/forms/controls/derived-frame.d.ts +0 -2
- package/@types/forms/controls/dropdown.d.sync-conflict-20250918-222044-TFDLWFG.ts +30 -0
- package/@types/forms/controls/dropdown.d.ts +1 -1
- package/@types/forms/controls/file.d.sync-conflict-20250918-222045-TFDLWFG.ts +13 -0
- package/@types/forms/controls/file.d.ts +1 -2
- package/@types/forms/controls/form-control.d.sync-conflict-20250918-184322-TFDLWFG.ts +19 -0
- package/@types/forms/controls/form-control.d.sync-conflict-20250918-222046-TFDLWFG.ts +19 -0
- package/@types/forms/controls/form-control.d.ts +7 -4
- package/@types/forms/controls/image.d.ts +19 -0
- package/@types/forms/controls/image.test.d.ts +1 -0
- package/@types/forms/controls/multiple-files.d.sync-conflict-20250918-184318-TFDLWFG.ts +42 -0
- package/@types/forms/controls/multiple-files.d.ts +3 -1
- package/@types/forms/controls/multiple-images.d.ts +19 -0
- package/@types/forms/controls/number.d.sync-conflict-20250918-222046-TFDLWFG.ts +13 -0
- package/@types/forms/controls/number.d.ts +1 -1
- package/@types/forms/controls/photo.d.sync-conflict-20250918-184321-TFDLWFG.ts +19 -0
- package/@types/forms/controls/photo.d.ts +3 -5
- package/@types/forms/controls/simple-input.d.sync-conflict-20250918-184310-TFDLWFG.ts +33 -0
- package/@types/forms/controls/simple-input.d.sync-conflict-20250918-222042-TFDLWFG.ts +33 -0
- package/@types/forms/controls/simple-input.d.ts +5 -4
- package/@types/forms/controls/simple-input.sync-conflict-20250918-222045-TFDLWFG.d.ts +33 -0
- package/@types/forms/controls/single-reference.d.ts +3 -2
- package/@types/forms/controls/table.d.sync-conflict-20250918-184302-TFDLWFG.ts +39 -0
- package/@types/forms/controls/table.d.ts +8 -3
- package/@types/forms/controls/table.sync-conflict-20250918-222042-TFDLWFG.d.ts +39 -0
- package/@types/forms/controls/textarea.d.sync-conflict-20250918-222045-TFDLWFG.ts +25 -0
- package/@types/forms/controls/textarea.d.ts +3 -3
- package/@types/forms/fields/boolean.d.sync-conflict-20250918-184325-TFDLWFG.ts +22 -0
- package/@types/forms/fields/boolean.d.ts +6 -1
- package/@types/forms/fields/boolean.sync-conflict-20250918-222042-TFDLWFG.d.ts +22 -0
- package/@types/forms/fields/checkboxed-list.d.sync-conflict-20250918-184325-TFDLWFG.ts +23 -0
- package/@types/forms/fields/checkboxed-list.d.ts +3 -1
- package/@types/forms/fields/collection-field.d.sync-conflict-20250918-184319-TFDLWFG.ts +22 -0
- package/@types/forms/fields/collection-field.d.sync-conflict-20250918-222047-TFDLWFG.ts +22 -0
- package/@types/forms/fields/collection-field.d.ts +8 -1
- package/@types/forms/fields/color.d.ts +4 -0
- package/@types/forms/fields/coordinates.d.sync-conflict-20250918-222044-TFDLWFG.ts +14 -0
- package/@types/forms/fields/coordinates.d.ts +14 -0
- package/@types/forms/fields/date.d.ts +13 -0
- package/@types/forms/fields/datetime.d.sync-conflict-20250918-222050-TFDLWFG.ts +4 -0
- package/@types/forms/fields/datetime.d.ts +14 -0
- package/@types/forms/fields/deep-reverse-single-reference-list.d.ts +20 -0
- package/@types/forms/fields/deep-reverse-single-reference-table.d.ts +16 -0
- package/@types/forms/fields/email.d.sync-conflict-20250918-184303-TFDLWFG.ts +8 -0
- package/@types/forms/fields/email.d.ts +3 -0
- package/@types/forms/fields/enum-multiple-sealious.d.ts +16 -0
- package/@types/forms/fields/enum-multiple-sealious.sync-conflict-20250918-222047-TFDLWFG.d.ts +16 -0
- package/@types/forms/fields/field.d.sync-conflict-20250918-184306-TFDLWFG.ts +70 -0
- package/@types/forms/fields/field.d.ts +37 -5
- package/@types/forms/fields/fields.d.sync-conflict-20250918-184314-TFDLWFG.ts +29 -0
- package/@types/forms/fields/fields.d.ts +23 -8
- package/@types/forms/fields/file.d.sync-conflict-20250918-184310-TFDLWFG.ts +23 -0
- package/@types/forms/fields/file.d.sync-conflict-20250918-222046-TFDLWFG.ts +23 -0
- package/@types/forms/fields/file.d.ts +11 -5
- package/@types/forms/fields/file.sync-conflict-20250918-222049-TFDLWFG.d.ts +23 -0
- package/@types/forms/fields/float.d.ts +4 -0
- package/@types/forms/fields/get-field-for-sealious.d.sync-conflict-20250918-222046-TFDLWFG.ts +29 -0
- package/@types/forms/fields/get-field-for-sealious.d.ts +31 -0
- package/@types/forms/fields/get-field-for-sealious.sync-conflict-20250918-222042-TFDLWFG.d.ts +29 -0
- package/@types/forms/fields/html.d.ts +6 -0
- package/@types/forms/fields/image.d.sync-conflict-20250918-222042-TFDLWFG.ts +5 -0
- package/@types/forms/fields/image.d.ts +5 -0
- package/@types/forms/fields/int.d.ts +6 -0
- package/@types/forms/fields/json.d.ts +13 -0
- package/@types/forms/fields/markdown.d.ts +6 -0
- package/@types/forms/fields/multiple-files.d.sync-conflict-20250918-184304-TFDLWFG.ts +16 -0
- package/@types/forms/fields/multiple-files.d.ts +3 -1
- package/@types/forms/fields/number.d.sync-conflict-20250918-184317-TFDLWFG.ts +25 -0
- package/@types/forms/fields/number.d.sync-conflict-20250918-222047-TFDLWFG.ts +25 -0
- package/@types/forms/fields/number.d.ts +3 -1
- package/@types/forms/fields/password.d.ts +5 -0
- package/@types/forms/fields/pick-from-list-sealious.d.ts +11 -0
- package/@types/forms/fields/pick-from-list.d.sync-conflict-20250918-184322-TFDLWFG.ts +15 -0
- package/@types/forms/fields/pick-from-list.d.ts +4 -3
- package/@types/forms/fields/proxy-field.d.sync-conflict-20250918-184307-TFDLWFG.ts +15 -0
- package/@types/forms/fields/proxy-field.d.ts +3 -1
- package/@types/forms/fields/regexp.d.sync-conflict-20250918-184305-TFDLWFG.ts +21 -0
- package/@types/forms/fields/regexp.d.sync-conflict-20250918-222045-TFDLWFG.ts +21 -0
- package/@types/forms/fields/regexp.d.ts +6 -1
- package/@types/forms/fields/regexp.sync-conflict-20250918-222047-TFDLWFG.d.ts +21 -0
- package/@types/forms/fields/simple-form-field.d.sync-conflict-20250918-184309-TFDLWFG.ts +29 -0
- package/@types/forms/fields/simple-form-field.d.sync-conflict-20250918-222044-TFDLWFG.ts +29 -0
- package/@types/forms/fields/simple-form-field.d.ts +23 -3
- package/@types/forms/fields/simple-form-field.sync-conflict-20250918-222049-TFDLWFG.d.ts +29 -0
- package/@types/forms/fields/single-reference.d.ts +19 -0
- package/@types/forms/fields/single-reference.sync-conflict-20250918-222043-TFDLWFG.d.ts +10 -0
- package/@types/forms/fields/structured-array.d.sync-conflict-20250918-184302-TFDLWFG.ts +27 -0
- package/@types/forms/fields/structured-array.d.sync-conflict-20250918-222049-TFDLWFG.ts +27 -0
- package/@types/forms/fields/structured-array.d.ts +19 -10
- package/@types/forms/fields/structured-array.sync-conflict-20250918-222047-TFDLWFG.d.ts +27 -0
- package/@types/forms/fields/table.d.sync-conflict-20250918-184303-TFDLWFG.ts +16 -0
- package/@types/forms/fields/table.d.ts +3 -0
- package/@types/forms/fields/text.d.ts +6 -0
- package/@types/forms/fields/url.d.ts +6 -0
- package/@types/forms/form-types.d.sync-conflict-20250918-222045-TFDLWFG.ts +26 -0
- package/@types/forms/form-types.d.ts +2 -0
- package/@types/forms/form.d.sync-conflict-20250918-184315-TFDLWFG.ts +32 -0
- package/@types/forms/form.d.sync-conflict-20250918-222049-TFDLWFG.ts +32 -0
- package/@types/forms/form.d.ts +10 -8
- package/@types/forms/form.sync-conflict-20250918-222049-TFDLWFG.d.ts +33 -0
- package/@types/forms/form.test.d.sync-conflict-20250918-184318-TFDLWFG.ts +6 -0
- package/@types/forms/form.test.d.sync-conflict-20250918-222047-TFDLWFG.ts +6 -0
- package/@types/forms/form.test.d.ts +2 -2
- package/@types/forms/multiform.d.sync-conflict-20250918-184308-TFDLWFG.ts +23 -0
- package/@types/forms/multiform.d.ts +1 -2
- package/@types/forms/multiform.sync-conflict-20250918-222044-TFDLWFG.d.ts +23 -0
- package/@types/index.d.sync-conflict-20250918-184316-TFDLWFG.ts +46 -0
- package/@types/index.d.ts +2 -2
- package/@types/mount.d.sync-conflict-20250918-184320-TFDLWFG.ts +6 -0
- package/@types/mount.d.ts +0 -1
- package/@types/page/list.d.sync-conflict-20250918-184318-TFDLWFG.ts +48 -0
- package/@types/page/list.d.sync-conflict-20250918-222046-TFDLWFG.ts +48 -0
- package/@types/page/list.d.ts +2 -2
- package/@types/page/list.sync-conflict-20250918-222048-TFDLWFG.d.ts +48 -0
- package/@types/page/mountable-with-fields.d.sync-conflict-20250918-184321-TFDLWFG.ts +42 -0
- package/@types/page/mountable-with-fields.d.sync-conflict-20250918-222046-TFDLWFG.ts +42 -0
- package/@types/page/mountable-with-fields.d.ts +3 -3
- package/@types/page/mountable-with-fields.sync-conflict-20250918-222044-TFDLWFG.d.ts +42 -0
- package/@types/page/mountable.d.sync-conflict-20250918-184306-TFDLWFG.ts +10 -0
- package/@types/page/mountable.d.ts +0 -1
- package/@types/page/page.d.sync-conflict-20250918-184320-TFDLWFG.ts +18 -0
- package/@types/page/page.d.ts +0 -1
- package/@types/page/props-parser.d.sync-conflict-20250918-184305-TFDLWFG.ts +15 -0
- package/@types/page/props-parser.d.ts +0 -1
- package/@types/page/stateful-page.d.sync-conflict-20250918-184326-TFDLWFG.ts +62 -0
- package/@types/page/stateful-page.d.ts +0 -1
- package/@types/register-external.d.ts +2 -2
- package/@types/templates/form.d.ts +1 -3
- package/@types/templates/jdd-component.d.ts +1 -1
- package/@types/templates/page.d.ts +1 -1
- package/@types/templates/shared/shared-crud-form-fields.d.sync-conflict-20250918-184306-TFDLWFG.ts +1 -0
- package/@types/templates/shared/shared-crud-form-fields.d.ts +1 -68
- package/@types/templates/templates.d.ts +1 -21
- package/@types/test_utils/test-on-real-app.d.sync-conflict-20250918-184320-TFDLWFG.ts +26 -0
- package/@types/test_utils/test-on-real-app.d.ts +0 -1
- package/@types/utils/extract-fields-from-collection.d.sync-conflict-20250918-184312-TFDLWFG.ts +18 -0
- package/@types/utils/extract-fields-from-collection.d.ts +5 -1
- package/@types/utils/extract-fields-from-collection.sync-conflict-20250918-222045-TFDLWFG.d.ts +18 -0
- package/@types/utils/wrap-attributes.d.ts +3 -0
- package/README.md +5 -0
- package/assets/file-icon.svg +5 -0
- package/eslint.config.mjs +56 -0
- package/lib/add-crud.js +77 -89
- package/lib/add-jdd-component.js +3 -3
- package/lib/add-list-route.test.js +1 -1
- package/lib/add-route.js +2 -9
- package/lib/build.js +6 -4
- package/lib/builders/backend-ts-builder.js +0 -1
- package/lib/builders/colors-builder.js +11 -8
- package/lib/builders/fonts-builder.js +0 -1
- package/lib/builders/frontend-ts-builder.js +0 -1
- package/lib/cli.js +4 -7
- package/lib/components/tabs.js +36 -36
- package/lib/controllers/table-add-button.stimulus.js +35 -0
- package/lib/esbuild-plugins/rewrite-asset-imports.js +7 -10
- package/lib/forms/controls/array.js +25 -22
- package/lib/forms/controls/big-radio-group.js +2 -2
- package/lib/forms/controls/checkbox-group.js +7 -7
- package/lib/forms/controls/checkboxed-list-input.js +7 -1
- package/lib/forms/controls/checkboxed-list-input.test.js +6 -6
- package/lib/forms/controls/controls.js +2 -2
- package/lib/forms/controls/derived-frame.js +8 -4
- package/lib/forms/controls/derived.js +1 -1
- package/lib/forms/controls/dropdown.js +5 -3
- package/lib/forms/controls/editable-collection-subset.js +2 -2
- package/lib/forms/controls/file.js +26 -2
- package/lib/forms/controls/file.test.js +2 -2
- package/lib/forms/controls/form-control.js +1 -1
- package/lib/forms/controls/hidden-input.js +4 -1
- package/lib/forms/controls/{photo.js → image.js} +6 -7
- package/lib/forms/controls/{photo.test.js → image.test.js} +8 -23
- package/lib/forms/controls/multiple-files.js +10 -1
- package/lib/forms/controls/{multiple-photos.js → multiple-images.js} +3 -3
- package/lib/forms/controls/simple-input.js +13 -12
- package/lib/forms/controls/single-reference.js +4 -0
- package/lib/forms/controls/single-reference.test.js +1 -1
- package/lib/forms/controls/table.js +62 -25
- package/lib/forms/controls/textarea.js +5 -3
- package/lib/forms/controls/tickable.js +13 -5
- package/lib/forms/fields/boolean.js +14 -0
- package/lib/forms/fields/checkboxed-list.js +4 -0
- package/lib/forms/fields/collection-field.js +9 -0
- package/lib/forms/fields/color.js +10 -0
- package/lib/forms/fields/coordinates.js +49 -0
- package/lib/forms/fields/date.js +34 -0
- package/lib/forms/fields/datetime.js +46 -0
- package/lib/forms/fields/deep-reverse-single-reference-list.js +81 -0
- package/lib/forms/fields/deep-reverse-single-reference-table.js +122 -0
- package/lib/forms/fields/email.js +7 -0
- package/lib/forms/fields/enum-multiple-sealious.js +32 -0
- package/lib/forms/fields/field.js +32 -4
- package/lib/forms/fields/field.test.js +8 -8
- package/lib/forms/fields/fields.js +23 -8
- package/lib/forms/fields/file.js +33 -9
- package/lib/forms/fields/file.test.js +5 -17
- package/lib/forms/fields/float.js +10 -0
- package/lib/forms/fields/get-field-for-sealious.js +213 -0
- package/lib/forms/fields/html.js +14 -0
- package/lib/forms/fields/image.js +13 -0
- package/lib/forms/fields/int.js +23 -0
- package/lib/forms/fields/json.js +31 -0
- package/lib/forms/fields/markdown.js +14 -0
- package/lib/forms/fields/multiple-files.js +4 -0
- package/lib/forms/fields/number.js +6 -0
- package/lib/forms/fields/password.js +13 -0
- package/lib/forms/fields/pick-from-list-sealious.js +17 -0
- package/lib/forms/fields/pick-from-list.js +6 -2
- package/lib/forms/fields/proxy-field.js +3 -0
- package/lib/forms/fields/regexp.js +14 -0
- package/lib/forms/fields/simple-form-field.js +61 -2
- package/lib/forms/fields/single-reference.js +44 -0
- package/lib/forms/fields/structured-array.js +61 -12
- package/lib/forms/fields/table.js +29 -2
- package/lib/forms/fields/text.js +17 -0
- package/lib/forms/fields/url.js +17 -0
- package/lib/forms/form.js +30 -14
- package/lib/forms/form.test.js +5 -7
- package/lib/forms/multiform.js +10 -9
- package/lib/forms/multiform.test.js +5 -5
- package/lib/generate-collections.js +2 -3
- package/lib/generate-components.js +2 -3
- package/lib/generate-routes.js +3 -5
- package/lib/generate-routes.test.js +7 -16
- package/lib/generate-stimulus.js +4 -4
- package/lib/get-fonts.js +29 -27
- package/lib/index.js +1 -0
- package/lib/make-env.js +1 -1
- package/lib/make-hidden-inputs.js +4 -4
- package/lib/mount.js +11 -1
- package/lib/notifier.js +3 -4
- package/lib/page/list.js +20 -15
- package/lib/page/mountable-with-fields.js +14 -6
- package/lib/page/mountable-with-fields.test.js +1 -1
- package/lib/page/mountable.js +0 -1
- package/lib/page/page.js +0 -1
- package/lib/register-external.js +4 -4
- package/lib/templates/form.js +9 -10
- package/lib/templates/jdd-component.js +1 -1
- package/lib/templates/jdd-editor.js +1 -1
- package/lib/templates/multiform.js +4 -4
- package/lib/templates/page.js +1 -3
- package/lib/templates/shared/collection-create-form.js +31 -44
- package/lib/templates/shared/collection-edit-form.js +43 -81
- package/lib/templates/shared/collection-list.js +13 -21
- package/lib/templates/shared/shared-crud-form-fields.js +28 -98
- package/lib/test_utils/exec_async.js +3 -3
- package/lib/test_utils/test-on-real-app.js +12 -14
- package/lib/utils/extract-fields-from-collection.js +60 -20
- package/lib/utils/make-slug.js +1 -1
- package/lib/utils/wrap-attributes.js +20 -0
- package/lib/utils/write-file.js +1 -1
- package/package.json +11 -9
- package/src/add-collection.ts +1 -3
- package/src/add-crud.ts +84 -100
- package/src/add-jdd-component.ts +4 -5
- package/src/add-list-route.test.ts +1 -1
- package/src/add-route.ts +3 -13
- package/src/build.ts +6 -4
- package/src/builders/backend-ts-builder.ts +0 -1
- package/src/builders/builder.ts +4 -1
- package/src/builders/colors-builder.ts +11 -9
- package/src/builders/css-builder.ts +4 -1
- package/src/builders/fonts-builder.ts +0 -1
- package/src/builders/frontend-ts-builder.ts +0 -1
- package/src/cli.ts +5 -7
- package/src/components/tabs.ts +38 -37
- package/src/components/toggle-modal.ts +1 -1
- package/src/controllers/table-add-button.stimulus.ts +35 -0
- package/src/esbuild-plugins/rewrite-asset-imports.ts +7 -10
- package/src/forms/controls/array.ts +35 -36
- package/src/forms/controls/autocomplete.ts +2 -2
- package/src/forms/controls/big-radio-group.ts +4 -4
- package/src/forms/controls/checkbox-group.ts +10 -10
- package/src/forms/controls/checkboxed-list-input.test.ts +6 -6
- package/src/forms/controls/checkboxed-list-input.ts +16 -8
- package/src/forms/controls/controls.ts +2 -2
- package/src/forms/controls/derived-frame.ts +16 -11
- package/src/forms/controls/derived.ts +7 -6
- package/src/forms/controls/dropdown.ts +13 -13
- package/src/forms/controls/editable-collection-subset.ts +4 -3
- package/src/forms/controls/field-group.ts +1 -1
- package/src/forms/controls/file.test.ts +4 -2
- package/src/forms/controls/file.ts +30 -7
- package/src/forms/controls/form-control.ts +8 -3
- package/src/forms/controls/hidden-input.ts +5 -1
- package/src/forms/controls/html.ts +1 -0
- package/src/forms/controls/{photo.test.ts → image.test.ts} +7 -24
- package/src/forms/controls/{photo.ts → image.ts} +4 -6
- package/src/forms/controls/multiple-files.ts +23 -8
- package/src/forms/controls/{multiple-photos.ts → multiple-images.ts} +2 -2
- package/src/forms/controls/number.ts +1 -1
- package/src/forms/controls/simple-input.ts +21 -33
- package/src/forms/controls/single-reference.test.ts +1 -1
- package/src/forms/controls/single-reference.ts +11 -3
- package/src/forms/controls/table.ts +87 -33
- package/src/forms/controls/textarea.ts +7 -5
- package/src/forms/controls/tickable.ts +13 -7
- package/src/forms/fields/boolean.ts +27 -2
- package/src/forms/fields/checkboxed-list.ts +11 -2
- package/src/forms/fields/collection-field.ts +21 -3
- package/src/forms/fields/color.ts +9 -0
- package/src/forms/fields/coordinates.ts +66 -0
- package/src/forms/fields/date.ts +50 -0
- package/src/forms/fields/datetime.ts +66 -0
- package/src/forms/fields/deep-reverse-single-reference-list.ts +130 -0
- package/src/forms/fields/deep-reverse-single-reference-table.ts +213 -0
- package/src/forms/fields/email.ts +10 -1
- package/src/forms/fields/enum-multiple-sealious.ts +48 -0
- package/src/forms/fields/existing-sealious-value.ts +1 -1
- package/src/forms/fields/field.test.ts +8 -8
- package/src/forms/fields/field.ts +98 -11
- package/src/forms/fields/fields.ts +23 -8
- package/src/forms/fields/file.test.ts +5 -17
- package/src/forms/fields/file.ts +44 -16
- package/src/forms/fields/float.ts +9 -0
- package/src/forms/fields/get-field-for-sealious.ts +337 -0
- package/src/forms/fields/html.ts +15 -0
- package/src/forms/fields/image.ts +12 -0
- package/src/forms/fields/int.ts +25 -0
- package/src/forms/fields/json.ts +48 -0
- package/src/forms/fields/markdown.ts +15 -0
- package/src/forms/fields/multiple-files.ts +10 -1
- package/src/forms/fields/number.ts +10 -3
- package/src/forms/fields/password.ts +13 -0
- package/src/forms/fields/pick-from-list-sealious.ts +22 -0
- package/src/forms/fields/pick-from-list.ts +8 -4
- package/src/forms/fields/proxy-field.ts +7 -1
- package/src/forms/fields/regexp.ts +27 -1
- package/src/forms/fields/simple-form-field.ts +103 -7
- package/src/forms/fields/single-reference.ts +62 -0
- package/src/forms/fields/structured-array.ts +111 -18
- package/src/forms/fields/table.ts +39 -16
- package/src/forms/fields/text.ts +18 -0
- package/src/forms/fields/url.ts +20 -0
- package/src/forms/form-types.ts +5 -4
- package/src/forms/form.test.ts +5 -7
- package/src/forms/form.ts +42 -23
- package/src/forms/forms.css +0 -85
- package/src/forms/multiform.test.ts +9 -9
- package/src/forms/multiform.ts +12 -10
- package/src/generate-collections.ts +2 -3
- package/src/generate-components.ts +2 -3
- package/src/generate-routes.test.ts +7 -16
- package/src/generate-routes.ts +6 -10
- package/src/generate-stimulus.ts +4 -5
- package/src/get-fonts.ts +32 -30
- package/src/index.ts +2 -1
- package/src/make-env.ts +1 -1
- package/src/make-hidden-inputs.ts +8 -7
- package/src/mount.ts +16 -7
- package/src/notifier.ts +4 -7
- package/src/page/default-list-filters.ts +1 -0
- package/src/page/list.ts +33 -28
- package/src/page/mountable-with-fields.test.ts +1 -1
- package/src/page/mountable-with-fields.ts +21 -12
- package/src/page/mountable.ts +0 -1
- package/src/page/page.ts +2 -3
- package/src/page/props-parser.ts +1 -1
- package/src/page/sealious-list.ts +1 -1
- package/src/page/stateful-page.ts +6 -10
- package/src/register-external.ts +5 -5
- package/src/templates/form.ts +9 -11
- package/src/templates/jdd-component.ts +1 -1
- package/src/templates/jdd-editor.ts +2 -4
- package/src/templates/list.ts +0 -1
- package/src/templates/multiform.ts +4 -4
- package/src/templates/page.ts +1 -6
- package/src/templates/shared/collection-create-form.ts +34 -71
- package/src/templates/shared/collection-edit-form.ts +46 -108
- package/src/templates/shared/collection-list.ts +13 -21
- package/src/templates/shared/item-delete.ts +0 -1
- package/src/templates/shared/shared-crud-form-fields.ts +38 -177
- package/src/templates/templates.ts +5 -1
- package/src/test_utils/exec_async.ts +3 -4
- package/src/test_utils/test-on-real-app.ts +13 -14
- package/src/utils/browser-creator.js +0 -1
- package/src/utils/exec.ts +0 -1
- package/src/utils/extract-fields-from-collection.ts +76 -25
- package/src/utils/input-wrapper.ts +1 -1
- package/src/utils/make-slug.ts +1 -1
- package/src/utils/wrap-attributes.ts +17 -0
- package/src/utils/write-file.ts +1 -1
- package/.eslintrc.cjs +0 -39
- package/lib/add-verbose-crud.js +0 -119
- package/lib/crud-field-snippets.js +0 -52
- package/lib/find-css-includes.js +0 -3
- package/lib/forms/controls/reverse-single-reference.js +0 -1
- package/lib/forms/fields/enum-multiple.js +0 -47
- package/lib/forms/fields/enum-multiple.test.js +0 -27
- package/lib/forms/fields/enum.js +0 -41
- package/lib/forms/fields/enum.test.js +0 -21
- package/lib/forms/fields/reverse-single-reference.js +0 -17
- package/lib/templates/shared/handlers/boolean.js +0 -14
- package/lib/templates/shared/handlers/date.js +0 -8
- package/lib/templates/shared/handlers/deep-reverse-single-reference.js +0 -209
- package/lib/templates/shared/handlers/default.js +0 -49
- package/lib/templates/shared/handlers/enum.js +0 -19
- package/lib/templates/shared/handlers/file.js +0 -23
- package/lib/templates/shared/handlers/image.js +0 -32
- package/lib/templates/shared/handlers/int.js +0 -11
- package/lib/templates/shared/handlers/jdd.js +0 -10
- package/lib/templates/shared/handlers/single-reference.js +0 -12
- package/lib/templates/shared/handlers/structured-array.js +0 -33
- package/src/add-verbose-crud.ts +0 -138
- package/src/crud-field-snippets.ts +0 -57
- package/src/find-css-includes.ts +0 -3
- package/src/forms/controls/reverse-single-reference.ts +0 -50
- package/src/forms/fields/enum-multiple.test.ts +0 -31
- package/src/forms/fields/enum-multiple.ts +0 -62
- package/src/forms/fields/enum.test.ts +0 -25
- package/src/forms/fields/enum.ts +0 -56
- package/src/forms/fields/reverse-single-reference.ts +0 -20
- package/src/templates/shared/handlers/boolean.ts +0 -18
- package/src/templates/shared/handlers/date.ts +0 -12
- package/src/templates/shared/handlers/deep-reverse-single-reference.ts +0 -244
- package/src/templates/shared/handlers/default.ts +0 -64
- package/src/templates/shared/handlers/enum.ts +0 -23
- package/src/templates/shared/handlers/file.ts +0 -27
- package/src/templates/shared/handlers/image.ts +0 -45
- package/src/templates/shared/handlers/int.ts +0 -15
- package/src/templates/shared/handlers/jdd.ts +0 -14
- package/src/templates/shared/handlers/single-reference.ts +0 -16
- package/src/templates/shared/handlers/structured-array.ts +0 -42
package/lib/generate-routes.js
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { promises as fs } from "fs";
|
|
2
|
-
import * as prettier from "prettier";
|
|
3
2
|
import { relative, resolve, basename } from "path";
|
|
4
3
|
import _locreq from "locreq";
|
|
5
4
|
import { walkDir } from "./utils/walk.js";
|
|
6
5
|
import { importPath } from "./utils/import-path.js";
|
|
7
6
|
import { assertType, predicates } from "@sealcode/ts-predicates";
|
|
8
7
|
import { unescape_url_params } from "./utils/escape-url-params.js";
|
|
9
|
-
import {
|
|
8
|
+
import { formatWithPrettier } from "./utils/prettier.js";
|
|
10
9
|
import { Templates } from "./templates/templates.js";
|
|
11
10
|
const target_locreq = _locreq(process.cwd());
|
|
12
11
|
async function extractActionName(full_file_path) {
|
|
@@ -91,14 +90,13 @@ ${sortRoutes(files).map(
|
|
|
91
90
|
}`;
|
|
92
91
|
const urls_content = `${sortRoutes(files).map(({ actionName, url }) => generateURL(actionName, url)).join("\n")}
|
|
93
92
|
`;
|
|
94
|
-
const prettier_config = await getPrettierConfig();
|
|
95
93
|
await fs.writeFile(
|
|
96
94
|
target_locreq.resolve("src/back/routes/routes.ts"),
|
|
97
|
-
|
|
95
|
+
await formatWithPrettier(routes_content)
|
|
98
96
|
);
|
|
99
97
|
await fs.writeFile(
|
|
100
98
|
target_locreq.resolve("src/back/routes/urls.ts"),
|
|
101
|
-
|
|
99
|
+
await formatWithPrettier(urls_content)
|
|
102
100
|
);
|
|
103
101
|
console.log(
|
|
104
102
|
"Successfuly generated new src/back/routes/routes.ts and src/back/routes/urls.ts"
|
|
@@ -1,19 +1,14 @@
|
|
|
1
1
|
import { generateURL, sortRoutes } from "./generate-routes.js";
|
|
2
|
-
import
|
|
3
|
-
import { getPrettierConfig } from "./utils/prettier.js";
|
|
2
|
+
import { formatWithPrettier } from "./utils/prettier.js";
|
|
4
3
|
import assert from "node:assert";
|
|
5
4
|
describe("generate routes", () => {
|
|
6
5
|
it("handles a url with params", async () => {
|
|
7
6
|
assert.strictEqual(
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
await getPrettierConfig()
|
|
11
|
-
),
|
|
12
|
-
prettier.format(
|
|
7
|
+
await formatWithPrettier(generateURL("EditUser", "/admin/users/:id/edit/")),
|
|
8
|
+
await formatWithPrettier(
|
|
13
9
|
`export const EditUserURL = (id: string) => \`/admin/users/\${id}/edit/\`;
|
|
14
10
|
EditUserURL.params = ["id"];
|
|
15
|
-
EditUserURL.rawURL = "/admin/users/:id/edit/"
|
|
16
|
-
await getPrettierConfig()
|
|
11
|
+
EditUserURL.rawURL = "/admin/users/:id/edit/";`
|
|
17
12
|
)
|
|
18
13
|
);
|
|
19
14
|
});
|
|
@@ -25,15 +20,11 @@ EditUserURL.rawURL = "/admin/users/:id/edit/";`,
|
|
|
25
20
|
});
|
|
26
21
|
it("handles a url with params and diacritics", async () => {
|
|
27
22
|
assert.strictEqual(
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
await getPrettierConfig()
|
|
31
|
-
),
|
|
32
|
-
prettier.format(
|
|
23
|
+
await formatWithPrettier(generateURL("EditUser", "/admin/u\u017Cytkownicy/:id/edit/")),
|
|
24
|
+
await formatWithPrettier(
|
|
33
25
|
`export const EditUserURL = (id: string) => \`/admin/u%C5%BCytkownicy/\${id}/edit/\`;
|
|
34
26
|
EditUserURL.params = ["id"];
|
|
35
|
-
EditUserURL.rawURL = "/admin/u%C5%BCytkownicy/:id/edit/"
|
|
36
|
-
await getPrettierConfig()
|
|
27
|
+
EditUserURL.rawURL = "/admin/u%C5%BCytkownicy/:id/edit/";`
|
|
37
28
|
)
|
|
38
29
|
);
|
|
39
30
|
});
|
package/lib/generate-stimulus.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import _locreq from "locreq";
|
|
2
|
-
import * as prettier from "prettier";
|
|
3
2
|
import { promises as fs } from "fs";
|
|
4
|
-
import {
|
|
3
|
+
import { formatWithPrettier } from "./utils/prettier.js";
|
|
5
4
|
import recursive from "recursive-readdir";
|
|
6
5
|
import path, { dirname } from "path";
|
|
7
6
|
import { toKebabCase, toPascalCase } from "js-convert-case";
|
|
@@ -12,6 +11,7 @@ async function generateStimulusControllers(controller_dirs) {
|
|
|
12
11
|
target_locreq.resolve("src/"),
|
|
13
12
|
...controller_dirs
|
|
14
13
|
];
|
|
14
|
+
console.info("Looking for controllers in ", stimulus_search_dirs);
|
|
15
15
|
const controller_names = (await Promise.all(stimulus_search_dirs.map((dir) => recursive(dir)))).flat().filter((c) => c.endsWith(".stimulus.ts")).sort();
|
|
16
16
|
const controller_data = controller_names.map(
|
|
17
17
|
(p) => "./" + path.relative(target_locreq.resolve(dirname(output_file)), p).replace(/\.[tj]sx?$/, ".js")
|
|
@@ -34,9 +34,9 @@ export { Turbo };
|
|
|
34
34
|
`;
|
|
35
35
|
await fs.writeFile(
|
|
36
36
|
target_locreq.resolve(output_file),
|
|
37
|
-
|
|
37
|
+
await formatWithPrettier(content)
|
|
38
38
|
);
|
|
39
|
-
console.
|
|
39
|
+
console.info(`Successfuly generated new ${output_file} file`);
|
|
40
40
|
}
|
|
41
41
|
export {
|
|
42
42
|
generateStimulusControllers
|
package/lib/get-fonts.js
CHANGED
|
@@ -27,43 +27,45 @@ async function getFonts(_ = {}) {
|
|
|
27
27
|
fontsPath: "/dist/fonts"
|
|
28
28
|
});
|
|
29
29
|
await downloader.execute();
|
|
30
|
-
console.
|
|
30
|
+
console.info("Downloaded new fonts pack from google fonts");
|
|
31
31
|
const squirrel_fonts = fonts_config.fontSquirrel;
|
|
32
|
-
if (
|
|
32
|
+
if (is(
|
|
33
33
|
squirrel_fonts,
|
|
34
34
|
predicates.record(
|
|
35
35
|
predicates.string,
|
|
36
36
|
predicates.array(predicates.string)
|
|
37
37
|
)
|
|
38
38
|
)) {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
});
|
|
44
|
-
const config_file = `{
|
|
39
|
+
await mkdir(target_locreq.resolve("public/dist/fontsquirrel/"), {
|
|
40
|
+
recursive: true
|
|
41
|
+
});
|
|
42
|
+
const config_file = `{
|
|
45
43
|
"tmpDir": "/tmp/fonts",
|
|
46
44
|
"fontsDir": "/dist/fontsquirrel/fonts",
|
|
47
45
|
"cssDir": "/dist/fontsquirrel/css",
|
|
48
46
|
"cssFile": "fonts.css"
|
|
49
47
|
}`;
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
48
|
+
await writeFile("public/fonsta.config.json", config_file);
|
|
49
|
+
await Promise.all(
|
|
50
|
+
Object.keys(squirrel_fonts).map((font) => {
|
|
51
|
+
if (squirrel_fonts[font].length) {
|
|
52
|
+
return execPromise(
|
|
53
|
+
`node ${path_to_fonsta} install ${font}:${squirrel_fonts[font].join(",")}`,
|
|
54
|
+
{
|
|
55
|
+
cwd: target_locreq.resolve("public")
|
|
56
|
+
}
|
|
57
|
+
);
|
|
58
|
+
} else {
|
|
59
|
+
return execPromise(
|
|
60
|
+
`node ${path_to_fonsta} install ${font}`,
|
|
61
|
+
{
|
|
62
|
+
cwd: target_locreq.resolve("public")
|
|
63
|
+
}
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
})
|
|
67
|
+
);
|
|
68
|
+
}
|
|
67
69
|
const fonts_css_file_path = resolve(
|
|
68
70
|
target_locreq.resolve("public/dist/fonts"),
|
|
69
71
|
"fonts.css"
|
|
@@ -75,8 +77,8 @@ async function getFonts(_ = {}) {
|
|
|
75
77
|
);
|
|
76
78
|
await unlink("public/fonsta.config.json");
|
|
77
79
|
await rmdir("public/tmp");
|
|
78
|
-
console.
|
|
79
|
-
console.
|
|
80
|
+
console.info("Downloaded new fonts pack from Font Squirrel");
|
|
81
|
+
console.info("Downloaded new fonts pack");
|
|
80
82
|
}
|
|
81
83
|
export {
|
|
82
84
|
FONTS_CONFIG_PATH,
|
package/lib/index.js
CHANGED
|
@@ -16,6 +16,7 @@ export * from "./forms/multiform.js";
|
|
|
16
16
|
import * as Components from "./components/components.js";
|
|
17
17
|
export * from "./mount.js";
|
|
18
18
|
export * from "./page/default-list-filters.js";
|
|
19
|
+
export * from "./forms/fields/get-field-for-sealious.js";
|
|
19
20
|
export {
|
|
20
21
|
Components,
|
|
21
22
|
Controls,
|
package/lib/make-env.js
CHANGED
|
@@ -3,10 +3,10 @@ import { attribute } from "./sanitize.js";
|
|
|
3
3
|
function makeHiddenInputs(ctx, fields, values, fields_to_skip) {
|
|
4
4
|
return tempstream`${Object.entries(fields).filter(([key]) => !fields_to_skip.includes(key)).map(
|
|
5
5
|
([key, field]) => tempstream`<input
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
type="hidden"
|
|
7
|
+
name="${key}"
|
|
8
|
+
value="${field.getParsedValue(ctx, values).then((r) => attribute(JSON.stringify(r.raw) || ""))}"
|
|
9
|
+
/>`
|
|
10
10
|
)}`;
|
|
11
11
|
}
|
|
12
12
|
export {
|
package/lib/mount.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { FileManager } from "@sealcode/file-manager";
|
|
2
2
|
import { Middlewares as SealiousMiddlewares } from "sealious";
|
|
3
|
+
import { KoaResponsiveImageRouter } from "koa-responsive-image-router";
|
|
3
4
|
async function handleHtmlPromise(ctx, next) {
|
|
4
5
|
await next();
|
|
5
6
|
if (ctx.body instanceof Promise) {
|
|
@@ -9,9 +10,19 @@ async function handleHtmlPromise(ctx, next) {
|
|
|
9
10
|
}
|
|
10
11
|
function mount(router, url, mountable, use_dummy_app = false, file_manager = use_dummy_app ? new FileManager("/tmp", "/uploaded_files") : void 0) {
|
|
11
12
|
const raw_url = typeof url === "string" ? url : url.rawURL;
|
|
13
|
+
const imageRouter = new KoaResponsiveImageRouter({
|
|
14
|
+
staticPath: "/tmp",
|
|
15
|
+
thumbnailSize: 10,
|
|
16
|
+
cacheManagerResolutionThreshold: 10,
|
|
17
|
+
imageStoragePath: "/tmp",
|
|
18
|
+
smartCropStoragePath: "/tmp"
|
|
19
|
+
});
|
|
20
|
+
const fileManager = new FileManager("/tmp", "/uploaded_files");
|
|
12
21
|
const args = use_dummy_app ? [
|
|
13
22
|
async (ctx, next) => {
|
|
14
23
|
ctx.$app = {
|
|
24
|
+
fileManager,
|
|
25
|
+
imageRouter,
|
|
15
26
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
16
27
|
Logger: new Proxy(
|
|
17
28
|
{},
|
|
@@ -28,7 +39,6 @@ function mount(router, url, mountable, use_dummy_app = false, file_manager = use
|
|
|
28
39
|
}
|
|
29
40
|
),
|
|
30
41
|
getString: (x) => x
|
|
31
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
32
42
|
};
|
|
33
43
|
await next();
|
|
34
44
|
},
|
package/lib/notifier.js
CHANGED
|
@@ -13,7 +13,7 @@ async function wait_for_run_id_to_change(app_port) {
|
|
|
13
13
|
try {
|
|
14
14
|
const { started_at } = await get_status(app_port);
|
|
15
15
|
first_timestamp = started_at;
|
|
16
|
-
} catch (
|
|
16
|
+
} catch (_e) {
|
|
17
17
|
await wait_for_app_to_be_stable(app_port);
|
|
18
18
|
return;
|
|
19
19
|
}
|
|
@@ -34,7 +34,6 @@ async function wait_for_app_to_be_stable(app_port, n = 3) {
|
|
|
34
34
|
console.log("Waiting for app to be stable....");
|
|
35
35
|
let counter = 0;
|
|
36
36
|
while (true) {
|
|
37
|
-
console.debug("notifier.ts:53");
|
|
38
37
|
const { status } = await get_status(app_port).catch(() => ({
|
|
39
38
|
status: "down"
|
|
40
39
|
}));
|
|
@@ -77,8 +76,8 @@ function make_notifier(port, app_port) {
|
|
|
77
76
|
sockets = sockets.filter((s) => s !== socket);
|
|
78
77
|
});
|
|
79
78
|
});
|
|
80
|
-
console.
|
|
81
|
-
"
|
|
79
|
+
console.info(
|
|
80
|
+
"\u{1F514} Build notifier listening on websocket at port " + port.toString()
|
|
82
81
|
);
|
|
83
82
|
return function notify(message) {
|
|
84
83
|
sockets.forEach((s) => s.send(message));
|
package/lib/page/list.js
CHANGED
|
@@ -4,13 +4,13 @@ import { naturalNumbers, UrlWithNewParams } from "../utils/utils.js";
|
|
|
4
4
|
import { makeHiddenInputs } from "../make-hidden-inputs.js";
|
|
5
5
|
import qs from "qs";
|
|
6
6
|
import { NumberField } from "../forms/fields/number.js";
|
|
7
|
-
import {
|
|
7
|
+
import { TextBasedSimpleField } from "../forms/fields/simple-form-field.js";
|
|
8
8
|
const BasePagePropsShape = {};
|
|
9
9
|
const DEFAULT_ITEMS_PER_PAGE = 12;
|
|
10
10
|
const BaseListPageFields = {
|
|
11
11
|
page: new NumberField(false, 1),
|
|
12
12
|
itemsPerPage: new NumberField(false, DEFAULT_ITEMS_PER_PAGE),
|
|
13
|
-
sort: new
|
|
13
|
+
sort: new TextBasedSimpleField(false)
|
|
14
14
|
};
|
|
15
15
|
const SORT_SEPARATOR = ":";
|
|
16
16
|
function decodeSort(s) {
|
|
@@ -40,8 +40,8 @@ class ListPage extends Page {
|
|
|
40
40
|
}
|
|
41
41
|
init() {
|
|
42
42
|
super.init();
|
|
43
|
-
for (const [
|
|
44
|
-
void field.init(
|
|
43
|
+
for (const [, field] of Object.entries(this.filterFields)) {
|
|
44
|
+
void field.init();
|
|
45
45
|
}
|
|
46
46
|
}
|
|
47
47
|
renderListContainer(_, content) {
|
|
@@ -49,11 +49,14 @@ class ListPage extends Page {
|
|
|
49
49
|
}
|
|
50
50
|
async getPaginationConfig(ctx) {
|
|
51
51
|
const values = await this.extractRawValues(ctx);
|
|
52
|
-
let { parsed: page } = await this.fields.page.
|
|
52
|
+
let { parsed: page } = await this.fields.page.getParsedValue(
|
|
53
|
+
ctx,
|
|
54
|
+
values
|
|
55
|
+
);
|
|
53
56
|
if (!page) {
|
|
54
57
|
page = 1;
|
|
55
58
|
}
|
|
56
|
-
const { parsed: itemsPerPage } = await this.fields.itemsPerPage.
|
|
59
|
+
const { parsed: itemsPerPage } = await this.fields.itemsPerPage.getParsedValue(ctx, values);
|
|
57
60
|
return { page, itemsPerPage };
|
|
58
61
|
}
|
|
59
62
|
async renderItems(ctx, values, items) {
|
|
@@ -87,17 +90,16 @@ class ListPage extends Page {
|
|
|
87
90
|
(n) => (
|
|
88
91
|
/* HTML */
|
|
89
92
|
`<option
|
|
90
|
-
|
|
93
|
+
value="${UrlWithNewParams(
|
|
91
94
|
ctx,
|
|
92
|
-
//eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
93
95
|
this.propsParser.overwriteProp(ctx, {
|
|
94
96
|
page: n
|
|
95
97
|
})
|
|
96
98
|
)}"
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
99
|
+
${page === n ? "selected" : ""}
|
|
100
|
+
>
|
|
101
|
+
${n}
|
|
102
|
+
</option>`
|
|
101
103
|
)
|
|
102
104
|
)}
|
|
103
105
|
</select>
|
|
@@ -114,7 +116,6 @@ class ListPage extends Page {
|
|
|
114
116
|
`<a
|
|
115
117
|
href="${UrlWithNewParams(
|
|
116
118
|
ctx,
|
|
117
|
-
//eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
118
119
|
this.propsParser.overwriteProp(ctx, {
|
|
119
120
|
page
|
|
120
121
|
})
|
|
@@ -127,7 +128,7 @@ class ListPage extends Page {
|
|
|
127
128
|
const filter = {};
|
|
128
129
|
const raw_values = await this.extractRawValues(ctx);
|
|
129
130
|
for (const [fieldname, field] of Object.entries(this.filterFields)) {
|
|
130
|
-
const { parsed } = await field.
|
|
131
|
+
const { parsed } = await field.getParsedValue(ctx, raw_values);
|
|
131
132
|
filter[fieldname] = field.mapToFilter(parsed);
|
|
132
133
|
}
|
|
133
134
|
return filter;
|
|
@@ -163,7 +164,11 @@ class ListPage extends Page {
|
|
|
163
164
|
return control.render(
|
|
164
165
|
this.makeFormControlContext(
|
|
165
166
|
ctx,
|
|
166
|
-
{
|
|
167
|
+
{
|
|
168
|
+
raw_values: values,
|
|
169
|
+
messages: [],
|
|
170
|
+
field_messages: {}
|
|
171
|
+
},
|
|
167
172
|
false
|
|
168
173
|
)
|
|
169
174
|
);
|
|
@@ -13,14 +13,15 @@ class MountableWithFields extends Mountable {
|
|
|
13
13
|
this.fields = {};
|
|
14
14
|
}
|
|
15
15
|
init() {
|
|
16
|
-
for (const [
|
|
17
|
-
void field.init(
|
|
16
|
+
for (const [field_name, field] of Object.entries(this.fields)) {
|
|
17
|
+
void field.init();
|
|
18
|
+
field.setName(field_name);
|
|
18
19
|
}
|
|
19
20
|
}
|
|
20
21
|
makeFormControlContext(ctx, data, validate, field_name_prefix = this.field_names_prefix, form_id = this.form_id) {
|
|
21
22
|
return new FormControlContext(
|
|
22
23
|
ctx,
|
|
23
|
-
data
|
|
24
|
+
data,
|
|
24
25
|
data.messages,
|
|
25
26
|
field_name_prefix,
|
|
26
27
|
form_id,
|
|
@@ -44,10 +45,13 @@ class MountableWithFields extends Mountable {
|
|
|
44
45
|
await Promise.all(
|
|
45
46
|
Object.keys(this.fields).map(async (key) => {
|
|
46
47
|
const field = this.fields[key];
|
|
47
|
-
const { valid: fieldvalid, message: fieldmessage } = await field.
|
|
48
|
+
const { valid: fieldvalid, message: fieldmessage } = await field.getParsedValue(ctx, values, true);
|
|
48
49
|
if (!fieldvalid) {
|
|
49
50
|
valid = false;
|
|
50
|
-
field_errors[field.name] =
|
|
51
|
+
field_errors[field.name] = {
|
|
52
|
+
type: "error",
|
|
53
|
+
message: fieldmessage
|
|
54
|
+
};
|
|
51
55
|
}
|
|
52
56
|
})
|
|
53
57
|
);
|
|
@@ -81,7 +85,11 @@ class MountableWithFields extends Mountable {
|
|
|
81
85
|
const result = {};
|
|
82
86
|
const promises = Object.entries(this.fields).map(
|
|
83
87
|
async ([key, field]) => {
|
|
84
|
-
const { parsed } = await field.
|
|
88
|
+
const { parsed } = await field.getParsedValue(
|
|
89
|
+
ctx,
|
|
90
|
+
raw_values,
|
|
91
|
+
false
|
|
92
|
+
);
|
|
85
93
|
result[key] = parsed;
|
|
86
94
|
}
|
|
87
95
|
);
|
|
@@ -17,7 +17,7 @@ describe("mountable-with-fields", () => {
|
|
|
17
17
|
const data = await this.getParsedValues(ctx);
|
|
18
18
|
data.not_required?.trim();
|
|
19
19
|
data.required.trim();
|
|
20
|
-
const { parsed: data2 } = await this.fields.not_required.
|
|
20
|
+
const { parsed: data2 } = await this.fields.not_required.getParsedValue(
|
|
21
21
|
ctx,
|
|
22
22
|
form_values.raw_values
|
|
23
23
|
);
|
package/lib/page/mountable.js
CHANGED
package/lib/page/page.js
CHANGED
package/lib/register-external.js
CHANGED
|
@@ -43,7 +43,7 @@ async function updatePackageJson(projectDir, moduleName, subdirectory, type) {
|
|
|
43
43
|
const pathToAdd = `node_modules/${moduleName}/${subdirectory}`;
|
|
44
44
|
const existingPaths = packageJson.sealgen[type];
|
|
45
45
|
if (existingPaths.includes(pathToAdd)) {
|
|
46
|
-
console.
|
|
46
|
+
console.warn(`${type} already contains: ${pathToAdd}`);
|
|
47
47
|
return;
|
|
48
48
|
}
|
|
49
49
|
existingPaths.push(pathToAdd);
|
|
@@ -52,9 +52,9 @@ async function updatePackageJson(projectDir, moduleName, subdirectory, type) {
|
|
|
52
52
|
"json"
|
|
53
53
|
);
|
|
54
54
|
await fs.writeFile(packageJsonPath, updatedContent);
|
|
55
|
-
console.
|
|
55
|
+
console.info(`Added ${pathToAdd} to ${type} in ${packageJsonPath}`);
|
|
56
56
|
}
|
|
57
|
-
async function registerExternalControllers(
|
|
57
|
+
async function registerExternalControllers(_args) {
|
|
58
58
|
const moduleName = process.argv.at(3);
|
|
59
59
|
const subdirectory = process.argv.at(4);
|
|
60
60
|
if (!moduleName || !subdirectory) {
|
|
@@ -76,7 +76,7 @@ async function registerExternalControllers(args) {
|
|
|
76
76
|
process.exit(1);
|
|
77
77
|
}
|
|
78
78
|
}
|
|
79
|
-
async function registerExternalStyles(
|
|
79
|
+
async function registerExternalStyles(_args) {
|
|
80
80
|
const moduleName = process.argv.at(3);
|
|
81
81
|
const subdirectory = process.argv.at(4);
|
|
82
82
|
if (!moduleName || !subdirectory) {
|
package/lib/templates/form.js
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { curryImportPath } from "../utils/import-path.js";
|
|
3
|
-
import { getPrettierConfig } from "../utils/prettier.js";
|
|
1
|
+
import { formatWithPrettier } from "../utils/prettier.js";
|
|
4
2
|
const defaults = {
|
|
5
3
|
postimport: `
|
|
6
4
|
import { Fields } from "@sealcode/sealgen";
|
|
7
5
|
import type {FormDataValue} from "@sealcode/sealgen";`,
|
|
8
6
|
fields: `
|
|
9
|
-
password: new Fields.
|
|
7
|
+
password: new Fields.Password(true),`,
|
|
10
8
|
controls: `
|
|
11
9
|
new Controls.SimpleInput(fields.password, {
|
|
12
10
|
label: "Password:",
|
|
@@ -17,8 +15,8 @@ const defaults = {
|
|
|
17
15
|
data: Record<string, FormDataValue>
|
|
18
16
|
): Promise<{ valid: boolean; error: string }> {
|
|
19
17
|
// just a silly example, please remove this with better logic
|
|
20
|
-
const { parsed: email } = await this.fields.email.
|
|
21
|
-
const { parsed: password } = await this.fields.password.
|
|
18
|
+
const { parsed: email } = await this.fields.email.getParsedValue(ctx, data);
|
|
19
|
+
const { parsed: password } = await this.fields.password.getParsedValue(ctx, data);
|
|
22
20
|
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
23
21
|
if ((password || "").length > ((email as string) || "").length) {
|
|
24
22
|
return { valid: false, error: "Password cannot be longer than email" };
|
|
@@ -41,13 +39,12 @@ const defaults = {
|
|
|
41
39
|
other_methods: "",
|
|
42
40
|
success_message: "Success!"
|
|
43
41
|
};
|
|
44
|
-
async function formTemplate(action_name,
|
|
42
|
+
async function formTemplate(action_name, _params = defaults) {
|
|
45
43
|
const params = { ...defaults, ..._params };
|
|
46
|
-
const rel = curryImportPath(newfilefullpath);
|
|
47
44
|
const content = `import type { Context } from "koa";
|
|
48
45
|
import type { FormData } from "@sealcode/sealgen";
|
|
49
46
|
import { Form, Controls, fieldsToShape } from "@sealcode/sealgen";
|
|
50
|
-
import html from "
|
|
47
|
+
import html from "src/back/html.js";
|
|
51
48
|
|
|
52
49
|
${params.postimport}
|
|
53
50
|
|
|
@@ -57,6 +54,8 @@ const fields = {
|
|
|
57
54
|
${params.fields}
|
|
58
55
|
};
|
|
59
56
|
|
|
57
|
+
Form.initFieldNames(fields);
|
|
58
|
+
|
|
60
59
|
export const ${action_name}Shape = fieldsToShape(fields);
|
|
61
60
|
|
|
62
61
|
export default new (class ${action_name}Form extends Form<typeof fields, void> {
|
|
@@ -78,7 +77,7 @@ export default new (class ${action_name}Form extends Form<typeof fields, void> {
|
|
|
78
77
|
${params.render}
|
|
79
78
|
})();
|
|
80
79
|
`;
|
|
81
|
-
return
|
|
80
|
+
return formatWithPrettier(content);
|
|
82
81
|
}
|
|
83
82
|
export {
|
|
84
83
|
formTemplate
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { toKebabCase, toPascalCase } from "js-convert-case";
|
|
2
|
-
function jddComponentTemplate(component_name) {
|
|
2
|
+
async function jddComponentTemplate(component_name) {
|
|
3
3
|
return `import { TempstreamJSX } from "tempstream";
|
|
4
4
|
import type { ComponentToHTMLArgs } from "@sealcode/jdd";
|
|
5
5
|
import { Component, ComponentArguments } from "@sealcode/jdd";
|
|
@@ -20,7 +20,7 @@ async function jddEditorTemplate(actionName) {
|
|
|
20
20
|
let field_name = "";
|
|
21
21
|
if (jdd_fields.length == 1) {
|
|
22
22
|
field_name = jdd_fields[0].name;
|
|
23
|
-
console.
|
|
23
|
+
console.info(
|
|
24
24
|
`Only one field of type JDD found: ${field_name}, so skipping the question...`
|
|
25
25
|
);
|
|
26
26
|
} else if (jdd_fields.length > 1) {
|
|
@@ -9,8 +9,8 @@ import { FlatTemplatable } from "tempstream";
|
|
|
9
9
|
export const actionName = "${action_name}";
|
|
10
10
|
|
|
11
11
|
const fields1 = {
|
|
12
|
-
email: new Fields.
|
|
13
|
-
password: new Fields.
|
|
12
|
+
email: new Fields.TextBasedSimpleField(true),
|
|
13
|
+
password: new Fields.TextBasedSimpleField(true),
|
|
14
14
|
};
|
|
15
15
|
|
|
16
16
|
const form1 = new (class extends Form<typeof fields1, unknown> {
|
|
@@ -26,8 +26,8 @@ const form1 = new (class extends Form<typeof fields1, unknown> {
|
|
|
26
26
|
})();
|
|
27
27
|
|
|
28
28
|
const fields2 = {
|
|
29
|
-
name: new Fields.
|
|
30
|
-
surname: new Fields.
|
|
29
|
+
name: new Fields.TextBasedSimpleField(true),
|
|
30
|
+
surname: new Fields.TextBasedSimpleField(true),
|
|
31
31
|
};
|
|
32
32
|
|
|
33
33
|
const form2 = new (class extends Form<typeof fields2, unknown> {
|
package/lib/templates/page.js
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
async function pageTemplate(action_name, newfilefullpath) {
|
|
3
|
-
const rel = curryImportPath(newfilefullpath);
|
|
1
|
+
async function pageTemplate(action_name) {
|
|
4
2
|
return `import type { Context } from "koa";
|
|
5
3
|
import { TempstreamJSX } from "tempstream";
|
|
6
4
|
import { Page } from "@sealcode/sealgen";
|