sonamu 0.6.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.swcrc.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 +2 -1
- package/dist/api/caster.d.ts.map +1 -1
- package/dist/api/caster.js +6 -1
- 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 +178 -409
- package/dist/api/config.d.ts +27 -13
- package/dist/api/config.d.ts.map +1 -1
- package/dist/api/config.js +19 -26
- package/dist/api/context.d.ts +4 -3
- package/dist/api/context.d.ts.map +1 -1
- package/dist/api/context.js +1 -1
- package/dist/api/decorators.d.ts +20 -6
- package/dist/api/decorators.d.ts.map +1 -1
- package/dist/api/decorators.js +111 -18
- package/dist/api/index.d.ts +2 -2
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +3 -3
- package/dist/api/sonamu.d.ts +7 -7
- package/dist/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +83 -51
- 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 +5 -1
- package/dist/bin/build-config.d.ts.map +1 -1
- package/dist/bin/build-config.js +5 -2
- package/dist/bin/cli.js +165 -64
- 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 +30 -13
- 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 +232 -89
- 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 +11 -10
- package/dist/database/db.d.ts +5 -6
- package/dist/database/db.d.ts.map +1 -1
- package/dist/database/db.js +22 -25
- 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 +2 -2
- package/dist/database/puri.d.ts +25 -14
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +83 -21
- package/dist/database/puri.types.d.ts +21 -7
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +4 -1
- 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 +1 -1
- 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 +227 -78
- package/dist/entity/entity-manager.d.ts +165 -2
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity-manager.js +26 -10
- package/dist/entity/entity.d.ts +5 -3
- package/dist/entity/entity.d.ts.map +1 -1
- package/dist/entity/entity.js +153 -54
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- package/dist/file-storage/file-storage.js +2 -2
- package/dist/index.d.ts +18 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -13
- 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 +123 -67
- 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 +67 -218
- package/dist/migration/migrator.d.ts +24 -73
- package/dist/migration/migrator.d.ts.map +1 -1
- package/dist/migration/migrator.js +121 -301
- 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 +1 -1
- 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 +91 -8
- package/dist/naite/naite.d.ts.map +1 -1
- package/dist/naite/naite.js +285 -41
- package/dist/stream/sse.d.ts +2 -2
- package/dist/stream/sse.d.ts.map +1 -1
- package/dist/stream/sse.js +1 -1
- package/dist/syncer/api-parser.d.ts +3 -13
- package/dist/syncer/api-parser.d.ts.map +1 -1
- package/dist/syncer/api-parser.js +67 -56
- package/dist/syncer/checksum.d.ts +2 -2
- package/dist/syncer/checksum.d.ts.map +1 -1
- package/dist/syncer/checksum.js +11 -11
- package/dist/syncer/code-generator.d.ts +3 -3
- package/dist/syncer/code-generator.d.ts.map +1 -1
- package/dist/syncer/code-generator.js +37 -17
- package/dist/syncer/entity-operations.d.ts +2 -2
- package/dist/syncer/entity-operations.d.ts.map +1 -1
- package/dist/syncer/entity-operations.js +9 -8
- package/dist/syncer/file-patterns.d.ts +1 -1
- package/dist/syncer/file-patterns.d.ts.map +1 -1
- package/dist/syncer/file-patterns.js +1 -1
- package/dist/syncer/index.d.ts +4 -4
- package/dist/syncer/index.d.ts.map +1 -1
- package/dist/syncer/index.js +5 -5
- package/dist/syncer/module-loader.d.ts +4 -4
- package/dist/syncer/module-loader.d.ts.map +1 -1
- package/dist/syncer/module-loader.js +17 -12
- package/dist/syncer/syncer.d.ts +31 -24
- package/dist/syncer/syncer.d.ts.map +1 -1
- package/dist/syncer/syncer.js +92 -45
- package/dist/template/entity-converter.d.ts +1 -1
- package/dist/template/entity-converter.d.ts.map +1 -1
- package/dist/template/entity-converter.js +15 -8
- package/dist/template/helpers.d.ts +2 -2
- package/dist/template/helpers.d.ts.map +1 -1
- package/dist/template/helpers.js +3 -3
- package/dist/template/implementations/entity.template.d.ts +2 -2
- package/dist/template/implementations/entity.template.d.ts.map +1 -1
- package/dist/template/implementations/entity.template.js +4 -5
- package/dist/template/implementations/generated.template.d.ts +2 -3
- package/dist/template/implementations/generated.template.d.ts.map +1 -1
- package/dist/template/implementations/generated.template.js +46 -29
- package/dist/template/implementations/generated_http.template.d.ts +2 -3
- package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_http.template.js +9 -9
- package/dist/template/implementations/generated_sso.template.d.ts +3 -4
- package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
- package/dist/template/implementations/generated_sso.template.js +54 -25
- package/dist/template/implementations/init_types.template.d.ts +2 -2
- package/dist/template/implementations/init_types.template.d.ts.map +1 -1
- package/dist/template/implementations/init_types.template.js +2 -2
- package/dist/template/implementations/model.template.d.ts +2 -2
- package/dist/template/implementations/model.template.d.ts.map +1 -1
- package/dist/template/implementations/model.template.js +47 -37
- package/dist/template/implementations/model_test.template.d.ts +2 -2
- package/dist/template/implementations/model_test.template.d.ts.map +1 -1
- package/dist/template/implementations/model_test.template.js +2 -2
- package/dist/template/implementations/service.template.d.ts +4 -4
- package/dist/template/implementations/service.template.d.ts.map +1 -1
- package/dist/template/implementations/service.template.js +24 -16
- package/dist/template/implementations/view_enums_buttonset.template.d.ts +2 -2
- package/dist/template/implementations/view_enums_buttonset.template.d.ts.map +1 -1
- package/dist/template/implementations/view_enums_buttonset.template.js +1 -1
- package/dist/template/implementations/view_enums_dropdown.template.d.ts +2 -2
- package/dist/template/implementations/view_enums_dropdown.template.d.ts.map +1 -1
- package/dist/template/implementations/view_enums_dropdown.template.js +2 -2
- package/dist/template/implementations/view_enums_select.template.d.ts +2 -2
- package/dist/template/implementations/view_enums_select.template.d.ts.map +1 -1
- package/dist/template/implementations/view_enums_select.template.js +2 -2
- package/dist/template/implementations/view_form.template.d.ts +2 -2
- package/dist/template/implementations/view_form.template.d.ts.map +1 -1
- package/dist/template/implementations/view_form.template.js +4 -4
- package/dist/template/implementations/view_id_all_select.template.d.ts +2 -2
- package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -1
- package/dist/template/implementations/view_id_all_select.template.js +1 -1
- package/dist/template/implementations/view_id_async_select.template.d.ts +2 -2
- package/dist/template/implementations/view_id_async_select.template.d.ts.map +1 -1
- package/dist/template/implementations/view_id_async_select.template.js +1 -1
- package/dist/template/implementations/view_list.template.d.ts +2 -2
- package/dist/template/implementations/view_list.template.d.ts.map +1 -1
- package/dist/template/implementations/view_list.template.js +29 -19
- package/dist/template/implementations/view_list_columns.template.d.ts +3 -3
- package/dist/template/implementations/view_list_columns.template.d.ts.map +1 -1
- package/dist/template/implementations/view_list_columns.template.js +1 -1
- package/dist/template/implementations/view_search_input.template.d.ts +2 -2
- package/dist/template/implementations/view_search_input.template.d.ts.map +1 -1
- package/dist/template/implementations/view_search_input.template.js +1 -1
- package/dist/template/index.d.ts +4 -2
- package/dist/template/index.d.ts.map +1 -1
- package/dist/template/index.js +5 -3
- 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 +12 -2
- package/dist/template/template.d.ts.map +1 -1
- package/dist/template/template.js +19 -6
- package/dist/template/zod-converter.d.ts +40 -7
- package/dist/template/zod-converter.d.ts.map +1 -1
- package/dist/template/zod-converter.js +386 -58
- 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 +12 -3
- 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 +338 -236
- package/dist/types/types.d.ts +709 -104
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +309 -52
- package/dist/typings/knex.d.js +2 -2
- package/dist/utils/async-utils.d.ts.map +1 -1
- package/dist/utils/async-utils.js +3 -3
- package/dist/utils/console-util.js +1 -1
- package/dist/utils/controller.d.ts +1 -0
- package/dist/utils/controller.d.ts.map +1 -1
- package/dist/utils/controller.js +4 -1
- package/dist/utils/esm-utils.d.ts +0 -6
- package/dist/utils/esm-utils.d.ts.map +1 -1
- package/dist/utils/esm-utils.js +2 -9
- 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 +1 -1
- package/dist/utils/lodash-able.d.ts.map +1 -1
- package/dist/utils/lodash-able.js +1 -1
- 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 +1 -1
- package/dist/utils/path-utils.d.ts.map +1 -1
- package/dist/utils/path-utils.js +3 -3
- package/dist/utils/process-utils.js +1 -1
- 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 +14 -3
- 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 +7 -1
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +44 -5
- 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 +1 -1
- package/package.json +55 -30
- 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 +176 -533
- package/src/api/config.ts +39 -56
- package/src/api/context.ts +7 -18
- package/src/api/decorators.ts +175 -46
- package/src/api/index.ts +2 -2
- package/src/api/sonamu.ts +133 -124
- package/src/api/validator.ts +83 -0
- package/src/bin/build-config.ts +7 -1
- package/src/bin/cli.ts +192 -110
- 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 +36 -50
- 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 +182 -126
- package/src/database/puri.types.ts +64 -31
- package/src/database/transaction-context.ts +1 -1
- package/src/database/upsert-builder.ts +261 -132
- package/src/entity/entity-manager.ts +36 -28
- package/src/entity/entity.ts +330 -249
- 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 -12
- package/src/migration/code-generation.ts +185 -172
- package/src/migration/migration-set.ts +80 -293
- package/src/migration/migrator.ts +182 -425
- 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 +378 -33
- package/src/shared/web.shared.ts.txt +20 -24
- package/src/stream/sse.ts +5 -5
- package/src/syncer/api-parser.ts +52 -69
- package/src/syncer/checksum.ts +25 -37
- package/src/syncer/code-generator.ts +58 -62
- package/src/syncer/entity-operations.ts +12 -15
- package/src/syncer/file-patterns.ts +2 -2
- package/src/syncer/index.ts +4 -4
- package/src/syncer/module-loader.ts +28 -25
- package/src/syncer/syncer.ts +155 -162
- package/src/template/entity-converter.ts +18 -27
- package/src/template/helpers.ts +8 -11
- package/src/template/implementations/entity.template.ts +6 -6
- package/src/template/implementations/generated.template.ts +99 -99
- package/src/template/implementations/generated_http.template.ts +21 -54
- package/src/template/implementations/generated_sso.template.ts +78 -65
- package/src/template/implementations/init_types.template.ts +4 -6
- package/src/template/implementations/model.template.ts +47 -38
- package/src/template/implementations/model_test.template.ts +3 -3
- package/src/template/implementations/service.template.ts +56 -80
- package/src/template/implementations/view_enums_buttonset.template.ts +2 -2
- package/src/template/implementations/view_enums_dropdown.template.ts +4 -4
- package/src/template/implementations/view_enums_select.template.ts +3 -3
- package/src/template/implementations/view_form.template.ts +34 -75
- package/src/template/implementations/view_id_all_select.template.ts +2 -2
- package/src/template/implementations/view_id_async_select.template.ts +9 -23
- package/src/template/implementations/view_list.template.ts +54 -95
- package/src/template/implementations/view_list_columns.template.ts +4 -10
- package/src/template/implementations/view_search_input.template.ts +2 -2
- package/src/template/index.ts +4 -2
- package/src/template/template-manager.ts +166 -0
- package/src/template/template-types.ts +16 -0
- package/src/template/template.ts +29 -10
- package/src/template/zod-converter.ts +459 -101
- package/src/testing/_relation-graph.ts +18 -11
- package/src/testing/fixture-manager.ts +468 -362
- package/src/types/types.ts +516 -248
- package/src/typings/knex.d.ts +7 -9
- package/src/utils/async-utils.ts +8 -12
- package/src/utils/console-util.ts +1 -1
- package/src/utils/controller.ts +3 -0
- package/src/utils/esm-utils.ts +8 -18
- 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 +3 -6
- package/src/utils/process-utils.ts +1 -1
- package/src/utils/sql-parser.ts +23 -5
- package/src/utils/type-utils.ts +83 -0
- package/src/utils/utils.ts +58 -9
- package/src/utils/zod-error.ts +3 -3
- 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 -72
- 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 -39
- 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 -210
- package/src/bin/cli-wrapper.ts +0 -82
- package/src/database/knex-plugins/knex-on-duplicate-update.ts +0 -45
- package/src/entity/entity-utils.ts +0 -291
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NaiteReporter
|
|
3
|
+
*
|
|
4
|
+
* 테스트 결과와 Trace 정보를 Unix Socket으로 VS Code extension에 전달합니다.
|
|
5
|
+
* extension이 ~/.sonamu/naite.sock에 소켓 서버를 열어둡니다.
|
|
6
|
+
*
|
|
7
|
+
* fs mock 충돌을 피하기 위해 net 모듈만 사용합니다.
|
|
8
|
+
*/
|
|
9
|
+
/** biome-ignore-all lint/suspicious/noExplicitAny: Naite는 expect와 호응하도록 any를 허용함 */
|
|
10
|
+
|
|
11
|
+
import { connect, type Socket } from "net";
|
|
12
|
+
import { homedir } from "os";
|
|
13
|
+
import { join } from "path";
|
|
14
|
+
import type { NaiteMessagingTypes } from "./messaging-types";
|
|
15
|
+
|
|
16
|
+
// 소켓 경로
|
|
17
|
+
const SOCKET_PATH =
|
|
18
|
+
process.platform === "win32" ? "\\\\.\\pipe\\naite" : join(homedir(), ".sonamu", "naite.sock");
|
|
19
|
+
|
|
20
|
+
class NaiteReporterClass {
|
|
21
|
+
private socket: Socket | null = null;
|
|
22
|
+
private connected = false;
|
|
23
|
+
private buffer: string[] = [];
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* 소켓 연결 시도
|
|
27
|
+
*/
|
|
28
|
+
private ensureConnection(): void {
|
|
29
|
+
if (this.connected || this.socket) return;
|
|
30
|
+
|
|
31
|
+
try {
|
|
32
|
+
this.socket = connect(SOCKET_PATH);
|
|
33
|
+
|
|
34
|
+
this.socket.on("connect", () => {
|
|
35
|
+
this.connected = true;
|
|
36
|
+
// 버퍼에 쌓인 메시지 전송
|
|
37
|
+
for (const msg of this.buffer) {
|
|
38
|
+
this.socket?.write(msg);
|
|
39
|
+
}
|
|
40
|
+
this.buffer = [];
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
this.socket.on("error", () => {
|
|
44
|
+
// 연결 실패 무시 (extension이 꺼져있을 수 있음)
|
|
45
|
+
this.connected = false;
|
|
46
|
+
this.socket = null;
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
this.socket.on("close", () => {
|
|
50
|
+
this.connected = false;
|
|
51
|
+
this.socket = null;
|
|
52
|
+
});
|
|
53
|
+
} catch {
|
|
54
|
+
// 연결 실패 무시
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* 메시지 전송 (줄바꿈으로 구분)
|
|
60
|
+
*/
|
|
61
|
+
private send(data: NaiteMessagingTypes.NaiteMessage): void {
|
|
62
|
+
const msg = `${JSON.stringify(data)}\n`;
|
|
63
|
+
|
|
64
|
+
this.ensureConnection();
|
|
65
|
+
|
|
66
|
+
if (this.connected && this.socket) {
|
|
67
|
+
this.socket.write(msg);
|
|
68
|
+
} else {
|
|
69
|
+
// 연결 대기 중이면 버퍼에 저장
|
|
70
|
+
this.buffer.push(msg);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* beforeAll에서 호출합니다.
|
|
76
|
+
* 테스트 run 시작을 알립니다 (데이터 클리어 신호).
|
|
77
|
+
*/
|
|
78
|
+
startTestRun(): void {
|
|
79
|
+
if (process.env.CI) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
this.send({
|
|
84
|
+
type: "run/start",
|
|
85
|
+
startedAt: new Date().toISOString(),
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* afterEach에서 호출합니다.
|
|
91
|
+
* 테스트 케이스 결과를 traces와 함께 전송합니다.
|
|
92
|
+
*/
|
|
93
|
+
reportTestResult(result: Omit<NaiteMessagingTypes.TestResult, "receivedAt">): void {
|
|
94
|
+
if (process.env.CI) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
this.send({
|
|
99
|
+
type: "test/result",
|
|
100
|
+
receivedAt: new Date().toISOString(),
|
|
101
|
+
...result,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* afterAll에서 호출합니다.
|
|
107
|
+
* 테스트 run 종료를 알립니다.
|
|
108
|
+
*/
|
|
109
|
+
endTestRun(): void {
|
|
110
|
+
if (process.env.CI) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
this.send({
|
|
115
|
+
type: "run/end",
|
|
116
|
+
endedAt: new Date().toISOString(),
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
// 연결 종료
|
|
120
|
+
if (this.socket) {
|
|
121
|
+
this.socket.end();
|
|
122
|
+
this.socket = null;
|
|
123
|
+
this.connected = false;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export const NaiteReporter = new NaiteReporterClass();
|
package/src/naite/naite.ts
CHANGED
|
@@ -1,70 +1,415 @@
|
|
|
1
|
+
/** biome-ignore-all lint/suspicious/noExplicitAny: Naite는 expect와 호응하도록 any를 허용함 */
|
|
2
|
+
|
|
3
|
+
import { get } from "radashi";
|
|
1
4
|
import { Sonamu } from "../api/sonamu";
|
|
5
|
+
import type { ComparisonOperator } from "../database/puri.types";
|
|
6
|
+
import { isSerializable } from "../utils/object-utils";
|
|
7
|
+
|
|
8
|
+
// StackFrame 타입
|
|
9
|
+
interface StackFrame {
|
|
10
|
+
functionName: string | null;
|
|
11
|
+
filePath: string; // "/Users/.../syncer.ts" 또는 "node:internal/..."
|
|
12
|
+
lineNumber: number; // TS 파일 기준 라인 번호
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// NaiteTrace 타입
|
|
16
|
+
interface NaiteTrace {
|
|
17
|
+
key: string;
|
|
18
|
+
data: any;
|
|
19
|
+
stack: StackFrame[]; // 콜스택 정보
|
|
20
|
+
at: Date;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Naite.t가 저장되는 타입 (항상 배열로 통일)
|
|
24
|
+
export type NaiteStore = Map<string, NaiteTrace[]>;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* 콜스택을 파싱하여 StackFrame 배열로 반환
|
|
28
|
+
* - extractCallStack 자신과 Naite.t는 제외
|
|
29
|
+
* - runWithContext/runWithMockContext 발견 시 거기서 종료
|
|
30
|
+
* - node: 내부 경로는 포함하되, lineNumber는 path에 : 포함 시 붙이지 않음
|
|
31
|
+
*/
|
|
32
|
+
function extractCallStack(): StackFrame[] {
|
|
33
|
+
const stack = new Error().stack;
|
|
34
|
+
if (!stack) return [];
|
|
35
|
+
|
|
36
|
+
const lines = stack.split("\n");
|
|
37
|
+
|
|
38
|
+
// 콜스택 구조:
|
|
39
|
+
// [0]: "Error"
|
|
40
|
+
// [1]: "at extractCallStack"
|
|
41
|
+
// [2]: "at Naite.t"
|
|
42
|
+
// [3]: 실제 호출 위치부터 시작
|
|
43
|
+
const frames = lines
|
|
44
|
+
.slice(3)
|
|
45
|
+
.map(parseStackFrame)
|
|
46
|
+
.filter((frame): frame is StackFrame => frame !== null);
|
|
47
|
+
|
|
48
|
+
// runWithContext 계열 함수 발견 시 거기서 자르기
|
|
49
|
+
const contextIndex = frames.findIndex(
|
|
50
|
+
(f) =>
|
|
51
|
+
f.functionName?.includes("runWithContext") || f.functionName?.includes("runWithMockContext"),
|
|
52
|
+
);
|
|
53
|
+
|
|
54
|
+
return contextIndex >= 0 ? frames.slice(0, contextIndex + 1) : frames;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* 콜스택 한 줄을 파싱
|
|
59
|
+
* 형식1: "at FunctionName (filePath:lineNumber:columnNumber)"
|
|
60
|
+
* 형식2: "at filePath:lineNumber:columnNumber" (익명 함수/모듈 레벨)
|
|
61
|
+
*/
|
|
62
|
+
function parseStackFrame(line: string): StackFrame | null {
|
|
63
|
+
// 패턴1: "at FunctionName (filePath:lineNumber:columnNumber)"
|
|
64
|
+
const matchWithFunc = line.match(/at\s+(.+?)\s+\((.+?):(\d+):\d+\)/);
|
|
65
|
+
if (matchWithFunc) {
|
|
66
|
+
const functionName = matchWithFunc[1];
|
|
67
|
+
const filePath = matchWithFunc[2];
|
|
68
|
+
const lineNumberStr = matchWithFunc[3];
|
|
69
|
+
|
|
70
|
+
// filePath에 이미 :가 포함되어 있으면 (예: "node:internal/...")
|
|
71
|
+
if (filePath.includes(":")) {
|
|
72
|
+
return { functionName, filePath, lineNumber: 0 };
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return {
|
|
76
|
+
functionName,
|
|
77
|
+
filePath,
|
|
78
|
+
lineNumber: Number.parseInt(lineNumberStr, 10),
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// 패턴2: "at filePath:lineNumber:columnNumber" (함수명 없음)
|
|
83
|
+
const matchNoFunc = line.match(/at\s+(.+?):(\d+):\d+$/);
|
|
84
|
+
if (matchNoFunc) {
|
|
85
|
+
const filePath = matchNoFunc[1];
|
|
86
|
+
const lineNumberStr = matchNoFunc[2];
|
|
87
|
+
|
|
88
|
+
return {
|
|
89
|
+
functionName: null,
|
|
90
|
+
filePath,
|
|
91
|
+
lineNumber: Number.parseInt(lineNumberStr, 10),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* wildcard 패턴 매칭
|
|
100
|
+
* 예시:
|
|
101
|
+
* - "syncer:*" → "syncer:a", "syncer:a:b" 모두 매칭
|
|
102
|
+
* - "syncer:*:user" → "syncer:renderTemplate:user" 매칭
|
|
103
|
+
* - "syncer:renderTemplate:*" → "syncer:renderTemplate:service" 매칭
|
|
104
|
+
*/
|
|
105
|
+
function matchesPattern(key: string, pattern: string): boolean {
|
|
106
|
+
const keyParts = key.split(":");
|
|
107
|
+
const patternParts = pattern.split(":");
|
|
108
|
+
|
|
109
|
+
// 마지막이 * → prefix 매칭 (길이 무관)
|
|
110
|
+
// 예: "syncer:*"는 "syncer:a", "syncer:a:b" 모두 매칭
|
|
111
|
+
if (patternParts[patternParts.length - 1] === "*") {
|
|
112
|
+
const prefixParts = patternParts.slice(0, -1);
|
|
113
|
+
// prefix가 모두 일치하는지 확인
|
|
114
|
+
return prefixParts.every((part, i) => part === keyParts[i]);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// 길이가 같아야 함
|
|
118
|
+
if (patternParts.length !== keyParts.length) {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// 각 파트가 * 또는 정확히 일치
|
|
123
|
+
return patternParts.every((part, i) => part === "*" || part === keyParts[i]);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* NaiteQuery 클래스
|
|
128
|
+
* 체이닝을 통한 trace 필터링 및 조회
|
|
129
|
+
*/
|
|
130
|
+
export class NaiteQuery {
|
|
131
|
+
constructor(private traces: NaiteTrace[]) {}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* 파일명으로 필터링
|
|
135
|
+
* @param fileName 파일명 (예: "syncer.test.ts")
|
|
136
|
+
*/
|
|
137
|
+
fromFile(fileName: string): NaiteQuery {
|
|
138
|
+
const filtered = this.traces.filter((t) =>
|
|
139
|
+
t.stack.some((frame) => frame.filePath.endsWith(`/${fileName}`)),
|
|
140
|
+
);
|
|
141
|
+
return new NaiteQuery(filtered);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* 함수명으로 필터링
|
|
146
|
+
* @param funcName 함수명 (includes 체크)
|
|
147
|
+
* @param options.from 'direct' = 직접 호출만, 'indirect' = 간접 호출만, 'both' = 모두
|
|
148
|
+
*/
|
|
149
|
+
fromFunction(
|
|
150
|
+
funcName: string,
|
|
151
|
+
options: { from: "direct" | "indirect" | "both" } = { from: "both" },
|
|
152
|
+
): NaiteQuery {
|
|
153
|
+
const filtered = this.traces.filter((t) => {
|
|
154
|
+
if (options.from === "direct") {
|
|
155
|
+
// stack[0]만 확인 (직접 호출)
|
|
156
|
+
return t.stack[0]?.functionName?.includes(funcName);
|
|
157
|
+
}
|
|
158
|
+
if (options.from === "indirect") {
|
|
159
|
+
// stack[1+]에서 확인 (간접 호출)
|
|
160
|
+
return t.stack.slice(1).some((f) => f.functionName?.includes(funcName));
|
|
161
|
+
}
|
|
162
|
+
// 전체 스택에서 확인
|
|
163
|
+
return t.stack.some((f) => f.functionName?.includes(funcName));
|
|
164
|
+
});
|
|
165
|
+
return new NaiteQuery(filtered);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* 데이터 경로 기반 필터링
|
|
170
|
+
* @param path radash get 경로 (예: "data.userId")
|
|
171
|
+
* @param operator 비교 연산자
|
|
172
|
+
* @param value 비교값
|
|
173
|
+
*/
|
|
174
|
+
where(path: string, operator: ComparisonOperator | "includes", value: any): NaiteQuery {
|
|
175
|
+
const filtered = this.traces.filter((trace) => {
|
|
176
|
+
const actual = get(trace, path) as any;
|
|
177
|
+
|
|
178
|
+
switch (operator) {
|
|
179
|
+
case ">":
|
|
180
|
+
return actual > value;
|
|
181
|
+
case "<":
|
|
182
|
+
return actual < value;
|
|
183
|
+
case ">=":
|
|
184
|
+
return actual >= value;
|
|
185
|
+
case "<=":
|
|
186
|
+
return actual <= value;
|
|
187
|
+
case "=":
|
|
188
|
+
return actual === value;
|
|
189
|
+
case "!=":
|
|
190
|
+
return actual !== value;
|
|
191
|
+
case "includes":
|
|
192
|
+
return typeof actual === "string" && actual.includes(value);
|
|
193
|
+
default:
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
return new NaiteQuery(filtered);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* 전체 데이터 배열 반환
|
|
202
|
+
*/
|
|
203
|
+
result(): any[] {
|
|
204
|
+
return this.traces.map((t) => t.data);
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* 첫 번째 데이터 반환
|
|
209
|
+
*/
|
|
210
|
+
first(): any | undefined {
|
|
211
|
+
return this.traces[0]?.data;
|
|
212
|
+
}
|
|
2
213
|
|
|
3
|
-
|
|
214
|
+
/**
|
|
215
|
+
* 마지막 데이터 반환
|
|
216
|
+
*/
|
|
217
|
+
last(): any | undefined {
|
|
218
|
+
return this.traces[this.traces.length - 1]?.data;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/**
|
|
222
|
+
* n번째 데이터 반환
|
|
223
|
+
*/
|
|
224
|
+
at(index: number): any | undefined {
|
|
225
|
+
return this.traces[index]?.data;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* 원본 trace 배열 반환 (디버깅/NaiteViewer용)
|
|
230
|
+
*/
|
|
231
|
+
getTraces(): NaiteTrace[] {
|
|
232
|
+
return this.traces;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// Naite 싱글턴 객체 (추후 logger 연결 등의 상태 관리 필요성 고려)
|
|
237
|
+
export class NaiteClass {
|
|
4
238
|
// 테스트 로그 기록
|
|
5
|
-
|
|
239
|
+
t(
|
|
240
|
+
name: string,
|
|
241
|
+
value: any /*이렇게 받은 값이 NaiteTrace로 저장되어 있다가 추후에 vitest에게 meta를 통해 넘겨져 프로세스간 통신을 통해 직렬화되어야 하는 점을 고려하였을 때 여기에 Serializable을 써서 제한을 둘 수도 있지만, 사용상의 편의를 생각하여 any로 받습니다.*/,
|
|
242
|
+
) {
|
|
243
|
+
// 이 t 함수는 테스트 환경에서만 작동해야 합니다.
|
|
244
|
+
// 그리고 테스트 환경 판단에 왜 isTest() 함수를 사용하지 않았냐면요,,
|
|
245
|
+
// 이렇게 하는게 유틸 함수 불러와서 사용하는 것보다 조금이나마 빠를 것 같았기 때문입니다.
|
|
246
|
+
if (process.env.NODE_ENV !== "test") {
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
try {
|
|
251
|
+
const context = Sonamu.getContext();
|
|
252
|
+
const store = context?.naiteStore;
|
|
253
|
+
|
|
254
|
+
if (!store) {
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// 콜스택 수집
|
|
259
|
+
const stack = extractCallStack();
|
|
260
|
+
|
|
261
|
+
const trace: NaiteTrace = {
|
|
262
|
+
key: name,
|
|
263
|
+
data: value,
|
|
264
|
+
stack,
|
|
265
|
+
at: new Date(),
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
// 항상 배열로 관리
|
|
269
|
+
const existing = store.get(name) ?? [];
|
|
270
|
+
store.set(name, [...existing, trace]);
|
|
271
|
+
} catch {
|
|
272
|
+
// Context 없는 상황에서 Naite.t 호출
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* key 또는 wildcard 패턴으로 trace 조회
|
|
278
|
+
* 항상 NaiteQuery 반환하여 체이닝 가능
|
|
279
|
+
*/
|
|
280
|
+
get(keyPattern: string): NaiteQuery {
|
|
6
281
|
const context = Sonamu.getContext();
|
|
7
282
|
const store = context?.naiteStore;
|
|
8
283
|
|
|
9
284
|
if (!store) {
|
|
10
|
-
return;
|
|
285
|
+
return new NaiteQuery([]);
|
|
11
286
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
287
|
+
|
|
288
|
+
// wildcard 없으면 exact match
|
|
289
|
+
if (!keyPattern.includes("*")) {
|
|
290
|
+
const traces = store.get(keyPattern) ?? [];
|
|
291
|
+
return new NaiteQuery(traces);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
// wildcard 패턴 매칭
|
|
295
|
+
const allTraces: NaiteTrace[] = [];
|
|
296
|
+
for (const [key, traces] of store.entries()) {
|
|
297
|
+
if (matchesPattern(key, keyPattern)) {
|
|
298
|
+
allTraces.push(...traces);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
return new NaiteQuery(allTraces);
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// 전체 리스트 가져오기
|
|
306
|
+
getAll(): { [key: string]: any } {
|
|
307
|
+
const context = Sonamu.getContext();
|
|
308
|
+
if (!context?.naiteStore) {
|
|
309
|
+
return {};
|
|
310
|
+
}
|
|
311
|
+
// NaiteTrace 배열을 data만 추출하여 반환
|
|
312
|
+
const result: { [key: string]: any } = {};
|
|
313
|
+
for (const [key, traces] of context.naiteStore.entries()) {
|
|
314
|
+
if (key.startsWith("mock:")) {
|
|
315
|
+
// Mock 설정은 그대로 반환
|
|
316
|
+
result[key] = traces;
|
|
17
317
|
} else {
|
|
18
|
-
//
|
|
19
|
-
|
|
318
|
+
// NaiteTrace 배열은 data만 추출
|
|
319
|
+
result[key] = traces.map((t: NaiteTrace) => t.data);
|
|
20
320
|
}
|
|
21
|
-
} else {
|
|
22
|
-
// 값이 없는 경우 추가
|
|
23
|
-
store.set(name, value);
|
|
24
321
|
}
|
|
322
|
+
return result;
|
|
25
323
|
}
|
|
26
324
|
|
|
27
|
-
|
|
28
|
-
|
|
325
|
+
/**
|
|
326
|
+
* 스토어에 들어있던 트레이스를 고대로 꺼내옵니다.
|
|
327
|
+
* 이때 값들은 모두 직렬화 가능한 상태로 나가게 됩니다.
|
|
328
|
+
* 테스트 정보와 함께 extensions에 보낼 용도로 만들었습니다.
|
|
329
|
+
* @returns
|
|
330
|
+
*/
|
|
331
|
+
getAllTraces(): {
|
|
332
|
+
key: string;
|
|
333
|
+
value: any;
|
|
334
|
+
filePath: string;
|
|
335
|
+
lineNumber: number;
|
|
336
|
+
at: string;
|
|
337
|
+
}[] {
|
|
29
338
|
const context = Sonamu.getContext();
|
|
30
|
-
if (!context?.naiteStore
|
|
31
|
-
|
|
339
|
+
if (!context?.naiteStore) {
|
|
340
|
+
return [];
|
|
32
341
|
}
|
|
33
|
-
|
|
342
|
+
|
|
343
|
+
const traces = Array.from(context.naiteStore.values()).flat();
|
|
344
|
+
|
|
345
|
+
// 직렬화 불가능한 값이 존재한다면 이를 대문짝만하게 알려줍니다! 그치만 알리기만 하고 그냥 지나갑니다 ㅎㅎ
|
|
346
|
+
// 왜 직렬화가 중요한가? 이(getAllTraces) 호출의 결과는 외부로 나가게 되는데,
|
|
347
|
+
// 이때 주 용도가 vitest의 task.meta 필드를 통해 afterEach에서 Sonamu extension으로 전달하는 것입니다.
|
|
348
|
+
// 여기서 meta 필드에 담긴 내용은 프로세스간 통신(process.send) 또는 스레드간 통신(message port)을 통해 전달되어야 하는데,
|
|
349
|
+
// 이로 인해 "직렬화 가능한 값들만 허용"하는 제약이 생깁니다.
|
|
350
|
+
//
|
|
351
|
+
// 이 제약을 의식하여 Naite.t에 직렬화 가능한 값만 넘기게 할 수도 있었지만, 그렇게 하면 불편해질 것 같아서 하지 않았습니다.
|
|
352
|
+
// 따라서 현재 Naite.t는 모든 값을 받을 수 있게 되어 있습니다.
|
|
353
|
+
// 대신 이렇게(getAllTraces) 그 값들을 빼낼 때 JSON.stringify를 사용하여 강제로 직렬화 가능하게 만들었습니다,,
|
|
354
|
+
for (const trace of traces) {
|
|
355
|
+
const check = isSerializable(trace.data);
|
|
356
|
+
if (!check.valid) {
|
|
357
|
+
console.warn(
|
|
358
|
+
"\n" +
|
|
359
|
+
"╔════════════════════════════════════════════════════════════════╗\n" +
|
|
360
|
+
"║ [Naite] Non-serializable value detected! ║\n" +
|
|
361
|
+
"╠════════════════════════════════════════════════════════════════╣\n" +
|
|
362
|
+
`║ Key: ${trace.key.padEnd(57)}║\n` +
|
|
363
|
+
`║ Reason: ${(check.reason ?? "unknown").slice(0, 54).padEnd(54)}║\n` +
|
|
364
|
+
`║ Location: ${(trace.stack[0]?.filePath ?? "unknown").slice(-51).padEnd(52)}║\n` +
|
|
365
|
+
`║ Line: ${String(trace.stack[0]?.lineNumber ?? 0).padEnd(56)}║\n` +
|
|
366
|
+
"╠════════════════════════════════════════════════════════════════╣\n" +
|
|
367
|
+
"║ Naite.t() accepts any type of value. However, values will ║\n" +
|
|
368
|
+
"║ be serialized to JSON when exported via Naite.getAllTraces(). ║\n" +
|
|
369
|
+
"╚════════════════════════════════════════════════════════════════╝\n",
|
|
370
|
+
);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
return traces.map((trace) => ({
|
|
375
|
+
key: trace.key,
|
|
376
|
+
value: JSON.parse(JSON.stringify(trace.data ?? "")), // 직렬화 가능한 것만 남기려는 눈물겨운 노력,, 안그러면 task.meta에 들어가서 프로세스간 통신 할 때 문제 생기거든요,,
|
|
377
|
+
filePath: trace.stack[0]?.filePath ?? "",
|
|
378
|
+
lineNumber: trace.stack[0]?.lineNumber ?? 0,
|
|
379
|
+
at: trace.at.toISOString(),
|
|
380
|
+
}));
|
|
34
381
|
}
|
|
35
382
|
|
|
36
|
-
//
|
|
37
|
-
|
|
383
|
+
// 특정 키 삭제하기
|
|
384
|
+
del(key: string) {
|
|
38
385
|
const context = Sonamu.getContext();
|
|
39
386
|
if (!context?.naiteStore) {
|
|
40
|
-
return
|
|
387
|
+
return;
|
|
41
388
|
}
|
|
42
|
-
|
|
389
|
+
context.naiteStore.delete(key);
|
|
43
390
|
}
|
|
44
391
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
// throw new Error("Vitest is not initialized");
|
|
49
|
-
// }
|
|
50
|
-
// return this.vitestExpect(this.get(name));
|
|
51
|
-
// }
|
|
392
|
+
createStore(): NaiteStore {
|
|
393
|
+
return new Map<string, NaiteTrace[]>();
|
|
394
|
+
}
|
|
52
395
|
|
|
53
396
|
// 일반 로그 레벨
|
|
54
|
-
|
|
397
|
+
d(_message: string) {
|
|
55
398
|
// TODO: Logger 연결
|
|
56
399
|
console.log(`[DEBUG] ${_message}`);
|
|
57
400
|
}
|
|
58
|
-
|
|
401
|
+
i(_message: string) {
|
|
59
402
|
// TODO: Logger 연결
|
|
60
403
|
console.log(`[INFO] ${_message}`);
|
|
61
404
|
}
|
|
62
|
-
|
|
405
|
+
w(_message: string) {
|
|
63
406
|
// TODO: Logger 연결
|
|
64
407
|
console.log(`[WARN] ${_message}`);
|
|
65
408
|
}
|
|
66
|
-
|
|
409
|
+
e(_message: string) {
|
|
67
410
|
// TODO: Logger 연결
|
|
68
411
|
console.log(`[ERROR] ${_message}`);
|
|
69
412
|
}
|
|
70
413
|
}
|
|
414
|
+
|
|
415
|
+
export const Naite = new NaiteClass();
|