sonamu 0.5.7 → 0.7.0
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.project-default +18 -0
- package/bin/cli.js +24 -0
- package/dist/ai/agents/agent.d.ts +11 -0
- package/dist/ai/agents/agent.d.ts.map +1 -0
- package/dist/ai/agents/agent.js +65 -0
- package/dist/ai/agents/index.d.ts +3 -0
- package/dist/ai/agents/index.d.ts.map +1 -0
- package/dist/ai/agents/index.js +4 -0
- package/dist/ai/agents/types.d.ts +43 -0
- package/dist/ai/agents/types.d.ts.map +1 -0
- package/dist/ai/agents/types.js +3 -0
- package/dist/ai/index.d.ts +2 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +3 -0
- package/dist/ai/providers/rtzr/api.d.ts +22 -0
- package/dist/ai/providers/rtzr/api.d.ts.map +1 -0
- package/dist/ai/providers/rtzr/api.js +28 -0
- package/dist/ai/providers/rtzr/error.d.ts +18 -0
- package/dist/ai/providers/rtzr/error.d.ts.map +1 -0
- package/dist/ai/providers/rtzr/error.js +29 -0
- package/dist/ai/providers/rtzr/index.d.ts +5 -0
- package/dist/ai/providers/rtzr/index.d.ts.map +1 -0
- package/dist/ai/providers/rtzr/index.js +6 -0
- package/dist/ai/providers/rtzr/model.d.ts +52 -0
- package/dist/ai/providers/rtzr/model.d.ts.map +1 -0
- package/dist/ai/providers/rtzr/model.js +137 -0
- package/dist/ai/providers/rtzr/options.d.ts +7 -0
- package/dist/ai/providers/rtzr/options.d.ts.map +1 -0
- package/dist/ai/providers/rtzr/options.js +47 -0
- package/dist/ai/providers/rtzr/provider.d.ts +18 -0
- package/dist/ai/providers/rtzr/provider.d.ts.map +1 -0
- package/dist/ai/providers/rtzr/provider.js +54 -0
- package/dist/ai/providers/rtzr/utils.d.ts +19 -0
- package/dist/ai/providers/rtzr/utils.d.ts.map +1 -0
- package/dist/ai/providers/rtzr/utils.js +88 -0
- package/dist/api/base-frame.d.ts +2 -2
- package/dist/api/base-frame.d.ts.map +1 -1
- package/dist/api/base-frame.js +13 -2
- package/dist/api/caster.d.ts.map +1 -1
- package/dist/api/caster.js +71 -2
- package/dist/api/code-converters.d.ts +58 -14
- package/dist/api/code-converters.d.ts.map +1 -1
- package/dist/api/code-converters.js +258 -2
- package/dist/api/config.d.ts +90 -0
- package/dist/api/config.d.ts.map +1 -0
- package/dist/api/config.js +25 -0
- package/dist/api/context.d.ts +4 -2
- package/dist/api/context.d.ts.map +1 -1
- package/dist/api/context.js +3 -2
- package/dist/api/decorators.d.ts +20 -6
- package/dist/api/decorators.d.ts.map +1 -1
- package/dist/api/decorators.js +235 -2
- package/dist/api/index.d.ts +2 -2
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +9 -2
- package/dist/api/sonamu.d.ts +10 -24
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +514 -2
- package/dist/api/validator.d.ts +6 -0
- package/dist/api/validator.d.ts.map +1 -0
- package/dist/api/validator.js +81 -0
- package/dist/bin/build-config.d.ts +6 -1
- package/dist/bin/build-config.d.ts.map +1 -1
- package/dist/bin/build-config.js +15 -2
- package/dist/bin/cli.js +519 -2
- package/dist/bin/hot-hook-register.d.ts +11 -0
- package/dist/bin/hot-hook-register.d.ts.map +1 -0
- package/dist/bin/hot-hook-register.js +21 -0
- package/dist/bin/loader-register.d.ts +2 -0
- package/dist/bin/loader-register.d.ts.map +1 -0
- package/dist/bin/loader-register.js +34 -0
- package/dist/database/_batch_update.d.ts +5 -3
- package/dist/database/_batch_update.d.ts.map +1 -1
- package/dist/database/_batch_update.js +95 -2
- package/dist/database/base-model.d.ts +96 -10
- package/dist/database/base-model.d.ts.map +1 -1
- package/dist/database/base-model.js +390 -2
- package/dist/database/base-model.types.d.ts +93 -0
- package/dist/database/base-model.types.d.ts.map +1 -0
- package/dist/database/base-model.types.js +10 -0
- package/dist/database/code-generator.d.ts +1 -1
- package/dist/database/code-generator.d.ts.map +1 -1
- package/dist/database/code-generator.js +54 -2
- package/dist/database/db.d.ts +6 -21
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +129 -2
- package/dist/database/puri-subset.test-d.js +81 -0
- package/dist/database/puri-subset.types.d.ts +123 -0
- package/dist/database/puri-subset.types.d.ts.map +1 -0
- package/dist/database/puri-subset.types.js +16 -0
- package/dist/database/puri-wrapper.d.ts +13 -11
- package/dist/database/puri-wrapper.d.ts.map +1 -1
- package/dist/database/puri-wrapper.js +109 -2
- package/dist/database/puri.d.ts +41 -23
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +601 -2
- package/dist/database/puri.types.d.ts +25 -6
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +6 -2
- package/dist/database/transaction-context.d.ts +1 -1
- package/dist/database/transaction-context.d.ts.map +1 -1
- package/dist/database/transaction-context.js +14 -2
- package/dist/database/upsert-builder.d.ts +9 -3
- package/dist/database/upsert-builder.d.ts.map +1 -1
- package/dist/database/upsert-builder.js +365 -2
- package/dist/entity/entity-manager.d.ts +167 -2
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity-manager.js +130 -2
- package/dist/entity/entity.d.ts +5 -3
- package/dist/entity/entity.d.ts.map +1 -1
- package/dist/entity/entity.js +750 -2
- package/dist/exceptions/error-handler.d.ts +1 -1
- package/dist/exceptions/error-handler.d.ts.map +1 -1
- package/dist/exceptions/error-handler.js +29 -2
- package/dist/exceptions/so-exceptions.d.ts +1 -1
- package/dist/exceptions/so-exceptions.d.ts.map +1 -1
- package/dist/exceptions/so-exceptions.js +85 -2
- package/dist/file-storage/driver.d.ts +1 -1
- package/dist/file-storage/driver.d.ts.map +1 -1
- package/dist/file-storage/driver.js +79 -2
- package/dist/file-storage/file-storage.js +75 -2
- package/dist/index.d.ts +18 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +34 -2
- package/dist/migration/code-generation.d.ts +1 -1
- package/dist/migration/code-generation.d.ts.map +1 -1
- package/dist/migration/code-generation.js +614 -2
- package/dist/migration/migration-set.d.ts +2 -10
- package/dist/migration/migration-set.d.ts.map +1 -1
- package/dist/migration/migration-set.js +213 -2
- package/dist/migration/migrator.d.ts +24 -82
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +330 -2
- package/dist/migration/postgresql-schema-reader.d.ts +51 -0
- package/dist/migration/postgresql-schema-reader.d.ts.map +1 -0
- package/dist/migration/postgresql-schema-reader.js +245 -0
- package/dist/migration/types.d.ts +6 -38
- package/dist/migration/types.d.ts.map +1 -1
- package/dist/migration/types.js +3 -2
- package/dist/naite/messaging-types.d.ts +43 -0
- package/dist/naite/messaging-types.d.ts.map +1 -0
- package/dist/naite/messaging-types.js +7 -0
- package/dist/naite/naite-reporter.d.ts +41 -0
- package/dist/naite/naite-reporter.d.ts.map +1 -0
- package/dist/naite/naite-reporter.js +102 -0
- package/dist/naite/naite.d.ts +95 -0
- package/dist/naite/naite.d.ts.map +1 -0
- package/dist/naite/naite.js +316 -0
- package/dist/stream/index.js +3 -2
- package/dist/stream/sse.d.ts +2 -2
- package/dist/stream/sse.d.ts.map +1 -1
- package/dist/stream/sse.js +38 -2
- package/dist/syncer/api-parser.d.ts +10 -0
- package/dist/syncer/api-parser.d.ts.map +1 -0
- package/dist/syncer/api-parser.js +240 -0
- package/dist/syncer/checksum.d.ts +21 -0
- package/dist/syncer/checksum.d.ts.map +1 -0
- package/dist/syncer/checksum.js +98 -0
- package/dist/syncer/code-generator.d.ts +20 -0
- package/dist/syncer/code-generator.d.ts.map +1 -0
- package/dist/syncer/code-generator.js +161 -0
- package/dist/syncer/entity-operations.d.ts +17 -0
- package/dist/syncer/entity-operations.d.ts.map +1 -0
- package/dist/syncer/entity-operations.js +59 -0
- package/dist/syncer/file-patterns.d.ts +29 -0
- package/dist/syncer/file-patterns.d.ts.map +1 -0
- package/dist/syncer/file-patterns.js +38 -0
- package/dist/syncer/index.d.ts +6 -0
- package/dist/syncer/index.d.ts.map +1 -1
- package/dist/syncer/index.js +9 -2
- package/dist/syncer/module-loader.d.ts +35 -0
- package/dist/syncer/module-loader.d.ts.map +1 -0
- package/dist/syncer/module-loader.js +87 -0
- package/dist/syncer/syncer.d.ts +98 -106
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +422 -2
- package/dist/template/entity-converter.d.ts +14 -0
- package/dist/template/entity-converter.d.ts.map +1 -0
- package/dist/template/entity-converter.js +108 -0
- package/dist/template/helpers.d.ts +23 -0
- package/dist/template/helpers.d.ts.map +1 -0
- package/dist/template/helpers.js +64 -0
- package/dist/{templates → template/implementations}/entity.template.d.ts +3 -3
- package/dist/template/implementations/entity.template.d.ts.map +1 -0
- package/dist/template/implementations/entity.template.js +86 -0
- package/dist/{templates → template/implementations}/generated.template.d.ts +3 -4
- package/dist/template/implementations/generated.template.d.ts.map +1 -0
- package/dist/template/implementations/generated.template.js +249 -0
- package/dist/{templates → template/implementations}/generated_http.template.d.ts +3 -4
- package/dist/template/implementations/generated_http.template.d.ts.map +1 -0
- package/dist/template/implementations/generated_http.template.js +131 -0
- package/dist/{templates → template/implementations}/generated_sso.template.d.ts +4 -5
- package/dist/template/implementations/generated_sso.template.d.ts.map +1 -0
- package/dist/template/implementations/generated_sso.template.js +134 -0
- package/dist/{templates → template/implementations}/init_types.template.d.ts +3 -3
- package/dist/template/implementations/init_types.template.d.ts.map +1 -0
- package/dist/template/implementations/init_types.template.js +38 -0
- package/dist/template/implementations/model.template.d.ts +17 -0
- package/dist/template/implementations/model.template.d.ts.map +1 -0
- package/dist/template/implementations/model.template.js +181 -0
- package/dist/{templates → template/implementations}/model_test.template.d.ts +3 -3
- package/dist/template/implementations/model_test.template.d.ts.map +1 -0
- package/dist/template/implementations/model_test.template.js +35 -0
- package/dist/{templates → template/implementations}/service.template.d.ts +6 -6
- package/dist/template/implementations/service.template.d.ts.map +1 -0
- package/dist/template/implementations/service.template.js +201 -0
- package/dist/{templates → template/implementations}/view_enums_buttonset.template.d.ts +3 -3
- package/dist/template/implementations/view_enums_buttonset.template.d.ts.map +1 -0
- package/dist/template/implementations/view_enums_buttonset.template.js +31 -0
- package/dist/{templates → template/implementations}/view_enums_dropdown.template.d.ts +3 -4
- package/dist/template/implementations/view_enums_dropdown.template.d.ts.map +1 -0
- package/dist/template/implementations/view_enums_dropdown.template.js +50 -0
- package/dist/{templates → template/implementations}/view_enums_select.template.d.ts +3 -3
- package/dist/template/implementations/view_enums_select.template.d.ts.map +1 -0
- package/dist/template/implementations/view_enums_select.template.js +55 -0
- package/dist/{templates → template/implementations}/view_form.template.d.ts +5 -5
- package/dist/template/implementations/view_form.template.d.ts.map +1 -0
- package/dist/template/implementations/view_form.template.js +337 -0
- package/dist/{templates → template/implementations}/view_id_all_select.template.d.ts +3 -3
- package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -0
- package/dist/template/implementations/view_id_all_select.template.js +31 -0
- package/dist/{templates → template/implementations}/view_id_async_select.template.d.ts +3 -3
- package/dist/template/implementations/view_id_async_select.template.d.ts.map +1 -0
- package/dist/template/implementations/view_id_async_select.template.js +105 -0
- package/dist/{templates → template/implementations}/view_list.template.d.ts +5 -13
- package/dist/template/implementations/view_list.template.d.ts.map +1 -0
- package/dist/template/implementations/view_list.template.js +475 -0
- package/dist/template/implementations/view_list_columns.template.d.ts +17 -0
- package/dist/template/implementations/view_list_columns.template.d.ts.map +1 -0
- package/dist/template/implementations/view_list_columns.template.js +49 -0
- package/dist/{templates → template/implementations}/view_search_input.template.d.ts +3 -3
- package/dist/template/implementations/view_search_input.template.d.ts.map +1 -0
- package/dist/template/implementations/view_search_input.template.js +64 -0
- package/dist/template/index.d.ts +7 -0
- package/dist/template/index.d.ts.map +1 -0
- package/dist/template/index.js +8 -0
- package/dist/template/template-manager.d.ts +56 -0
- package/dist/template/template-manager.d.ts.map +1 -0
- package/dist/template/template-manager.js +125 -0
- package/dist/template/template-types.d.ts +16 -0
- package/dist/template/template-types.d.ts.map +1 -0
- package/dist/template/template-types.js +7 -0
- package/dist/template/template.d.ts +49 -0
- package/dist/template/template.d.ts.map +1 -0
- package/dist/template/template.js +60 -0
- package/dist/template/zod-converter.d.ts +51 -0
- package/dist/template/zod-converter.d.ts.map +1 -0
- package/dist/template/zod-converter.js +449 -0
- package/dist/testing/_relation-graph.d.ts +1 -1
- package/dist/testing/_relation-graph.d.ts.map +1 -1
- package/dist/testing/_relation-graph.js +89 -2
- package/dist/testing/fixture-manager.d.ts +42 -11
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +623 -2
- package/dist/types/types.d.ts +747 -143
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +546 -2
- package/dist/typings/knex.d.js +3 -2
- package/dist/utils/async-utils.d.ts +7 -0
- package/dist/utils/async-utils.d.ts.map +1 -1
- package/dist/utils/async-utils.js +57 -2
- package/dist/utils/console-util.d.ts +2 -0
- package/dist/utils/console-util.d.ts.map +1 -0
- package/dist/utils/console-util.js +6 -0
- package/dist/utils/controller.d.ts +1 -0
- package/dist/utils/controller.d.ts.map +1 -1
- package/dist/utils/controller.js +29 -2
- package/dist/utils/esm-utils.d.ts +39 -0
- package/dist/utils/esm-utils.d.ts.map +1 -0
- package/dist/utils/esm-utils.js +49 -0
- package/dist/utils/formatter.d.ts +3 -0
- package/dist/utils/formatter.d.ts.map +1 -0
- package/dist/utils/formatter.js +110 -0
- package/dist/utils/fs-utils.d.ts +1 -1
- package/dist/utils/fs-utils.d.ts.map +1 -1
- package/dist/utils/fs-utils.js +17 -2
- package/dist/utils/lodash-able.d.ts.map +1 -1
- package/dist/utils/lodash-able.js +6 -2
- package/dist/utils/model.js +22 -2
- package/dist/utils/object-utils.d.ts +44 -0
- package/dist/utils/object-utils.d.ts.map +1 -0
- package/dist/utils/object-utils.js +191 -0
- package/dist/utils/path-utils.d.ts +89 -0
- package/dist/utils/path-utils.d.ts.map +1 -0
- package/dist/utils/path-utils.js +60 -0
- package/dist/utils/process-utils.d.ts +13 -0
- package/dist/utils/process-utils.d.ts.map +1 -0
- package/dist/utils/process-utils.js +36 -0
- package/dist/utils/sql-parser.d.ts +5 -1
- package/dist/utils/sql-parser.d.ts.map +1 -1
- package/dist/utils/sql-parser.js +46 -2
- package/dist/utils/type-utils.d.ts +23 -0
- package/dist/utils/type-utils.d.ts.map +1 -0
- package/dist/utils/type-utils.js +45 -0
- package/dist/utils/utils.d.ts +10 -7
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +72 -2
- package/dist/utils/zod-error.d.ts +1 -1
- package/dist/utils/zod-error.d.ts.map +1 -1
- package/dist/utils/zod-error.js +19 -2
- package/package.json +65 -27
- package/src/ai/agents/agent.ts +87 -0
- package/src/ai/agents/index.ts +2 -0
- package/src/ai/agents/types.ts +47 -0
- package/src/ai/index.ts +1 -0
- package/src/ai/providers/rtzr/api.ts +37 -0
- package/src/ai/providers/rtzr/error.ts +34 -0
- package/src/ai/providers/rtzr/index.ts +4 -0
- package/src/ai/providers/rtzr/model.ts +201 -0
- package/src/ai/providers/rtzr/options.ts +49 -0
- package/src/ai/providers/rtzr/provider.ts +91 -0
- package/src/ai/providers/rtzr/utils.ts +127 -0
- package/src/api/base-frame.ts +4 -2
- package/src/api/caster.ts +17 -23
- package/src/api/code-converters.ts +178 -535
- package/src/api/config.ts +125 -0
- package/src/api/context.ts +7 -17
- package/src/api/decorators.ts +176 -46
- package/src/api/index.ts +2 -2
- package/src/api/sonamu.ts +190 -167
- package/src/api/validator.ts +83 -0
- package/src/bin/build-config.ts +8 -1
- package/src/bin/cli.ts +258 -124
- package/src/bin/hot-hook-register.ts +22 -0
- package/src/bin/loader-register.ts +38 -0
- package/src/database/_batch_update.ts +46 -31
- package/src/database/base-model.ts +390 -182
- package/src/database/base-model.types.ts +155 -0
- package/src/database/code-generator.ts +13 -32
- package/src/database/db.ts +40 -96
- package/src/database/puri-subset.test-d.ts +471 -0
- package/src/database/puri-subset.types.ts +195 -0
- package/src/database/puri-wrapper.ts +58 -67
- package/src/database/puri.ts +229 -148
- package/src/database/puri.types.ts +76 -30
- package/src/database/transaction-context.ts +1 -1
- package/src/database/upsert-builder.ts +262 -132
- package/src/entity/entity-manager.ts +48 -36
- package/src/entity/entity.ts +330 -248
- package/src/exceptions/error-handler.ts +3 -3
- package/src/exceptions/so-exceptions.ts +11 -11
- package/src/file-storage/driver.ts +5 -5
- package/src/file-storage/file-storage.ts +2 -2
- package/src/index.ts +18 -10
- package/src/migration/code-generation.ts +185 -172
- package/src/migration/migration-set.ts +80 -293
- package/src/migration/migrator.ts +199 -571
- package/src/migration/mysql-schema-reader.ts.txt +272 -0
- package/src/migration/postgresql-schema-reader.ts +310 -0
- package/src/migration/types.ts +6 -39
- package/src/naite/messaging-types.ts +51 -0
- package/src/naite/naite-reporter.ts +128 -0
- package/src/naite/naite.ts +415 -0
- package/src/shared/web.shared.ts.txt +20 -24
- package/src/stream/sse.ts +5 -5
- package/src/syncer/api-parser.ts +282 -0
- package/src/syncer/checksum.ts +140 -0
- package/src/syncer/code-generator.ts +198 -0
- package/src/syncer/entity-operations.ts +65 -0
- package/src/syncer/file-patterns.ts +56 -0
- package/src/syncer/index.ts +6 -0
- package/src/syncer/module-loader.ts +128 -0
- package/src/syncer/syncer.ts +389 -1453
- package/src/template/entity-converter.ts +114 -0
- package/src/template/helpers.ts +81 -0
- package/src/{templates → template/implementations}/entity.template.ts +7 -7
- package/src/{templates → template/implementations}/generated.template.ts +101 -101
- package/src/{templates → template/implementations}/generated_http.template.ts +27 -57
- package/src/template/implementations/generated_sso.template.ts +151 -0
- package/src/{templates → template/implementations}/init_types.template.ts +5 -7
- package/src/{templates → template/implementations}/model.template.ts +52 -43
- package/src/{templates → template/implementations}/model_test.template.ts +5 -5
- package/src/{templates → template/implementations}/service.template.ts +66 -82
- package/src/{templates → template/implementations}/view_enums_buttonset.template.ts +3 -3
- package/src/{templates → template/implementations}/view_enums_dropdown.template.ts +4 -20
- package/src/{templates → template/implementations}/view_enums_select.template.ts +4 -4
- package/src/{templates → template/implementations}/view_form.template.ts +40 -83
- package/src/{templates → template/implementations}/view_id_all_select.template.ts +3 -3
- package/src/{templates → template/implementations}/view_id_async_select.template.ts +10 -24
- package/src/{templates → template/implementations}/view_list.template.ts +60 -152
- package/src/{templates → template/implementations}/view_list_columns.template.ts +5 -11
- package/src/{templates → template/implementations}/view_search_input.template.ts +3 -3
- package/src/template/index.ts +6 -0
- package/src/template/template-manager.ts +166 -0
- package/src/template/template-types.ts +16 -0
- package/src/template/template.ts +105 -0
- package/src/template/zod-converter.ts +525 -0
- package/src/testing/_relation-graph.ts +18 -11
- package/src/testing/fixture-manager.ts +472 -359
- package/src/types/types.ts +553 -308
- package/src/typings/knex.d.ts +7 -9
- package/src/utils/async-utils.ts +23 -10
- package/src/utils/console-util.ts +4 -0
- package/src/utils/controller.ts +3 -0
- package/src/utils/esm-utils.ts +59 -0
- package/src/utils/formatter.ts +109 -0
- package/src/utils/fs-utils.ts +1 -1
- package/src/utils/lodash-able.ts +1 -4
- package/src/utils/object-utils.ts +217 -0
- package/src/utils/path-utils.ts +99 -0
- package/src/utils/process-utils.ts +46 -0
- package/src/utils/sql-parser.ts +23 -5
- package/src/utils/type-utils.ts +83 -0
- package/src/utils/utils.ts +66 -43
- package/src/utils/zod-error.ts +3 -4
- package/dist/api/base-frame.js.map +0 -1
- package/dist/api/caster.js.map +0 -1
- package/dist/api/code-converters.js.map +0 -1
- package/dist/api/context.js.map +0 -1
- package/dist/api/decorators.js.map +0 -1
- package/dist/api/index.js.map +0 -1
- package/dist/api/sonamu.js.map +0 -1
- package/dist/bin/build-config.js.map +0 -1
- package/dist/bin/cli-wrapper.d.ts +0 -3
- package/dist/bin/cli-wrapper.d.ts.map +0 -1
- package/dist/bin/cli-wrapper.js +0 -3
- package/dist/bin/cli-wrapper.js.map +0 -1
- package/dist/bin/cli.js.map +0 -1
- package/dist/database/_batch_update.js.map +0 -1
- package/dist/database/base-model.js.map +0 -1
- package/dist/database/code-generator.js.map +0 -1
- package/dist/database/db.js.map +0 -1
- package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts +0 -2
- package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts.map +0 -1
- package/dist/database/knex-plugins/knex-on-duplicate-update.js +0 -2
- package/dist/database/knex-plugins/knex-on-duplicate-update.js.map +0 -1
- package/dist/database/puri-wrapper.js.map +0 -1
- package/dist/database/puri.js.map +0 -1
- package/dist/database/puri.types.js.map +0 -1
- package/dist/database/transaction-context.js.map +0 -1
- package/dist/database/upsert-builder.js.map +0 -1
- package/dist/entity/entity-manager.js.map +0 -1
- package/dist/entity/entity-utils.d.ts +0 -61
- package/dist/entity/entity-utils.d.ts.map +0 -1
- package/dist/entity/entity-utils.js +0 -2
- package/dist/entity/entity-utils.js.map +0 -1
- package/dist/entity/entity.js.map +0 -1
- package/dist/exceptions/error-handler.js.map +0 -1
- package/dist/exceptions/so-exceptions.js.map +0 -1
- package/dist/file-storage/driver.js.map +0 -1
- package/dist/file-storage/file-storage.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/migration/code-generation.js.map +0 -1
- package/dist/migration/migration-set.js.map +0 -1
- package/dist/migration/migrator.js.map +0 -1
- package/dist/migration/types.js.map +0 -1
- package/dist/stream/index.js.map +0 -1
- package/dist/stream/sse.js.map +0 -1
- package/dist/syncer/index.js.map +0 -1
- package/dist/syncer/syncer.js.map +0 -1
- package/dist/templates/base-template.d.ts +0 -13
- package/dist/templates/base-template.d.ts.map +0 -1
- package/dist/templates/base-template.js +0 -2
- package/dist/templates/base-template.js.map +0 -1
- package/dist/templates/entity.template.d.ts.map +0 -1
- package/dist/templates/entity.template.js +0 -2
- package/dist/templates/entity.template.js.map +0 -1
- package/dist/templates/generated.template.d.ts.map +0 -1
- package/dist/templates/generated.template.js +0 -2
- package/dist/templates/generated.template.js.map +0 -1
- package/dist/templates/generated_http.template.d.ts.map +0 -1
- package/dist/templates/generated_http.template.js +0 -2
- package/dist/templates/generated_http.template.js.map +0 -1
- package/dist/templates/generated_sso.template.d.ts.map +0 -1
- package/dist/templates/generated_sso.template.js +0 -2
- package/dist/templates/generated_sso.template.js.map +0 -1
- package/dist/templates/index.d.ts +0 -2
- package/dist/templates/index.d.ts.map +0 -1
- package/dist/templates/index.js +0 -2
- package/dist/templates/index.js.map +0 -1
- package/dist/templates/init_types.template.d.ts.map +0 -1
- package/dist/templates/init_types.template.js +0 -2
- package/dist/templates/init_types.template.js.map +0 -1
- package/dist/templates/model.template.d.ts +0 -17
- package/dist/templates/model.template.d.ts.map +0 -1
- package/dist/templates/model.template.js +0 -2
- package/dist/templates/model.template.js.map +0 -1
- package/dist/templates/model_test.template.d.ts.map +0 -1
- package/dist/templates/model_test.template.js +0 -2
- package/dist/templates/model_test.template.js.map +0 -1
- package/dist/templates/service.template.d.ts.map +0 -1
- package/dist/templates/service.template.js +0 -2
- package/dist/templates/service.template.js.map +0 -1
- package/dist/templates/view_enums_buttonset.template.d.ts.map +0 -1
- package/dist/templates/view_enums_buttonset.template.js +0 -2
- package/dist/templates/view_enums_buttonset.template.js.map +0 -1
- package/dist/templates/view_enums_dropdown.template.d.ts.map +0 -1
- package/dist/templates/view_enums_dropdown.template.js +0 -2
- package/dist/templates/view_enums_dropdown.template.js.map +0 -1
- package/dist/templates/view_enums_select.template.d.ts.map +0 -1
- package/dist/templates/view_enums_select.template.js +0 -2
- package/dist/templates/view_enums_select.template.js.map +0 -1
- package/dist/templates/view_form.template.d.ts.map +0 -1
- package/dist/templates/view_form.template.js +0 -2
- package/dist/templates/view_form.template.js.map +0 -1
- package/dist/templates/view_id_all_select.template.d.ts.map +0 -1
- package/dist/templates/view_id_all_select.template.js +0 -2
- package/dist/templates/view_id_all_select.template.js.map +0 -1
- package/dist/templates/view_id_async_select.template.d.ts.map +0 -1
- package/dist/templates/view_id_async_select.template.js +0 -2
- package/dist/templates/view_id_async_select.template.js.map +0 -1
- package/dist/templates/view_list.template.d.ts.map +0 -1
- package/dist/templates/view_list.template.js +0 -2
- package/dist/templates/view_list.template.js.map +0 -1
- package/dist/templates/view_list_columns.template.d.ts +0 -17
- package/dist/templates/view_list_columns.template.d.ts.map +0 -1
- package/dist/templates/view_list_columns.template.js +0 -2
- package/dist/templates/view_list_columns.template.js.map +0 -1
- package/dist/templates/view_search_input.template.d.ts.map +0 -1
- package/dist/templates/view_search_input.template.js +0 -2
- package/dist/templates/view_search_input.template.js.map +0 -1
- package/dist/testing/_relation-graph.js.map +0 -1
- package/dist/testing/fixture-manager.js.map +0 -1
- package/dist/types/types.js.map +0 -1
- package/dist/typings/knex.d.js.map +0 -1
- package/dist/utils/async-utils.js.map +0 -1
- package/dist/utils/controller.js.map +0 -1
- package/dist/utils/fs-utils.js.map +0 -1
- package/dist/utils/lodash-able.js.map +0 -1
- package/dist/utils/model.js.map +0 -1
- package/dist/utils/sql-parser.js.map +0 -1
- package/dist/utils/utils.js.map +0 -1
- package/dist/utils/zod-error.js.map +0 -1
- package/src/bin/cli-wrapper.ts +0 -75
- package/src/database/knex-plugins/knex-on-duplicate-update.ts +0 -45
- package/src/entity/entity-utils.ts +0 -291
- package/src/templates/base-template.ts +0 -19
- package/src/templates/generated_sso.template.ts +0 -138
- package/src/templates/index.ts +0 -1
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import type { FastifyCorsOptions } from "@fastify/cors";
|
|
2
|
+
import type { FastifyFormbodyOptions } from "@fastify/formbody";
|
|
3
|
+
import type { FastifyMultipartOptions } from "@fastify/multipart";
|
|
4
|
+
import type { DeserializeFunction, SerializeFunction } from "@fastify/passport/dist/Authenticator";
|
|
5
|
+
import type { SecureSessionPluginOptions } from "@fastify/secure-session";
|
|
6
|
+
import type { FastifyStaticOptions } from "@fastify/static";
|
|
7
|
+
import type { FastifyInstance, FastifyReply, FastifyRequest, FastifyServerOptions } from "fastify";
|
|
8
|
+
import type { QsPluginOptions } from "fastify-qs";
|
|
9
|
+
import type { SsePluginOptions } from "fastify-sse-v2/lib/types";
|
|
10
|
+
import type { Knex } from "knex";
|
|
11
|
+
import type { Driver } from "../file-storage/driver";
|
|
12
|
+
import type { SonamuFastifyConfig } from "../types/types";
|
|
13
|
+
|
|
14
|
+
export type DatabaseConfig = Omit<Knex.Config, "connection"> & {
|
|
15
|
+
connection?: Knex.PgConnectionConfig;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export type SonamuConfig = {
|
|
19
|
+
projectName?: string;
|
|
20
|
+
|
|
21
|
+
api: {
|
|
22
|
+
dir: string;
|
|
23
|
+
route: {
|
|
24
|
+
prefix: string;
|
|
25
|
+
};
|
|
26
|
+
timezone?: string;
|
|
27
|
+
};
|
|
28
|
+
sync: {
|
|
29
|
+
targets: string[]; // "web", "app" 등
|
|
30
|
+
};
|
|
31
|
+
ui?: {
|
|
32
|
+
port: number;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
database: {
|
|
36
|
+
// 데이터베이스
|
|
37
|
+
database?: "postgresql";
|
|
38
|
+
// 기본 데이터베이스 이름
|
|
39
|
+
name: string;
|
|
40
|
+
// 모든 환경에 적용될 기본 Knex 옵션
|
|
41
|
+
defaultOptions: DatabaseConfig;
|
|
42
|
+
// 환경별 설정
|
|
43
|
+
environments?: {
|
|
44
|
+
development?: DatabaseConfig;
|
|
45
|
+
development_slave?: DatabaseConfig;
|
|
46
|
+
production?: DatabaseConfig;
|
|
47
|
+
production_slave?: DatabaseConfig;
|
|
48
|
+
remote_fixture?: DatabaseConfig;
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
server: SonamuServerOptions;
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
export type SonamuServerOptions = {
|
|
56
|
+
fastify?: FastifyServerOptions;
|
|
57
|
+
|
|
58
|
+
listen?: {
|
|
59
|
+
port: number;
|
|
60
|
+
host?: string;
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
plugins?: {
|
|
64
|
+
cors?: boolean | FastifyCorsOptions;
|
|
65
|
+
formbody?: boolean | FastifyFormbodyOptions;
|
|
66
|
+
multipart?: boolean | FastifyMultipartOptions;
|
|
67
|
+
qs?: boolean | QsPluginOptions;
|
|
68
|
+
sse?: boolean | SsePluginOptions;
|
|
69
|
+
static?: boolean | FastifyStaticOptions;
|
|
70
|
+
session?: boolean | SecureSessionPluginOptions;
|
|
71
|
+
|
|
72
|
+
custom?: (server: FastifyInstance) => void;
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
auth?:
|
|
76
|
+
| boolean
|
|
77
|
+
| {
|
|
78
|
+
userSerializer: SerializeFunction<unknown, unknown>;
|
|
79
|
+
userDeserializer: DeserializeFunction<unknown, unknown>;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
apiConfig: SonamuFastifyConfig;
|
|
83
|
+
|
|
84
|
+
storage?: Driver;
|
|
85
|
+
|
|
86
|
+
lifecycle?: {
|
|
87
|
+
onStart?: (server: FastifyInstance) => Promise<void> | void;
|
|
88
|
+
onShutdown?: (server: FastifyInstance) => Promise<void> | void;
|
|
89
|
+
onError?: (error: Error, request: FastifyRequest, reply: FastifyReply) => Promise<void> | void;
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
export type SonamuConfigExport = SonamuConfig | Promise<SonamuConfig>;
|
|
94
|
+
|
|
95
|
+
export function defineConfig(config: SonamuConfig): SonamuConfig;
|
|
96
|
+
export function defineConfig(config: Promise<SonamuConfig>): Promise<SonamuConfig>;
|
|
97
|
+
export function defineConfig(config: SonamuConfigExport): SonamuConfigExport {
|
|
98
|
+
return config;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* sonamu.config.ts 파일을 로드합니다.
|
|
103
|
+
* 이 설정 파일은 환경에 따라 다른 경로에 있을 수 있습니다.
|
|
104
|
+
* dist를 빌드하는 환경이라면 dist 바로 아래에 있을 것이고(cli-wrapper.ts에서 빌드),
|
|
105
|
+
* 그렇지 않은 환경이라면 프로젝트 루트에 있을 것입니다.
|
|
106
|
+
*
|
|
107
|
+
* 이 함수는 의도적으로 다른 의존성의 사용을 최대한 배제하였습니다.
|
|
108
|
+
* 이는 실행 초기에 최대한 빠르게 설정을 읽어올 수 있도록 하기 위함입니다.
|
|
109
|
+
* 따라서 경로 concat과 URL scheme 추가도 단순한 문자열 조작으로 처리하였습니다.
|
|
110
|
+
*
|
|
111
|
+
* @param rootPath
|
|
112
|
+
* @returns
|
|
113
|
+
*/
|
|
114
|
+
export async function loadConfig(rootPath: string): Promise<SonamuConfig> {
|
|
115
|
+
const start = performance.now();
|
|
116
|
+
const configPath =
|
|
117
|
+
process.env.HOT === "yes" || process.env.VITEST === "true"
|
|
118
|
+
? `${rootPath}/sonamu.config.ts`
|
|
119
|
+
: `${rootPath}/dist/sonamu.config.js`;
|
|
120
|
+
const { default: config } = await import(`file://${configPath}`);
|
|
121
|
+
const importTime = performance.now() - start;
|
|
122
|
+
process.env.NODE_ENV !== "test" &&
|
|
123
|
+
console.log(`[TIMING] loadConfig took ${importTime.toFixed(2)}ms`);
|
|
124
|
+
return config;
|
|
125
|
+
}
|
package/src/api/context.ts
CHANGED
|
@@ -1,29 +1,19 @@
|
|
|
1
1
|
import type { FastifyReply, FastifyRequest, PassportUser } from "fastify";
|
|
2
2
|
import type { RouteGenericInterface } from "fastify/types/route";
|
|
3
|
-
import type {
|
|
4
|
-
Server,
|
|
5
|
-
IncomingMessage,
|
|
6
|
-
ServerResponse,
|
|
7
|
-
IncomingHttpHeaders,
|
|
8
|
-
} from "http";
|
|
9
|
-
import type { FileStorage } from "../file-storage/file-storage";
|
|
3
|
+
import type { IncomingHttpHeaders, IncomingMessage, Server, ServerResponse } from "http";
|
|
10
4
|
import type { ZodObject } from "zod";
|
|
5
|
+
import type { FileStorage } from "../file-storage/file-storage";
|
|
6
|
+
import type { NaiteStore } from "../naite/naite";
|
|
11
7
|
import type { createSSEFactory } from "../stream/sse";
|
|
12
8
|
|
|
9
|
+
// biome-ignore lint/suspicious/noEmptyInterface: Context 확장 타입
|
|
13
10
|
export interface ContextExtend {}
|
|
14
11
|
export type Context = {
|
|
15
12
|
request: FastifyRequest;
|
|
16
|
-
reply: FastifyReply<
|
|
17
|
-
Server,
|
|
18
|
-
IncomingMessage,
|
|
19
|
-
ServerResponse,
|
|
20
|
-
RouteGenericInterface,
|
|
21
|
-
unknown
|
|
22
|
-
>;
|
|
13
|
+
reply: FastifyReply<Server, IncomingMessage, ServerResponse, RouteGenericInterface, unknown>;
|
|
23
14
|
headers: IncomingHttpHeaders;
|
|
24
|
-
createSSE: <T extends ZodObject>(
|
|
25
|
-
|
|
26
|
-
) => ReturnType<typeof createSSEFactory<T>>;
|
|
15
|
+
createSSE: <T extends ZodObject>(events: T) => ReturnType<typeof createSSEFactory<T>>;
|
|
16
|
+
naiteStore: NaiteStore;
|
|
27
17
|
} & AuthContext &
|
|
28
18
|
ContextExtend;
|
|
29
19
|
|
package/src/api/decorators.ts
CHANGED
|
@@ -1,15 +1,18 @@
|
|
|
1
|
+
import assert from "assert";
|
|
1
2
|
import type { HTTPMethods } from "fastify";
|
|
2
3
|
import inflection from "inflection";
|
|
3
|
-
import
|
|
4
|
-
import { z } from "zod";
|
|
4
|
+
import { isEqual } from "radashi";
|
|
5
|
+
import type { z } from "zod";
|
|
6
|
+
import type { BaseModelClass } from "../database/base-model";
|
|
7
|
+
import { DB } from "../database/db";
|
|
5
8
|
import {
|
|
6
9
|
PuriTransactionWrapper,
|
|
7
|
-
PuriWrapper,
|
|
8
|
-
TransactionalOptions,
|
|
10
|
+
type PuriWrapper,
|
|
11
|
+
type TransactionalOptions,
|
|
9
12
|
} from "../database/puri-wrapper";
|
|
10
|
-
import {
|
|
11
|
-
import { Sonamu } from "./sonamu";
|
|
13
|
+
import type { ApiParam, ApiParamType } from "../types/types";
|
|
12
14
|
import type { UploadContext } from "./context";
|
|
15
|
+
import { Sonamu } from "./sonamu";
|
|
13
16
|
|
|
14
17
|
export interface GuardKeys {
|
|
15
18
|
query: true;
|
|
@@ -17,11 +20,7 @@ export interface GuardKeys {
|
|
|
17
20
|
user: true;
|
|
18
21
|
}
|
|
19
22
|
export type GuardKey = keyof GuardKeys;
|
|
20
|
-
export type ServiceClient =
|
|
21
|
-
| "axios"
|
|
22
|
-
| "axios-multipart"
|
|
23
|
-
| "swr"
|
|
24
|
-
| "window-fetch";
|
|
23
|
+
export type ServiceClient = "axios" | "axios-multipart" | "swr" | "window-fetch";
|
|
25
24
|
export type ApiDecoratorOptions = {
|
|
26
25
|
httpMethod?: HTTPMethods;
|
|
27
26
|
contentType?:
|
|
@@ -39,6 +38,7 @@ export type ApiDecoratorOptions = {
|
|
|
39
38
|
};
|
|
40
39
|
export type StreamDecoratorOptions = {
|
|
41
40
|
type: "sse"; // | 'ws
|
|
41
|
+
// biome-ignore lint/suspicious/noExplicitAny: 이벤트 키별로 넘겨주는 값이므로 어떤 타입이든 상관없음
|
|
42
42
|
events: z.ZodObject<any>;
|
|
43
43
|
path?: string;
|
|
44
44
|
resourceName?: string;
|
|
@@ -49,6 +49,9 @@ export type UploadDecoratorOptions = {
|
|
|
49
49
|
mode?: "single" | "multiple";
|
|
50
50
|
};
|
|
51
51
|
export const registeredApis: {
|
|
52
|
+
/**
|
|
53
|
+
* modelName은 모델 클래스 이름입니다. (ex. "UserModel")
|
|
54
|
+
*/
|
|
52
55
|
modelName: string;
|
|
53
56
|
methodName: string;
|
|
54
57
|
path: string;
|
|
@@ -67,6 +70,23 @@ export type ExtendedApi = {
|
|
|
67
70
|
parameters: ApiParam[];
|
|
68
71
|
returnType: ApiParamType;
|
|
69
72
|
};
|
|
73
|
+
type DecoratorTarget = { constructor: { name: string } };
|
|
74
|
+
|
|
75
|
+
const DECORATOR_TYPES = {
|
|
76
|
+
API: Symbol("api"),
|
|
77
|
+
STREAM: Symbol("stream"),
|
|
78
|
+
} as const;
|
|
79
|
+
|
|
80
|
+
function checkSingleDecorator(target: DecoratorTarget, propertyKey: string, decoratorType: symbol) {
|
|
81
|
+
const method = target[propertyKey as keyof typeof target] as { __decoratorType?: symbol };
|
|
82
|
+
if (method?.__decoratorType && method?.__decoratorType !== decoratorType) {
|
|
83
|
+
throw new Error(
|
|
84
|
+
`@${String(decoratorType)} decorator can only be used once on ${target.constructor.name}.${propertyKey}. You can use only one of @api or @stream decorator on the same method.`,
|
|
85
|
+
);
|
|
86
|
+
} else {
|
|
87
|
+
method.__decoratorType = decoratorType;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
70
90
|
|
|
71
91
|
export function api(options: ApiDecoratorOptions = {}) {
|
|
72
92
|
options = {
|
|
@@ -76,26 +96,43 @@ export function api(options: ApiDecoratorOptions = {}) {
|
|
|
76
96
|
...options,
|
|
77
97
|
};
|
|
78
98
|
|
|
79
|
-
return
|
|
80
|
-
const modelName = target.constructor.name.match(/(.+)Class$/)
|
|
99
|
+
return (target: DecoratorTarget, propertyKey: string) => {
|
|
100
|
+
const modelName = target.constructor.name.match(/(.+)Class$/)?.[1];
|
|
101
|
+
assert(
|
|
102
|
+
modelName,
|
|
103
|
+
`modelName is required on @api decorator on ${target.constructor.name}.${propertyKey}`,
|
|
104
|
+
);
|
|
81
105
|
const methodName = propertyKey;
|
|
82
106
|
|
|
107
|
+
// 메서드에 걸린 데코레이터 중복 체크
|
|
108
|
+
checkSingleDecorator(target, propertyKey, DECORATOR_TYPES.API);
|
|
109
|
+
|
|
83
110
|
const defaultPath = `/${inflection.camelize(
|
|
84
111
|
modelName.replace(/Model$/, "").replace(/Frame$/, ""),
|
|
85
|
-
true
|
|
112
|
+
true,
|
|
86
113
|
)}/${inflection.camelize(propertyKey, true)}`;
|
|
114
|
+
const path = options.path ?? defaultPath;
|
|
87
115
|
|
|
88
116
|
// 기존 동일한 메서드가 있는지 확인 후 있는 경우 override
|
|
89
117
|
const existingApi = registeredApis.find(
|
|
90
|
-
(api) => api.modelName === modelName && api.methodName === methodName
|
|
118
|
+
(api) => api.modelName === modelName && api.methodName === methodName,
|
|
91
119
|
);
|
|
92
120
|
if (existingApi) {
|
|
93
|
-
|
|
121
|
+
// 기존의 path와 새로운 path가 다르다면(=빈 스트링이 아니었는데 다른 스트링으로 바뀌게 된다면) 에러를 터뜨려줍니다.
|
|
122
|
+
assertNoConflictingPath("api", modelName, methodName, existingApi.path, path);
|
|
123
|
+
existingApi.path = path;
|
|
124
|
+
|
|
125
|
+
// 기존의 옵션과 새로운 옵션이 겹치는 부분이 있다면 에러를 터뜨려줍니다.
|
|
126
|
+
assertNoConflictingOptions("api", modelName, methodName, existingApi.options, options);
|
|
127
|
+
existingApi.options = {
|
|
128
|
+
...existingApi.options, // 기존의 옵션을 존중하되
|
|
129
|
+
...options, // @api 데코레이터의 옵션을 추가합니다.
|
|
130
|
+
};
|
|
94
131
|
} else {
|
|
95
132
|
registeredApis.push({
|
|
96
133
|
modelName,
|
|
97
134
|
methodName,
|
|
98
|
-
path
|
|
135
|
+
path,
|
|
99
136
|
options,
|
|
100
137
|
});
|
|
101
138
|
}
|
|
@@ -103,29 +140,55 @@ export function api(options: ApiDecoratorOptions = {}) {
|
|
|
103
140
|
}
|
|
104
141
|
|
|
105
142
|
export function stream(options: StreamDecoratorOptions) {
|
|
106
|
-
return
|
|
107
|
-
const modelName = target.constructor.name.match(/(.+)Class$/)
|
|
143
|
+
return (target: DecoratorTarget, propertyKey: string) => {
|
|
144
|
+
const modelName = target.constructor.name.match(/(.+)Class$/)?.[1];
|
|
145
|
+
assert(
|
|
146
|
+
modelName,
|
|
147
|
+
`modelName is required on @stream decorator on ${target.constructor.name}.${propertyKey}`,
|
|
148
|
+
);
|
|
108
149
|
const methodName = propertyKey;
|
|
109
150
|
|
|
151
|
+
// 메서드에 걸린 데코레이터 중복 체크
|
|
152
|
+
checkSingleDecorator(target, propertyKey, DECORATOR_TYPES.STREAM);
|
|
153
|
+
|
|
110
154
|
const defaultPath = `/${inflection.camelize(
|
|
111
155
|
modelName.replace(/Model$/, "").replace(/Frame$/, ""),
|
|
112
|
-
true
|
|
156
|
+
true,
|
|
113
157
|
)}/${inflection.camelize(propertyKey, true)}`;
|
|
158
|
+
const path = options.path ?? defaultPath;
|
|
159
|
+
const optionsWithDefaults = {
|
|
160
|
+
...options,
|
|
161
|
+
httpMethod: "GET" as HTTPMethods,
|
|
162
|
+
};
|
|
114
163
|
|
|
115
164
|
const existingApi = registeredApis.find(
|
|
116
|
-
(api) => api.modelName === modelName && api.methodName === methodName
|
|
165
|
+
(api) => api.modelName === modelName && api.methodName === methodName,
|
|
117
166
|
);
|
|
118
167
|
if (existingApi) {
|
|
119
|
-
|
|
168
|
+
// 기존의 path와 새로운 path가 다르다면(=빈 스트링이 아니었는데 다른 스트링으로 바뀌게 된다면) 에러를 터뜨려줍니다.
|
|
169
|
+
assertNoConflictingPath("stream", modelName, methodName, existingApi.path, path);
|
|
170
|
+
existingApi.path = path;
|
|
171
|
+
|
|
172
|
+
// 기존의 옵션과 새로운 옵션이 겹치는 부분이 있다면 에러를 터뜨려줍니다.
|
|
173
|
+
assertNoConflictingOptions(
|
|
174
|
+
"stream",
|
|
175
|
+
modelName,
|
|
176
|
+
methodName,
|
|
177
|
+
existingApi.options,
|
|
178
|
+
optionsWithDefaults,
|
|
179
|
+
);
|
|
180
|
+
existingApi.options = {
|
|
181
|
+
...existingApi.options, // 기존의 옵션을 존중하되
|
|
182
|
+
...optionsWithDefaults, // @stream 데코레이터의 옵션을 추가합니다.
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
existingApi.streamOptions = options;
|
|
120
186
|
} else {
|
|
121
187
|
registeredApis.push({
|
|
122
188
|
modelName,
|
|
123
189
|
methodName,
|
|
124
|
-
path
|
|
125
|
-
options:
|
|
126
|
-
...options,
|
|
127
|
-
httpMethod: "GET",
|
|
128
|
-
},
|
|
190
|
+
path,
|
|
191
|
+
options: optionsWithDefaults,
|
|
129
192
|
streamOptions: options,
|
|
130
193
|
});
|
|
131
194
|
}
|
|
@@ -135,14 +198,10 @@ export function stream(options: StreamDecoratorOptions) {
|
|
|
135
198
|
export function transactional(options: TransactionalOptions = {}) {
|
|
136
199
|
const { isolation, readOnly, dbPreset = "w" } = options;
|
|
137
200
|
|
|
138
|
-
return
|
|
139
|
-
_target: Object,
|
|
140
|
-
_propertyKey: string,
|
|
141
|
-
descriptor: PropertyDescriptor
|
|
142
|
-
) {
|
|
201
|
+
return (_target: DecoratorTarget, _propertyKey: string, descriptor: PropertyDescriptor) => {
|
|
143
202
|
const originalMethod = descriptor.value;
|
|
144
203
|
|
|
145
|
-
descriptor.value = async function (this:
|
|
204
|
+
descriptor.value = async function (this: BaseModelClass, ...args: unknown[]) {
|
|
146
205
|
const existingContext = DB.transactionStorage.getStore();
|
|
147
206
|
|
|
148
207
|
// 이미 AsyncLocalStorage 컨텍스트 안에 있는지 확인
|
|
@@ -159,10 +218,7 @@ export function transactional(options: TransactionalOptions = {}) {
|
|
|
159
218
|
|
|
160
219
|
return puri.knex.transaction(
|
|
161
220
|
async (trx) => {
|
|
162
|
-
const trxWrapper = new PuriTransactionWrapper(
|
|
163
|
-
trx,
|
|
164
|
-
this.getUpsertBuilder()
|
|
165
|
-
);
|
|
221
|
+
const trxWrapper = new PuriTransactionWrapper(trx, this.getUpsertBuilder());
|
|
166
222
|
// TransactionContext에 트랜잭션 저장
|
|
167
223
|
DB.getTransactionContext().setTransaction(dbPreset, trxWrapper);
|
|
168
224
|
|
|
@@ -173,7 +229,7 @@ export function transactional(options: TransactionalOptions = {}) {
|
|
|
173
229
|
DB.getTransactionContext().deleteTransaction(dbPreset);
|
|
174
230
|
}
|
|
175
231
|
},
|
|
176
|
-
{ isolationLevel: isolation, readOnly }
|
|
232
|
+
{ isolationLevel: isolation, readOnly },
|
|
177
233
|
);
|
|
178
234
|
};
|
|
179
235
|
|
|
@@ -190,25 +246,42 @@ export function transactional(options: TransactionalOptions = {}) {
|
|
|
190
246
|
};
|
|
191
247
|
}
|
|
192
248
|
|
|
249
|
+
/**
|
|
250
|
+
* api 데코레이터와 함께 사용할 수 있습니다.
|
|
251
|
+
* @param options
|
|
252
|
+
* @returns
|
|
253
|
+
*/
|
|
193
254
|
export function upload(options: UploadDecoratorOptions = {}) {
|
|
194
|
-
return
|
|
195
|
-
_target: Object,
|
|
196
|
-
_propertyKey: string,
|
|
197
|
-
descriptor: PropertyDescriptor
|
|
198
|
-
) {
|
|
255
|
+
return (_target: DecoratorTarget, _propertyKey: string, descriptor: PropertyDescriptor) => {
|
|
199
256
|
const originalMethod = descriptor.value;
|
|
200
|
-
const modelName = _target.constructor.name.match(/(.+)Class$/)
|
|
257
|
+
const modelName = _target.constructor.name.match(/(.+)Class$/)?.[1];
|
|
258
|
+
assert(
|
|
259
|
+
modelName,
|
|
260
|
+
`modelName is required on @upload decorator on ${_target.constructor.name}.${_propertyKey}`,
|
|
261
|
+
);
|
|
201
262
|
const methodName = _propertyKey;
|
|
202
263
|
|
|
203
264
|
// registeredApis에서 해당 API 찾아서 uploadOptions 추가
|
|
204
265
|
const existingApi = registeredApis.find(
|
|
205
|
-
(api) => api.modelName === modelName && api.methodName === methodName
|
|
266
|
+
(api) => api.modelName === modelName && api.methodName === methodName,
|
|
206
267
|
);
|
|
207
268
|
if (existingApi) {
|
|
208
269
|
existingApi.uploadOptions = options;
|
|
270
|
+
} else {
|
|
271
|
+
// 이 메소드에 붙은 @api 데코레이터가 아직 eval되지 않은 상황입니다. (만약 @api가 안 붙어 있었다면 심각한 상황입니다..!)
|
|
272
|
+
// 여기에서 최초로 modelName과 methodName에 대해 registeredApis에 하나를 추가해주어야 합니다.
|
|
273
|
+
// uploadOptions는 그대로 추가하고, path는 빈 스트링으로 추가해줍니다.
|
|
274
|
+
// 이후 @api 데코레이터가 eval되면 실제 path로 덮어씌워지고, options가 추가됩니다.
|
|
275
|
+
registeredApis.push({
|
|
276
|
+
modelName,
|
|
277
|
+
methodName,
|
|
278
|
+
path: "",
|
|
279
|
+
options: {},
|
|
280
|
+
uploadOptions: options,
|
|
281
|
+
});
|
|
209
282
|
}
|
|
210
283
|
|
|
211
|
-
descriptor.value = async function (this:
|
|
284
|
+
descriptor.value = async function (this: BaseModelClass, ...args: unknown[]) {
|
|
212
285
|
const { request } = Sonamu.getContext();
|
|
213
286
|
const uploadContext: UploadContext = {
|
|
214
287
|
file: undefined,
|
|
@@ -225,6 +298,7 @@ export function upload(options: UploadDecoratorOptions = {}) {
|
|
|
225
298
|
const rawFilesIterator = request.files();
|
|
226
299
|
for await (const rawFile of rawFilesIterator) {
|
|
227
300
|
if (rawFile) {
|
|
301
|
+
await rawFile.toBuffer();
|
|
228
302
|
uploadContext.files.push(new FileStorage(rawFile, storage));
|
|
229
303
|
}
|
|
230
304
|
}
|
|
@@ -243,3 +317,59 @@ export function upload(options: UploadDecoratorOptions = {}) {
|
|
|
243
317
|
return descriptor;
|
|
244
318
|
};
|
|
245
319
|
}
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* 기존의 path와 새로운 path가 다르다면(=값이 있던 스트링이 다른 값이 있는 스트링으로 바뀌게 된다면) 에러를 터뜨려줍니다.
|
|
323
|
+
* @param decoratorName 데코레이터 이름
|
|
324
|
+
* @param modelName 모델 이름
|
|
325
|
+
* @param methodName 메서드 이름
|
|
326
|
+
* @param existingPath 기존의 path
|
|
327
|
+
* @param newPath 새로운 path
|
|
328
|
+
*/
|
|
329
|
+
function assertNoConflictingPath(
|
|
330
|
+
decoratorName: string,
|
|
331
|
+
modelName: string,
|
|
332
|
+
methodName: string,
|
|
333
|
+
existingPath: string,
|
|
334
|
+
newPath: string,
|
|
335
|
+
) {
|
|
336
|
+
if (existingPath !== "" && newPath !== "" && existingPath !== newPath) {
|
|
337
|
+
// 이것이 무슨 상황이냐면요, api.path가 덮어씌워지는 상황입니다.
|
|
338
|
+
// 가령 @api({ path: "/api/v1/users" }) 데코레이터가 붙어있는 메서드에
|
|
339
|
+
// @stream({ path: "/api/v1/users/stream" }) 같은 것이 붙어 있는 상황입니다.
|
|
340
|
+
// 이렇게 되면 두 데코레이터가 같은 api의 path 필드를 건드리게 되므로, 에러를 터뜨려줍니다.
|
|
341
|
+
throw new Error(
|
|
342
|
+
`@${decoratorName} decorator on ${modelName}.${methodName} has conflicting path: ${newPath}. The decorator is trying to override the existing path(${existingPath}) with the new path(${newPath}).`,
|
|
343
|
+
);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* 기존의 옵션과 새로운 옵션이 겹치는 부분이 있다면 에러를 터뜨려줍니다.
|
|
349
|
+
* @param decoratorName 데코레이터 이름
|
|
350
|
+
* @param modelName 모델 이름
|
|
351
|
+
* @param methodName 메서드 이름
|
|
352
|
+
* @param existingOptions 기존의 옵션
|
|
353
|
+
* @param newOptions 새로운 옵션
|
|
354
|
+
*/
|
|
355
|
+
function assertNoConflictingOptions(
|
|
356
|
+
decoratorName: string,
|
|
357
|
+
modelName: string,
|
|
358
|
+
methodName: string,
|
|
359
|
+
// biome-ignore lint/suspicious/noExplicitAny: <아 쉽게쉽게 좀 갑시다>
|
|
360
|
+
existingOptions: Record<string, any>,
|
|
361
|
+
// biome-ignore lint/suspicious/noExplicitAny: <이럴 때 아니면 any 언제 씁니까>
|
|
362
|
+
newOptions: Record<string, any>,
|
|
363
|
+
) {
|
|
364
|
+
Object.keys(newOptions).forEach((key) => {
|
|
365
|
+
if (existingOptions[key] && !isEqual(existingOptions[key], newOptions[key])) {
|
|
366
|
+
// 이것이 무슨 상황이냐면요, api.options가 덮어씌워지는 상황입니다.
|
|
367
|
+
// 가령 @api({ resourceName: "Users" }) 데코레이터가 붙어있는 메서드에
|
|
368
|
+
// @stream({ resourceName: "Posts" }) 같은 것이 붙어 있는 상황입니다.
|
|
369
|
+
// 이렇게 되면 두 데코레이터가 같은 api의 options 속 같은 필드를 건드리게 되므로, 에러를 터뜨려줍니다.
|
|
370
|
+
throw new Error(
|
|
371
|
+
`@${decoratorName} decorator on ${modelName}.${methodName} has conflicting options: ${key}. The decorator is trying to override the existing option(${JSON.stringify(existingOptions[key])}) with the new option(${JSON.stringify(newOptions[key])}).`,
|
|
372
|
+
);
|
|
373
|
+
}
|
|
374
|
+
});
|
|
375
|
+
}
|
package/src/api/index.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
export * from "../file-storage/driver";
|
|
2
|
+
export * from "../file-storage/file-storage";
|
|
1
3
|
export * from "./caster";
|
|
2
4
|
export * from "./code-converters";
|
|
3
5
|
export * from "./context";
|
|
4
6
|
export * from "./decorators";
|
|
5
|
-
export * from "../file-storage/driver";
|
|
6
|
-
export * from "../file-storage/file-storage";
|
|
7
7
|
export * from "./sonamu";
|