sonamu 0.4.14 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.swcrc +15 -0
- package/dist/api/base-frame.d.ts +8 -0
- package/dist/api/base-frame.d.ts.map +1 -0
- package/dist/api/base-frame.js +2 -0
- package/dist/api/base-frame.js.map +1 -0
- package/dist/api/caster.d.ts +5 -0
- package/dist/api/caster.d.ts.map +1 -0
- package/dist/api/caster.js +2 -0
- package/dist/api/caster.js.map +1 -0
- package/dist/api/code-converters.d.ts +23 -0
- package/dist/api/code-converters.d.ts.map +1 -0
- package/dist/api/code-converters.js +2 -0
- package/dist/api/code-converters.js.map +1 -0
- package/dist/api/context.d.ts +19 -0
- package/dist/api/context.d.ts.map +1 -0
- package/dist/api/context.js +2 -0
- package/dist/api/context.js.map +1 -0
- package/dist/api/decorators.d.ts +50 -0
- package/dist/api/decorators.d.ts.map +1 -0
- package/dist/api/decorators.js +2 -0
- package/dist/api/decorators.js.map +1 -0
- package/dist/api/index.d.ts +8 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +2 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/sonamu.d.ts +84 -0
- package/dist/api/sonamu.d.ts.map +1 -0
- package/dist/api/sonamu.js +2 -0
- package/dist/api/sonamu.js.map +1 -0
- package/dist/bin/build-config.d.ts +9 -0
- package/dist/bin/build-config.d.ts.map +1 -0
- package/dist/bin/build-config.js +2 -0
- package/dist/bin/build-config.js.map +1 -0
- package/dist/bin/cli-wrapper.d.ts +2 -0
- package/dist/bin/cli-wrapper.d.ts.map +1 -0
- package/dist/bin/cli-wrapper.js +1 -38
- package/dist/bin/cli-wrapper.js.map +1 -1
- package/dist/bin/cli.d.ts +2 -2
- package/dist/bin/cli.d.ts.map +1 -0
- package/dist/bin/cli.js +1 -903
- package/dist/bin/cli.js.map +1 -1
- package/dist/database/_batch_update.d.ts +15 -0
- package/dist/database/_batch_update.d.ts.map +1 -0
- package/dist/database/_batch_update.js +2 -0
- package/dist/database/_batch_update.js.map +1 -0
- package/dist/database/base-model.d.ts +48 -0
- package/dist/database/base-model.d.ts.map +1 -0
- package/dist/database/base-model.js +2 -0
- package/dist/database/base-model.js.map +1 -0
- package/dist/database/code-generator.d.ts +13 -0
- package/dist/database/code-generator.d.ts.map +1 -0
- package/dist/database/code-generator.js +2 -0
- package/dist/database/code-generator.js.map +1 -0
- package/dist/database/db.d.ts +40 -0
- package/dist/database/db.d.ts.map +1 -0
- package/dist/database/db.js +2 -0
- package/dist/database/db.js.map +1 -0
- package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts +2 -0
- package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts.map +1 -0
- package/dist/database/knex-plugins/knex-on-duplicate-update.js +2 -0
- package/dist/database/knex-plugins/knex-on-duplicate-update.js.map +1 -0
- package/dist/database/puri-wrapper.d.ts +34 -0
- package/dist/database/puri-wrapper.d.ts.map +1 -0
- package/dist/database/puri-wrapper.js +2 -0
- package/dist/database/puri-wrapper.js.map +1 -0
- package/dist/database/puri.d.ts +83 -0
- package/dist/database/puri.d.ts.map +1 -0
- package/dist/database/puri.js +2 -0
- package/dist/database/puri.js.map +1 -0
- package/dist/database/puri.types.d.ts +60 -0
- package/dist/database/puri.types.d.ts.map +1 -0
- package/dist/database/puri.types.js +2 -0
- package/dist/database/puri.types.js.map +1 -0
- package/dist/database/transaction-context.d.ts +9 -0
- package/dist/database/transaction-context.d.ts.map +1 -0
- package/dist/database/transaction-context.js +2 -0
- package/dist/database/transaction-context.js.map +1 -0
- package/dist/database/upsert-builder.d.ts +34 -0
- package/dist/database/upsert-builder.d.ts.map +1 -0
- package/dist/database/upsert-builder.js +2 -0
- package/dist/database/upsert-builder.js.map +1 -0
- package/dist/entity/entity-manager.d.ts +32 -0
- package/dist/entity/entity-manager.d.ts.map +1 -0
- package/dist/entity/entity-manager.js +2 -0
- package/dist/entity/entity-manager.js.map +1 -0
- package/dist/entity/entity-utils.d.ts +61 -0
- package/dist/entity/entity-utils.d.ts.map +1 -0
- package/dist/entity/entity-utils.js +2 -0
- package/dist/entity/entity-utils.js.map +1 -0
- package/dist/entity/entity.d.ts +62 -0
- package/dist/entity/entity.d.ts.map +1 -0
- package/dist/entity/entity.js +2 -0
- package/dist/entity/entity.js.map +1 -0
- package/dist/entity/migrator.d.ts +135 -0
- package/dist/entity/migrator.d.ts.map +1 -0
- package/dist/entity/migrator.js +2 -0
- package/dist/entity/migrator.js.map +1 -0
- package/dist/exceptions/error-handler.d.ts +3 -0
- package/dist/exceptions/error-handler.d.ts.map +1 -0
- package/dist/exceptions/error-handler.js +2 -0
- package/dist/exceptions/error-handler.js.map +1 -0
- package/dist/exceptions/so-exceptions.d.ts +48 -0
- package/dist/exceptions/so-exceptions.d.ts.map +1 -0
- package/dist/exceptions/so-exceptions.js +2 -0
- package/dist/exceptions/so-exceptions.js.map +1 -0
- package/dist/file-storage/driver.d.ts +48 -0
- package/dist/file-storage/driver.d.ts.map +1 -0
- package/dist/file-storage/driver.js +2 -0
- package/dist/file-storage/driver.js.map +1 -0
- package/dist/file-storage/file-storage.d.ts +50 -0
- package/dist/file-storage/file-storage.d.ts.map +1 -0
- package/dist/file-storage/file-storage.js +2 -0
- package/dist/file-storage/file-storage.js.map +1 -0
- package/dist/index.d.ts +23 -813
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -433
- package/dist/index.js.map +1 -1
- package/dist/migration/code-generation.d.ts +15 -0
- package/dist/migration/code-generation.d.ts.map +1 -0
- package/dist/migration/code-generation.js +2 -0
- package/dist/migration/code-generation.js.map +1 -0
- package/dist/migration/migration-set.d.ts +17 -0
- package/dist/migration/migration-set.d.ts.map +1 -0
- package/dist/migration/migration-set.js +2 -0
- package/dist/migration/migration-set.js.map +1 -0
- package/dist/migration/migrator.d.ts +130 -0
- package/dist/migration/migrator.d.ts.map +1 -0
- package/dist/migration/migrator.js +2 -0
- package/dist/migration/migrator.js.map +1 -0
- package/dist/migration/types.d.ts +52 -0
- package/dist/migration/types.d.ts.map +1 -0
- package/dist/migration/types.js +2 -0
- package/dist/migration/types.js.map +1 -0
- package/dist/stream/index.d.ts +2 -0
- package/dist/stream/index.d.ts.map +1 -0
- package/dist/stream/index.js +2 -0
- package/dist/stream/index.js.map +1 -0
- package/dist/stream/sse.d.ts +13 -0
- package/dist/stream/sse.d.ts.map +1 -0
- package/dist/stream/sse.js +2 -0
- package/dist/stream/sse.js.map +1 -0
- package/dist/syncer/index.d.ts +2 -0
- package/dist/syncer/index.d.ts.map +1 -0
- package/dist/syncer/index.js +2 -0
- package/dist/syncer/index.js.map +1 -0
- package/dist/syncer/syncer.d.ts +127 -0
- package/dist/syncer/syncer.d.ts.map +1 -0
- package/dist/syncer/syncer.js +2 -0
- package/dist/syncer/syncer.js.map +1 -0
- package/dist/templates/base-template.d.ts +13 -0
- package/dist/templates/base-template.d.ts.map +1 -0
- package/dist/templates/base-template.js +2 -0
- package/dist/templates/base-template.js.map +1 -0
- package/dist/templates/entity.template.d.ts +17 -0
- package/dist/templates/entity.template.d.ts.map +1 -0
- package/dist/templates/entity.template.js +2 -0
- package/dist/templates/entity.template.js.map +1 -0
- package/dist/templates/generated.template.d.ts +27 -0
- package/dist/templates/generated.template.d.ts.map +1 -0
- package/dist/templates/generated.template.js +2 -0
- package/dist/templates/generated.template.js.map +1 -0
- package/dist/templates/generated_http.template.d.ts +24 -0
- package/dist/templates/generated_http.template.d.ts.map +1 -0
- package/dist/templates/generated_http.template.js +2 -0
- package/dist/templates/generated_http.template.js.map +1 -0
- package/dist/templates/generated_sso.template.d.ts +20 -0
- package/dist/templates/generated_sso.template.d.ts.map +1 -0
- package/dist/templates/generated_sso.template.js +2 -0
- package/dist/templates/generated_sso.template.js.map +1 -0
- package/dist/templates/index.d.ts +2 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +2 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/templates/init_types.template.d.ts +17 -0
- package/dist/templates/init_types.template.d.ts.map +1 -0
- package/dist/templates/init_types.template.js +2 -0
- package/dist/templates/init_types.template.js.map +1 -0
- package/dist/templates/model.template.d.ts +17 -0
- package/dist/templates/model.template.d.ts.map +1 -0
- package/dist/templates/model.template.js +2 -0
- package/dist/templates/model.template.js.map +1 -0
- package/dist/templates/model_test.template.d.ts +17 -0
- package/dist/templates/model_test.template.d.ts.map +1 -0
- package/dist/templates/model_test.template.js +2 -0
- package/dist/templates/model_test.template.js.map +1 -0
- package/dist/templates/service.template.d.ts +29 -0
- package/dist/templates/service.template.d.ts.map +1 -0
- package/dist/templates/service.template.js +2 -0
- package/dist/templates/service.template.js.map +1 -0
- package/dist/templates/view_enums_buttonset.template.d.ts +17 -0
- package/dist/templates/view_enums_buttonset.template.d.ts.map +1 -0
- package/dist/templates/view_enums_buttonset.template.js +2 -0
- package/dist/templates/view_enums_buttonset.template.js.map +1 -0
- package/dist/templates/view_enums_dropdown.template.d.ts +18 -0
- package/dist/templates/view_enums_dropdown.template.d.ts.map +1 -0
- package/dist/templates/view_enums_dropdown.template.js +2 -0
- package/dist/templates/view_enums_dropdown.template.js.map +1 -0
- package/dist/templates/view_enums_select.template.d.ts +17 -0
- package/dist/templates/view_enums_select.template.d.ts.map +1 -0
- package/dist/templates/view_enums_select.template.js +2 -0
- package/dist/templates/view_enums_select.template.js.map +1 -0
- package/dist/templates/view_form.template.d.ts +26 -0
- package/dist/templates/view_form.template.d.ts.map +1 -0
- package/dist/templates/view_form.template.js +2 -0
- package/dist/templates/view_form.template.js.map +1 -0
- package/dist/templates/view_id_all_select.template.d.ts +17 -0
- package/dist/templates/view_id_all_select.template.d.ts.map +1 -0
- package/dist/templates/view_id_all_select.template.js +2 -0
- package/dist/templates/view_id_all_select.template.js.map +1 -0
- package/dist/templates/view_id_async_select.template.d.ts +17 -0
- package/dist/templates/view_id_async_select.template.d.ts.map +1 -0
- package/dist/templates/view_id_async_select.template.js +2 -0
- package/dist/templates/view_id_async_select.template.js.map +1 -0
- package/dist/templates/view_list.template.d.ts +38 -0
- package/dist/templates/view_list.template.d.ts.map +1 -0
- package/dist/templates/view_list.template.js +2 -0
- package/dist/templates/view_list.template.js.map +1 -0
- package/dist/templates/view_list_columns.template.d.ts +17 -0
- package/dist/templates/view_list_columns.template.d.ts.map +1 -0
- package/dist/templates/view_list_columns.template.js +2 -0
- package/dist/templates/view_list_columns.template.js.map +1 -0
- package/dist/templates/view_search_input.template.d.ts +17 -0
- package/dist/templates/view_search_input.template.d.ts.map +1 -0
- package/dist/templates/view_search_input.template.js +2 -0
- package/dist/templates/view_search_input.template.js.map +1 -0
- package/dist/testing/_relation-graph.d.ts +7 -0
- package/dist/testing/_relation-graph.d.ts.map +1 -0
- package/dist/testing/_relation-graph.js +2 -0
- package/dist/testing/_relation-graph.js.map +1 -0
- package/dist/testing/fixture-manager.d.ts +35 -0
- package/dist/testing/fixture-manager.d.ts.map +1 -0
- package/dist/testing/fixture-manager.js +2 -0
- package/dist/testing/fixture-manager.js.map +1 -0
- package/dist/types/types.d.ts +611 -0
- package/dist/types/types.d.ts.map +1 -0
- package/dist/types/types.js +2 -0
- package/dist/types/types.js.map +1 -0
- package/dist/typings/knex.d.js +2 -0
- package/dist/typings/knex.d.js.map +1 -0
- package/dist/utils/async-utils.d.ts +25 -0
- package/dist/utils/async-utils.d.ts.map +1 -0
- package/dist/utils/async-utils.js +2 -0
- package/dist/utils/async-utils.js.map +1 -0
- package/dist/utils/controller.d.ts +9 -0
- package/dist/utils/controller.d.ts.map +1 -0
- package/dist/utils/controller.js +2 -0
- package/dist/utils/controller.js.map +1 -0
- package/dist/utils/fs-utils.d.ts +9 -0
- package/dist/utils/fs-utils.d.ts.map +1 -0
- package/dist/utils/fs-utils.js +2 -0
- package/dist/utils/fs-utils.js.map +1 -0
- package/dist/utils/lodash-able.d.ts +2 -0
- package/dist/utils/lodash-able.d.ts.map +1 -0
- package/dist/utils/lodash-able.js +2 -0
- package/dist/utils/lodash-able.js.map +1 -0
- package/dist/utils/model.d.ts +17 -0
- package/dist/utils/model.d.ts.map +1 -0
- package/dist/utils/model.js +2 -0
- package/dist/utils/model.js.map +1 -0
- package/dist/utils/sql-parser.d.ts +4 -0
- package/dist/utils/sql-parser.d.ts.map +1 -0
- package/dist/utils/sql-parser.js +2 -0
- package/dist/utils/sql-parser.js.map +1 -0
- package/dist/utils/utils.d.ts +9 -0
- package/dist/utils/utils.d.ts.map +1 -0
- package/dist/utils/utils.js +2 -0
- package/dist/utils/utils.js.map +1 -0
- package/dist/utils/zod-error.d.ts +8 -0
- package/dist/utils/zod-error.d.ts.map +1 -0
- package/dist/utils/zod-error.js +2 -0
- package/dist/utils/zod-error.js.map +1 -0
- package/nodemon.json +6 -0
- package/package.json +32 -45
- package/src/api/base-frame.ts +3 -4
- package/src/api/caster.ts +22 -23
- package/src/api/code-converters.ts +170 -134
- package/src/api/context.ts +15 -3
- package/src/api/decorators.ts +144 -20
- package/src/api/index.ts +2 -0
- package/src/api/sonamu.ts +408 -165
- package/src/bin/build-config.ts +10 -0
- package/src/bin/cli-wrapper.ts +35 -32
- package/src/bin/cli.ts +141 -204
- package/src/database/_batch_update.ts +10 -15
- package/src/database/base-model.ts +326 -216
- package/src/database/db.ts +191 -21
- package/src/database/{drivers/knex/plugins → knex-plugins}/knex-on-duplicate-update.ts +1 -1
- package/src/database/puri-wrapper.ts +129 -0
- package/src/database/puri.ts +808 -0
- package/src/database/puri.types.ts +222 -0
- package/src/database/transaction-context.ts +18 -0
- package/src/database/upsert-builder.ts +32 -35
- package/src/entity/entity-manager.ts +7 -15
- package/src/entity/entity.ts +9 -31
- package/src/entity/migrator-/354/235/264/354/202/254/352/260/224/354/226/264/354/232/224.md +1 -0
- package/src/file-storage/driver.ts +131 -0
- package/src/file-storage/file-storage.ts +100 -0
- package/src/index.ts +15 -11
- package/src/migration/code-generation.ts +777 -0
- package/src/migration/migration-set.ts +453 -0
- package/src/migration/migrator.ts +823 -0
- package/src/migration/types.ts +53 -0
- package/src/shared/web.shared.ts.txt +33 -2
- package/src/stream/index.ts +1 -0
- package/src/stream/sse.ts +49 -0
- package/src/syncer/syncer.ts +294 -127
- package/src/templates/generated.template.ts +13 -1
- package/src/templates/generated_http.template.ts +15 -12
- package/src/templates/generated_sso.template.ts +50 -2
- package/src/templates/model.template.ts +138 -2
- package/src/templates/service.template.ts +0 -1
- package/src/templates/view_form.template.ts +11 -7
- package/src/templates/view_list.template.ts +12 -4
- package/src/testing/fixture-manager.ts +229 -174
- package/src/types/types.ts +108 -14
- package/src/utils/async-utils.ts +64 -0
- package/src/utils/fs-utils.ts +17 -0
- package/src/utils/model.ts +0 -2
- package/src/utils/utils.ts +14 -58
- package/src/utils/zod-error.ts +12 -176
- package/tsconfig.json +6 -0
- package/tsup.config.js +4 -2
- package/.pnp.cjs +0 -14363
- package/.pnp.loader.mjs +0 -2047
- package/.vscode/extensions.json +0 -6
- package/.vscode/settings.json +0 -9
- package/.yarnrc.yml +0 -5
- package/dist/base-model-CEB0H0aO.d.mts +0 -43
- package/dist/base-model-CrqDMYhI.d.ts +0 -43
- package/dist/bin/cli-wrapper.d.mts +0 -1
- package/dist/bin/cli-wrapper.mjs +0 -43
- package/dist/bin/cli-wrapper.mjs.map +0 -1
- package/dist/bin/cli.d.mts +0 -2
- package/dist/bin/cli.mjs +0 -907
- package/dist/bin/cli.mjs.map +0 -1
- package/dist/chunk-2WAC2GER.js +0 -7625
- package/dist/chunk-2WAC2GER.js.map +0 -1
- package/dist/chunk-C3IPIF6O.mjs +0 -1581
- package/dist/chunk-C3IPIF6O.mjs.map +0 -1
- package/dist/chunk-EXHKSVTE.js +0 -280
- package/dist/chunk-EXHKSVTE.js.map +0 -1
- package/dist/chunk-FCERKIIF.mjs +0 -7623
- package/dist/chunk-FCERKIIF.mjs.map +0 -1
- package/dist/chunk-HGIBJYOU.mjs +0 -231
- package/dist/chunk-HGIBJYOU.mjs.map +0 -1
- package/dist/chunk-JKSOJRQA.mjs +0 -280
- package/dist/chunk-JKSOJRQA.mjs.map +0 -1
- package/dist/chunk-OTKKFP3Y.js +0 -1581
- package/dist/chunk-OTKKFP3Y.js.map +0 -1
- package/dist/chunk-PTFDTOJU.mjs +0 -19
- package/dist/chunk-PTFDTOJU.mjs.map +0 -1
- package/dist/chunk-UZ2IY5VE.js +0 -231
- package/dist/chunk-UZ2IY5VE.js.map +0 -1
- package/dist/database/drivers/knex/base-model.d.mts +0 -16
- package/dist/database/drivers/knex/base-model.d.ts +0 -16
- package/dist/database/drivers/knex/base-model.js +0 -55
- package/dist/database/drivers/knex/base-model.js.map +0 -1
- package/dist/database/drivers/knex/base-model.mjs +0 -56
- package/dist/database/drivers/knex/base-model.mjs.map +0 -1
- package/dist/database/drivers/kysely/base-model.d.mts +0 -22
- package/dist/database/drivers/kysely/base-model.d.ts +0 -22
- package/dist/database/drivers/kysely/base-model.js +0 -64
- package/dist/database/drivers/kysely/base-model.js.map +0 -1
- package/dist/database/drivers/kysely/base-model.mjs +0 -65
- package/dist/database/drivers/kysely/base-model.mjs.map +0 -1
- package/dist/index.d.mts +0 -813
- package/dist/index.mjs +0 -435
- package/dist/index.mjs.map +0 -1
- package/dist/model-aFgomcdc.d.mts +0 -1112
- package/dist/model-aFgomcdc.d.ts +0 -1112
- package/src/database/base-model.abstract.ts +0 -97
- package/src/database/db.abstract.ts +0 -75
- package/src/database/drivers/knex/base-model.ts +0 -55
- package/src/database/drivers/knex/client.ts +0 -209
- package/src/database/drivers/knex/db.ts +0 -232
- package/src/database/drivers/knex/generator.ts +0 -659
- package/src/database/drivers/kysely/base-model.ts +0 -89
- package/src/database/drivers/kysely/client.ts +0 -309
- package/src/database/drivers/kysely/db.ts +0 -238
- package/src/database/drivers/kysely/generator.ts +0 -714
- package/src/database/types.ts +0 -118
- package/src/entity/migrator.ts +0 -1400
- package/src/smd/smd-manager.ts +0 -139
- package/src/smd/smd.ts +0 -571
- package/src/templates/kysely_types.template.ts +0 -205
|
@@ -171,9 +171,21 @@ export class Template__generated extends Template {
|
|
|
171
171
|
|
|
172
172
|
const schemaBody = propNodeToZodTypeDef(propNode, importKeys);
|
|
173
173
|
|
|
174
|
+
// fulltext index에 포함된 컬럼들 추출
|
|
175
|
+
const fulltextColumns = _.uniq(
|
|
176
|
+
entity.indexes
|
|
177
|
+
.filter((index) => index.type === "fulltext")
|
|
178
|
+
.flatMap((index) => index.columns)
|
|
179
|
+
);
|
|
180
|
+
|
|
174
181
|
const lines = [
|
|
175
182
|
`export const ${schemaName} = ${schemaBody}`,
|
|
176
|
-
`export type ${schemaName} = z.infer<typeof ${schemaName}
|
|
183
|
+
`export type ${schemaName} = z.infer<typeof ${schemaName}>` +
|
|
184
|
+
(fulltextColumns.length > 0
|
|
185
|
+
? ` & { readonly __fulltext__: readonly [${fulltextColumns
|
|
186
|
+
.map((col) => `"${col}"`)
|
|
187
|
+
.join(", ")}] }`
|
|
188
|
+
: ""),
|
|
177
189
|
];
|
|
178
190
|
|
|
179
191
|
return {
|
|
@@ -84,7 +84,7 @@ export class Template__generated_http extends Template {
|
|
|
84
84
|
])
|
|
85
85
|
);
|
|
86
86
|
} else if (zodType instanceof z.ZodArray) {
|
|
87
|
-
return [this.zodTypeToReqDefault(zodType.element, name)];
|
|
87
|
+
return [this.zodTypeToReqDefault((zodType as z.ZodArray<z.ZodType>).element, name)];
|
|
88
88
|
} else if (zodType instanceof z.ZodString) {
|
|
89
89
|
if (name.endsWith("_at") || name.endsWith("_date") || name === "range") {
|
|
90
90
|
return "2000-01-01";
|
|
@@ -95,40 +95,43 @@ export class Template__generated_http extends Template {
|
|
|
95
95
|
if (name === "num") {
|
|
96
96
|
return 24;
|
|
97
97
|
}
|
|
98
|
-
|
|
98
|
+
|
|
99
|
+
const minValue = zodType.minValue ?? 0;
|
|
100
|
+
return minValue > Number.MIN_SAFE_INTEGER ? minValue : 0;
|
|
99
101
|
} else if (zodType instanceof z.ZodBoolean) {
|
|
100
102
|
return false;
|
|
101
103
|
} else if (zodType instanceof z.ZodEnum) {
|
|
102
104
|
return zodType.options[0];
|
|
103
105
|
} else if (zodType instanceof z.ZodOptional) {
|
|
104
|
-
return this.zodTypeToReqDefault(zodType.
|
|
106
|
+
return this.zodTypeToReqDefault((zodType as z.ZodOptional<z.ZodType>).def.innerType, name);
|
|
105
107
|
} else if (zodType instanceof z.ZodNullable) {
|
|
106
108
|
return null;
|
|
107
109
|
} else if (zodType instanceof z.ZodUnion) {
|
|
108
|
-
return this.zodTypeToReqDefault(zodType.
|
|
110
|
+
return this.zodTypeToReqDefault((zodType as z.ZodUnion<z.ZodType[]>).def.options[0], name);
|
|
109
111
|
} else if (zodType instanceof z.ZodUnknown) {
|
|
110
112
|
return "unknown";
|
|
111
113
|
} else if (zodType instanceof z.ZodTuple) {
|
|
112
|
-
return zodType.
|
|
114
|
+
return zodType.def.items.map((item: any) =>
|
|
113
115
|
this.zodTypeToReqDefault(item, name)
|
|
114
116
|
);
|
|
115
117
|
} else if (zodType instanceof z.ZodDate) {
|
|
116
118
|
return "2000-01-01";
|
|
117
119
|
} else if (zodType instanceof z.ZodLiteral) {
|
|
118
120
|
return zodType.value;
|
|
119
|
-
} else if (zodType instanceof z.ZodEffects) {
|
|
120
|
-
return this.zodTypeToReqDefault(zodType._def.schema, name);
|
|
121
121
|
} else if (zodType instanceof z.ZodRecord || zodType instanceof z.ZodMap) {
|
|
122
|
-
const
|
|
123
|
-
const
|
|
122
|
+
const kvDef = (zodType as z.ZodRecord<any, z.ZodType> | z.ZodMap<z.ZodType, z.ZodType>).def
|
|
123
|
+
const key = this.zodTypeToReqDefault(kvDef.keyType, name) as any;
|
|
124
|
+
const value = this.zodTypeToReqDefault(kvDef.valueType, name);
|
|
124
125
|
return { [key]: value };
|
|
125
126
|
} else if (zodType instanceof z.ZodSet) {
|
|
126
|
-
return [this.zodTypeToReqDefault(zodType.
|
|
127
|
+
return [this.zodTypeToReqDefault((zodType as z.ZodSet<z.ZodType>).def.valueType, name)];
|
|
127
128
|
} else if (zodType instanceof z.ZodIntersection) {
|
|
128
|
-
return this.zodTypeToReqDefault(zodType.
|
|
129
|
+
return this.zodTypeToReqDefault((zodType as z.ZodIntersection<z.ZodType, z.ZodType>).def.right, name);
|
|
130
|
+
} else if (zodType instanceof z.ZodDefault) {
|
|
131
|
+
return this.zodTypeToReqDefault((zodType as z.ZodDefault<z.ZodType>).def.innerType, name);
|
|
129
132
|
} else {
|
|
130
133
|
// console.log(zodType);
|
|
131
|
-
return `unknown-${zodType.
|
|
134
|
+
return `unknown-${zodType.type}`;
|
|
132
135
|
}
|
|
133
136
|
}
|
|
134
137
|
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
isManyToManyRelationProp,
|
|
3
|
+
SubsetQuery,
|
|
4
|
+
TemplateOptions,
|
|
5
|
+
} from "../types/types";
|
|
2
6
|
import { EntityManager } from "../entity/entity-manager";
|
|
3
7
|
import { Template } from "./base-template";
|
|
4
8
|
import inflection from "inflection";
|
|
@@ -6,6 +10,7 @@ import { SourceCode } from "./generated.template";
|
|
|
6
10
|
import _ from "lodash";
|
|
7
11
|
import { nonNullable } from "../utils/utils";
|
|
8
12
|
import { Sonamu } from "../api";
|
|
13
|
+
import { Entity } from "../entity/entity";
|
|
9
14
|
|
|
10
15
|
export class Template__generated_sso extends Template {
|
|
11
16
|
constructor() {
|
|
@@ -62,6 +67,12 @@ export class Template__generated_sso extends Template {
|
|
|
62
67
|
})
|
|
63
68
|
.filter(nonNullable);
|
|
64
69
|
|
|
70
|
+
// DatabaseSchema 생성
|
|
71
|
+
const dbSchemaSourceCode = this.getDatabaseSchemaSourceCode(entities);
|
|
72
|
+
if (dbSchemaSourceCode) {
|
|
73
|
+
sourceCodes.push(dbSchemaSourceCode);
|
|
74
|
+
}
|
|
75
|
+
|
|
65
76
|
const sourceCode = sourceCodes.reduce(
|
|
66
77
|
(result, ts) => {
|
|
67
78
|
if (ts === null) {
|
|
@@ -82,7 +93,44 @@ export class Template__generated_sso extends Template {
|
|
|
82
93
|
...this.getTargetAndPath(),
|
|
83
94
|
body: sourceCode.lines.join("\n"),
|
|
84
95
|
importKeys: sourceCode.importKeys,
|
|
85
|
-
customHeaders: [
|
|
96
|
+
customHeaders: [
|
|
97
|
+
`import { SubsetQuery, ManyToManyBaseSchema } from "sonamu";`,
|
|
98
|
+
],
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
getDatabaseSchemaSourceCode(entities: Entity[]): SourceCode | null {
|
|
103
|
+
if (entities.length === 0) {
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const entitySchemaLines = entities.map(
|
|
108
|
+
(entity) => `${entity.table}: ${entity.id}BaseSchema;`
|
|
109
|
+
);
|
|
110
|
+
|
|
111
|
+
const joinTableSchemaLines = _.uniq(
|
|
112
|
+
entities.flatMap((entity) =>
|
|
113
|
+
entity.props.filter(isManyToManyRelationProp).map((prop) => {
|
|
114
|
+
const fromTableKey = inflection.singularize(entity.table);
|
|
115
|
+
const toTableKey = inflection.singularize(
|
|
116
|
+
EntityManager.get(prop.with).table
|
|
117
|
+
);
|
|
118
|
+
return `${prop.joinTable}: ManyToManyBaseSchema<"${fromTableKey}", "${toTableKey}">;`;
|
|
119
|
+
})
|
|
120
|
+
)
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
return {
|
|
124
|
+
label: `DatabaseSchema`,
|
|
125
|
+
lines: [
|
|
126
|
+
`declare module "sonamu" {`,
|
|
127
|
+
` export interface DatabaseSchemaExtend {`,
|
|
128
|
+
...entitySchemaLines,
|
|
129
|
+
...joinTableSchemaLines,
|
|
130
|
+
` }`,
|
|
131
|
+
`}`,
|
|
132
|
+
],
|
|
133
|
+
importKeys: entities.map((entity) => `${entity.id}BaseSchema`),
|
|
86
134
|
};
|
|
87
135
|
}
|
|
88
136
|
}
|
|
@@ -3,7 +3,6 @@ import { EntityManager, EntityNamesRecord } from "../entity/entity-manager";
|
|
|
3
3
|
import { Template } from "./base-template";
|
|
4
4
|
import { Template__view_list } from "./view_list.template";
|
|
5
5
|
import { Sonamu } from "../api";
|
|
6
|
-
import { DB } from "../database/db";
|
|
7
6
|
|
|
8
7
|
export class Template__model extends Template {
|
|
9
8
|
constructor() {
|
|
@@ -25,6 +24,7 @@ export class Template__model extends Template {
|
|
|
25
24
|
listParamsNode: RenderingNode
|
|
26
25
|
) {
|
|
27
26
|
const names = EntityManager.getNamesFromId(entityId);
|
|
27
|
+
const entity = EntityManager.get(entityId);
|
|
28
28
|
|
|
29
29
|
const vlTpl = new Template__view_list();
|
|
30
30
|
if (listParamsNode?.children === undefined) {
|
|
@@ -34,7 +34,143 @@ export class Template__model extends Template {
|
|
|
34
34
|
|
|
35
35
|
return {
|
|
36
36
|
...this.getTargetAndPath(names),
|
|
37
|
-
body:
|
|
37
|
+
body: `
|
|
38
|
+
import { BaseModelClass, ListResult, asArray, NotFoundException, BadRequestException, api } from 'sonamu';
|
|
39
|
+
import {
|
|
40
|
+
${entityId}SubsetKey,
|
|
41
|
+
${entityId}SubsetMapping,
|
|
42
|
+
} from "../sonamu.generated";
|
|
43
|
+
import {
|
|
44
|
+
${names.camel}SubsetQueries,
|
|
45
|
+
} from "../sonamu.generated.sso";
|
|
46
|
+
import { ${entityId}ListParams, ${entityId}SaveParams } from "./${names.fs}.types";
|
|
47
|
+
|
|
48
|
+
/*
|
|
49
|
+
${entityId} Model
|
|
50
|
+
*/
|
|
51
|
+
class ${entityId}ModelClass extends BaseModelClass {
|
|
52
|
+
modelName = "${entityId}";
|
|
53
|
+
|
|
54
|
+
@api({ httpMethod: "GET", clients: ["axios", "swr"], resourceName: "${entityId}" })
|
|
55
|
+
async findById<T extends ${entityId}SubsetKey>(
|
|
56
|
+
subset: T,
|
|
57
|
+
id: number
|
|
58
|
+
): Promise<${entityId}SubsetMapping[T]> {
|
|
59
|
+
const { rows } = await this.findMany(subset, {
|
|
60
|
+
id,
|
|
61
|
+
num: 1,
|
|
62
|
+
page: 1,
|
|
63
|
+
});
|
|
64
|
+
if (!rows[0]) {
|
|
65
|
+
throw new NotFoundException(\`존재하지 않는 ${names.capital} ID \${id}\`);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return rows[0];
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async findOne<T extends ${entityId}SubsetKey>(
|
|
72
|
+
subset: T,
|
|
73
|
+
listParams: ${entityId}ListParams
|
|
74
|
+
): Promise<${entityId}SubsetMapping[T] | null> {
|
|
75
|
+
const { rows } = await this.findMany(subset, {
|
|
76
|
+
...listParams,
|
|
77
|
+
num: 1,
|
|
78
|
+
page: 1,
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
return rows[0] ?? null;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
@api({ httpMethod: "GET", clients: ["axios", "swr"], resourceName: "${names.capitalPlural}" })
|
|
85
|
+
async findMany<T extends ${entityId}SubsetKey>(
|
|
86
|
+
subset: T,
|
|
87
|
+
params: ${entityId}ListParams = {}
|
|
88
|
+
): Promise<ListResult<${entityId}SubsetMapping[T]>> {
|
|
89
|
+
// params with defaults
|
|
90
|
+
params = {
|
|
91
|
+
num: 24,
|
|
92
|
+
page: 1,
|
|
93
|
+
search: "${def.search}",
|
|
94
|
+
orderBy: "${def.orderBy}",
|
|
95
|
+
...params,
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
// build queries
|
|
99
|
+
let { rows, total } = await this.runSubsetQuery({
|
|
100
|
+
subset,
|
|
101
|
+
params,
|
|
102
|
+
subsetQuery: ${names.camel}SubsetQueries[subset],
|
|
103
|
+
build: ({ qb }) => {
|
|
104
|
+
// id
|
|
105
|
+
if (params.id) {
|
|
106
|
+
qb.whereIn("${entity.table}.id", asArray(params.id));
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// search-keyword
|
|
110
|
+
if (params.search && params.keyword && params.keyword.length > 0) {
|
|
111
|
+
if (params.search === "id") {
|
|
112
|
+
qb.where("${entity.table}.id", params.keyword);
|
|
113
|
+
// } else if (params.search === "field") {
|
|
114
|
+
// qb.where("${entity.table}.field", "like", \`%\${params.keyword}%\`);
|
|
115
|
+
} else {
|
|
116
|
+
throw new BadRequestException(
|
|
117
|
+
\`구현되지 않은 검색 필드 \${params.search}\`
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// orderBy
|
|
123
|
+
if (params.orderBy) {
|
|
124
|
+
// default orderBy
|
|
125
|
+
const [orderByField, orderByDirec] = params.orderBy.split("-");
|
|
126
|
+
qb.orderBy("${entity.table}." + orderByField, orderByDirec);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return qb;
|
|
130
|
+
},
|
|
131
|
+
debug: false,
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
return {
|
|
135
|
+
rows,
|
|
136
|
+
total,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
@api({ httpMethod: "POST" })
|
|
141
|
+
async save(
|
|
142
|
+
spa: ${entityId}SaveParams[]
|
|
143
|
+
): Promise<number[]> {
|
|
144
|
+
const wdb = this.getPuri("w");
|
|
145
|
+
|
|
146
|
+
// register
|
|
147
|
+
spa.map((sp) => {
|
|
148
|
+
wdb.ubRegister("${entity.table}", sp);
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
// transaction
|
|
152
|
+
return wdb.transaction(async (trx) => {
|
|
153
|
+
const ids = await trx.ubUpsert("${entity.table}");
|
|
154
|
+
|
|
155
|
+
return ids;
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
@api({ httpMethod: "POST", guards: [ "admin" ] })
|
|
160
|
+
async del(ids: number[]): Promise<number> {
|
|
161
|
+
const wdb = this.getPuri("w");
|
|
162
|
+
|
|
163
|
+
// transaction
|
|
164
|
+
await wdb.transaction(async (trx) => {
|
|
165
|
+
return trx.table("${entity.table}").whereIn("${entity.table}.id", ids).delete();
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
return ids.length;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
export const ${entityId}Model = new ${entityId}ModelClass();
|
|
173
|
+
`.trim(),
|
|
38
174
|
importKeys: [],
|
|
39
175
|
};
|
|
40
176
|
}
|
|
@@ -73,7 +73,6 @@ export class Template__service extends Template {
|
|
|
73
73
|
(param) =>
|
|
74
74
|
!ApiParamType.isContext(param.type) &&
|
|
75
75
|
!ApiParamType.isRefKnex(param.type) &&
|
|
76
|
-
!ApiParamType.isRefKysely(param.type) &&
|
|
77
76
|
!(param.optional === true && param.name.startsWith("_")) // _로 시작하는 파라미터는 제외
|
|
78
77
|
);
|
|
79
78
|
|
|
@@ -81,6 +81,8 @@ export class Template__view_form extends Template {
|
|
|
81
81
|
} else {
|
|
82
82
|
return `<TextArea rows={8} placeholder="${col.label}" ${regExpr} />`;
|
|
83
83
|
}
|
|
84
|
+
case "datetime":
|
|
85
|
+
return `<Input type="datetime-local" ${regExpr} />`;
|
|
84
86
|
case "string-datetime":
|
|
85
87
|
return `<SQLDateTimeInput ${regExpr} />`;
|
|
86
88
|
case "string-date":
|
|
@@ -147,9 +149,11 @@ export class Template__view_form extends Template {
|
|
|
147
149
|
} else if (col.zodType instanceof z.ZodNumber) {
|
|
148
150
|
value = 0;
|
|
149
151
|
} else if (col.zodType instanceof z.ZodEnum) {
|
|
150
|
-
value = Object.keys(col.zodType.
|
|
152
|
+
value = Object.keys(col.zodType.options)[0];
|
|
151
153
|
} else if (col.zodType instanceof z.ZodBoolean) {
|
|
152
154
|
value = false;
|
|
155
|
+
} else if (col.zodType instanceof z.ZodDate) {
|
|
156
|
+
value = new Date();
|
|
153
157
|
} else if (col.zodType instanceof z.ZodString) {
|
|
154
158
|
if (col.renderType === "string-datetime") {
|
|
155
159
|
value = "now()";
|
|
@@ -268,10 +272,10 @@ import {
|
|
|
268
272
|
} from 'semantic-ui-react';
|
|
269
273
|
import { DateTime } from "luxon";
|
|
270
274
|
|
|
271
|
-
import { BackLink, LinkInput, NumberInput, BooleanToggle, SQLDateTimeInput, SQLDateInput, useTypeForm, useGoBack } from "@sonamu-kit/react-sui";
|
|
275
|
+
import { BackLink, LinkInput, NumberInput, BooleanToggle, SQLDateTimeInput, SQLDateInput, useTypeForm, useGoBack, formatDateTime } from "@sonamu-kit/react-sui";
|
|
272
276
|
import { defaultCatch } from 'src/services/sonamu.shared';
|
|
273
|
-
import { ImageUploader } from 'src/admin-common/ImageUploader';
|
|
274
|
-
import { useCommonModal } from "src/admin-common/CommonModal";
|
|
277
|
+
// import { ImageUploader } from 'src/admin-common/ImageUploader';
|
|
278
|
+
// import { useCommonModal } from "src/admin-common/CommonModal";
|
|
275
279
|
|
|
276
280
|
import { ${names.capital}SaveParams } from 'src/services/${names.fs}/${
|
|
277
281
|
names.fs
|
|
@@ -343,14 +347,14 @@ export function ${names.capitalPlural}Form({ id, mode }: ${
|
|
|
343
347
|
}, [id]);
|
|
344
348
|
|
|
345
349
|
// CommonModal
|
|
346
|
-
const { doneModal, closeModal } = useCommonModal();
|
|
350
|
+
// const { doneModal, closeModal } = useCommonModal();
|
|
347
351
|
|
|
348
352
|
// 저장
|
|
349
353
|
const { goBack } = useGoBack();
|
|
350
354
|
const handleSubmit = useCallback(() => {
|
|
351
355
|
${names.capital}Service.save([form]).then(([id]) => {
|
|
352
356
|
if( mode === 'modal' ) {
|
|
353
|
-
doneModal();
|
|
357
|
+
// doneModal();
|
|
354
358
|
} else {
|
|
355
359
|
goBack('/admin/${names.fsPlural}');
|
|
356
360
|
}
|
|
@@ -383,7 +387,7 @@ export function ${names.capitalPlural}Form({ id, mode }: ${
|
|
|
383
387
|
.map((col) => {
|
|
384
388
|
if (col.name === "created_at") {
|
|
385
389
|
return `{form.id && (${this.wrapFG(
|
|
386
|
-
`<div className="p-8px">{form.${col.name}}</div>`,
|
|
390
|
+
`<div className="p-8px">{formatDateTime(form.${col.name})}</div>`,
|
|
387
391
|
"등록일시"
|
|
388
392
|
)})}`;
|
|
389
393
|
} else {
|
|
@@ -54,6 +54,12 @@ export class Template__view_list extends Template {
|
|
|
54
54
|
return `<>{${
|
|
55
55
|
col.nullable ? `${colName} && ` : ""
|
|
56
56
|
}<img src={${colName}} />}</>`;
|
|
57
|
+
case "datetime":
|
|
58
|
+
if (col.nullable) {
|
|
59
|
+
return `<span className="text-tiny">{${colName} === null ? '-' : formatDateTime(${colName})}</span>`;
|
|
60
|
+
} else {
|
|
61
|
+
return `<span className="text-tiny">{formatDateTime(${colName})}</span>`;
|
|
62
|
+
}
|
|
57
63
|
case "string-datetime":
|
|
58
64
|
if (col.nullable) {
|
|
59
65
|
return `<span className="text-tiny">{${colName} === null ? '-' : dateF(${colName})}</span>`;
|
|
@@ -133,7 +139,9 @@ export class Template__view_list extends Template {
|
|
|
133
139
|
return `import { ${names.capital}SearchInput } from "src/components/${names.fs}/${names.capital}SearchInput";`;
|
|
134
140
|
} else if (col.renderType === "enums") {
|
|
135
141
|
if (col.name === "orderBy") {
|
|
136
|
-
const componentId = `${names.capital}${inflection.camelize(
|
|
142
|
+
const componentId = `${names.capital}${inflection.camelize(
|
|
143
|
+
col.name
|
|
144
|
+
)}Select`;
|
|
137
145
|
return `import { ${componentId} } from "src/components/${names.fs}/${componentId}";`;
|
|
138
146
|
} else {
|
|
139
147
|
try {
|
|
@@ -217,11 +225,11 @@ export class Template__view_list extends Template {
|
|
|
217
225
|
(col) => col.name === "orderBy"
|
|
218
226
|
)?.zodType;
|
|
219
227
|
if (orderByZodType && orderByZodType instanceof z.ZodEnum) {
|
|
220
|
-
def.orderBy =
|
|
228
|
+
def.orderBy = orderByZodType.options[0].toString();
|
|
221
229
|
}
|
|
222
230
|
const searchZodType = columns.find((col) => col.name === "search")?.zodType;
|
|
223
231
|
if (searchZodType && searchZodType instanceof z.ZodEnum) {
|
|
224
|
-
def.search =
|
|
232
|
+
def.search = searchZodType.options[0].toString();
|
|
225
233
|
}
|
|
226
234
|
return def;
|
|
227
235
|
}
|
|
@@ -347,7 +355,7 @@ import {
|
|
|
347
355
|
} from 'semantic-ui-react';
|
|
348
356
|
import classNames from 'classnames';
|
|
349
357
|
import { DateTime } from "luxon";
|
|
350
|
-
import { DelButton, EditButton, AppBreadcrumbs, AddButton, useSelection, useListParams, SonamuCol, numF,
|
|
358
|
+
import { DelButton, EditButton, AppBreadcrumbs, AddButton, useSelection, useListParams, SonamuCol, numF, formatDate, formatDateTime } from '@sonamu-kit/react-sui';
|
|
351
359
|
|
|
352
360
|
import { ${names.capital}SubsetA } from "src/services/sonamu.generated";
|
|
353
361
|
import { ${names.capital}Service } from 'src/services/${names.fs}/${
|