sonamu 0.5.7 → 0.6.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/dist/api/base-frame.js +12 -2
- package/dist/api/caster.js +66 -2
- package/dist/api/code-converters.js +489 -2
- package/dist/api/config.d.ts +76 -0
- package/dist/api/config.d.ts.map +1 -0
- package/dist/api/config.js +32 -0
- package/dist/api/context.d.ts +1 -0
- package/dist/api/context.d.ts.map +1 -1
- package/dist/api/context.js +3 -2
- package/dist/api/decorators.d.ts.map +1 -1
- package/dist/api/decorators.js +142 -2
- package/dist/api/index.js +9 -2
- package/dist/api/sonamu.d.ts +8 -22
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +482 -2
- package/dist/bin/build-config.d.ts +2 -1
- package/dist/bin/build-config.d.ts.map +1 -1
- package/dist/bin/build-config.js +12 -2
- package/dist/bin/cli-wrapper.js +71 -2
- package/dist/bin/cli.js +418 -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/database/_batch_update.js +78 -2
- package/dist/database/base-model.js +247 -2
- package/dist/database/code-generator.js +53 -2
- package/dist/database/db.d.ts +2 -16
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +132 -2
- package/dist/database/knex-plugins/knex-on-duplicate-update.js +39 -2
- package/dist/database/puri-wrapper.js +109 -2
- package/dist/database/puri.d.ts +23 -16
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +539 -2
- package/dist/database/puri.types.d.ts +8 -3
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +3 -2
- package/dist/database/transaction-context.js +14 -2
- package/dist/database/upsert-builder.js +215 -2
- package/dist/entity/entity-manager.d.ts +3 -1
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity-manager.js +114 -2
- package/dist/entity/entity-utils.js +210 -2
- package/dist/entity/entity.d.ts.map +1 -1
- package/dist/entity/entity.js +651 -2
- package/dist/exceptions/error-handler.js +29 -2
- package/dist/exceptions/so-exceptions.js +85 -2
- package/dist/file-storage/driver.js +79 -2
- package/dist/file-storage/file-storage.js +75 -2
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +28 -2
- package/dist/migration/code-generation.js +558 -2
- package/dist/migration/migration-set.js +364 -2
- package/dist/migration/migrator.d.ts +0 -9
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +510 -2
- package/dist/migration/types.js +3 -2
- package/dist/naite/naite.d.ts +12 -0
- package/dist/naite/naite.d.ts.map +1 -0
- package/dist/naite/naite.js +72 -0
- package/dist/stream/index.js +3 -2
- package/dist/stream/sse.js +38 -2
- package/dist/syncer/api-parser.d.ts +20 -0
- package/dist/syncer/api-parser.d.ts.map +1 -0
- package/dist/syncer/api-parser.js +229 -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 +141 -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 +58 -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 +82 -0
- package/dist/syncer/syncer.d.ts +93 -108
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +375 -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 +101 -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 +87 -0
- package/dist/{templates → template/implementations}/generated.template.d.ts +3 -3
- package/dist/template/implementations/generated.template.d.ts.map +1 -0
- package/dist/template/implementations/generated.template.js +232 -0
- package/dist/{templates → template/implementations}/generated_http.template.d.ts +3 -3
- 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 +3 -3
- package/dist/template/implementations/generated_sso.template.d.ts.map +1 -0
- package/dist/template/implementations/generated_sso.template.js +105 -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 +171 -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 +193 -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 +465 -0
- package/dist/{templates → template/implementations}/view_list_columns.template.d.ts +3 -3
- 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 +5 -0
- package/dist/template/index.d.ts.map +1 -0
- package/dist/template/index.js +6 -0
- package/dist/template/template.d.ts +39 -0
- package/dist/template/template.d.ts.map +1 -0
- package/dist/template/template.js +47 -0
- package/dist/template/zod-converter.d.ts +18 -0
- package/dist/template/zod-converter.d.ts.map +1 -0
- package/dist/template/zod-converter.js +166 -0
- package/dist/testing/_relation-graph.js +80 -2
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +521 -2
- package/dist/types/types.d.ts +39 -40
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +289 -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.js +26 -2
- package/dist/utils/esm-utils.d.ts +45 -0
- package/dist/utils/esm-utils.d.ts.map +1 -0
- package/dist/utils/esm-utils.js +56 -0
- package/dist/utils/fs-utils.js +17 -2
- package/dist/utils/lodash-able.js +6 -2
- package/dist/utils/model.js +22 -2
- 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.js +35 -2
- package/dist/utils/utils.d.ts +4 -7
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +33 -2
- package/dist/utils/zod-error.d.ts.map +1 -1
- package/dist/utils/zod-error.js +19 -2
- package/package.json +21 -8
- package/src/api/code-converters.ts +2 -2
- package/src/api/config.ts +142 -0
- package/src/api/context.ts +1 -0
- package/src/api/decorators.ts +1 -0
- package/src/api/sonamu.ts +81 -67
- package/src/bin/build-config.ts +2 -1
- package/src/bin/cli-wrapper.ts +10 -3
- package/src/bin/cli.ts +108 -56
- package/src/bin/hot-hook-register.ts +22 -0
- package/src/database/base-model.ts +1 -1
- package/src/database/code-generator.ts +1 -1
- package/src/database/db.ts +10 -52
- package/src/database/puri.ts +78 -53
- package/src/database/puri.types.ts +18 -5
- package/src/database/upsert-builder.ts +1 -1
- package/src/entity/entity-manager.ts +19 -15
- package/src/entity/entity.ts +4 -3
- package/src/index.ts +2 -0
- package/src/migration/code-generation.ts +1 -1
- package/src/migration/migration-set.ts +1 -1
- package/src/migration/migrator.ts +23 -152
- package/src/naite/naite.ts +70 -0
- package/src/syncer/api-parser.ts +299 -0
- package/src/syncer/checksum.ts +152 -0
- package/src/syncer/code-generator.ts +202 -0
- package/src/syncer/entity-operations.ts +68 -0
- package/src/syncer/file-patterns.ts +56 -0
- package/src/syncer/index.ts +6 -0
- package/src/syncer/module-loader.ts +125 -0
- package/src/syncer/syncer.ts +363 -1420
- package/src/template/entity-converter.ts +123 -0
- package/src/template/helpers.ts +84 -0
- package/src/{templates → template/implementations}/entity.template.ts +4 -4
- package/src/{templates → template/implementations}/generated.template.ts +9 -9
- package/src/{templates → template/implementations}/generated_http.template.ts +9 -6
- package/src/{templates → template/implementations}/generated_sso.template.ts +7 -7
- package/src/{templates → template/implementations}/init_types.template.ts +4 -4
- package/src/{templates → template/implementations}/model.template.ts +9 -9
- package/src/{templates → template/implementations}/model_test.template.ts +5 -5
- package/src/{templates → template/implementations}/service.template.ts +19 -11
- package/src/{templates → template/implementations}/view_enums_buttonset.template.ts +3 -3
- package/src/{templates → template/implementations}/view_enums_dropdown.template.ts +5 -21
- package/src/{templates → template/implementations}/view_enums_select.template.ts +4 -4
- package/src/{templates → template/implementations}/view_form.template.ts +11 -13
- package/src/{templates → template/implementations}/view_id_all_select.template.ts +3 -3
- package/src/{templates → template/implementations}/view_id_async_select.template.ts +3 -3
- package/src/{templates → template/implementations}/view_list.template.ts +13 -64
- package/src/{templates → template/implementations}/view_list_columns.template.ts +3 -3
- package/src/{templates → template/implementations}/view_search_input.template.ts +3 -3
- package/src/template/index.ts +4 -0
- package/src/template/template.ts +86 -0
- package/src/template/zod-converter.ts +219 -0
- package/src/testing/fixture-manager.ts +8 -1
- package/src/types/types.ts +38 -61
- package/src/utils/async-utils.ts +17 -0
- package/src/utils/console-util.ts +4 -0
- package/src/utils/esm-utils.ts +69 -0
- package/src/utils/path-utils.ts +102 -0
- package/src/utils/process-utils.ts +46 -0
- package/src/utils/sql-parser.ts +1 -1
- package/src/utils/utils.ts +14 -40
- package/src/utils/zod-error.ts +0 -1
- 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.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.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.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.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/templates/base-template.ts +0 -19
- package/src/templates/index.ts +0 -1
package/dist/migration/types.js
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
export { };
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb24vdHlwZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU29uYW11REJDb25maWcgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IEdlbk1pZ3JhdGlvbkNvZGUgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcblxuZXhwb3J0IHR5cGUgTWlncmF0aW9uQ29kZSA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgQ29ublN0cmluZyA9XG4gIGAke1wibXlzcWwyXCJ9Oi8vJHtzdHJpbmd9QCR7c3RyaW5nfToke251bWJlcn0vJHtzdHJpbmd9YDsgLy8gbXlzcWwyOi8vYWNjb3VudEBob3N0OnBvcnQvZGF0YWJhc2VcbmV4cG9ydCB0eXBlIE1pZ3JhdGlvblN0YXR1cyA9IHtcbiAgY29kZXM6IE1pZ3JhdGlvbkNvZGVbXTtcbiAgY29ubnM6IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgY29ubktleToga2V5b2YgU29uYW11REJDb25maWc7XG4gICAgY29ublN0cmluZzogQ29ublN0cmluZztcbiAgICBjdXJyZW50VmVyc2lvbjogc3RyaW5nO1xuICAgIHN0YXR1czogc3RyaW5nIHwgbnVtYmVyO1xuICAgIHBlbmRpbmc6IHN0cmluZ1tdO1xuICB9W107XG4gIHByZXBhcmVkQ29kZXM6IEdlbk1pZ3JhdGlvbkNvZGVbXTtcbn07XG5leHBvcnQgdHlwZSBEQkNvbHVtbiA9IHtcbiAgRmllbGQ6IHN0cmluZztcbiAgVHlwZTogc3RyaW5nO1xuICBOdWxsOiBzdHJpbmc7XG4gIEtleTogc3RyaW5nO1xuICBEZWZhdWx0OiBzdHJpbmcgfCBudWxsO1xuICBFeHRyYTogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIERCSW5kZXggPSB7XG4gIFRhYmxlOiBzdHJpbmc7XG4gIE5vbl91bmlxdWU6IG51bWJlcjtcbiAgS2V5X25hbWU6IHN0cmluZztcbiAgU2VxX2luX2luZGV4OiBudW1iZXI7XG4gIENvbHVtbl9uYW1lOiBzdHJpbmc7XG4gIENvbGxhdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgQ2FyZGluYWxpdHk6IG51bWJlciB8IG51bGw7XG4gIFN1Yl9wYXJ0OiBudW1iZXIgfCBudWxsO1xuICBQYWNrZWQ6IHN0cmluZyB8IG51bGw7XG4gIE51bGw6IHN0cmluZztcbiAgSW5kZXhfdHlwZTogc3RyaW5nO1xuICBDb21tZW50OiBzdHJpbmc7XG4gIEluZGV4X2NvbW1lbnQ6IHN0cmluZztcbiAgVmlzaWJsZTogc3RyaW5nO1xuICBFeHByZXNzaW9uOiBzdHJpbmcgfCBudWxsO1xufTtcbmV4cG9ydCB0eXBlIERCRm9yZWlnbiA9IHtcbiAga2V5TmFtZTogc3RyaW5nO1xuICBmcm9tOiBzdHJpbmc7XG4gIHJlZmVyZW5jZXNUYWJsZTogc3RyaW5nO1xuICByZWZlcmVuY2VzRmllbGQ6IHN0cmluZztcbiAgb25EZWxldGU6IHN0cmluZztcbiAgb25VcGRhdGU6IHN0cmluZztcbn07XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBOENBLFdBT0UifQ==
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare class Naite {
|
|
2
|
+
static t(name: string, value: any): void;
|
|
3
|
+
static get(name: string): any;
|
|
4
|
+
static getAll(): {
|
|
5
|
+
[key: string]: any;
|
|
6
|
+
};
|
|
7
|
+
static d(_message: string): void;
|
|
8
|
+
static i(_message: string): void;
|
|
9
|
+
static w(_message: string): void;
|
|
10
|
+
static e(_message: string): void;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=naite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"naite.d.ts","sourceRoot":"","sources":["../../src/naite/naite.ts"],"names":[],"mappings":"AAEA,qBAAa,KAAK;IAEhB,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAuBjC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG;IAS7B,MAAM,CAAC,MAAM,IAAI;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE;IAiBvC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM;IAIzB,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM;IAIzB,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM;IAIzB,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM;CAI1B"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { Sonamu } from "../api/sonamu.js";
|
|
2
|
+
export class Naite {
|
|
3
|
+
// 테스트 로그 기록
|
|
4
|
+
static t(name, value) {
|
|
5
|
+
const context = Sonamu.getContext();
|
|
6
|
+
const store = context?.naiteStore;
|
|
7
|
+
if (!store) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
if (store.has(name)) {
|
|
11
|
+
// 이미 값이 있는 경우
|
|
12
|
+
if (Array.isArray(store.get(name))) {
|
|
13
|
+
// 배열에 추가
|
|
14
|
+
store.set(name, [
|
|
15
|
+
...store.get(name),
|
|
16
|
+
value
|
|
17
|
+
]);
|
|
18
|
+
} else {
|
|
19
|
+
// 배열이 아닌 경우 배열로 변환
|
|
20
|
+
store.set(name, [
|
|
21
|
+
store.get(name),
|
|
22
|
+
value
|
|
23
|
+
]);
|
|
24
|
+
}
|
|
25
|
+
} else {
|
|
26
|
+
// 값이 없는 경우 추가
|
|
27
|
+
store.set(name, value);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// 테스트에서 값 가져오기
|
|
31
|
+
static get(name) {
|
|
32
|
+
const context = Sonamu.getContext();
|
|
33
|
+
if (!context?.naiteStore || !context.naiteStore.has(name)) {
|
|
34
|
+
throw new Error(`Naite.get: \`${name}\` not found`);
|
|
35
|
+
}
|
|
36
|
+
return context?.naiteStore?.get(name);
|
|
37
|
+
}
|
|
38
|
+
// 전체 리스트 가져오기
|
|
39
|
+
static getAll() {
|
|
40
|
+
const context = Sonamu.getContext();
|
|
41
|
+
if (!context?.naiteStore) {
|
|
42
|
+
return {};
|
|
43
|
+
}
|
|
44
|
+
return Object.fromEntries(context.naiteStore.entries());
|
|
45
|
+
}
|
|
46
|
+
// expect 래퍼 (CJS-ESM 이슈로 현재 사용불가)
|
|
47
|
+
// static expect(name: string) {
|
|
48
|
+
// if (!this.vitestExpect) {
|
|
49
|
+
// throw new Error("Vitest is not initialized");
|
|
50
|
+
// }
|
|
51
|
+
// return this.vitestExpect(this.get(name));
|
|
52
|
+
// }
|
|
53
|
+
// 일반 로그 레벨
|
|
54
|
+
static d(_message) {
|
|
55
|
+
// TODO: Logger 연결
|
|
56
|
+
console.log(`[DEBUG] ${_message}`);
|
|
57
|
+
}
|
|
58
|
+
static i(_message) {
|
|
59
|
+
// TODO: Logger 연결
|
|
60
|
+
console.log(`[INFO] ${_message}`);
|
|
61
|
+
}
|
|
62
|
+
static w(_message) {
|
|
63
|
+
// TODO: Logger 연결
|
|
64
|
+
console.log(`[WARN] ${_message}`);
|
|
65
|
+
}
|
|
66
|
+
static e(_message) {
|
|
67
|
+
// TODO: Logger 연결
|
|
68
|
+
console.log(`[ERROR] ${_message}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9uYWl0ZS9uYWl0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuXG5leHBvcnQgY2xhc3MgTmFpdGUge1xuICAvLyDthYzsiqTtirgg66Gc6re4IOq4sOuhnVxuICBzdGF0aWMgdChuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICBjb25zdCBjb250ZXh0ID0gU29uYW11LmdldENvbnRleHQoKTtcbiAgICBjb25zdCBzdG9yZSA9IGNvbnRleHQ/Lm5haXRlU3RvcmU7XG5cbiAgICBpZiAoIXN0b3JlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzdG9yZS5oYXMobmFtZSkpIHtcbiAgICAgIC8vIOydtOuvuCDqsJLsnbQg7J6I64qUIOqyveyasFxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3RvcmUuZ2V0KG5hbWUpKSkge1xuICAgICAgICAvLyDrsLDsl7Tsl5Ag7LaU6rCAXG4gICAgICAgIHN0b3JlLnNldChuYW1lLCBbLi4uc3RvcmUuZ2V0KG5hbWUpLCB2YWx1ZV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g67Cw7Je07J20IOyVhOuLjCDqsr3smrAg67Cw7Je066GcIOuzgO2ZmFxuICAgICAgICBzdG9yZS5zZXQobmFtZSwgW3N0b3JlLmdldChuYW1lKSwgdmFsdWVdKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8g6rCS7J20IOyXhuuKlCDqsr3smrAg7LaU6rCAXG4gICAgICBzdG9yZS5zZXQobmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIO2FjOyKpO2KuOyXkOyEnCDqsJIg6rCA7KC47Jik6riwXG4gIHN0YXRpYyBnZXQobmFtZTogc3RyaW5nKTogYW55IHtcbiAgICBjb25zdCBjb250ZXh0ID0gU29uYW11LmdldENvbnRleHQoKTtcbiAgICBpZiAoIWNvbnRleHQ/Lm5haXRlU3RvcmUgfHwgIWNvbnRleHQubmFpdGVTdG9yZS5oYXMobmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTmFpdGUuZ2V0OiBcXGAke25hbWV9XFxgIG5vdCBmb3VuZGApO1xuICAgIH1cbiAgICByZXR1cm4gY29udGV4dD8ubmFpdGVTdG9yZT8uZ2V0KG5hbWUpO1xuICB9XG5cbiAgLy8g7KCE7LK0IOumrOyKpO2KuCDqsIDsoLjsmKTquLBcbiAgc3RhdGljIGdldEFsbCgpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHtcbiAgICBjb25zdCBjb250ZXh0ID0gU29uYW11LmdldENvbnRleHQoKTtcbiAgICBpZiAoIWNvbnRleHQ/Lm5haXRlU3RvcmUpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhjb250ZXh0Lm5haXRlU3RvcmUuZW50cmllcygpKTtcbiAgfVxuXG4gIC8vIGV4cGVjdCDrnpjtjbwgKENKUy1FU00g7J207IqI66GcIO2YhOyerCDsgqzsmqnrtojqsIApXG4gIC8vIHN0YXRpYyBleHBlY3QobmFtZTogc3RyaW5nKSB7XG4gIC8vICAgaWYgKCF0aGlzLnZpdGVzdEV4cGVjdCkge1xuICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKFwiVml0ZXN0IGlzIG5vdCBpbml0aWFsaXplZFwiKTtcbiAgLy8gICB9XG4gIC8vICAgcmV0dXJuIHRoaXMudml0ZXN0RXhwZWN0KHRoaXMuZ2V0KG5hbWUpKTtcbiAgLy8gfVxuXG4gIC8vIOydvOuwmCDroZzqt7gg66CI67KoXG4gIHN0YXRpYyBkKF9tZXNzYWdlOiBzdHJpbmcpIHtcbiAgICAvLyBUT0RPOiBMb2dnZXIg7Jew6rKwXG4gICAgY29uc29sZS5sb2coYFtERUJVR10gJHtfbWVzc2FnZX1gKTtcbiAgfVxuICBzdGF0aWMgaShfbWVzc2FnZTogc3RyaW5nKSB7XG4gICAgLy8gVE9ETzogTG9nZ2VyIOyXsOqysFxuICAgIGNvbnNvbGUubG9nKGBbSU5GT10gJHtfbWVzc2FnZX1gKTtcbiAgfVxuICBzdGF0aWMgdyhfbWVzc2FnZTogc3RyaW5nKSB7XG4gICAgLy8gVE9ETzogTG9nZ2VyIOyXsOqysFxuICAgIGNvbnNvbGUubG9nKGBbV0FSTl0gJHtfbWVzc2FnZX1gKTtcbiAgfVxuICBzdGF0aWMgZShfbWVzc2FnZTogc3RyaW5nKSB7XG4gICAgLy8gVE9ETzogTG9nZ2VyIOyXsOqysFxuICAgIGNvbnNvbGUubG9nKGBbRVJST1JdICR7X21lc3NhZ2V9YCk7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJTb25hbXUiLCJOYWl0ZSIsInQiLCJuYW1lIiwidmFsdWUiLCJjb250ZXh0IiwiZ2V0Q29udGV4dCIsInN0b3JlIiwibmFpdGVTdG9yZSIsImhhcyIsIkFycmF5IiwiaXNBcnJheSIsImdldCIsInNldCIsIkVycm9yIiwiZ2V0QWxsIiwiT2JqZWN0IiwiZnJvbUVudHJpZXMiLCJlbnRyaWVzIiwiZCIsIl9tZXNzYWdlIiwiY29uc29sZSIsImxvZyIsImkiLCJ3IiwiZSJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsTUFBTSxRQUFRLG1CQUFnQjtBQUV2QyxPQUFPLE1BQU1DO0lBQ1gsWUFBWTtJQUNaLE9BQU9DLEVBQUVDLElBQVksRUFBRUMsS0FBVSxFQUFFO1FBQ2pDLE1BQU1DLFVBQVVMLE9BQU9NLFVBQVU7UUFDakMsTUFBTUMsUUFBUUYsU0FBU0c7UUFFdkIsSUFBSSxDQUFDRCxPQUFPO1lBQ1Y7UUFDRjtRQUNBLElBQUlBLE1BQU1FLEdBQUcsQ0FBQ04sT0FBTztZQUNuQixjQUFjO1lBQ2QsSUFBSU8sTUFBTUMsT0FBTyxDQUFDSixNQUFNSyxHQUFHLENBQUNULFFBQVE7Z0JBQ2xDLFNBQVM7Z0JBQ1RJLE1BQU1NLEdBQUcsQ0FBQ1YsTUFBTTt1QkFBSUksTUFBTUssR0FBRyxDQUFDVDtvQkFBT0M7aUJBQU07WUFDN0MsT0FBTztnQkFDTCxtQkFBbUI7Z0JBQ25CRyxNQUFNTSxHQUFHLENBQUNWLE1BQU07b0JBQUNJLE1BQU1LLEdBQUcsQ0FBQ1Q7b0JBQU9DO2lCQUFNO1lBQzFDO1FBQ0YsT0FBTztZQUNMLGNBQWM7WUFDZEcsTUFBTU0sR0FBRyxDQUFDVixNQUFNQztRQUNsQjtJQUNGO0lBRUEsZUFBZTtJQUNmLE9BQU9RLElBQUlULElBQVksRUFBTztRQUM1QixNQUFNRSxVQUFVTCxPQUFPTSxVQUFVO1FBQ2pDLElBQUksQ0FBQ0QsU0FBU0csY0FBYyxDQUFDSCxRQUFRRyxVQUFVLENBQUNDLEdBQUcsQ0FBQ04sT0FBTztZQUN6RCxNQUFNLElBQUlXLE1BQU0sQ0FBQyxhQUFhLEVBQUVYLEtBQUssWUFBWSxDQUFDO1FBQ3BEO1FBQ0EsT0FBT0UsU0FBU0csWUFBWUksSUFBSVQ7SUFDbEM7SUFFQSxjQUFjO0lBQ2QsT0FBT1ksU0FBaUM7UUFDdEMsTUFBTVYsVUFBVUwsT0FBT00sVUFBVTtRQUNqQyxJQUFJLENBQUNELFNBQVNHLFlBQVk7WUFDeEIsT0FBTyxDQUFDO1FBQ1Y7UUFDQSxPQUFPUSxPQUFPQyxXQUFXLENBQUNaLFFBQVFHLFVBQVUsQ0FBQ1UsT0FBTztJQUN0RDtJQUVBLGtDQUFrQztJQUNsQyxnQ0FBZ0M7SUFDaEMsOEJBQThCO0lBQzlCLG9EQUFvRDtJQUNwRCxNQUFNO0lBQ04sOENBQThDO0lBQzlDLElBQUk7SUFFSixXQUFXO0lBQ1gsT0FBT0MsRUFBRUMsUUFBZ0IsRUFBRTtRQUN6QixrQkFBa0I7UUFDbEJDLFFBQVFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRUYsVUFBVTtJQUNuQztJQUNBLE9BQU9HLEVBQUVILFFBQWdCLEVBQUU7UUFDekIsa0JBQWtCO1FBQ2xCQyxRQUFRQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUVGLFVBQVU7SUFDbEM7SUFDQSxPQUFPSSxFQUFFSixRQUFnQixFQUFFO1FBQ3pCLGtCQUFrQjtRQUNsQkMsUUFBUUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFRixVQUFVO0lBQ2xDO0lBQ0EsT0FBT0ssRUFBRUwsUUFBZ0IsRUFBRTtRQUN6QixrQkFBa0I7UUFDbEJDLFFBQVFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRUYsVUFBVTtJQUNuQztBQUNGIn0=
|
package/dist/stream/index.js
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
export * from "./sse.js";
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJlYW0vaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vc3NlXCI7XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxXQUFRIn0=
|
package/dist/stream/sse.js
CHANGED
|
@@ -1,2 +1,38 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
// NOTE(Haze, 251106): context provider에서 인자를 채워주면 createSSE(events)만으로 사용 가능
|
|
2
|
+
export function createSSEFactory(socket, reply, _events) {
|
|
3
|
+
return new SSEConnection(socket, reply);
|
|
4
|
+
}
|
|
5
|
+
class SSEConnection {
|
|
6
|
+
socket;
|
|
7
|
+
reply;
|
|
8
|
+
_closed = false;
|
|
9
|
+
constructor(socket, reply){
|
|
10
|
+
this.socket = socket;
|
|
11
|
+
this.reply = reply;
|
|
12
|
+
this.socket.on("close", ()=>{
|
|
13
|
+
this._closed = true;
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
publish(event, data) {
|
|
17
|
+
if (this._closed) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
this.reply.sse({
|
|
21
|
+
event: event,
|
|
22
|
+
data: JSON.stringify(data)
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
async end() {
|
|
26
|
+
if (this._closed) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
this.reply.sse({
|
|
30
|
+
event: "end",
|
|
31
|
+
data: "END"
|
|
32
|
+
});
|
|
33
|
+
await new Promise((resolve)=>setTimeout(resolve, 200));
|
|
34
|
+
this.reply.raw.end();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdHJlYW0vc3NlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgdHlwZSB7IEZhc3RpZnlSZXF1ZXN0LCBGYXN0aWZ5UmVwbHkgfSBmcm9tIFwiZmFzdGlmeVwiO1xuXG4vLyBOT1RFKEhhemUsIDI1MTEwNik6IGNvbnRleHQgcHJvdmlkZXLsl5DshJwg7J247J6Q66W8IOyxhOybjOyjvOuptCBjcmVhdGVTU0UoZXZlbnRzKeunjOycvOuhnCDsgqzsmqkg6rCA64qlXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU1NFRmFjdG9yeTxUIGV4dGVuZHMgei5ab2RPYmplY3Q+KFxuICBzb2NrZXQ6IEZhc3RpZnlSZXF1ZXN0W1wic29ja2V0XCJdLFxuICByZXBseTogRmFzdGlmeVJlcGx5LFxuICBfZXZlbnRzOiBUXG4pIHtcbiAgcmV0dXJuIG5ldyBTU0VDb25uZWN0aW9uPFQ+KHNvY2tldCwgcmVwbHkpO1xufVxuXG5jbGFzcyBTU0VDb25uZWN0aW9uPFQgZXh0ZW5kcyB6LlpvZE9iamVjdD4ge1xuICBwcml2YXRlIF9jbG9zZWQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNvY2tldDogRmFzdGlmeVJlcXVlc3RbXCJzb2NrZXRcIl0sXG4gICAgcHJpdmF0ZSByZWFkb25seSByZXBseTogRmFzdGlmeVJlcGx5XG4gICkge1xuICAgIHRoaXMuc29ja2V0Lm9uKFwiY2xvc2VcIiwgKCkgPT4ge1xuICAgICAgdGhpcy5fY2xvc2VkID0gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1Ymxpc2g8SyBleHRlbmRzIGtleW9mIHouaW5mZXI8VD4+KGV2ZW50OiBLLCBkYXRhOiB6LmluZmVyPFQ+W0tdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2Nsb3NlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucmVwbHkuc3NlKHtcbiAgICAgIGV2ZW50OiBldmVudCBhcyBzdHJpbmcsXG4gICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeShkYXRhKSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGVuZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5fY2xvc2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5yZXBseS5zc2Uoe1xuICAgICAgZXZlbnQ6IFwiZW5kXCIsXG4gICAgICBkYXRhOiBcIkVORFwiLFxuICAgIH0pO1xuICAgIFxuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDIwMCkpO1xuICAgIHRoaXMucmVwbHkucmF3LmVuZCgpO1xuICB9XG59XG4iXSwibmFtZXMiOlsiY3JlYXRlU1NFRmFjdG9yeSIsInNvY2tldCIsInJlcGx5IiwiX2V2ZW50cyIsIlNTRUNvbm5lY3Rpb24iLCJfY2xvc2VkIiwib24iLCJwdWJsaXNoIiwiZXZlbnQiLCJkYXRhIiwic3NlIiwiSlNPTiIsInN0cmluZ2lmeSIsImVuZCIsIlByb21pc2UiLCJyZXNvbHZlIiwic2V0VGltZW91dCIsInJhdyJdLCJtYXBwaW5ncyI6IkFBR0EsNkVBQTZFO0FBQzdFLE9BQU8sU0FBU0EsaUJBQ2RDLE1BQWdDLEVBQ2hDQyxLQUFtQixFQUNuQkMsT0FBVTtJQUVWLE9BQU8sSUFBSUMsY0FBaUJILFFBQVFDO0FBQ3RDO0FBRUEsTUFBTUU7OztJQUNJQyxVQUFVLE1BQU07SUFFeEIsWUFDRSxBQUFpQkosTUFBZ0MsRUFDakQsQUFBaUJDLEtBQW1CLENBQ3BDO2FBRmlCRCxTQUFBQTthQUNBQyxRQUFBQTtRQUVqQixJQUFJLENBQUNELE1BQU0sQ0FBQ0ssRUFBRSxDQUFDLFNBQVM7WUFDdEIsSUFBSSxDQUFDRCxPQUFPLEdBQUc7UUFDakI7SUFDRjtJQUVBRSxRQUFvQ0MsS0FBUSxFQUFFQyxJQUFtQixFQUFRO1FBQ3ZFLElBQUksSUFBSSxDQUFDSixPQUFPLEVBQUU7WUFDaEI7UUFDRjtRQUVBLElBQUksQ0FBQ0gsS0FBSyxDQUFDUSxHQUFHLENBQUM7WUFDYkYsT0FBT0E7WUFDUEMsTUFBTUUsS0FBS0MsU0FBUyxDQUFDSDtRQUN2QjtJQUNGO0lBRUEsTUFBTUksTUFBcUI7UUFDekIsSUFBSSxJQUFJLENBQUNSLE9BQU8sRUFBRTtZQUNoQjtRQUNGO1FBRUEsSUFBSSxDQUFDSCxLQUFLLENBQUNRLEdBQUcsQ0FBQztZQUNiRixPQUFPO1lBQ1BDLE1BQU07UUFDUjtRQUVBLE1BQU0sSUFBSUssUUFBUSxDQUFDQyxVQUFZQyxXQUFXRCxTQUFTO1FBQ25ELElBQUksQ0FBQ2IsS0FBSyxDQUFDZSxHQUFHLENBQUNKLEdBQUc7SUFDcEI7QUFDRiJ9
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ApiParam, ApiParamType } from "../types/types";
|
|
2
|
+
import { AbsolutePath } from "../utils/path-utils";
|
|
3
|
+
/**
|
|
4
|
+
* TypeScript 파일을 파싱하여 API 메소드 정보를 추출합니다.
|
|
5
|
+
* @api 데코레이터가 붙은 메소드들의 타입 정보를 분석합니다.
|
|
6
|
+
* @param filePath - 파싱할 TypeScript 파일의 절대 경로
|
|
7
|
+
* @returns API 메소드 정보 배열 (타입 파라미터, 파라미터, 리턴 타입 등)
|
|
8
|
+
*/
|
|
9
|
+
export declare function readApisFromFile(filePath: AbsolutePath): Promise<{
|
|
10
|
+
typeParameters: ApiParamType.TypeParam[];
|
|
11
|
+
parameters: ApiParam[];
|
|
12
|
+
returnType: ApiParamType;
|
|
13
|
+
modelName: string;
|
|
14
|
+
methodName: string;
|
|
15
|
+
path: string;
|
|
16
|
+
options: import("..").ApiDecoratorOptions;
|
|
17
|
+
streamOptions?: import("..").StreamDecoratorOptions;
|
|
18
|
+
uploadOptions?: import("..").UploadDecoratorOptions;
|
|
19
|
+
}[]>;
|
|
20
|
+
//# sourceMappingURL=api-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-parser.d.ts","sourceRoot":"","sources":["../../src/syncer/api-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAOxD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,YAAY;;;;;;;;;;KA4G5D"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import ts from "typescript";
|
|
3
|
+
import { registeredApis } from "../api/decorators.js";
|
|
4
|
+
import inflection from "inflection";
|
|
5
|
+
import assert from "assert";
|
|
6
|
+
/**
|
|
7
|
+
* TypeScript 파일을 파싱하여 API 메소드 정보를 추출합니다.
|
|
8
|
+
* @api 데코레이터가 붙은 메소드들의 타입 정보를 분석합니다.
|
|
9
|
+
* @param filePath - 파싱할 TypeScript 파일의 절대 경로
|
|
10
|
+
* @returns API 메소드 정보 배열 (타입 파라미터, 파라미터, 리턴 타입 등)
|
|
11
|
+
*/ export async function readApisFromFile(filePath) {
|
|
12
|
+
if (!filePath.endsWith(".ts")) {
|
|
13
|
+
throw new Error(`${filePath} does not seem to be a TypeScript file. Please check the file path. We only support parsing TypeScript files.`);
|
|
14
|
+
}
|
|
15
|
+
const sourceFile = ts.createSourceFile(filePath, (await readFile(filePath)).toString(), ts.ScriptTarget.Latest);
|
|
16
|
+
const methods = [];
|
|
17
|
+
let modelName = "UnknownModel";
|
|
18
|
+
let methodName = "unknownMethod";
|
|
19
|
+
const visitor = (node)=>{
|
|
20
|
+
if (ts.isClassDeclaration(node)) {
|
|
21
|
+
if (node.name && ts.isIdentifier(node.name)) {
|
|
22
|
+
modelName = node.name.escapedText.toString().replace(/Class$/, "");
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
if (ts.isMethodDeclaration(node)) {
|
|
26
|
+
if (ts.isIdentifier(node.name)) {
|
|
27
|
+
methodName = node.name.escapedText.toString();
|
|
28
|
+
}
|
|
29
|
+
const typeParameters = (node.typeParameters ?? []).map((typeParam)=>{
|
|
30
|
+
const tp = typeParam;
|
|
31
|
+
return {
|
|
32
|
+
t: "type-param",
|
|
33
|
+
id: tp.name.escapedText.toString(),
|
|
34
|
+
constraint: tp.constraint ? resolveTypeNode(tp.constraint) : undefined
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
const parameters = node.parameters.map((paramDec, index)=>{
|
|
38
|
+
const defaultDef = printNode(paramDec.initializer, sourceFile);
|
|
39
|
+
// 기본값이 있는 경우 paramDec.type가 undefined로 나옴
|
|
40
|
+
return resolveParamDec({
|
|
41
|
+
name: paramDec.name,
|
|
42
|
+
type: paramDec.type,
|
|
43
|
+
optional: paramDec.questionToken !== undefined || paramDec.initializer !== undefined,
|
|
44
|
+
defaultDef
|
|
45
|
+
}, index);
|
|
46
|
+
});
|
|
47
|
+
if (node.type === undefined) {
|
|
48
|
+
throw new Error(`리턴 타입이 기재되지 않은 메소드 ${modelName}.${methodName}`);
|
|
49
|
+
}
|
|
50
|
+
const returnType = resolveTypeNode(node.type);
|
|
51
|
+
methods.push({
|
|
52
|
+
modelName,
|
|
53
|
+
methodName,
|
|
54
|
+
typeParameters,
|
|
55
|
+
parameters,
|
|
56
|
+
returnType
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
ts.forEachChild(node, visitor);
|
|
60
|
+
};
|
|
61
|
+
visitor(sourceFile);
|
|
62
|
+
if (methods.length === 0) {
|
|
63
|
+
return [];
|
|
64
|
+
}
|
|
65
|
+
// 현재 파일의 등록된 API 필터
|
|
66
|
+
const currentModelApis = registeredApis.filter((api)=>{
|
|
67
|
+
return methods.find((method)=>method.modelName === api.modelName && method.methodName === api.methodName);
|
|
68
|
+
});
|
|
69
|
+
if (currentModelApis.length === 0) {
|
|
70
|
+
// const p = path.join(tmpdir(), "sonamu-syncer-error.json");
|
|
71
|
+
// writeFileSync(p, JSON.stringify(registeredApis, null, 2));
|
|
72
|
+
// execSync(`open ${p}`);
|
|
73
|
+
throw new Error(`현재 파일에 사전 등록된 API가 없습니다. ${filePath}`);
|
|
74
|
+
}
|
|
75
|
+
// 등록된 API에 현재 메소드 타입 정보 확장
|
|
76
|
+
const extendedApis = currentModelApis.map((api)=>{
|
|
77
|
+
const foundMethod = methods.find((method)=>method.modelName === api.modelName && method.methodName === api.methodName);
|
|
78
|
+
return {
|
|
79
|
+
...api,
|
|
80
|
+
typeParameters: foundMethod.typeParameters,
|
|
81
|
+
parameters: foundMethod.parameters,
|
|
82
|
+
returnType: foundMethod.returnType
|
|
83
|
+
};
|
|
84
|
+
});
|
|
85
|
+
return extendedApis;
|
|
86
|
+
}
|
|
87
|
+
function resolveTypeNode(typeNode) {
|
|
88
|
+
switch(typeNode?.kind){
|
|
89
|
+
case ts.SyntaxKind.AnyKeyword:
|
|
90
|
+
return "any";
|
|
91
|
+
case ts.SyntaxKind.UnknownKeyword:
|
|
92
|
+
return "unknown";
|
|
93
|
+
case ts.SyntaxKind.StringKeyword:
|
|
94
|
+
return "string";
|
|
95
|
+
case ts.SyntaxKind.NumberKeyword:
|
|
96
|
+
return "number";
|
|
97
|
+
case ts.SyntaxKind.BooleanKeyword:
|
|
98
|
+
return "boolean";
|
|
99
|
+
case ts.SyntaxKind.UndefinedKeyword:
|
|
100
|
+
return "undefined";
|
|
101
|
+
case ts.SyntaxKind.NullKeyword:
|
|
102
|
+
return "null";
|
|
103
|
+
case ts.SyntaxKind.VoidKeyword:
|
|
104
|
+
return "void";
|
|
105
|
+
case ts.SyntaxKind.LiteralType:
|
|
106
|
+
const literal = typeNode.literal;
|
|
107
|
+
if (ts.isStringLiteral(literal)) {
|
|
108
|
+
return {
|
|
109
|
+
t: "string-literal",
|
|
110
|
+
value: literal.text
|
|
111
|
+
};
|
|
112
|
+
} else if (ts.isNumericLiteral(literal)) {
|
|
113
|
+
return {
|
|
114
|
+
t: "numeric-literal",
|
|
115
|
+
value: Number(literal.text)
|
|
116
|
+
};
|
|
117
|
+
} else {
|
|
118
|
+
if (literal.kind === ts.SyntaxKind.NullKeyword) {
|
|
119
|
+
return "null";
|
|
120
|
+
} else if (literal.kind === ts.SyntaxKind.UndefinedKeyword) {
|
|
121
|
+
return "undefined";
|
|
122
|
+
} else if (literal.kind === ts.SyntaxKind.TrueKeyword) {
|
|
123
|
+
return "true";
|
|
124
|
+
} else if (literal.kind === ts.SyntaxKind.FalseKeyword) {
|
|
125
|
+
return "false";
|
|
126
|
+
}
|
|
127
|
+
throw new Error("알 수 없는 리터럴");
|
|
128
|
+
}
|
|
129
|
+
case ts.SyntaxKind.ArrayType:
|
|
130
|
+
const arrNode = typeNode;
|
|
131
|
+
return {
|
|
132
|
+
t: "array",
|
|
133
|
+
elementsType: resolveTypeNode(arrNode.elementType)
|
|
134
|
+
};
|
|
135
|
+
case ts.SyntaxKind.TypeLiteral:
|
|
136
|
+
const literalNode = typeNode;
|
|
137
|
+
return {
|
|
138
|
+
t: "object",
|
|
139
|
+
props: literalNode.members.map((member)=>{
|
|
140
|
+
if (ts.isIndexSignatureDeclaration(member)) {
|
|
141
|
+
assert(member.parameters[0]);
|
|
142
|
+
const res = resolveParamDec({
|
|
143
|
+
name: member.parameters[0].name,
|
|
144
|
+
type: member.parameters[0].type
|
|
145
|
+
});
|
|
146
|
+
return resolveParamDec({
|
|
147
|
+
name: {
|
|
148
|
+
escapedText: `[${res.name}${res.optional ? "?" : ""}: ${res.type}]`
|
|
149
|
+
},
|
|
150
|
+
type: member.type
|
|
151
|
+
});
|
|
152
|
+
} else {
|
|
153
|
+
return resolveParamDec({
|
|
154
|
+
name: member.name,
|
|
155
|
+
type: member.type,
|
|
156
|
+
optional: member.questionToken !== undefined
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
})
|
|
160
|
+
};
|
|
161
|
+
case ts.SyntaxKind.TypeReference:
|
|
162
|
+
return {
|
|
163
|
+
t: "ref",
|
|
164
|
+
id: typeNode.typeName.escapedText.toString(),
|
|
165
|
+
args: typeNode.typeArguments?.map((typeArg)=>resolveTypeNode(typeArg))
|
|
166
|
+
};
|
|
167
|
+
case ts.SyntaxKind.UnionType:
|
|
168
|
+
return {
|
|
169
|
+
t: "union",
|
|
170
|
+
types: typeNode.types.map((type)=>resolveTypeNode(type))
|
|
171
|
+
};
|
|
172
|
+
case ts.SyntaxKind.IntersectionType:
|
|
173
|
+
return {
|
|
174
|
+
t: "intersection",
|
|
175
|
+
types: typeNode.types.map((type)=>resolveTypeNode(type))
|
|
176
|
+
};
|
|
177
|
+
case ts.SyntaxKind.IndexedAccessType:
|
|
178
|
+
return {
|
|
179
|
+
t: "indexed-access",
|
|
180
|
+
object: resolveTypeNode(typeNode.objectType),
|
|
181
|
+
index: resolveTypeNode(typeNode.indexType)
|
|
182
|
+
};
|
|
183
|
+
case ts.SyntaxKind.TupleType:
|
|
184
|
+
if (ts.isTupleTypeNode(typeNode)) {
|
|
185
|
+
return {
|
|
186
|
+
t: "tuple-type",
|
|
187
|
+
elements: typeNode.elements.map((elem)=>resolveTypeNode(elem))
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
break;
|
|
191
|
+
case undefined:
|
|
192
|
+
throw new Error(`typeNode undefined`);
|
|
193
|
+
}
|
|
194
|
+
console.debug(typeNode);
|
|
195
|
+
throw new Error(`알 수 없는 SyntaxKind ${typeNode.kind}`);
|
|
196
|
+
}
|
|
197
|
+
function resolveParamDec(paramDec, index = 0) {
|
|
198
|
+
const name = paramDec.name;
|
|
199
|
+
const type = resolveTypeNode(paramDec.type);
|
|
200
|
+
if (name === undefined) {
|
|
201
|
+
console.debug({
|
|
202
|
+
name,
|
|
203
|
+
type,
|
|
204
|
+
paramDec
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
const result = {
|
|
208
|
+
name: name.escapedText ? name.escapedText.toString() : `nonameAt${index}`,
|
|
209
|
+
type,
|
|
210
|
+
optional: paramDec.optional === true,
|
|
211
|
+
defaultDef: paramDec?.defaultDef
|
|
212
|
+
};
|
|
213
|
+
// 구조분해할당의 경우 타입이름 사용
|
|
214
|
+
if (ts.isObjectBindingPattern(name) && ts.isTypeReferenceNode(paramDec.type) && ts.isIdentifier(paramDec.type.typeName)) {
|
|
215
|
+
result.name = inflection.camelize(paramDec.type.typeName.text, true);
|
|
216
|
+
}
|
|
217
|
+
return result;
|
|
218
|
+
}
|
|
219
|
+
function printNode(node, sourceFile) {
|
|
220
|
+
if (node === undefined) {
|
|
221
|
+
return undefined;
|
|
222
|
+
}
|
|
223
|
+
const printer = ts.createPrinter({
|
|
224
|
+
newLine: ts.NewLineKind.LineFeed
|
|
225
|
+
});
|
|
226
|
+
return printer.printNode(ts.EmitHint.Unspecified, node, sourceFile);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvYXBpLXBhcnNlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBcGlQYXJhbSwgQXBpUGFyYW1UeXBlIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0ICogYXMgXyBmcm9tIFwibG9kYXNoLWVzXCI7XG5pbXBvcnQgdHMgZnJvbSBcInR5cGVzY3JpcHRcIjtcbmltcG9ydCB7IEV4dGVuZGVkQXBpLCByZWdpc3RlcmVkQXBpcyB9IGZyb20gXCIuLi9hcGkvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcblxuLyoqXG4gKiBUeXBlU2NyaXB0IO2MjOydvOydhCDtjIzsi7HtlZjsl6wgQVBJIOuplOyGjOuTnCDsoJXrs7Trpbwg7LaU7Lac7ZWp64uI64ukLlxuICogQGFwaSDrjbDsvZTroIjsnbTthLDqsIAg67aZ7J2AIOuplOyGjOuTnOuTpOydmCDtg4DsnoUg7KCV67O066W8IOu2hOyEne2VqeuLiOuLpC5cbiAqIEBwYXJhbSBmaWxlUGF0aCAtIO2MjOyLse2VoCBUeXBlU2NyaXB0IO2MjOydvOydmCDsoIjrjIAg6rK966GcXG4gKiBAcmV0dXJucyBBUEkg66mU7IaM65OcIOygleuztCDrsLDsl7QgKO2DgOyehSDtjIzrnbzrr7jthLAsIO2MjOudvOuvuO2EsCwg66as7YS0IO2DgOyehSDrk7EpXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkQXBpc0Zyb21GaWxlKGZpbGVQYXRoOiBBYnNvbHV0ZVBhdGgpIHtcbiAgaWYgKCFmaWxlUGF0aC5lbmRzV2l0aChcIi50c1wiKSkgeyBcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZmlsZVBhdGh9IGRvZXMgbm90IHNlZW0gdG8gYmUgYSBUeXBlU2NyaXB0IGZpbGUuIFBsZWFzZSBjaGVjayB0aGUgZmlsZSBwYXRoLiBXZSBvbmx5IHN1cHBvcnQgcGFyc2luZyBUeXBlU2NyaXB0IGZpbGVzLmApO1xuICB9XG4gIFxuICBjb25zdCBzb3VyY2VGaWxlID0gdHMuY3JlYXRlU291cmNlRmlsZShcbiAgICBmaWxlUGF0aCxcbiAgICAoYXdhaXQgcmVhZEZpbGUoZmlsZVBhdGgpKS50b1N0cmluZygpLFxuICAgIHRzLlNjcmlwdFRhcmdldC5MYXRlc3RcbiAgKTtcblxuICBjb25zdCBtZXRob2RzOiBPbWl0PEV4dGVuZGVkQXBpLCBcInBhdGhcIiB8IFwib3B0aW9uc1wiPltdID0gW107XG4gIGxldCBtb2RlbE5hbWU6IHN0cmluZyA9IFwiVW5rbm93bk1vZGVsXCI7XG4gIGxldCBtZXRob2ROYW1lOiBzdHJpbmcgPSBcInVua25vd25NZXRob2RcIjtcbiAgY29uc3QgdmlzaXRvciA9IChub2RlOiB0cy5Ob2RlKSA9PiB7XG4gICAgaWYgKHRzLmlzQ2xhc3NEZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgaWYgKG5vZGUubmFtZSAmJiB0cy5pc0lkZW50aWZpZXIobm9kZS5uYW1lKSkge1xuICAgICAgICBtb2RlbE5hbWUgPSBub2RlLm5hbWUuZXNjYXBlZFRleHQudG9TdHJpbmcoKS5yZXBsYWNlKC9DbGFzcyQvLCBcIlwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRzLmlzTWV0aG9kRGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICAgIGlmICh0cy5pc0lkZW50aWZpZXIobm9kZS5uYW1lKSkge1xuICAgICAgICBtZXRob2ROYW1lID0gbm9kZS5uYW1lLmVzY2FwZWRUZXh0LnRvU3RyaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHR5cGVQYXJhbWV0ZXJzOiBBcGlQYXJhbVR5cGUuVHlwZVBhcmFtW10gPSAoXG4gICAgICAgIG5vZGUudHlwZVBhcmFtZXRlcnMgPz8gW11cbiAgICAgICkubWFwKCh0eXBlUGFyYW0pID0+IHtcbiAgICAgICAgY29uc3QgdHAgPSB0eXBlUGFyYW0gYXMgdHMuVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdDogXCJ0eXBlLXBhcmFtXCIsXG4gICAgICAgICAgaWQ6IHRwLm5hbWUuZXNjYXBlZFRleHQudG9TdHJpbmcoKSxcbiAgICAgICAgICBjb25zdHJhaW50OiB0cC5jb25zdHJhaW50XG4gICAgICAgICAgICA/IHJlc29sdmVUeXBlTm9kZSh0cC5jb25zdHJhaW50KVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHBhcmFtZXRlcnM6IEFwaVBhcmFtW10gPSBub2RlLnBhcmFtZXRlcnMubWFwKChwYXJhbURlYywgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgZGVmYXVsdERlZiA9IHByaW50Tm9kZShwYXJhbURlYy5pbml0aWFsaXplciwgc291cmNlRmlsZSk7XG5cbiAgICAgICAgLy8g6riw67O46rCS7J20IOyeiOuKlCDqsr3smrAgcGFyYW1EZWMudHlwZeqwgCB1bmRlZmluZWTroZwg64KY7Ji0XG5cbiAgICAgICAgcmV0dXJuIHJlc29sdmVQYXJhbURlYyhcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBwYXJhbURlYy5uYW1lLFxuICAgICAgICAgICAgdHlwZTogcGFyYW1EZWMudHlwZSBhcyB0cy5UeXBlTm9kZSxcbiAgICAgICAgICAgIG9wdGlvbmFsOlxuICAgICAgICAgICAgICBwYXJhbURlYy5xdWVzdGlvblRva2VuICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgcGFyYW1EZWMuaW5pdGlhbGl6ZXIgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGRlZmF1bHREZWYsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBpbmRleFxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICBpZiAobm9kZS50eXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGDrpqzthLQg7YOA7J6F7J20IOq4sOyerOuQmOyngCDslYrsnYAg66mU7IaM65OcICR7bW9kZWxOYW1lfS4ke21ldGhvZE5hbWV9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgcmV0dXJuVHlwZSA9IHJlc29sdmVUeXBlTm9kZShub2RlLnR5cGUhKTtcblxuICAgICAgbWV0aG9kcy5wdXNoKHtcbiAgICAgICAgbW9kZWxOYW1lLFxuICAgICAgICBtZXRob2ROYW1lLFxuICAgICAgICB0eXBlUGFyYW1ldGVycyxcbiAgICAgICAgcGFyYW1ldGVycyxcbiAgICAgICAgcmV0dXJuVHlwZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0cy5mb3JFYWNoQ2hpbGQobm9kZSwgdmlzaXRvcik7XG4gIH07XG4gIHZpc2l0b3Ioc291cmNlRmlsZSk7XG5cbiAgaWYgKG1ldGhvZHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLy8g7ZiE7J6sIO2MjOydvOydmCDrk7HroZ3rkJwgQVBJIO2VhO2EsFxuICBjb25zdCBjdXJyZW50TW9kZWxBcGlzID0gcmVnaXN0ZXJlZEFwaXMuZmlsdGVyKChhcGkpID0+IHtcbiAgICByZXR1cm4gbWV0aG9kcy5maW5kKFxuICAgICAgKG1ldGhvZCkgPT5cbiAgICAgICAgbWV0aG9kLm1vZGVsTmFtZSA9PT0gYXBpLm1vZGVsTmFtZSAmJlxuICAgICAgICBtZXRob2QubWV0aG9kTmFtZSA9PT0gYXBpLm1ldGhvZE5hbWVcbiAgICApO1xuICB9KTtcbiAgaWYgKGN1cnJlbnRNb2RlbEFwaXMubGVuZ3RoID09PSAwKSB7XG4gICAgLy8gY29uc3QgcCA9IHBhdGguam9pbih0bXBkaXIoKSwgXCJzb25hbXUtc3luY2VyLWVycm9yLmpzb25cIik7XG4gICAgLy8gd3JpdGVGaWxlU3luYyhwLCBKU09OLnN0cmluZ2lmeShyZWdpc3RlcmVkQXBpcywgbnVsbCwgMikpO1xuICAgIC8vIGV4ZWNTeW5jKGBvcGVuICR7cH1gKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYO2YhOyerCDtjIzsnbzsl5Ag7IKs7KCEIOuTseuhneuQnCBBUEnqsIAg7JeG7Iq164uI64ukLiAke2ZpbGVQYXRofWApO1xuICB9XG5cbiAgLy8g65Ox66Gd65CcIEFQSeyXkCDtmITsnqwg66mU7IaM65OcIO2DgOyehSDsoJXrs7Qg7ZmV7J6lXG4gIGNvbnN0IGV4dGVuZGVkQXBpcyA9IGN1cnJlbnRNb2RlbEFwaXMubWFwKChhcGkpID0+IHtcbiAgICBjb25zdCBmb3VuZE1ldGhvZCA9IG1ldGhvZHMuZmluZChcbiAgICAgIChtZXRob2QpID0+XG4gICAgICAgIG1ldGhvZC5tb2RlbE5hbWUgPT09IGFwaS5tb2RlbE5hbWUgJiZcbiAgICAgICAgbWV0aG9kLm1ldGhvZE5hbWUgPT09IGFwaS5tZXRob2ROYW1lXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uYXBpLFxuICAgICAgdHlwZVBhcmFtZXRlcnM6IGZvdW5kTWV0aG9kIS50eXBlUGFyYW1ldGVycyxcbiAgICAgIHBhcmFtZXRlcnM6IGZvdW5kTWV0aG9kIS5wYXJhbWV0ZXJzLFxuICAgICAgcmV0dXJuVHlwZTogZm91bmRNZXRob2QhLnJldHVyblR5cGUsXG4gICAgfTtcbiAgfSk7XG4gIHJldHVybiBleHRlbmRlZEFwaXM7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVUeXBlTm9kZSh0eXBlTm9kZTogdHMuVHlwZU5vZGUpOiBBcGlQYXJhbVR5cGUge1xuICBzd2l0Y2ggKHR5cGVOb2RlPy5raW5kKSB7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLkFueUtleXdvcmQ6XG4gICAgICByZXR1cm4gXCJhbnlcIjtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuVW5rbm93bktleXdvcmQ6XG4gICAgICByZXR1cm4gXCJ1bmtub3duXCI7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlN0cmluZ0tleXdvcmQ6XG4gICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuTnVtYmVyS2V5d29yZDpcbiAgICAgIHJldHVybiBcIm51bWJlclwiO1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5Cb29sZWFuS2V5d29yZDpcbiAgICAgIHJldHVybiBcImJvb2xlYW5cIjtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuVW5kZWZpbmVkS2V5d29yZDpcbiAgICAgIHJldHVybiBcInVuZGVmaW5lZFwiO1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5OdWxsS2V5d29yZDpcbiAgICAgIHJldHVybiBcIm51bGxcIjtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuVm9pZEtleXdvcmQ6XG4gICAgICByZXR1cm4gXCJ2b2lkXCI7XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLkxpdGVyYWxUeXBlOlxuICAgICAgY29uc3QgbGl0ZXJhbCA9ICh0eXBlTm9kZSBhcyB0cy5MaXRlcmFsVHlwZU5vZGUpLmxpdGVyYWw7XG4gICAgICBpZiAodHMuaXNTdHJpbmdMaXRlcmFsKGxpdGVyYWwpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdDogXCJzdHJpbmctbGl0ZXJhbFwiLFxuICAgICAgICAgIHZhbHVlOiBsaXRlcmFsLnRleHQsXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKHRzLmlzTnVtZXJpY0xpdGVyYWwobGl0ZXJhbCkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0OiBcIm51bWVyaWMtbGl0ZXJhbFwiLFxuICAgICAgICAgIHZhbHVlOiBOdW1iZXIobGl0ZXJhbC50ZXh0KSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChsaXRlcmFsLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuTnVsbEtleXdvcmQpIHtcbiAgICAgICAgICByZXR1cm4gXCJudWxsXCI7XG4gICAgICAgIH0gZWxzZSBpZiAobGl0ZXJhbC5raW5kID09PSB0cy5TeW50YXhLaW5kLlVuZGVmaW5lZEtleXdvcmQpIHtcbiAgICAgICAgICByZXR1cm4gXCJ1bmRlZmluZWRcIjtcbiAgICAgICAgfSBlbHNlIGlmIChsaXRlcmFsLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuVHJ1ZUtleXdvcmQpIHtcbiAgICAgICAgICByZXR1cm4gXCJ0cnVlXCI7XG4gICAgICAgIH0gZWxzZSBpZiAobGl0ZXJhbC5raW5kID09PSB0cy5TeW50YXhLaW5kLkZhbHNlS2V5d29yZCkge1xuICAgICAgICAgIHJldHVybiBcImZhbHNlXCI7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwi7JWMIOyImCDsl4bripQg66as7YSw65+0XCIpO1xuICAgICAgfVxuICAgIGNhc2UgdHMuU3ludGF4S2luZC5BcnJheVR5cGU6XG4gICAgICBjb25zdCBhcnJOb2RlID0gdHlwZU5vZGUgYXMgdHMuQXJyYXlUeXBlTm9kZTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHQ6IFwiYXJyYXlcIixcbiAgICAgICAgZWxlbWVudHNUeXBlOiByZXNvbHZlVHlwZU5vZGUoYXJyTm9kZS5lbGVtZW50VHlwZSksXG4gICAgICB9O1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5UeXBlTGl0ZXJhbDpcbiAgICAgIGNvbnN0IGxpdGVyYWxOb2RlID0gdHlwZU5vZGUgYXMgdHMuVHlwZUxpdGVyYWxOb2RlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdDogXCJvYmplY3RcIixcbiAgICAgICAgcHJvcHM6IGxpdGVyYWxOb2RlLm1lbWJlcnMubWFwKChtZW1iZXIpID0+IHtcbiAgICAgICAgICBpZiAodHMuaXNJbmRleFNpZ25hdHVyZURlY2xhcmF0aW9uKG1lbWJlcikpIHtcbiAgICAgICAgICAgIGFzc2VydChtZW1iZXIucGFyYW1ldGVyc1swXSk7XG4gICAgICAgICAgICBjb25zdCByZXMgPSByZXNvbHZlUGFyYW1EZWMoe1xuICAgICAgICAgICAgICBuYW1lOiBtZW1iZXIucGFyYW1ldGVyc1swXS5uYW1lIGFzIHRzLklkZW50aWZpZXIsXG4gICAgICAgICAgICAgIHR5cGU6IG1lbWJlci5wYXJhbWV0ZXJzWzBdLnR5cGUgYXMgdHMuVHlwZU5vZGUsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVQYXJhbURlYyh7XG4gICAgICAgICAgICAgIG5hbWU6IHtcbiAgICAgICAgICAgICAgICBlc2NhcGVkVGV4dDogYFske3Jlcy5uYW1lfSR7cmVzLm9wdGlvbmFsID8gXCI/XCIgOiBcIlwifTogJHtcbiAgICAgICAgICAgICAgICAgIHJlcy50eXBlXG4gICAgICAgICAgICAgICAgfV1gLFxuICAgICAgICAgICAgICB9IGFzIHRzLklkZW50aWZpZXIsXG4gICAgICAgICAgICAgIHR5cGU6IG1lbWJlci50eXBlIGFzIHRzLlR5cGVOb2RlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlUGFyYW1EZWMoe1xuICAgICAgICAgICAgICBuYW1lOiAobWVtYmVyIGFzIHRzLlByb3BlcnR5U2lnbmF0dXJlKS5uYW1lIGFzIHRzLklkZW50aWZpZXIsXG4gICAgICAgICAgICAgIHR5cGU6IChtZW1iZXIgYXMgdHMuUHJvcGVydHlTaWduYXR1cmUpLnR5cGUgYXMgdHMuVHlwZU5vZGUsXG4gICAgICAgICAgICAgIG9wdGlvbmFsOlxuICAgICAgICAgICAgICAgIChtZW1iZXIgYXMgdHMuUHJvcGVydHlTaWduYXR1cmUpLnF1ZXN0aW9uVG9rZW4gIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICB9O1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5UeXBlUmVmZXJlbmNlOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdDogXCJyZWZcIixcbiAgICAgICAgaWQ6IChcbiAgICAgICAgICAodHlwZU5vZGUgYXMgdHMuVHlwZVJlZmVyZW5jZU5vZGUpLnR5cGVOYW1lIGFzIHRzLklkZW50aWZpZXJcbiAgICAgICAgKS5lc2NhcGVkVGV4dC50b1N0cmluZygpLFxuICAgICAgICBhcmdzOiAodHlwZU5vZGUgYXMgdHMuVHlwZVJlZmVyZW5jZU5vZGUpLnR5cGVBcmd1bWVudHM/Lm1hcCgodHlwZUFyZykgPT5cbiAgICAgICAgICByZXNvbHZlVHlwZU5vZGUodHlwZUFyZylcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlVuaW9uVHlwZTpcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHQ6IFwidW5pb25cIixcbiAgICAgICAgdHlwZXM6ICh0eXBlTm9kZSBhcyB0cy5VbmlvblR5cGVOb2RlKS50eXBlcy5tYXAoKHR5cGUpID0+XG4gICAgICAgICAgcmVzb2x2ZVR5cGVOb2RlKHR5cGUpXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIGNhc2UgdHMuU3ludGF4S2luZC5JbnRlcnNlY3Rpb25UeXBlOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdDogXCJpbnRlcnNlY3Rpb25cIixcbiAgICAgICAgdHlwZXM6ICh0eXBlTm9kZSBhcyB0cy5JbnRlcnNlY3Rpb25UeXBlTm9kZSkudHlwZXMubWFwKCh0eXBlKSA9PlxuICAgICAgICAgIHJlc29sdmVUeXBlTm9kZSh0eXBlKVxuICAgICAgICApLFxuICAgICAgfTtcbiAgICBjYXNlIHRzLlN5bnRheEtpbmQuSW5kZXhlZEFjY2Vzc1R5cGU6XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0OiBcImluZGV4ZWQtYWNjZXNzXCIsXG4gICAgICAgIG9iamVjdDogcmVzb2x2ZVR5cGVOb2RlKFxuICAgICAgICAgICh0eXBlTm9kZSBhcyB0cy5JbmRleGVkQWNjZXNzVHlwZU5vZGUpLm9iamVjdFR5cGVcbiAgICAgICAgKSxcbiAgICAgICAgaW5kZXg6IHJlc29sdmVUeXBlTm9kZShcbiAgICAgICAgICAodHlwZU5vZGUgYXMgdHMuSW5kZXhlZEFjY2Vzc1R5cGVOb2RlKS5pbmRleFR5cGVcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgY2FzZSB0cy5TeW50YXhLaW5kLlR1cGxlVHlwZTpcbiAgICAgIGlmICh0cy5pc1R1cGxlVHlwZU5vZGUodHlwZU5vZGUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdDogXCJ0dXBsZS10eXBlXCIsXG4gICAgICAgICAgZWxlbWVudHM6IHR5cGVOb2RlLmVsZW1lbnRzLm1hcCgoZWxlbSkgPT4gcmVzb2x2ZVR5cGVOb2RlKGVsZW0pKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgdW5kZWZpbmVkOlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGB0eXBlTm9kZSB1bmRlZmluZWRgKTtcbiAgfVxuXG4gIGNvbnNvbGUuZGVidWcodHlwZU5vZGUpO1xuICB0aHJvdyBuZXcgRXJyb3IoYOyVjCDsiJgg7JeG64qUIFN5bnRheEtpbmQgJHt0eXBlTm9kZS5raW5kfWApO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlUGFyYW1EZWMoXG4gIHBhcmFtRGVjOiB7XG4gICAgbmFtZTogdHMuQmluZGluZ05hbWU7XG4gICAgdHlwZTogdHMuVHlwZU5vZGU7XG4gICAgb3B0aW9uYWw/OiBib29sZWFuO1xuICAgIGRlZmF1bHREZWY/OiBzdHJpbmc7XG4gIH0sXG4gIGluZGV4OiBudW1iZXIgPSAwXG4pOiBBcGlQYXJhbSB7XG4gIGNvbnN0IG5hbWUgPSBwYXJhbURlYy5uYW1lIGFzIHRzLklkZW50aWZpZXI7XG4gIGNvbnN0IHR5cGUgPSByZXNvbHZlVHlwZU5vZGUocGFyYW1EZWMudHlwZSk7XG5cbiAgaWYgKG5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnNvbGUuZGVidWcoeyBuYW1lLCB0eXBlLCBwYXJhbURlYyB9KTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdDogQXBpUGFyYW0gPSB7XG4gICAgbmFtZTogbmFtZS5lc2NhcGVkVGV4dCA/IG5hbWUuZXNjYXBlZFRleHQudG9TdHJpbmcoKSA6IGBub25hbWVBdCR7aW5kZXh9YCxcbiAgICB0eXBlLFxuICAgIG9wdGlvbmFsOiBwYXJhbURlYy5vcHRpb25hbCA9PT0gdHJ1ZSxcbiAgICBkZWZhdWx0RGVmOiBwYXJhbURlYz8uZGVmYXVsdERlZixcbiAgfTtcblxuICAvLyDqtazsobDrtoTtlbTtlaDri7nsnZgg6rK97JqwIO2DgOyeheydtOumhCDsgqzsmqlcbiAgaWYgKFxuICAgIHRzLmlzT2JqZWN0QmluZGluZ1BhdHRlcm4obmFtZSkgJiZcbiAgICB0cy5pc1R5cGVSZWZlcmVuY2VOb2RlKHBhcmFtRGVjLnR5cGUpICYmXG4gICAgdHMuaXNJZGVudGlmaWVyKHBhcmFtRGVjLnR5cGUudHlwZU5hbWUpXG4gICkge1xuICAgIHJlc3VsdC5uYW1lID0gaW5mbGVjdGlvbi5jYW1lbGl6ZShwYXJhbURlYy50eXBlLnR5cGVOYW1lLnRleHQsIHRydWUpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gcHJpbnROb2RlKFxuICBub2RlOiB0cy5Ob2RlIHwgdW5kZWZpbmVkLFxuICBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IHByaW50ZXIgPSB0cy5jcmVhdGVQcmludGVyKHsgbmV3TGluZTogdHMuTmV3TGluZUtpbmQuTGluZUZlZWQgfSk7XG4gIHJldHVybiBwcmludGVyLnByaW50Tm9kZSh0cy5FbWl0SGludC5VbnNwZWNpZmllZCwgbm9kZSwgc291cmNlRmlsZSk7XG59XG4iXSwibmFtZXMiOlsicmVhZEZpbGUiLCJ0cyIsInJlZ2lzdGVyZWRBcGlzIiwiaW5mbGVjdGlvbiIsImFzc2VydCIsInJlYWRBcGlzRnJvbUZpbGUiLCJmaWxlUGF0aCIsImVuZHNXaXRoIiwiRXJyb3IiLCJzb3VyY2VGaWxlIiwiY3JlYXRlU291cmNlRmlsZSIsInRvU3RyaW5nIiwiU2NyaXB0VGFyZ2V0IiwiTGF0ZXN0IiwibWV0aG9kcyIsIm1vZGVsTmFtZSIsIm1ldGhvZE5hbWUiLCJ2aXNpdG9yIiwibm9kZSIsImlzQ2xhc3NEZWNsYXJhdGlvbiIsIm5hbWUiLCJpc0lkZW50aWZpZXIiLCJlc2NhcGVkVGV4dCIsInJlcGxhY2UiLCJpc01ldGhvZERlY2xhcmF0aW9uIiwidHlwZVBhcmFtZXRlcnMiLCJtYXAiLCJ0eXBlUGFyYW0iLCJ0cCIsInQiLCJpZCIsImNvbnN0cmFpbnQiLCJyZXNvbHZlVHlwZU5vZGUiLCJ1bmRlZmluZWQiLCJwYXJhbWV0ZXJzIiwicGFyYW1EZWMiLCJpbmRleCIsImRlZmF1bHREZWYiLCJwcmludE5vZGUiLCJpbml0aWFsaXplciIsInJlc29sdmVQYXJhbURlYyIsInR5cGUiLCJvcHRpb25hbCIsInF1ZXN0aW9uVG9rZW4iLCJyZXR1cm5UeXBlIiwicHVzaCIsImZvckVhY2hDaGlsZCIsImxlbmd0aCIsImN1cnJlbnRNb2RlbEFwaXMiLCJmaWx0ZXIiLCJhcGkiLCJmaW5kIiwibWV0aG9kIiwiZXh0ZW5kZWRBcGlzIiwiZm91bmRNZXRob2QiLCJ0eXBlTm9kZSIsImtpbmQiLCJTeW50YXhLaW5kIiwiQW55S2V5d29yZCIsIlVua25vd25LZXl3b3JkIiwiU3RyaW5nS2V5d29yZCIsIk51bWJlcktleXdvcmQiLCJCb29sZWFuS2V5d29yZCIsIlVuZGVmaW5lZEtleXdvcmQiLCJOdWxsS2V5d29yZCIsIlZvaWRLZXl3b3JkIiwiTGl0ZXJhbFR5cGUiLCJsaXRlcmFsIiwiaXNTdHJpbmdMaXRlcmFsIiwidmFsdWUiLCJ0ZXh0IiwiaXNOdW1lcmljTGl0ZXJhbCIsIk51bWJlciIsIlRydWVLZXl3b3JkIiwiRmFsc2VLZXl3b3JkIiwiQXJyYXlUeXBlIiwiYXJyTm9kZSIsImVsZW1lbnRzVHlwZSIsImVsZW1lbnRUeXBlIiwiVHlwZUxpdGVyYWwiLCJsaXRlcmFsTm9kZSIsInByb3BzIiwibWVtYmVycyIsIm1lbWJlciIsImlzSW5kZXhTaWduYXR1cmVEZWNsYXJhdGlvbiIsInJlcyIsIlR5cGVSZWZlcmVuY2UiLCJ0eXBlTmFtZSIsImFyZ3MiLCJ0eXBlQXJndW1lbnRzIiwidHlwZUFyZyIsIlVuaW9uVHlwZSIsInR5cGVzIiwiSW50ZXJzZWN0aW9uVHlwZSIsIkluZGV4ZWRBY2Nlc3NUeXBlIiwib2JqZWN0Iiwib2JqZWN0VHlwZSIsImluZGV4VHlwZSIsIlR1cGxlVHlwZSIsImlzVHVwbGVUeXBlTm9kZSIsImVsZW1lbnRzIiwiZWxlbSIsImNvbnNvbGUiLCJkZWJ1ZyIsInJlc3VsdCIsImlzT2JqZWN0QmluZGluZ1BhdHRlcm4iLCJpc1R5cGVSZWZlcmVuY2VOb2RlIiwiY2FtZWxpemUiLCJwcmludGVyIiwiY3JlYXRlUHJpbnRlciIsIm5ld0xpbmUiLCJOZXdMaW5lS2luZCIsIkxpbmVGZWVkIiwiRW1pdEhpbnQiLCJVbnNwZWNpZmllZCJdLCJtYXBwaW5ncyI6IkFBQ0EsU0FBU0EsUUFBUSxRQUFRLG1CQUFjO0FBRXZDLE9BQU9DLFFBQVEsYUFBYTtBQUM1QixTQUFzQkMsY0FBYyxRQUFRLHVCQUFvQjtBQUNoRSxPQUFPQyxnQkFBZ0IsYUFBYTtBQUNwQyxPQUFPQyxZQUFZLFNBQVM7QUFHNUI7Ozs7O0NBS0MsR0FDRCxPQUFPLGVBQWVDLGlCQUFpQkMsUUFBc0I7SUFDM0QsSUFBSSxDQUFDQSxTQUFTQyxRQUFRLENBQUMsUUFBUTtRQUM3QixNQUFNLElBQUlDLE1BQU0sR0FBR0YsU0FBUyw2R0FBNkcsQ0FBQztJQUM1STtJQUVBLE1BQU1HLGFBQWFSLEdBQUdTLGdCQUFnQixDQUNwQ0osVUFDQSxBQUFDLENBQUEsTUFBTU4sU0FBU00sU0FBUSxFQUFHSyxRQUFRLElBQ25DVixHQUFHVyxZQUFZLENBQUNDLE1BQU07SUFHeEIsTUFBTUMsVUFBbUQsRUFBRTtJQUMzRCxJQUFJQyxZQUFvQjtJQUN4QixJQUFJQyxhQUFxQjtJQUN6QixNQUFNQyxVQUFVLENBQUNDO1FBQ2YsSUFBSWpCLEdBQUdrQixrQkFBa0IsQ0FBQ0QsT0FBTztZQUMvQixJQUFJQSxL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
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { PathLike } from "fs";
|
|
2
|
+
import { AbsolutePath } from "../utils/path-utils";
|
|
3
|
+
/**
|
|
4
|
+
* 체크섬 파일에 저장된 내용과 현재 실제 파일의 체크섬을 비교하여 변경된 파일을 찾습니다.
|
|
5
|
+
* @returns 변경된 파일 경로 배열. 프로젝트 루트부터 슬래시로 시작합니다. 예시: "/src/application/user/user.model.ts"
|
|
6
|
+
*/
|
|
7
|
+
export declare function findChangedFilesUsingChecksums(): Promise<AbsolutePath[]>;
|
|
8
|
+
/**
|
|
9
|
+
* 체크섬을 갱신합니다.
|
|
10
|
+
* 현재 파일들의 체크섬을 계산해서 구한 다음, 체크섬 파일에 저장된 내용과 다르면 체크섬 파일을 갱신합니다.
|
|
11
|
+
*/
|
|
12
|
+
export declare function renewChecksums(): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* 두 파일의 내용이 같은지 체크섬으로 비교합니다.
|
|
15
|
+
* 만약 파일이 둘 중 하나라도 없다면 비교 불가로 false 반환합니다.
|
|
16
|
+
* @param one 파일 경로
|
|
17
|
+
* @param two 파일 경로
|
|
18
|
+
* @returns boolean
|
|
19
|
+
*/
|
|
20
|
+
export declare function areFilesSame(one: PathLike, two: PathLike): Promise<boolean>;
|
|
21
|
+
//# sourceMappingURL=checksum.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checksum.d.ts","sourceRoot":"","sources":["../../src/syncer/checksum.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoB,QAAQ,EAAE,MAAM,IAAI,CAAC;AAQhD,OAAO,EACL,YAAY,EAEb,MAAM,qBAAqB,CAAC;AAQ7B;;;GAGG;AACH,wBAAsB,8BAA8B,IAAI,OAAO,CAC7D,YAAY,EAAE,CACf,CAYA;AAED;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAUpD;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,QAAQ,EACb,GAAG,EAAE,QAAQ,GACZ,OAAO,CAAC,OAAO,CAAC,CASlB"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import { globAsync } from "../utils/async-utils.js";
|
|
3
|
+
import { createReadStream } from "fs";
|
|
4
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
5
|
+
import { exists } from "../utils/fs-utils.js";
|
|
6
|
+
import crypto from "crypto";
|
|
7
|
+
import equal from "fast-deep-equal";
|
|
8
|
+
import * as _ from "lodash-es";
|
|
9
|
+
import { Sonamu } from "../api/sonamu.js";
|
|
10
|
+
import { getChecksumPatternGroupInAbsolutePath } from "./file-patterns.js";
|
|
11
|
+
/**
|
|
12
|
+
* 체크섬 파일에 저장된 내용과 현재 실제 파일의 체크섬을 비교하여 변경된 파일을 찾습니다.
|
|
13
|
+
* @returns 변경된 파일 경로 배열. 프로젝트 루트부터 슬래시로 시작합니다. 예시: "/src/application/user/user.model.ts"
|
|
14
|
+
*/ export async function findChangedFilesUsingChecksums() {
|
|
15
|
+
const calculatedChecksums = await getCurrentChecksums();
|
|
16
|
+
const savedChecksums = await getPreviousChecksums();
|
|
17
|
+
const isSame = equal(calculatedChecksums, savedChecksums);
|
|
18
|
+
if (isSame) {
|
|
19
|
+
return [];
|
|
20
|
+
}
|
|
21
|
+
const diff = _.differenceWith(calculatedChecksums, savedChecksums, _.isEqual);
|
|
22
|
+
return diff.map((r)=>r.path);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 체크섬을 갱신합니다.
|
|
26
|
+
* 현재 파일들의 체크섬을 계산해서 구한 다음, 체크섬 파일에 저장된 내용과 다르면 체크섬 파일을 갱신합니다.
|
|
27
|
+
*/ export async function renewChecksums() {
|
|
28
|
+
const calculatedChecksums = await getCurrentChecksums();
|
|
29
|
+
const savedChecksums = await getPreviousChecksums();
|
|
30
|
+
const isSame = equal(calculatedChecksums, savedChecksums);
|
|
31
|
+
if (isSame) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
await saveChecksums(calculatedChecksums);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 두 파일의 내용이 같은지 체크섬으로 비교합니다.
|
|
38
|
+
* 만약 파일이 둘 중 하나라도 없다면 비교 불가로 false 반환합니다.
|
|
39
|
+
* @param one 파일 경로
|
|
40
|
+
* @param two 파일 경로
|
|
41
|
+
* @returns boolean
|
|
42
|
+
*/ export async function areFilesSame(one, two) {
|
|
43
|
+
if (!await exists(one) || !await exists(two)) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
const oneChecksum = await getChecksumOfFile(one);
|
|
47
|
+
const twoChecksum = await getChecksumOfFile(two);
|
|
48
|
+
return oneChecksum === twoChecksum;
|
|
49
|
+
}
|
|
50
|
+
async function getCurrentChecksums() {
|
|
51
|
+
const filePaths = (await Promise.all(Object.entries(getChecksumPatternGroupInAbsolutePath()).map(async ([_fileType, pattern])=>{
|
|
52
|
+
return globAsync(pattern);
|
|
53
|
+
}))).flat().sort();
|
|
54
|
+
const fileChecksums = await Promise.all(filePaths.map(async (filePath)=>{
|
|
55
|
+
return {
|
|
56
|
+
path: filePath,
|
|
57
|
+
checksum: await getChecksumOfFile(filePath)
|
|
58
|
+
};
|
|
59
|
+
}));
|
|
60
|
+
return fileChecksums;
|
|
61
|
+
}
|
|
62
|
+
async function getPreviousChecksums() {
|
|
63
|
+
const checksumFilePath = getChecksumFilePath();
|
|
64
|
+
if (!await exists(checksumFilePath)) {
|
|
65
|
+
return [];
|
|
66
|
+
}
|
|
67
|
+
const previousChecksums = JSON.parse(await readFile(checksumFilePath, "utf-8")).map((r)=>({
|
|
68
|
+
path: path.join(Sonamu.apiRootPath, r.path),
|
|
69
|
+
checksum: r.checksum
|
|
70
|
+
}));
|
|
71
|
+
return previousChecksums;
|
|
72
|
+
}
|
|
73
|
+
function getChecksumFilePath() {
|
|
74
|
+
return path.join(Sonamu.apiRootPath, "sonamu.lock");
|
|
75
|
+
}
|
|
76
|
+
async function saveChecksums(checksums) {
|
|
77
|
+
const checksumFilePath = getChecksumFilePath();
|
|
78
|
+
await writeFile(checksumFilePath, JSON.stringify(checksums.map((r)=>({
|
|
79
|
+
path: path.relative(Sonamu.apiRootPath, r.path),
|
|
80
|
+
checksum: r.checksum
|
|
81
|
+
})), null, 2), "utf-8");
|
|
82
|
+
console.log("checksum saved", checksumFilePath);
|
|
83
|
+
}
|
|
84
|
+
async function getChecksumOfFile(filePath) {
|
|
85
|
+
return new Promise((resolve, reject)=>{
|
|
86
|
+
const hash = crypto.createHash("sha1");
|
|
87
|
+
const input = createReadStream(filePath);
|
|
88
|
+
input.on("error", reject);
|
|
89
|
+
input.on("data", function(chunk) {
|
|
90
|
+
hash.update(chunk);
|
|
91
|
+
});
|
|
92
|
+
input.on("close", function() {
|
|
93
|
+
resolve(hash.digest("hex"));
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvY2hlY2tzdW0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGdsb2JBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgY3JlYXRlUmVhZFN0cmVhbSwgUGF0aExpa2UgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IHJlYWRGaWxlLCB3cml0ZUZpbGUgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGV4aXN0cyB9IGZyb20gXCIuLi91dGlscy9mcy11dGlsc1wiO1xuXG5pbXBvcnQgY3J5cHRvIGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCBlcXVhbCBmcm9tIFwiZmFzdC1kZWVwLWVxdWFsXCI7XG5pbXBvcnQgKiBhcyBfIGZyb20gXCJsb2Rhc2gtZXNcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGkvc29uYW11XCI7XG5pbXBvcnQge1xuICBBYnNvbHV0ZVBhdGgsXG4gIEFwaVJlbGF0aXZlUGF0aCxcbn0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGggfSBmcm9tIFwiLi9maWxlLXBhdHRlcm5zXCI7XG5cbnR5cGUgUGF0aEFuZENoZWNrc3VtID0ge1xuICBwYXRoOiBBYnNvbHV0ZVBhdGg7XG4gIGNoZWNrc3VtOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIOyytO2BrOyErCDtjIzsnbzsl5Ag7KCA7J6l65CcIOuCtOyaqeqzvCDtmITsnqwg7Iuk7KCcIO2MjOydvOydmCDssrTtgazshKzsnYQg67mE6rWQ7ZWY7JesIOuzgOqyveuQnCDtjIzsnbzsnYQg7LC+7Iq164uI64ukLlxuICogQHJldHVybnMg67OA6rK965CcIO2MjOydvCDqsr3roZwg67Cw7Je0LiDtlITroZzsoJ3tirgg66Oo7Yq467aA7YSwIOyKrOuemOyLnOuhnCDsi5zsnpHtlanri4jri6QuIOyYiOyLnDogXCIvc3JjL2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC50c1wiXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaW5kQ2hhbmdlZEZpbGVzVXNpbmdDaGVja3N1bXMoKTogUHJvbWlzZTxcbiAgQWJzb2x1dGVQYXRoW11cbj4ge1xuICBjb25zdCBjYWxjdWxhdGVkQ2hlY2tzdW1zID0gYXdhaXQgZ2V0Q3VycmVudENoZWNrc3VtcygpO1xuICBjb25zdCBzYXZlZENoZWNrc3VtcyA9IGF3YWl0IGdldFByZXZpb3VzQ2hlY2tzdW1zKCk7XG5cbiAgY29uc3QgaXNTYW1lID0gZXF1YWwoY2FsY3VsYXRlZENoZWNrc3Vtcywgc2F2ZWRDaGVja3N1bXMpO1xuICBpZiAoaXNTYW1lKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgZGlmZiA9IF8uZGlmZmVyZW5jZVdpdGgoY2FsY3VsYXRlZENoZWNrc3Vtcywgc2F2ZWRDaGVja3N1bXMsIF8uaXNFcXVhbCk7XG5cbiAgcmV0dXJuIGRpZmYubWFwKChyKSA9PiByLnBhdGgpO1xufVxuXG4vKipcbiAqIOyytO2BrOyErOydhCDqsLHsi6Dtlanri4jri6QuXG4gKiDtmITsnqwg7YyM7J2865Ok7J2YIOyytO2BrOyErOydhCDqs4TsgrDtlbTshJwg6rWs7ZWcIOuLpOydjCwg7LK07YGs7ISsIO2MjOydvOyXkCDsoIDsnqXrkJwg64K07Jqp6rO8IOuLpOultOuptCDssrTtgazshKwg7YyM7J287J2EIOqwseyLoO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmV3Q2hlY2tzdW1zKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjYWxjdWxhdGVkQ2hlY2tzdW1zID0gYXdhaXQgZ2V0Q3VycmVudENoZWNrc3VtcygpO1xuICBjb25zdCBzYXZlZENoZWNrc3VtcyA9IGF3YWl0IGdldFByZXZpb3VzQ2hlY2tzdW1zKCk7XG5cbiAgY29uc3QgaXNTYW1lID0gZXF1YWwoY2FsY3VsYXRlZENoZWNrc3Vtcywgc2F2ZWRDaGVja3N1bXMpO1xuICBpZiAoaXNTYW1lKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgc2F2ZUNoZWNrc3VtcyhjYWxjdWxhdGVkQ2hlY2tzdW1zKTtcbn1cblxuLyoqXG4gKiDrkZAg7YyM7J287J2YIOuCtOyaqeydtCDqsJnsnYDsp4Ag7LK07YGs7ISs7Jy866GcIOu5hOq1kO2VqeuLiOuLpC5cbiAqIOunjOyVvSDtjIzsnbzsnbQg65GYIOykkSDtlZjrgpjrnbzrj4Qg7JeG64uk66m0IOu5hOq1kCDrtojqsIDroZwgZmFsc2Ug67CY7ZmY7ZWp64uI64ukLlxuICogQHBhcmFtIG9uZSDtjIzsnbwg6rK966GcXG4gKiBAcGFyYW0gdHdvIO2MjOydvCDqsr3roZxcbiAqIEByZXR1cm5zIGJvb2xlYW5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFyZUZpbGVzU2FtZShcbiAgb25lOiBQYXRoTGlrZSxcbiAgdHdvOiBQYXRoTGlrZVxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmICghKGF3YWl0IGV4aXN0cyhvbmUpKSB8fCAhKGF3YWl0IGV4aXN0cyh0d28pKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG9uZUNoZWNrc3VtID0gYXdhaXQgZ2V0Q2hlY2tzdW1PZkZpbGUob25lKTtcbiAgY29uc3QgdHdvQ2hlY2tzdW0gPSBhd2FpdCBnZXRDaGVja3N1bU9mRmlsZSh0d28pO1xuXG4gIHJldHVybiBvbmVDaGVja3N1bSA9PT0gdHdvQ2hlY2tzdW07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEN1cnJlbnRDaGVja3N1bXMoKTogUHJvbWlzZTxQYXRoQW5kQ2hlY2tzdW1bXT4ge1xuICBjb25zdCBmaWxlUGF0aHMgPSAoXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBPYmplY3QuZW50cmllcyhnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoKCkpLm1hcChcbiAgICAgICAgYXN5bmMgKFtfZmlsZVR5cGUsIHBhdHRlcm5dKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGdsb2JBc3luYyhwYXR0ZXJuKSBhcyBQcm9taXNlPEFic29sdXRlUGF0aFtdPjtcbiAgICAgICAgfVxuICAgICAgKVxuICAgIClcbiAgKVxuICAgIC5mbGF0KClcbiAgICAuc29ydCgpO1xuXG4gIGNvbnN0IGZpbGVDaGVja3N1bXMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBmaWxlUGF0aHMubWFwKGFzeW5jIChmaWxlUGF0aCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgIGNoZWNrc3VtOiBhd2FpdCBnZXRDaGVja3N1bU9mRmlsZShmaWxlUGF0aCksXG4gICAgICB9O1xuICAgIH0pXG4gICk7XG5cbiAgcmV0dXJuIGZpbGVDaGVja3N1bXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFByZXZpb3VzQ2hlY2tzdW1zKCk6IFByb21pc2U8UGF0aEFuZENoZWNrc3VtW10+IHtcbiAgY29uc3QgY2hlY2tzdW1GaWxlUGF0aCA9IGdldENoZWNrc3VtRmlsZVBhdGgoKTtcbiAgaWYgKCEoYXdhaXQgZXhpc3RzKGNoZWNrc3VtRmlsZVBhdGgpKSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IHByZXZpb3VzQ2hlY2tzdW1zID0gSlNPTi5wYXJzZShcbiAgICBhd2FpdCByZWFkRmlsZShjaGVja3N1bUZpbGVQYXRoLCBcInV0Zi04XCIpXG4gICkubWFwKChyOiB7IHBhdGg6IEFwaVJlbGF0aXZlUGF0aDsgY2hlY2tzdW06IHN0cmluZyB9KSA9PiAoe1xuICAgIHBhdGg6IHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIHIucGF0aCksIC8vIOyytO2BrOyErCDtjIzsnbzsl5DshJwg7J297J2EIOuVjDogQVBJIOyDgeuMgCDqsr3roZwg4oaSIOygiOuMgCDqsr3roZxcbiAgICBjaGVja3N1bTogci5jaGVja3N1bSxcbiAgfSkpIGFzIFBhdGhBbmRDaGVja3N1bVtdO1xuICByZXR1cm4gcHJldmlvdXNDaGVja3N1bXM7XG59XG5cbmZ1bmN0aW9uIGdldENoZWNrc3VtRmlsZVBhdGgoKTogQWJzb2x1dGVQYXRoIHtcbiAgcmV0dXJuIHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwic29uYW11LmxvY2tcIikgYXMgQWJzb2x1dGVQYXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzYXZlQ2hlY2tzdW1zKGNoZWNrc3VtczogUGF0aEFuZENoZWNrc3VtW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY2hlY2tzdW1GaWxlUGF0aCA9IGdldENoZWNrc3VtRmlsZVBhdGgoKTtcbiAgYXdhaXQgd3JpdGVGaWxlKFxuICAgIGNoZWNrc3VtRmlsZVBhdGgsXG4gICAgSlNPTi5zdHJpbmdpZnkoXG4gICAgICBjaGVja3N1bXMubWFwKChyKSA9PiAoe1xuICAgICAgICBwYXRoOiBwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgci5wYXRoKSwgLy8g7LK07YGs7ISsIO2MjOydvOyXkCDsoIDsnqXtlaAg65WMOiDsoIjrjIAg6rK966GcIOKGkiBBUEkg7IOB64yAIOqyveuhnFxuICAgICAgICBjaGVja3N1bTogci5jaGVja3N1bSxcbiAgICAgIH0pKSxcbiAgICAgIG51bGwsXG4gICAgICAyXG4gICAgKSxcbiAgICBcInV0Zi04XCJcbiAgKTtcbiAgY29uc29sZS5sb2coXCJjaGVja3N1bSBzYXZlZFwiLCBjaGVja3N1bUZpbGVQYXRoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0Q2hlY2tzdW1PZkZpbGUoZmlsZVBhdGg6IFBhdGhMaWtlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaChcInNoYTFcIik7XG4gICAgY29uc3QgaW5wdXQgPSBjcmVhdGVSZWFkU3RyZWFtKGZpbGVQYXRoKTtcbiAgICBpbnB1dC5vbihcImVycm9yXCIsIHJlamVjdCk7XG4gICAgaW5wdXQub24oXCJkYXRhXCIsIGZ1bmN0aW9uIChjaHVuazogYW55KSB7XG4gICAgICBoYXNoLnVwZGF0ZShjaHVuayk7XG4gICAgfSk7XG4gICAgaW5wdXQub24oXCJjbG9zZVwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXNvbHZlKGhhc2guZGlnZXN0KFwiaGV4XCIpKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iXSwibmFtZXMiOlsicGF0aCIsImdsb2JBc3luYyIsImNyZWF0ZVJlYWRTdHJlYW0iLCJyZWFkRmlsZSIsIndyaXRlRmlsZSIsImV4aXN0cyIsImNyeXB0byIsImVxdWFsIiwiXyIsIlNvbmFtdSIsImdldENoZWNrc3VtUGF0dGVybkdyb3VwSW5BYnNvbHV0ZVBhdGgiLCJmaW5kQ2hhbmdlZEZpbGVzVXNpbmdDaGVja3N1bXMiLCJjYWxjdWxhdGVkQ2hlY2tzdW1zIiwiZ2V0Q3VycmVudENoZWNrc3VtcyIsInNhdmVkQ2hlY2tzdW1zIiwiZ2V0UHJldmlvdXNDaGVja3N1bXMiLCJpc1NhbWUiLCJkaWZmIiwiZGlmZmVyZW5jZVdpdGgiLCJpc0VxdWFsIiwibWFwIiwiciIsInJlbmV3Q2hlY2tzdW1zIiwic2F2ZUNoZWNrc3VtcyIsImFyZUZpbGVzU2FtZSIsIm9uZSIsInR3byIsIm9uZUNoZWNrc3VtIiwiZ2V0Q2hlY2tzdW1PZkZpbGUiLCJ0d29DaGVja3N1bSIsImZpbGVQYXRocyIsIlByb21pc2UiLCJhbGwiLCJPYmplY3QiLCJlbnRyaWVzIiwiX2ZpbGVUeXBlIiwicGF0dGVybiIsImZsYXQiLCJzb3J0IiwiZmlsZUNoZWNrc3VtcyIsImZpbGVQYXRoIiwiY2hlY2tzdW0iLCJjaGVja3N1bUZpbGVQYXRoIiwiZ2V0Q2hlY2tzdW1GaWxlUGF0aCIsInByZXZpb3VzQ2hlY2tzdW1zIiwiSlNPTiIsInBhcnNlIiwiam9pbiIsImFwaVJvb3RQYXRoIiwiY2hlY2tzdW1zIiwic3RyaW5naWZ5IiwicmVsYXRpdmUiLCJjb25zb2xlIiwibG9nIiwicmVzb2x2ZSIsInJlamVjdCIsImhhc2giLCJjcmVhdGVIYXNoIiwiaW5wdXQiLCJvbiIsImNodW5rIiwidXBkYXRlIiwiZGlnZXN0Il0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxVQUFVLE9BQU87QUFDeEIsU0FBU0MsU0FBUyxRQUFRLDBCQUF1QjtBQUNqRCxTQUFTQyxnQkFBZ0IsUUFBa0IsS0FBSztBQUNoRCxTQUFTQyxRQUFRLEVBQUVDLFNBQVMsUUFBUSxtQkFBYztBQUNsRCxTQUFTQyxNQUFNLFFBQVEsdUJBQW9CO0FBRTNDLE9BQU9DLFlBQVksU0FBUztBQUM1QixPQUFPQyxXQUFXLGtCQUFrQjtBQUNwQyxZQUFZQyxPQUFPLFlBQVk7QUFDL0IsU0FBU0MsTUFBTSxRQUFRLG1CQUFnQjtBQUt2QyxTQUFTQyxxQ0FBcUMsUUFBUSxxQkFBa0I7QUFPeEU7OztDQUdDLEdBQ0QsT0FBTyxlQUFlQztJQUdwQixNQUFNQyxzQkFBc0IsTUFBTUM7SUFDbEMsTUFBTUMsaUJBQWlCLE1BQU1DO0lBRTdCLE1BQU1DLFNBQVNULE1BQU1LLHFCQUFxQkU7SUFDMUMsSUFBSUUsUUFBUTtRQUNWLE9BQU8sRUFBRTtJQUNYO0lBRUEsTUFBTUMsT0FBT1QsRUFBRVUsY0FBYyxDQUFDTixxQkFBcUJFLGdCQUFnQk4sRUFBRVcsT0FBTztJQUU1RSxPQUFPRixLQUFLRyxHQUFHLENBQUMsQ0FBQ0MsSUFBTUEsRUFBRXJCLElBQUk7QUFDL0I7QUFFQTs7O0NBR0MsR0FDRCxPQUFPLGVBQWVzQjtJQUNwQixNQUFNVixzQkFBc0IsTUFBTUM7SUFDbEMsTUFBTUMsaUJBQWlCLE1BQU1DO0lBRTdCLE1BQU1DLFNBQVNULE1BQU1LLHFCQUFxQkU7SUFDMUMsSUFBSUUsUUFBUTtRQUNWO0lBQ0Y7SUFFQSxNQUFNTyxjQUFjWDtBQUN0QjtBQUVBOzs7Ozs7Q0FNQyxHQUNELE9BQU8sZUFBZVksYUFDcEJDLEdBQWEsRUFDYkMsR0FBYTtJQUViLElBQUksQ0FBRSxNQUFNckIsT0FBT29CLFFBQVMsQ0FBRSxNQUFNcEIsT0FBT3FCLE1BQU87UUFDaEQsT0FBTztJQUNUO0lBRUEsTUFBTUMsY0FBYyxNQUFNQyxrQkFBa0JIO0lBQzVDLE1BQU1JLGNBQWMsTUFBTUQsa0JBQWtCRjtJQUU1QyxPQUFPQyxnQkFBZ0JFO0FBQ3pCO0FBRUEsZUFBZWhCO0lBQ2IsTUFBTWlCLFlBQVksQUFDaEIsQ0FBQSxNQUFNQyxRQUFRQyxHQUFHLENBQ2ZDLE9BQU9DLE9BQU8sQ0FBQ3hCLHlDQUF5Q1UsR0FBRyxDQUN6RCxPQUFPLENBQUNlLFdBQVdDLFFBQVE7UUFDekIsT0FBT25DLFVBQVVtQztJQUNuQixHQUVKLEVBRUNDLElBQUksR0FDSkMsSUFBSTtJQUVQLE1BQU1DLGdCQUFnQixNQUFNUixRQUFRQyxHQUFHLENBQ3JDRixVQUFVVixHQUFHLENBQUMsT0FBT29CO1FBQ25CLE9BQU87WUFDTHhDLE1BQU13QztZQUNOQyxVQUFVLE1BQU1iLGtCQUFrQlk7UUFDcEM7SUFDRjtJQUdGLE9BQU9EO0FBQ1Q7QUFFQSxlQUFleEI7SUFDYixNQUFNMkIsbUJBQW1CQztJQUN6QixJQUFJLENBQUUsTUFBTXRDLE9BQU9xQyxtQkFBb0I7UUFDckMsT0FBTyxFQUFFO0lBQ1g7SUFFQSxNQUFNRSxvQkFBb0JDLEtBQUtDLEtBQUssQ0FDbEMsTUFBTTNDLFNBQVN1QyxrQkFBa0IsVUFDakN0QixHQUFHLENBQUMsQ0FBQ0MsSUFBb0QsQ0FBQTtZQUN6RHJCLE1BQU1BLEtBQUsrQyxJQUFJLENBQUN0QyxPQUFPdUMsV0FBVyxFQUFFM0IsRUFBRXJCLElBQUk7WUFDMUN5QyxVQUFVcEIsRUFBRW9CLFFBQVE7UUFDdEIsQ0FBQTtJQUNBLE9BQU9HO0FBQ1Q7QUFFQSxTQUFTRDtJQUNQLE9BQU8zQyxLQUFLK0MsSUFBSSxDQUFDdEMsT0FBT3VDLFdBQVcsRUFBRTtBQUN2QztBQUVBLGVBQWV6QixjQUFjMEIsU0FBNEI7SUFDdkQsTUFBTVAsbUJBQW1CQztJQUN6QixNQUFNdkMsVUFDSnNDLGtCQUNBRyxLQUFLSyxTQUFTLENBQ1pELFVBQVU3QixHQUFHLENBQUMsQ0FBQ0MsSUFBTyxDQUFBO1lBQ3BCckIsTUFBTUEsS0FBS21ELFFBQVEsQ0FBQzFDLE9BQU91QyxXQUFXLEVBQUUzQixFQUFFckIsSUFBSTtZQUM5Q3lDLFVBQVVwQixFQUFFb0IsUUFBUTtRQUN0QixDQUFBLElBQ0EsTUFDQSxJQUVGO0lBRUZXLFFBQVFDLEdBQUcsQ0FBQyxrQkFBa0JYO0FBQ2hDO0FBRUEsZUFBZWQsa0JBQWtCWSxRQUFrQjtJQUNqRCxPQUFPLElBQUlULFFBQWdCLENBQUN1QixTQUFTQztRQUNuQyxNQUFNQyxPQUFPbEQsT0FBT21ELFVBQVUsQ0FBQztRQUMvQixNQUFNQyxRQUFReEQsaUJBQWlCc0M7UUFDL0JrQixNQUFNQyxFQUFFLENBQUMsU0FBU0o7UUFDbEJHLE1BQU1DLEVBQUUsQ0FBQyxRQUFRLFNBQVVDLEtBQVU7WUFDbkNKLEtBQUtLLE1BQU0sQ0FBQ0Q7UUFDZDtRQUNBRixNQUFNQyxFQUFFLENBQUMsU0FBUztZQUNoQkwsUUFBUUUsS0FBS00sTUFBTSxDQUFDO1FBQ3RCO0lBQ0Y7QUFDRiJ9
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { GenerateOptions, PathAndCode, TemplateKey, TemplateOptions } from "../types/types";
|
|
2
|
+
import { AbsolutePath } from "../utils/path-utils";
|
|
3
|
+
/**
|
|
4
|
+
* 템플릿을 렌더링하고 파일로 생성합니다.
|
|
5
|
+
* overwrite 옵션이 false인 경우, 이미 존재하는 파일은 건너뜁니다.
|
|
6
|
+
* @param key - 템플릿 키 (예: "entity", "model", "service" 등)
|
|
7
|
+
* @param templateOptions - 템플릿 렌더링에 필요한 옵션
|
|
8
|
+
* @param _generateOptions - 생성 옵션 (overwrite 여부)
|
|
9
|
+
* @returns 생성된 파일 경로 배열
|
|
10
|
+
*/
|
|
11
|
+
export declare function generateTemplate(key: TemplateKey, templateOptions: any, _generateOptions?: GenerateOptions): Promise<AbsolutePath[]>;
|
|
12
|
+
/**
|
|
13
|
+
* 템플릿을 렌더링하여 PathAndCode 객체를 반환합니다.
|
|
14
|
+
* 파일로 쓰지 않고 메모리상에서만 렌더링합니다.
|
|
15
|
+
* @param key - 템플릿 키
|
|
16
|
+
* @param options - 템플릿 렌더링 옵션
|
|
17
|
+
* @returns 경로와 코드 쌍의 배열
|
|
18
|
+
*/
|
|
19
|
+
export declare function renderTemplate<T extends keyof TemplateOptions>(key: T, options: TemplateOptions[T]): Promise<PathAndCode[]>;
|
|
20
|
+
//# sourceMappingURL=code-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-generator.d.ts","sourceRoot":"","sources":["../../src/syncer/code-generator.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,eAAe,EACf,WAAW,EACX,WAAW,EACX,eAAe,EAChB,MAAM,gBAAgB,CAAC;AAWxB,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,WAAW,EAChB,eAAe,EAAE,GAAG,EACpB,gBAAgB,CAAC,EAAE,eAAe,GACjC,OAAO,CAAC,YAAY,EAAE,CAAC,CA2CzB;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAAC,CAAC,SAAS,MAAM,eAAe,EAClE,GAAG,EAAE,CAAC,EACN,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,GAC1B,OAAO,CAAC,WAAW,EAAE,CAAC,CAkBxB"}
|