@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/src/forms/form.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { Context } from "koa";
|
|
|
2
2
|
import { randomUUID } from "crypto";
|
|
3
3
|
|
|
4
4
|
import Router from "@koa/router";
|
|
5
|
-
import {
|
|
5
|
+
import { tempstream } from "tempstream";
|
|
6
6
|
import {
|
|
7
7
|
hasFieldOfType,
|
|
8
8
|
hasShape,
|
|
@@ -22,10 +22,14 @@ import {
|
|
|
22
22
|
MountableWithFields,
|
|
23
23
|
PageErrorMessage,
|
|
24
24
|
} from "../page/mountable-with-fields.js";
|
|
25
|
+
import { Readable } from "stream";
|
|
26
|
+
import { FormField } from "../index.js";
|
|
27
|
+
import { FieldMessages } from "./controls/form-control.js";
|
|
28
|
+
import { Errors as SealiousErrors } from "sealious";
|
|
25
29
|
|
|
26
30
|
export abstract class Form<
|
|
27
31
|
F extends Fields,
|
|
28
|
-
SubmitResult
|
|
32
|
+
SubmitResult,
|
|
29
33
|
> extends MountableWithFields<F> {
|
|
30
34
|
defaultSuccessMessage = "Done";
|
|
31
35
|
submitButtonText = "Wyślij";
|
|
@@ -34,7 +38,6 @@ export abstract class Form<
|
|
|
34
38
|
form_id = randomUUID() as string;
|
|
35
39
|
|
|
36
40
|
async canAccess(
|
|
37
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
38
41
|
_: Context
|
|
39
42
|
): Promise<{ canAccess: boolean; message: string }> {
|
|
40
43
|
return { canAccess: true, message: "" };
|
|
@@ -43,11 +46,11 @@ export abstract class Form<
|
|
|
43
46
|
async renderError(
|
|
44
47
|
_: Context,
|
|
45
48
|
error: PageErrorMessage
|
|
46
|
-
): Promise<
|
|
47
|
-
return tempstream/* HTML */ `<div>${error.message}</div>`;
|
|
49
|
+
): Promise<JSX.Element | Readable> {
|
|
50
|
+
return tempstream /* HTML */ `<div>${error.message}</div>`;
|
|
48
51
|
}
|
|
49
52
|
|
|
50
|
-
makeSubmitButton():
|
|
53
|
+
makeSubmitButton(): JSX.Element {
|
|
51
54
|
return /* HTML */ `<input
|
|
52
55
|
type="submit"
|
|
53
56
|
value="${this.submitButtonText}"
|
|
@@ -60,8 +63,8 @@ export abstract class Form<
|
|
|
60
63
|
ctx: Context,
|
|
61
64
|
data: FormData,
|
|
62
65
|
show_field_errors: boolean
|
|
63
|
-
): Promise<
|
|
64
|
-
return tempstream/* HTML */ `<div class="form-container">
|
|
66
|
+
): Promise<JSX.Element | Readable> {
|
|
67
|
+
return tempstream /* HTML */ `<div class="form-container">
|
|
65
68
|
${this.makeOpenFormTag(ctx)}
|
|
66
69
|
${!this.controls.some((control) => control.role == "messages")
|
|
67
70
|
? this.renderMessages(ctx, data)
|
|
@@ -76,12 +79,11 @@ export abstract class Form<
|
|
|
76
79
|
</div>`;
|
|
77
80
|
}
|
|
78
81
|
|
|
79
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
80
82
|
public async makeFormClasses(_ctx: Context): Promise<string[]> {
|
|
81
83
|
return [];
|
|
82
84
|
}
|
|
83
85
|
|
|
84
|
-
public makeOpenFormTag(ctx: Context):
|
|
86
|
+
public makeOpenFormTag(ctx: Context): JSX.Element {
|
|
85
87
|
return tempstream`<form enctype="multipart/form-data" method="POST" id="${
|
|
86
88
|
this.form_id
|
|
87
89
|
}" action="${this.action}" class="${this.makeFormClasses(ctx).then(
|
|
@@ -91,14 +93,14 @@ export abstract class Form<
|
|
|
91
93
|
}></form><div class="form">`;
|
|
92
94
|
}
|
|
93
95
|
|
|
94
|
-
public makeCloseFormTag():
|
|
96
|
+
public makeCloseFormTag(): JSX.Element {
|
|
95
97
|
return `</div>`;
|
|
96
98
|
}
|
|
97
99
|
|
|
98
100
|
public async onValuesInvalid(
|
|
99
101
|
ctx: Context,
|
|
100
102
|
form_messages: FormMessage[],
|
|
101
|
-
|
|
103
|
+
field_errors: FieldMessages<keyof Fields>
|
|
102
104
|
): Promise<FormReaction> {
|
|
103
105
|
const messages = form_messages.length
|
|
104
106
|
? form_messages
|
|
@@ -110,8 +112,9 @@ export abstract class Form<
|
|
|
110
112
|
{
|
|
111
113
|
raw_values: await this.extractRawValues(ctx),
|
|
112
114
|
messages,
|
|
115
|
+
field_messages: field_errors,
|
|
113
116
|
},
|
|
114
|
-
|
|
117
|
+
true
|
|
115
118
|
),
|
|
116
119
|
messages,
|
|
117
120
|
};
|
|
@@ -123,12 +126,21 @@ export abstract class Form<
|
|
|
123
126
|
error: unknown
|
|
124
127
|
): Promise<FormReaction> {
|
|
125
128
|
let error_message = "Unknown error has occured";
|
|
129
|
+
let field_messages: FieldMessages = {};
|
|
126
130
|
if (
|
|
127
131
|
is(error, predicates.object) &&
|
|
128
132
|
hasShape({ message: predicates.string }, error)
|
|
129
133
|
) {
|
|
130
134
|
error_message = error.message;
|
|
131
135
|
}
|
|
136
|
+
if (error instanceof SealiousErrors.FieldsError) {
|
|
137
|
+
field_messages = Object.fromEntries(
|
|
138
|
+
Object.entries(error.field_messages).map(([key, value]) => {
|
|
139
|
+
const message = value?.message || "";
|
|
140
|
+
return [key, { type: "error", message }];
|
|
141
|
+
})
|
|
142
|
+
);
|
|
143
|
+
}
|
|
132
144
|
const messages = [<const>{ type: "error", text: error_message }];
|
|
133
145
|
return {
|
|
134
146
|
action: "stay",
|
|
@@ -137,8 +149,9 @@ export abstract class Form<
|
|
|
137
149
|
{
|
|
138
150
|
raw_values: data.raw_values,
|
|
139
151
|
messages,
|
|
152
|
+
field_messages,
|
|
140
153
|
},
|
|
141
|
-
|
|
154
|
+
true
|
|
142
155
|
),
|
|
143
156
|
};
|
|
144
157
|
}
|
|
@@ -163,8 +176,9 @@ export abstract class Form<
|
|
|
163
176
|
{
|
|
164
177
|
raw_values: await this.getInitialValues(ctx),
|
|
165
178
|
messages,
|
|
179
|
+
field_messages: {},
|
|
166
180
|
},
|
|
167
|
-
|
|
181
|
+
false
|
|
168
182
|
),
|
|
169
183
|
messages,
|
|
170
184
|
};
|
|
@@ -181,10 +195,6 @@ export abstract class Form<
|
|
|
181
195
|
raw_values
|
|
182
196
|
);
|
|
183
197
|
if (!valid) {
|
|
184
|
-
console.debug("Form values invalid: ", {
|
|
185
|
-
form_messages,
|
|
186
|
-
field_errors,
|
|
187
|
-
});
|
|
188
198
|
return this.onValuesInvalid(ctx, form_messages, field_errors);
|
|
189
199
|
}
|
|
190
200
|
try {
|
|
@@ -192,12 +202,14 @@ export abstract class Form<
|
|
|
192
202
|
const result = await this.onSubmit(ctx, {
|
|
193
203
|
raw_values,
|
|
194
204
|
messages: [],
|
|
205
|
+
field_messages: {},
|
|
195
206
|
});
|
|
196
207
|
return this.onSuccess(
|
|
197
208
|
ctx,
|
|
198
209
|
{
|
|
199
210
|
raw_values: await this.getRawValuesOnSuccess(ctx),
|
|
200
211
|
messages: [],
|
|
212
|
+
field_messages: {},
|
|
201
213
|
},
|
|
202
214
|
result
|
|
203
215
|
);
|
|
@@ -209,8 +221,8 @@ export abstract class Form<
|
|
|
209
221
|
hasFieldOfType(e, "message", predicates.string)
|
|
210
222
|
? e?.message
|
|
211
223
|
: is(e, predicates.string)
|
|
212
|
-
|
|
213
|
-
|
|
224
|
+
? e
|
|
225
|
+
: "Wystąpił błąd";
|
|
214
226
|
|
|
215
227
|
return this.onError(
|
|
216
228
|
ctx,
|
|
@@ -222,6 +234,7 @@ export abstract class Form<
|
|
|
222
234
|
text: message,
|
|
223
235
|
},
|
|
224
236
|
],
|
|
237
|
+
field_messages: {},
|
|
225
238
|
},
|
|
226
239
|
e
|
|
227
240
|
);
|
|
@@ -257,12 +270,12 @@ export abstract class Form<
|
|
|
257
270
|
{
|
|
258
271
|
raw_values: await this.extractRawValues(ctx),
|
|
259
272
|
messages: [],
|
|
273
|
+
field_messages: {},
|
|
260
274
|
},
|
|
261
|
-
|
|
275
|
+
false
|
|
262
276
|
);
|
|
263
277
|
});
|
|
264
278
|
router.post(path, async (ctx) => {
|
|
265
|
-
console.log("REGULAR FORM HANDLE");
|
|
266
279
|
const reaction =
|
|
267
280
|
(ctx.override_reaction as FormReaction | undefined) ||
|
|
268
281
|
(await this.handlePost(ctx));
|
|
@@ -283,4 +296,10 @@ export abstract class Form<
|
|
|
283
296
|
? ctx.$body
|
|
284
297
|
: this.getInitialValues(ctx);
|
|
285
298
|
}
|
|
299
|
+
|
|
300
|
+
static initFieldNames(fields: Record<string, FormField>): void {
|
|
301
|
+
for (const [field_name, field] of Object.entries(fields)) {
|
|
302
|
+
field.setName(field_name);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
286
305
|
}
|
package/src/forms/forms.css
CHANGED
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
.form-message {
|
|
2
|
-
--color: black;
|
|
3
|
-
border: 1px solid var(--color);
|
|
4
|
-
border-radius: 5px;
|
|
5
|
-
padding: 10px;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
.form-message--error {
|
|
9
|
-
--color: #ff4136;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
.form-message--success {
|
|
13
|
-
--color: #2ecc40;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
.form__error {
|
|
17
|
-
color: #ff4136;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
.form-input__wrapper--checkbox {
|
|
21
|
-
display: flex;
|
|
22
|
-
flex-flow: row nowrap;
|
|
23
|
-
align-items: center;
|
|
24
|
-
& > input[type="checkbox"] {
|
|
25
|
-
width: 15px;
|
|
26
|
-
height: 15px;
|
|
27
|
-
|
|
28
|
-
+ label {
|
|
29
|
-
padding-left: 10px;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
.form-input__wrapper--multiple-files--photos {
|
|
35
|
-
ul {
|
|
36
|
-
list-style: none;
|
|
37
|
-
display: grid;
|
|
38
|
-
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
|
|
39
|
-
grid-gap: 10px;
|
|
40
|
-
margin-bottom: 20px;
|
|
41
|
-
|
|
42
|
-
li {
|
|
43
|
-
background-color: white;
|
|
44
|
-
box-shadow: 1px 1px 6px 0px #00000038;
|
|
45
|
-
padding: 10px;
|
|
46
|
-
display: grid;
|
|
47
|
-
grid-template-columns: 1fr 20px;
|
|
48
|
-
grid-template-rows: 20px auto min-content;
|
|
49
|
-
grid-row-gap: 10px;
|
|
50
|
-
|
|
51
|
-
a {
|
|
52
|
-
grid-row: 1/3;
|
|
53
|
-
grid-column: 1/3;
|
|
54
|
-
|
|
55
|
-
picture,
|
|
56
|
-
img {
|
|
57
|
-
width: 100%;
|
|
58
|
-
height: 150px;
|
|
59
|
-
object-fit: contain;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
.filename {
|
|
64
|
-
grid-row: 3/4;
|
|
65
|
-
grid-column: 1/3;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
form {
|
|
69
|
-
grid-row: 1/2;
|
|
70
|
-
grid-column: 2/3;
|
|
71
|
-
position: relative;
|
|
72
|
-
z-index: 2;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
.file-list-item {
|
|
79
|
-
display: flex;
|
|
80
|
-
flex-flow: row;
|
|
81
|
-
|
|
82
|
-
form {
|
|
83
|
-
padding-left: 20px;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
@@ -9,7 +9,7 @@ import { Multiform } from "./multiform.js";
|
|
|
9
9
|
import { assertThrowsAsync } from "../utils/utils.js";
|
|
10
10
|
import { form_factory } from "./form.test.js";
|
|
11
11
|
import { getBrowser } from "../utils/browser-creator.js";
|
|
12
|
-
import {
|
|
12
|
+
import { TextBasedSimpleField } from "./fields/simple-form-field.js";
|
|
13
13
|
import { Form } from "./form.js";
|
|
14
14
|
import { FormHeader } from "./controls/form-header.js";
|
|
15
15
|
import { SimpleInput } from "./controls/simple-input.js";
|
|
@@ -19,10 +19,10 @@ import { EmailField } from "./fields/email.js";
|
|
|
19
19
|
import getPort from "get-port";
|
|
20
20
|
|
|
21
21
|
const port = await getPort();
|
|
22
|
-
console.
|
|
22
|
+
console.info(`Using port ${port} form multiform.test.ts`);
|
|
23
23
|
|
|
24
24
|
const fields1 = {
|
|
25
|
-
email: new
|
|
25
|
+
email: new TextBasedSimpleField(true),
|
|
26
26
|
};
|
|
27
27
|
|
|
28
28
|
const form1 = new (class extends Form<typeof fields1, void> {
|
|
@@ -35,7 +35,7 @@ const form1 = new (class extends Form<typeof fields1, void> {
|
|
|
35
35
|
})();
|
|
36
36
|
|
|
37
37
|
const fields2 = {
|
|
38
|
-
name: new
|
|
38
|
+
name: new TextBasedSimpleField(true),
|
|
39
39
|
};
|
|
40
40
|
|
|
41
41
|
const form2 = new (class extends Form<Record<never, unknown>, void> {
|
|
@@ -58,7 +58,7 @@ function multiform_factory(
|
|
|
58
58
|
form2: form_factory(canAccessFun2),
|
|
59
59
|
};
|
|
60
60
|
async render(...args: Parameters<Multiform["render"]>): Promise<FlatTemplatable> {
|
|
61
|
-
return tempstream/* HTML */ `<!DOCTYPE html>
|
|
61
|
+
return tempstream /* HTML */ `<!DOCTYPE html>
|
|
62
62
|
<html>
|
|
63
63
|
<head>
|
|
64
64
|
<title>Multiform Test - Sealgen</title>
|
|
@@ -147,7 +147,7 @@ async function individual_field_validation_e2e_tests(javaScriptEnabled: boolean)
|
|
|
147
147
|
await page.getByPlaceholder("text").click();
|
|
148
148
|
await page.getByPlaceholder("text").fill("yes@an.email");
|
|
149
149
|
await page.locator("#multiform_test_form1_submit").click();
|
|
150
|
-
assertThrowsAsync(async () => {
|
|
150
|
+
await assertThrowsAsync(async () => {
|
|
151
151
|
return page.getByText("Please enter a proper email address").click({ timeout: 500 });
|
|
152
152
|
});
|
|
153
153
|
});
|
|
@@ -173,7 +173,7 @@ describe("multiform test", () => {
|
|
|
173
173
|
prerenderedForms?: Record<string, FlatTemplatable | undefined>,
|
|
174
174
|
show_field_errors = true
|
|
175
175
|
): Promise<FlatTemplatable> {
|
|
176
|
-
return tempstream/* HTML */ `<!DOCTYPE html>
|
|
176
|
+
return tempstream /* HTML */ `<!DOCTYPE html>
|
|
177
177
|
<html>
|
|
178
178
|
<head>
|
|
179
179
|
<title>Multiform Test - Sealgen</title>
|
|
@@ -455,7 +455,7 @@ describe("multiform test", () => {
|
|
|
455
455
|
async render(
|
|
456
456
|
...args: Parameters<Multiform["render"]>
|
|
457
457
|
): Promise<FlatTemplatable> {
|
|
458
|
-
return tempstream/* HTML */ `<!DOCTYPE html>
|
|
458
|
+
return tempstream /* HTML */ `<!DOCTYPE html>
|
|
459
459
|
<html>
|
|
460
460
|
<head>
|
|
461
461
|
<title>Multiform Test - Sealgen</title>
|
|
@@ -518,7 +518,7 @@ describe("multiform test", () => {
|
|
|
518
518
|
async render(
|
|
519
519
|
...args: Parameters<Multiform["render"]>
|
|
520
520
|
): Promise<FlatTemplatable> {
|
|
521
|
-
return tempstream/* HTML */ `<!DOCTYPE html>
|
|
521
|
+
return tempstream /* HTML */ `<!DOCTYPE html>
|
|
522
522
|
<html>
|
|
523
523
|
<head>
|
|
524
524
|
<title>Multiform Test - Sealgen</title>
|
package/src/forms/multiform.ts
CHANGED
|
@@ -35,13 +35,14 @@ export class Multiform extends MountableWithFields {
|
|
|
35
35
|
this.getSubformRawValues(context, key);
|
|
36
36
|
const submit_button_id = this.name + "_" + key + "_submit";
|
|
37
37
|
|
|
38
|
-
form.makeSubmitButton = () =>
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
38
|
+
form.makeSubmitButton = () =>
|
|
39
|
+
/* HTML */ `<input
|
|
40
|
+
type="submit"
|
|
41
|
+
value="${form.submitButtonText}"
|
|
42
|
+
formaction="${form.action}"
|
|
43
|
+
id="${submit_button_id}"
|
|
44
|
+
${form.form_id ? `form="${form.form_id}"` : ""}
|
|
45
|
+
/> `;
|
|
45
46
|
}
|
|
46
47
|
for (const form of Object.values(this.forms)) {
|
|
47
48
|
for (const field of Object.values(form.fields)) {
|
|
@@ -68,7 +69,6 @@ export class Multiform extends MountableWithFields {
|
|
|
68
69
|
};
|
|
69
70
|
}
|
|
70
71
|
|
|
71
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
72
72
|
getSubformsToRender(
|
|
73
73
|
ctx: Context
|
|
74
74
|
): Array<readonly [string, Form<any, unknown>]> {
|
|
@@ -103,6 +103,7 @@ export class Multiform extends MountableWithFields {
|
|
|
103
103
|
{
|
|
104
104
|
raw_values: await this.getSubformRawValues(ctx, sub_form_name),
|
|
105
105
|
messages: [],
|
|
106
|
+
field_messages: {},
|
|
106
107
|
},
|
|
107
108
|
show_field_errors
|
|
108
109
|
);
|
|
@@ -131,9 +132,10 @@ export class Multiform extends MountableWithFields {
|
|
|
131
132
|
prerenderedForms: Record<string, FlatTemplatable | undefined> = {},
|
|
132
133
|
show_field_errors: boolean
|
|
133
134
|
): Promise<FlatTemplatable> {
|
|
134
|
-
return tempstream/* HTML */ `${this.renderMessages(ctx, {
|
|
135
|
+
return tempstream /* HTML */ `${this.renderMessages(ctx, {
|
|
135
136
|
raw_values: {},
|
|
136
137
|
messages,
|
|
138
|
+
field_messages: {},
|
|
137
139
|
})}
|
|
138
140
|
<div class="forms">
|
|
139
141
|
<form
|
|
@@ -147,7 +149,7 @@ export class Multiform extends MountableWithFields {
|
|
|
147
149
|
${this.getSubformsToRender(ctx).map(([form_name]) => {
|
|
148
150
|
const frame_form_id =
|
|
149
151
|
this.name + "_" + form_name + "_frame_form";
|
|
150
|
-
return tempstream/* HTML */ `<turbo-frame
|
|
152
|
+
return tempstream /* HTML */ `<turbo-frame
|
|
151
153
|
id="${form_name}"
|
|
152
154
|
contains-subform
|
|
153
155
|
subform-id="${frame_form_id}"
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import _locreq from "locreq";
|
|
2
|
-
import * as prettier from "prettier";
|
|
3
2
|
import { promises as fs } from "fs";
|
|
4
3
|
import { assertType, predicates } from "@sealcode/ts-predicates";
|
|
5
|
-
import {
|
|
4
|
+
import { formatWithPrettier } from "./utils/prettier.js";
|
|
6
5
|
|
|
7
6
|
const target_locreq = _locreq(process.cwd());
|
|
8
7
|
|
|
@@ -69,7 +68,7 @@ ${file_data
|
|
|
69
68
|
};`;
|
|
70
69
|
await fs.writeFile(
|
|
71
70
|
target_locreq.resolve("src/back/collections/collections.ts"),
|
|
72
|
-
|
|
71
|
+
await formatWithPrettier(content)
|
|
73
72
|
);
|
|
74
73
|
// eslint-disable-next-line no-console
|
|
75
74
|
console.log(
|
|
@@ -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 from "path";
|
|
7
6
|
import { toKebabCase, toPascalCase } from "js-convert-case";
|
|
@@ -40,7 +39,7 @@ ${component_data
|
|
|
40
39
|
const target = "src/back/jdd-components/components.ts";
|
|
41
40
|
await fs.writeFile(
|
|
42
41
|
target_locreq.resolve(target),
|
|
43
|
-
|
|
42
|
+
await formatWithPrettier(content)
|
|
44
43
|
);
|
|
45
44
|
// eslint-disable-next-line no-console
|
|
46
45
|
console.log(`Successfuly generated new ${target} file`);
|
|
@@ -1,20 +1,15 @@
|
|
|
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
|
|
|
6
5
|
describe("generate routes", () => {
|
|
7
6
|
it("handles a url with params", async () => {
|
|
8
7
|
assert.strictEqual(
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
await getPrettierConfig()
|
|
12
|
-
),
|
|
13
|
-
prettier.format(
|
|
8
|
+
await formatWithPrettier(generateURL("EditUser", "/admin/users/:id/edit/")),
|
|
9
|
+
await formatWithPrettier(
|
|
14
10
|
`export const EditUserURL = (id: string) => \`/admin/users/\${id}/edit/\`;
|
|
15
11
|
EditUserURL.params = ["id"];
|
|
16
|
-
EditUserURL.rawURL = "/admin/users/:id/edit/"
|
|
17
|
-
await getPrettierConfig()
|
|
12
|
+
EditUserURL.rawURL = "/admin/users/:id/edit/";`
|
|
18
13
|
)
|
|
19
14
|
);
|
|
20
15
|
});
|
|
@@ -28,15 +23,11 @@ EditUserURL.rawURL = "/admin/users/:id/edit/";`,
|
|
|
28
23
|
|
|
29
24
|
it("handles a url with params and diacritics", async () => {
|
|
30
25
|
assert.strictEqual(
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
await getPrettierConfig()
|
|
34
|
-
),
|
|
35
|
-
prettier.format(
|
|
26
|
+
await formatWithPrettier(generateURL("EditUser", "/admin/użytkownicy/:id/edit/")),
|
|
27
|
+
await formatWithPrettier(
|
|
36
28
|
`export const EditUserURL = (id: string) => \`/admin/u%C5%BCytkownicy/\${id}/edit/\`;
|
|
37
29
|
EditUserURL.params = ["id"];
|
|
38
|
-
EditUserURL.rawURL = "/admin/u%C5%BCytkownicy/:id/edit/"
|
|
39
|
-
await getPrettierConfig()
|
|
30
|
+
EditUserURL.rawURL = "/admin/u%C5%BCytkownicy/:id/edit/";`
|
|
40
31
|
)
|
|
41
32
|
);
|
|
42
33
|
});
|
package/src/generate-routes.ts
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
|
|
|
12
11
|
const target_locreq = _locreq(process.cwd());
|
|
@@ -42,8 +41,8 @@ export function generateURL(actionName: string, url: string) {
|
|
|
42
41
|
)
|
|
43
42
|
.join("/")}\`;
|
|
44
43
|
${actionName}URL.params = [${params
|
|
45
|
-
|
|
46
|
-
|
|
44
|
+
.map((param) => `"${param}"`)
|
|
45
|
+
.join(",")}];
|
|
47
46
|
${actionName}URL.rawURL = "${encodeURI(url)}";`;
|
|
48
47
|
}
|
|
49
48
|
|
|
@@ -70,9 +69,7 @@ export function sortRoutes<T extends { url: string }>(urls: T[]): T[] {
|
|
|
70
69
|
|
|
71
70
|
export async function generateRoutes(): Promise<void> {
|
|
72
71
|
const files = await Promise.all(
|
|
73
|
-
(
|
|
74
|
-
await walkDir(target_locreq.resolve("src/back/routes"))
|
|
75
|
-
)
|
|
72
|
+
(await walkDir(target_locreq.resolve("src/back/routes")))
|
|
76
73
|
.filter((f) =>
|
|
77
74
|
Object.keys(Templates).some(
|
|
78
75
|
(key) =>
|
|
@@ -129,15 +126,14 @@ ${sortRoutes(files)
|
|
|
129
126
|
.join("\n")}
|
|
130
127
|
`;
|
|
131
128
|
|
|
132
|
-
const prettier_config = await getPrettierConfig();
|
|
133
129
|
await fs.writeFile(
|
|
134
130
|
target_locreq.resolve("src/back/routes/routes.ts"),
|
|
135
|
-
|
|
131
|
+
await formatWithPrettier(routes_content)
|
|
136
132
|
);
|
|
137
133
|
|
|
138
134
|
await fs.writeFile(
|
|
139
135
|
target_locreq.resolve("src/back/routes/urls.ts"),
|
|
140
|
-
|
|
136
|
+
await formatWithPrettier(urls_content)
|
|
141
137
|
);
|
|
142
138
|
// eslint-disable-next-line no-console
|
|
143
139
|
console.log(
|
package/src/generate-stimulus.ts
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";
|
|
@@ -16,6 +15,7 @@ export async function generateStimulusControllers(
|
|
|
16
15
|
target_locreq.resolve("src/"),
|
|
17
16
|
...controller_dirs,
|
|
18
17
|
];
|
|
18
|
+
console.info("Looking for controllers in ", stimulus_search_dirs);
|
|
19
19
|
const controller_names = (
|
|
20
20
|
await Promise.all(stimulus_search_dirs.map((dir) => recursive(dir)))
|
|
21
21
|
)
|
|
@@ -53,8 +53,7 @@ export { Turbo };
|
|
|
53
53
|
|
|
54
54
|
await fs.writeFile(
|
|
55
55
|
target_locreq.resolve(output_file),
|
|
56
|
-
|
|
56
|
+
await formatWithPrettier(content)
|
|
57
57
|
);
|
|
58
|
-
|
|
59
|
-
console.log(`Successfuly generated new ${output_file} file`);
|
|
58
|
+
console.info(`Successfuly generated new ${output_file} file`);
|
|
60
59
|
}
|
package/src/get-fonts.ts
CHANGED
|
@@ -34,12 +34,12 @@ export async function getFonts(_: Record<string, string | boolean> = {}) {
|
|
|
34
34
|
});
|
|
35
35
|
await downloader.execute();
|
|
36
36
|
|
|
37
|
-
console.
|
|
37
|
+
console.info("Downloaded new fonts pack from google fonts");
|
|
38
38
|
|
|
39
39
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment
|
|
40
40
|
const squirrel_fonts = fonts_config.fontSquirrel;
|
|
41
41
|
if (
|
|
42
|
-
|
|
42
|
+
is(
|
|
43
43
|
squirrel_fonts,
|
|
44
44
|
predicates.record(
|
|
45
45
|
predicates.string,
|
|
@@ -47,39 +47,41 @@ export async function getFonts(_: Record<string, string | boolean> = {}) {
|
|
|
47
47
|
)
|
|
48
48
|
)
|
|
49
49
|
) {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
await mkdir(target_locreq.resolve("public/dist/fontsquirrel/"), {
|
|
54
|
-
recursive: true,
|
|
55
|
-
});
|
|
50
|
+
await mkdir(target_locreq.resolve("public/dist/fontsquirrel/"), {
|
|
51
|
+
recursive: true,
|
|
52
|
+
});
|
|
56
53
|
|
|
57
|
-
|
|
54
|
+
const config_file = `{
|
|
58
55
|
"tmpDir": "/tmp/fonts",
|
|
59
56
|
"fontsDir": "/dist/fontsquirrel/fonts",
|
|
60
57
|
"cssDir": "/dist/fontsquirrel/css",
|
|
61
58
|
"cssFile": "fonts.css"
|
|
62
59
|
}`;
|
|
63
|
-
|
|
60
|
+
await writeFile("public/fonsta.config.json", config_file);
|
|
61
|
+
|
|
62
|
+
await Promise.all(
|
|
63
|
+
Object.keys(squirrel_fonts).map((font) => {
|
|
64
|
+
if (squirrel_fonts[font].length) {
|
|
65
|
+
return execPromise(
|
|
66
|
+
`node ${path_to_fonsta} install ${font}:${squirrel_fonts[
|
|
67
|
+
font
|
|
68
|
+
].join(",")}`,
|
|
69
|
+
{
|
|
70
|
+
cwd: target_locreq.resolve("public"),
|
|
71
|
+
}
|
|
72
|
+
);
|
|
73
|
+
} else {
|
|
74
|
+
return execPromise(
|
|
75
|
+
`node ${path_to_fonsta} install ${font}`,
|
|
76
|
+
{
|
|
77
|
+
cwd: target_locreq.resolve("public"),
|
|
78
|
+
}
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
})
|
|
82
|
+
);
|
|
83
|
+
}
|
|
64
84
|
|
|
65
|
-
await Promise.all(
|
|
66
|
-
Object.keys(squirrel_fonts).map((font) => {
|
|
67
|
-
if (squirrel_fonts[font].length) {
|
|
68
|
-
return execPromise(
|
|
69
|
-
`node ${path_to_fonsta} install ${font}:${squirrel_fonts[
|
|
70
|
-
font
|
|
71
|
-
].join(",")}`,
|
|
72
|
-
{
|
|
73
|
-
cwd: target_locreq.resolve("public"),
|
|
74
|
-
}
|
|
75
|
-
);
|
|
76
|
-
} else {
|
|
77
|
-
return execPromise(`node ${path_to_fonsta} install ${font}`, {
|
|
78
|
-
cwd: target_locreq.resolve("public"),
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
})
|
|
82
|
-
);
|
|
83
85
|
const fonts_css_file_path = resolve(
|
|
84
86
|
target_locreq.resolve("public/dist/fonts"),
|
|
85
87
|
"fonts.css"
|
|
@@ -93,7 +95,7 @@ export async function getFonts(_: Record<string, string | boolean> = {}) {
|
|
|
93
95
|
|
|
94
96
|
await unlink("public/fonsta.config.json");
|
|
95
97
|
await rmdir("public/tmp");
|
|
96
|
-
console.
|
|
98
|
+
console.info("Downloaded new fonts pack from Font Squirrel");
|
|
97
99
|
|
|
98
|
-
console.
|
|
100
|
+
console.info("Downloaded new fonts pack");
|
|
99
101
|
}
|