blendsdk 5.33.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/README.md +125 -0
- package/dist/cmdline/cmdline.d.ts +144 -0
- package/dist/cmdline/cmdline.d.ts.map +1 -0
- package/dist/cmdline/cmdline.js +683 -0
- package/dist/cmdline/cmdline.js.map +1 -0
- package/dist/cmdline/errors.d.ts +105 -0
- package/dist/cmdline/errors.d.ts.map +1 -0
- package/dist/cmdline/errors.js +153 -0
- package/dist/cmdline/errors.js.map +1 -0
- package/dist/cmdline/index.d.ts +5 -0
- package/dist/cmdline/index.d.ts.map +1 -0
- package/dist/cmdline/index.js +5 -0
- package/dist/cmdline/index.js.map +1 -0
- package/dist/cmdline/types.d.ts +260 -0
- package/dist/cmdline/types.d.ts.map +1 -0
- package/dist/cmdline/types.js +9 -0
- package/dist/cmdline/types.js.map +1 -0
- package/dist/cmdline/validators.d.ts +28 -0
- package/dist/cmdline/validators.d.ts.map +1 -0
- package/dist/cmdline/validators.js +211 -0
- package/dist/cmdline/validators.js.map +1 -0
- package/dist/codegen/database/index.d.ts +3 -0
- package/dist/codegen/database/index.d.ts.map +1 -0
- package/dist/codegen/database/index.js +3 -0
- package/dist/codegen/database/index.js.map +1 -0
- package/dist/codegen/database/introspect/index.d.ts +3 -0
- package/dist/codegen/database/introspect/index.d.ts.map +1 -0
- package/dist/codegen/database/introspect/index.js +3 -0
- package/dist/codegen/database/introspect/index.js.map +1 -0
- package/dist/codegen/database/introspect/introspect-query.d.ts +2 -0
- package/dist/codegen/database/introspect/introspect-query.d.ts.map +1 -0
- package/dist/codegen/database/introspect/introspect-query.js +416 -0
- package/dist/codegen/database/introspect/introspect-query.js.map +1 -0
- package/dist/codegen/database/introspect/introspect-types.d.ts +45 -0
- package/dist/codegen/database/introspect/introspect-types.d.ts.map +1 -0
- package/dist/codegen/database/introspect/introspect-types.js +2 -0
- package/dist/codegen/database/introspect/introspect-types.js.map +1 -0
- package/dist/codegen/database/introspect/introspect.d.ts +21 -0
- package/dist/codegen/database/introspect/introspect.d.ts.map +1 -0
- package/dist/codegen/database/introspect/introspect.js +223 -0
- package/dist/codegen/database/introspect/introspect.js.map +1 -0
- package/dist/codegen/database/schema/check-constraint.d.ts +8 -0
- package/dist/codegen/database/schema/check-constraint.d.ts.map +1 -0
- package/dist/codegen/database/schema/check-constraint.js +12 -0
- package/dist/codegen/database/schema/check-constraint.js.map +1 -0
- package/dist/codegen/database/schema/column-schema.d.ts +7 -0
- package/dist/codegen/database/schema/column-schema.d.ts.map +1 -0
- package/dist/codegen/database/schema/column-schema.js +9 -0
- package/dist/codegen/database/schema/column-schema.js.map +1 -0
- package/dist/codegen/database/schema/constraint-base.d.ts +13 -0
- package/dist/codegen/database/schema/constraint-base.d.ts.map +1 -0
- package/dist/codegen/database/schema/constraint-base.js +32 -0
- package/dist/codegen/database/schema/constraint-base.js.map +1 -0
- package/dist/codegen/database/schema/database-schema.d.ts +19 -0
- package/dist/codegen/database/schema/database-schema.d.ts.map +1 -0
- package/dist/codegen/database/schema/database-schema.js +48 -0
- package/dist/codegen/database/schema/database-schema.js.map +1 -0
- package/dist/codegen/database/schema/dataobject-schema.d.ts +9 -0
- package/dist/codegen/database/schema/dataobject-schema.d.ts.map +1 -0
- package/dist/codegen/database/schema/dataobject-schema.js +18 -0
- package/dist/codegen/database/schema/dataobject-schema.js.map +1 -0
- package/dist/codegen/database/schema/fkey-constraints.d.ts +21 -0
- package/dist/codegen/database/schema/fkey-constraints.d.ts.map +1 -0
- package/dist/codegen/database/schema/fkey-constraints.js +58 -0
- package/dist/codegen/database/schema/fkey-constraints.js.map +1 -0
- package/dist/codegen/database/schema/index-constraint.d.ts +34 -0
- package/dist/codegen/database/schema/index-constraint.d.ts.map +1 -0
- package/dist/codegen/database/schema/index-constraint.js +79 -0
- package/dist/codegen/database/schema/index-constraint.js.map +1 -0
- package/dist/codegen/database/schema/index.d.ts +5 -0
- package/dist/codegen/database/schema/index.d.ts.map +1 -0
- package/dist/codegen/database/schema/index.js +5 -0
- package/dist/codegen/database/schema/index.js.map +1 -0
- package/dist/codegen/database/schema/primarykey-constraint.d.ts +4 -0
- package/dist/codegen/database/schema/primarykey-constraint.d.ts.map +1 -0
- package/dist/codegen/database/schema/primarykey-constraint.js +4 -0
- package/dist/codegen/database/schema/primarykey-constraint.js.map +1 -0
- package/dist/codegen/database/schema/relation-schema.d.ts +16 -0
- package/dist/codegen/database/schema/relation-schema.d.ts.map +1 -0
- package/dist/codegen/database/schema/relation-schema.js +32 -0
- package/dist/codegen/database/schema/relation-schema.js.map +1 -0
- package/dist/codegen/database/schema/table-column-schema.d.ts +59 -0
- package/dist/codegen/database/schema/table-column-schema.d.ts.map +1 -0
- package/dist/codegen/database/schema/table-column-schema.js +137 -0
- package/dist/codegen/database/schema/table-column-schema.js.map +1 -0
- package/dist/codegen/database/schema/table-schema.d.ts +48 -0
- package/dist/codegen/database/schema/table-schema.d.ts.map +1 -0
- package/dist/codegen/database/schema/table-schema.js +219 -0
- package/dist/codegen/database/schema/table-schema.js.map +1 -0
- package/dist/codegen/database/schema/types.d.ts +13 -0
- package/dist/codegen/database/schema/types.d.ts.map +1 -0
- package/dist/codegen/database/schema/types.js +175 -0
- package/dist/codegen/database/schema/types.js.map +1 -0
- package/dist/codegen/database/schema/unique-constraint.d.ts +4 -0
- package/dist/codegen/database/schema/unique-constraint.d.ts.map +1 -0
- package/dist/codegen/database/schema/unique-constraint.js +4 -0
- package/dist/codegen/database/schema/unique-constraint.js.map +1 -0
- package/dist/codegen/database/schema/view-schema.d.ts +14 -0
- package/dist/codegen/database/schema/view-schema.d.ts.map +1 -0
- package/dist/codegen/database/schema/view-schema.js +32 -0
- package/dist/codegen/database/schema/view-schema.js.map +1 -0
- package/dist/codegen/generator/ctype-generator.d.ts +5 -0
- package/dist/codegen/generator/ctype-generator.d.ts.map +1 -0
- package/dist/codegen/generator/ctype-generator.js +26 -0
- package/dist/codegen/generator/ctype-generator.js.map +1 -0
- package/dist/codegen/generator/generator.d.ts +17 -0
- package/dist/codegen/generator/generator.d.ts.map +1 -0
- package/dist/codegen/generator/generator.js +57 -0
- package/dist/codegen/generator/generator.js.map +1 -0
- package/dist/codegen/generator/index.d.ts +8 -0
- package/dist/codegen/generator/index.d.ts.map +1 -0
- package/dist/codegen/generator/index.js +8 -0
- package/dist/codegen/generator/index.js.map +1 -0
- package/dist/codegen/generator/openapi-generator.d.ts +239 -0
- package/dist/codegen/generator/openapi-generator.d.ts.map +1 -0
- package/dist/codegen/generator/openapi-generator.js +434 -0
- package/dist/codegen/generator/openapi-generator.js.map +1 -0
- package/dist/codegen/generator/openapi-types.d.ts +263 -0
- package/dist/codegen/generator/openapi-types.d.ts.map +1 -0
- package/dist/codegen/generator/openapi-types.js +11 -0
- package/dist/codegen/generator/openapi-types.js.map +1 -0
- package/dist/codegen/generator/postgres-schema-generator.d.ts +48 -0
- package/dist/codegen/generator/postgres-schema-generator.d.ts.map +1 -0
- package/dist/codegen/generator/postgres-schema-generator.js +339 -0
- package/dist/codegen/generator/postgres-schema-generator.js.map +1 -0
- package/dist/codegen/generator/type-generator.d.ts +113 -0
- package/dist/codegen/generator/type-generator.d.ts.map +1 -0
- package/dist/codegen/generator/type-generator.js +249 -0
- package/dist/codegen/generator/type-generator.js.map +1 -0
- package/dist/codegen/generator/zod-generator.d.ts +15 -0
- package/dist/codegen/generator/zod-generator.d.ts.map +1 -0
- package/dist/codegen/generator/zod-generator.js +86 -0
- package/dist/codegen/generator/zod-generator.js.map +1 -0
- package/dist/codegen/generator/zod-to-openapi.d.ts +69 -0
- package/dist/codegen/generator/zod-to-openapi.d.ts.map +1 -0
- package/dist/codegen/generator/zod-to-openapi.js +480 -0
- package/dist/codegen/generator/zod-to-openapi.js.map +1 -0
- package/dist/codegen/index.d.ts +4 -0
- package/dist/codegen/index.d.ts.map +1 -0
- package/dist/codegen/index.js +4 -0
- package/dist/codegen/index.js.map +1 -0
- package/dist/codegen/schema/any-schema.d.ts +6 -0
- package/dist/codegen/schema/any-schema.d.ts.map +1 -0
- package/dist/codegen/schema/any-schema.js +12 -0
- package/dist/codegen/schema/any-schema.js.map +1 -0
- package/dist/codegen/schema/boolean-schema.d.ts +6 -0
- package/dist/codegen/schema/boolean-schema.d.ts.map +1 -0
- package/dist/codegen/schema/boolean-schema.js +12 -0
- package/dist/codegen/schema/boolean-schema.js.map +1 -0
- package/dist/codegen/schema/date-schema.d.ts +6 -0
- package/dist/codegen/schema/date-schema.d.ts.map +1 -0
- package/dist/codegen/schema/date-schema.js +12 -0
- package/dist/codegen/schema/date-schema.js.map +1 -0
- package/dist/codegen/schema/index.d.ts +10 -0
- package/dist/codegen/schema/index.d.ts.map +1 -0
- package/dist/codegen/schema/index.js +10 -0
- package/dist/codegen/schema/index.js.map +1 -0
- package/dist/codegen/schema/object-schema.d.ts +10 -0
- package/dist/codegen/schema/object-schema.d.ts.map +1 -0
- package/dist/codegen/schema/object-schema.js +21 -0
- package/dist/codegen/schema/object-schema.js.map +1 -0
- package/dist/codegen/schema/primitive-schema.d.ts +20 -0
- package/dist/codegen/schema/primitive-schema.d.ts.map +1 -0
- package/dist/codegen/schema/primitive-schema.js +48 -0
- package/dist/codegen/schema/primitive-schema.js.map +1 -0
- package/dist/codegen/schema/ref-schema.d.ts +6 -0
- package/dist/codegen/schema/ref-schema.d.ts.map +1 -0
- package/dist/codegen/schema/ref-schema.js +11 -0
- package/dist/codegen/schema/ref-schema.js.map +1 -0
- package/dist/codegen/schema/schema-container.d.ts +14 -0
- package/dist/codegen/schema/schema-container.d.ts.map +1 -0
- package/dist/codegen/schema/schema-container.js +38 -0
- package/dist/codegen/schema/schema-container.js.map +1 -0
- package/dist/codegen/schema/schema-object.d.ts +42 -0
- package/dist/codegen/schema/schema-object.d.ts.map +1 -0
- package/dist/codegen/schema/schema-object.js +90 -0
- package/dist/codegen/schema/schema-object.js.map +1 -0
- package/dist/codegen/schema/schema-scope.d.ts +23 -0
- package/dist/codegen/schema/schema-scope.d.ts.map +1 -0
- package/dist/codegen/schema/schema-scope.js +67 -0
- package/dist/codegen/schema/schema-scope.js.map +1 -0
- package/dist/codegen/schema/utils.d.ts +17 -0
- package/dist/codegen/schema/utils.d.ts.map +1 -0
- package/dist/codegen/schema/utils.js +47 -0
- package/dist/codegen/schema/utils.js.map +1 -0
- package/dist/dbcore/crud-statement.d.ts +67 -0
- package/dist/dbcore/crud-statement.d.ts.map +1 -0
- package/dist/dbcore/crud-statement.js +75 -0
- package/dist/dbcore/crud-statement.js.map +1 -0
- package/dist/dbcore/database.d.ts +272 -0
- package/dist/dbcore/database.d.ts.map +1 -0
- package/dist/dbcore/database.js +53 -0
- package/dist/dbcore/database.js.map +1 -0
- package/dist/dbcore/dataservice-base.d.ts +18 -0
- package/dist/dbcore/dataservice-base.d.ts.map +1 -0
- package/dist/dbcore/dataservice-base.js +19 -0
- package/dist/dbcore/dataservice-base.js.map +1 -0
- package/dist/dbcore/delete-statement.d.ts +29 -0
- package/dist/dbcore/delete-statement.d.ts.map +1 -0
- package/dist/dbcore/delete-statement.js +30 -0
- package/dist/dbcore/delete-statement.js.map +1 -0
- package/dist/dbcore/filterable-statement.d.ts +126 -0
- package/dist/dbcore/filterable-statement.d.ts.map +1 -0
- package/dist/dbcore/filterable-statement.js +178 -0
- package/dist/dbcore/filterable-statement.js.map +1 -0
- package/dist/dbcore/from-statement.d.ts +120 -0
- package/dist/dbcore/from-statement.d.ts.map +1 -0
- package/dist/dbcore/from-statement.js +150 -0
- package/dist/dbcore/from-statement.js.map +1 -0
- package/dist/dbcore/index.d.ts +21 -0
- package/dist/dbcore/index.d.ts.map +1 -0
- package/dist/dbcore/index.js +21 -0
- package/dist/dbcore/index.js.map +1 -0
- package/dist/dbcore/insert-statement.d.ts +48 -0
- package/dist/dbcore/insert-statement.d.ts.map +1 -0
- package/dist/dbcore/insert-statement.js +52 -0
- package/dist/dbcore/insert-statement.js.map +1 -0
- package/dist/dbcore/query-dataservice.d.ts +144 -0
- package/dist/dbcore/query-dataservice.d.ts.map +1 -0
- package/dist/dbcore/query-dataservice.js +144 -0
- package/dist/dbcore/query-dataservice.js.map +1 -0
- package/dist/dbcore/statement.d.ts +133 -0
- package/dist/dbcore/statement.d.ts.map +1 -0
- package/dist/dbcore/statement.js +138 -0
- package/dist/dbcore/statement.js.map +1 -0
- package/dist/dbcore/update-statement.d.ts +48 -0
- package/dist/dbcore/update-statement.d.ts.map +1 -0
- package/dist/dbcore/update-statement.js +52 -0
- package/dist/dbcore/update-statement.js.map +1 -0
- package/dist/expression/builders/comparison-builder.d.ts +47 -0
- package/dist/expression/builders/comparison-builder.d.ts.map +1 -0
- package/dist/expression/builders/comparison-builder.js +197 -0
- package/dist/expression/builders/comparison-builder.js.map +1 -0
- package/dist/expression/builders/query-builder.d.ts +80 -0
- package/dist/expression/builders/query-builder.d.ts.map +1 -0
- package/dist/expression/builders/query-builder.js +229 -0
- package/dist/expression/builders/query-builder.js.map +1 -0
- package/dist/expression/compiler/postgresql-compiler.d.ts +56 -0
- package/dist/expression/compiler/postgresql-compiler.d.ts.map +1 -0
- package/dist/expression/compiler/postgresql-compiler.js +217 -0
- package/dist/expression/compiler/postgresql-compiler.js.map +1 -0
- package/dist/expression/core/ast-node.d.ts +47 -0
- package/dist/expression/core/ast-node.d.ts.map +1 -0
- package/dist/expression/core/ast-node.js +154 -0
- package/dist/expression/core/ast-node.js.map +1 -0
- package/dist/expression/core/parameter-manager.d.ts +84 -0
- package/dist/expression/core/parameter-manager.d.ts.map +1 -0
- package/dist/expression/core/parameter-manager.js +164 -0
- package/dist/expression/core/parameter-manager.js.map +1 -0
- package/dist/expression/core/query-builder-interfaces.d.ts +188 -0
- package/dist/expression/core/query-builder-interfaces.d.ts.map +1 -0
- package/dist/expression/core/query-builder-interfaces.js +6 -0
- package/dist/expression/core/query-builder-interfaces.js.map +1 -0
- package/dist/expression/core/types.d.ts +239 -0
- package/dist/expression/core/types.d.ts.map +1 -0
- package/dist/expression/core/types.js +121 -0
- package/dist/expression/core/types.js.map +1 -0
- package/dist/expression/index.d.ts +11 -0
- package/dist/expression/index.d.ts.map +1 -0
- package/dist/expression/index.js +11 -0
- package/dist/expression/index.js.map +1 -0
- package/dist/i18n/content-file-source.d.ts +109 -0
- package/dist/i18n/content-file-source.d.ts.map +1 -0
- package/dist/i18n/content-file-source.js +218 -0
- package/dist/i18n/content-file-source.js.map +1 -0
- package/dist/i18n/index.d.ts +19 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +21 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/json-file-source.d.ts +96 -0
- package/dist/i18n/json-file-source.d.ts.map +1 -0
- package/dist/i18n/json-file-source.js +258 -0
- package/dist/i18n/json-file-source.js.map +1 -0
- package/dist/i18n/merge-catalogs.d.ts +20 -0
- package/dist/i18n/merge-catalogs.d.ts.map +1 -0
- package/dist/i18n/merge-catalogs.js +34 -0
- package/dist/i18n/merge-catalogs.js.map +1 -0
- package/dist/i18n/node.d.ts +20 -0
- package/dist/i18n/node.d.ts.map +1 -0
- package/dist/i18n/node.js +19 -0
- package/dist/i18n/node.js.map +1 -0
- package/dist/i18n/translation-source.d.ts +35 -0
- package/dist/i18n/translation-source.d.ts.map +1 -0
- package/dist/i18n/translation-source.js +2 -0
- package/dist/i18n/translation-source.js.map +1 -0
- package/dist/i18n/translator.d.ts +162 -0
- package/dist/i18n/translator.d.ts.map +1 -0
- package/dist/i18n/translator.js +259 -0
- package/dist/i18n/translator.js.map +1 -0
- package/dist/i18n/types.d.ts +80 -0
- package/dist/i18n/types.d.ts.map +1 -0
- package/dist/i18n/types.js +2 -0
- package/dist/i18n/types.js.map +1 -0
- package/dist/postgresql/database.d.ts +204 -0
- package/dist/postgresql/database.d.ts.map +1 -0
- package/dist/postgresql/database.js +321 -0
- package/dist/postgresql/database.js.map +1 -0
- package/dist/postgresql/delete-statement.d.ts +36 -0
- package/dist/postgresql/delete-statement.d.ts.map +1 -0
- package/dist/postgresql/delete-statement.js +54 -0
- package/dist/postgresql/delete-statement.js.map +1 -0
- package/dist/postgresql/index.d.ts +12 -0
- package/dist/postgresql/index.d.ts.map +1 -0
- package/dist/postgresql/index.js +12 -0
- package/dist/postgresql/index.js.map +1 -0
- package/dist/postgresql/insert-statement.d.ts +34 -0
- package/dist/postgresql/insert-statement.d.ts.map +1 -0
- package/dist/postgresql/insert-statement.js +48 -0
- package/dist/postgresql/insert-statement.js.map +1 -0
- package/dist/postgresql/update-statement.d.ts +38 -0
- package/dist/postgresql/update-statement.d.ts.map +1 -0
- package/dist/postgresql/update-statement.js +75 -0
- package/dist/postgresql/update-statement.js.map +1 -0
- package/dist/stdlib/formatString.d.ts +52 -0
- package/dist/stdlib/formatString.d.ts.map +1 -0
- package/dist/stdlib/formatString.js +118 -0
- package/dist/stdlib/formatString.js.map +1 -0
- package/dist/stdlib/index.d.ts +8 -0
- package/dist/stdlib/index.d.ts.map +1 -0
- package/dist/stdlib/index.js +8 -0
- package/dist/stdlib/index.js.map +1 -0
- package/dist/stdlib/isBoolean.d.ts +15 -0
- package/dist/stdlib/isBoolean.d.ts.map +1 -0
- package/dist/stdlib/isBoolean.js +17 -0
- package/dist/stdlib/isBoolean.js.map +1 -0
- package/dist/stdlib/isNullOrUndef.d.ts +24 -0
- package/dist/stdlib/isNullOrUndef.d.ts.map +1 -0
- package/dist/stdlib/isNullOrUndef.js +28 -0
- package/dist/stdlib/isNullOrUndef.js.map +1 -0
- package/dist/stdlib/isNumeric.d.ts +20 -0
- package/dist/stdlib/isNumeric.d.ts.map +1 -0
- package/dist/stdlib/isNumeric.js +39 -0
- package/dist/stdlib/isNumeric.js.map +1 -0
- package/dist/stdlib/isString.d.ts +15 -0
- package/dist/stdlib/isString.d.ts.map +1 -0
- package/dist/stdlib/isString.js +17 -0
- package/dist/stdlib/isString.js.map +1 -0
- package/dist/stdlib/isTemplateString.d.ts +18 -0
- package/dist/stdlib/isTemplateString.d.ts.map +1 -0
- package/dist/stdlib/isTemplateString.js +38 -0
- package/dist/stdlib/isTemplateString.js.map +1 -0
- package/dist/stdlib/wrapInArray.d.ts +14 -0
- package/dist/stdlib/wrapInArray.d.ts.map +1 -0
- package/dist/stdlib/wrapInArray.js +17 -0
- package/dist/stdlib/wrapInArray.js.map +1 -0
- package/dist/webafx/application/application-settings.d.ts +129 -0
- package/dist/webafx/application/application-settings.d.ts.map +1 -0
- package/dist/webafx/application/application-settings.js +162 -0
- package/dist/webafx/application/application-settings.js.map +1 -0
- package/dist/webafx/application/base-controller.d.ts +128 -0
- package/dist/webafx/application/base-controller.d.ts.map +1 -0
- package/dist/webafx/application/base-controller.js +122 -0
- package/dist/webafx/application/base-controller.js.map +1 -0
- package/dist/webafx/application/console-logger.d.ts +81 -0
- package/dist/webafx/application/console-logger.d.ts.map +1 -0
- package/dist/webafx/application/console-logger.js +111 -0
- package/dist/webafx/application/console-logger.js.map +1 -0
- package/dist/webafx/application/controller-registry.d.ts +34 -0
- package/dist/webafx/application/controller-registry.d.ts.map +1 -0
- package/dist/webafx/application/controller-registry.js +32 -0
- package/dist/webafx/application/controller-registry.js.map +1 -0
- package/dist/webafx/application/error-handler-middleware.d.ts +22 -0
- package/dist/webafx/application/error-handler-middleware.d.ts.map +1 -0
- package/dist/webafx/application/error-handler-middleware.js +70 -0
- package/dist/webafx/application/error-handler-middleware.js.map +1 -0
- package/dist/webafx/application/index.d.ts +13 -0
- package/dist/webafx/application/index.d.ts.map +1 -0
- package/dist/webafx/application/index.js +13 -0
- package/dist/webafx/application/index.js.map +1 -0
- package/dist/webafx/application/logger.d.ts +2 -0
- package/dist/webafx/application/logger.d.ts.map +1 -0
- package/dist/webafx/application/logger.js +2 -0
- package/dist/webafx/application/logger.js.map +1 -0
- package/dist/webafx/application/plugin.d.ts +73 -0
- package/dist/webafx/application/plugin.d.ts.map +1 -0
- package/dist/webafx/application/plugin.js +90 -0
- package/dist/webafx/application/plugin.js.map +1 -0
- package/dist/webafx/application/rate-limiter.d.ts +35 -0
- package/dist/webafx/application/rate-limiter.d.ts.map +1 -0
- package/dist/webafx/application/rate-limiter.js +74 -0
- package/dist/webafx/application/rate-limiter.js.map +1 -0
- package/dist/webafx/application/request-context.d.ts +62 -0
- package/dist/webafx/application/request-context.d.ts.map +1 -0
- package/dist/webafx/application/request-context.js +54 -0
- package/dist/webafx/application/request-context.js.map +1 -0
- package/dist/webafx/application/request-id-middleware.d.ts +30 -0
- package/dist/webafx/application/request-id-middleware.d.ts.map +1 -0
- package/dist/webafx/application/request-id-middleware.js +57 -0
- package/dist/webafx/application/request-id-middleware.js.map +1 -0
- package/dist/webafx/application/route-builder.d.ts +231 -0
- package/dist/webafx/application/route-builder.d.ts.map +1 -0
- package/dist/webafx/application/route-builder.js +182 -0
- package/dist/webafx/application/route-builder.js.map +1 -0
- package/dist/webafx/application/service-container.d.ts +144 -0
- package/dist/webafx/application/service-container.d.ts.map +1 -0
- package/dist/webafx/application/service-container.js +192 -0
- package/dist/webafx/application/service-container.js.map +1 -0
- package/dist/webafx/application/services.d.ts +27 -0
- package/dist/webafx/application/services.d.ts.map +1 -0
- package/dist/webafx/application/services.js +33 -0
- package/dist/webafx/application/services.js.map +1 -0
- package/dist/webafx/application/structured-logger.d.ts +99 -0
- package/dist/webafx/application/structured-logger.d.ts.map +1 -0
- package/dist/webafx/application/structured-logger.js +132 -0
- package/dist/webafx/application/structured-logger.js.map +1 -0
- package/dist/webafx/application/type.d.ts +29 -0
- package/dist/webafx/application/type.d.ts.map +1 -0
- package/dist/webafx/application/type.js +2 -0
- package/dist/webafx/application/type.js.map +1 -0
- package/dist/webafx/application/web-application.d.ts +257 -0
- package/dist/webafx/application/web-application.d.ts.map +1 -0
- package/dist/webafx/application/web-application.js +611 -0
- package/dist/webafx/application/web-application.js.map +1 -0
- package/dist/webafx/errors/api-error.d.ts +21 -0
- package/dist/webafx/errors/api-error.d.ts.map +1 -0
- package/dist/webafx/errors/api-error.js +38 -0
- package/dist/webafx/errors/api-error.js.map +1 -0
- package/dist/webafx/errors/http-errors.d.ts +56 -0
- package/dist/webafx/errors/http-errors.d.ts.map +1 -0
- package/dist/webafx/errors/http-errors.js +74 -0
- package/dist/webafx/errors/http-errors.js.map +1 -0
- package/dist/webafx/errors/index.d.ts +4 -0
- package/dist/webafx/errors/index.d.ts.map +1 -0
- package/dist/webafx/errors/index.js +4 -0
- package/dist/webafx/errors/index.js.map +1 -0
- package/dist/webafx/errors/types.d.ts +42 -0
- package/dist/webafx/errors/types.d.ts.map +1 -0
- package/dist/webafx/errors/types.js +2 -0
- package/dist/webafx/errors/types.js.map +1 -0
- package/dist/webafx/index.d.ts +3 -0
- package/dist/webafx/index.d.ts.map +1 -0
- package/dist/webafx/index.js +3 -0
- package/dist/webafx/index.js.map +1 -0
- package/dist/webafx-auth/abstract-auth-provider.d.ts +178 -0
- package/dist/webafx-auth/abstract-auth-provider.d.ts.map +1 -0
- package/dist/webafx-auth/abstract-auth-provider.js +240 -0
- package/dist/webafx-auth/abstract-auth-provider.js.map +1 -0
- package/dist/webafx-auth/index.d.ts +27 -0
- package/dist/webafx-auth/index.d.ts.map +1 -0
- package/dist/webafx-auth/index.js +32 -0
- package/dist/webafx-auth/index.js.map +1 -0
- package/dist/webafx-auth/jwt-auth-provider.d.ts +100 -0
- package/dist/webafx-auth/jwt-auth-provider.d.ts.map +1 -0
- package/dist/webafx-auth/jwt-auth-provider.js +154 -0
- package/dist/webafx-auth/jwt-auth-provider.js.map +1 -0
- package/dist/webafx-auth/memory-auth-provider.d.ts +100 -0
- package/dist/webafx-auth/memory-auth-provider.d.ts.map +1 -0
- package/dist/webafx-auth/memory-auth-provider.js +122 -0
- package/dist/webafx-auth/memory-auth-provider.js.map +1 -0
- package/dist/webafx-auth/types.d.ts +333 -0
- package/dist/webafx-auth/types.d.ts.map +1 -0
- package/dist/webafx-auth/types.js +24 -0
- package/dist/webafx-auth/types.js.map +1 -0
- package/dist/webafx-cache/abstract-cache-provider.d.ts +185 -0
- package/dist/webafx-cache/abstract-cache-provider.d.ts.map +1 -0
- package/dist/webafx-cache/abstract-cache-provider.js +133 -0
- package/dist/webafx-cache/abstract-cache-provider.js.map +1 -0
- package/dist/webafx-cache/abstract-pubsub-provider.d.ts +170 -0
- package/dist/webafx-cache/abstract-pubsub-provider.d.ts.map +1 -0
- package/dist/webafx-cache/abstract-pubsub-provider.js +132 -0
- package/dist/webafx-cache/abstract-pubsub-provider.js.map +1 -0
- package/dist/webafx-cache/cache-plugin.d.ts +114 -0
- package/dist/webafx-cache/cache-plugin.d.ts.map +1 -0
- package/dist/webafx-cache/cache-plugin.js +176 -0
- package/dist/webafx-cache/cache-plugin.js.map +1 -0
- package/dist/webafx-cache/index.d.ts +33 -0
- package/dist/webafx-cache/index.d.ts.map +1 -0
- package/dist/webafx-cache/index.js +44 -0
- package/dist/webafx-cache/index.js.map +1 -0
- package/dist/webafx-cache/memory-cache-provider.d.ts +99 -0
- package/dist/webafx-cache/memory-cache-provider.d.ts.map +1 -0
- package/dist/webafx-cache/memory-cache-provider.js +251 -0
- package/dist/webafx-cache/memory-cache-provider.js.map +1 -0
- package/dist/webafx-cache/memory-pubsub-provider.d.ts +124 -0
- package/dist/webafx-cache/memory-pubsub-provider.d.ts.map +1 -0
- package/dist/webafx-cache/memory-pubsub-provider.js +195 -0
- package/dist/webafx-cache/memory-pubsub-provider.js.map +1 -0
- package/dist/webafx-cache/pubsub-plugin.d.ts +128 -0
- package/dist/webafx-cache/pubsub-plugin.d.ts.map +1 -0
- package/dist/webafx-cache/pubsub-plugin.js +182 -0
- package/dist/webafx-cache/pubsub-plugin.js.map +1 -0
- package/dist/webafx-cache/redis-cache-provider.d.ts +81 -0
- package/dist/webafx-cache/redis-cache-provider.d.ts.map +1 -0
- package/dist/webafx-cache/redis-cache-provider.js +209 -0
- package/dist/webafx-cache/redis-cache-provider.js.map +1 -0
- package/dist/webafx-cache/redis-pubsub-provider.d.ts +164 -0
- package/dist/webafx-cache/redis-pubsub-provider.d.ts.map +1 -0
- package/dist/webafx-cache/redis-pubsub-provider.js +329 -0
- package/dist/webafx-cache/redis-pubsub-provider.js.map +1 -0
- package/dist/webafx-cache/types.d.ts +206 -0
- package/dist/webafx-cache/types.d.ts.map +1 -0
- package/dist/webafx-cache/types.js +27 -0
- package/dist/webafx-cache/types.js.map +1 -0
- package/dist/webafx-i18n/i18n-plugin.d.ts +29 -0
- package/dist/webafx-i18n/i18n-plugin.d.ts.map +1 -0
- package/dist/webafx-i18n/i18n-plugin.js +145 -0
- package/dist/webafx-i18n/i18n-plugin.js.map +1 -0
- package/dist/webafx-i18n/index.d.ts +12 -0
- package/dist/webafx-i18n/index.d.ts.map +1 -0
- package/dist/webafx-i18n/index.js +12 -0
- package/dist/webafx-i18n/index.js.map +1 -0
- package/dist/webafx-i18n/locale-resolver.d.ts +33 -0
- package/dist/webafx-i18n/locale-resolver.d.ts.map +1 -0
- package/dist/webafx-i18n/locale-resolver.js +67 -0
- package/dist/webafx-i18n/locale-resolver.js.map +1 -0
- package/dist/webafx-i18n/postgresql-source.d.ts +101 -0
- package/dist/webafx-i18n/postgresql-source.d.ts.map +1 -0
- package/dist/webafx-i18n/postgresql-source.js +101 -0
- package/dist/webafx-i18n/postgresql-source.js.map +1 -0
- package/dist/webafx-i18n/types.d.ts +70 -0
- package/dist/webafx-i18n/types.d.ts.map +1 -0
- package/dist/webafx-i18n/types.js +2 -0
- package/dist/webafx-i18n/types.js.map +1 -0
- package/dist/webafx-mailer/abstract-mail-provider.d.ts +55 -0
- package/dist/webafx-mailer/abstract-mail-provider.d.ts.map +1 -0
- package/dist/webafx-mailer/abstract-mail-provider.js +37 -0
- package/dist/webafx-mailer/abstract-mail-provider.js.map +1 -0
- package/dist/webafx-mailer/index.d.ts +24 -0
- package/dist/webafx-mailer/index.d.ts.map +1 -0
- package/dist/webafx-mailer/index.js +34 -0
- package/dist/webafx-mailer/index.js.map +1 -0
- package/dist/webafx-mailer/mail-plugin.d.ts +98 -0
- package/dist/webafx-mailer/mail-plugin.d.ts.map +1 -0
- package/dist/webafx-mailer/mail-plugin.js +155 -0
- package/dist/webafx-mailer/mail-plugin.js.map +1 -0
- package/dist/webafx-mailer/memory-mail-provider.d.ts +85 -0
- package/dist/webafx-mailer/memory-mail-provider.d.ts.map +1 -0
- package/dist/webafx-mailer/memory-mail-provider.js +111 -0
- package/dist/webafx-mailer/memory-mail-provider.js.map +1 -0
- package/dist/webafx-mailer/smtp-mail-provider.d.ts +65 -0
- package/dist/webafx-mailer/smtp-mail-provider.d.ts.map +1 -0
- package/dist/webafx-mailer/smtp-mail-provider.js +113 -0
- package/dist/webafx-mailer/smtp-mail-provider.js.map +1 -0
- package/dist/webafx-mailer/types.d.ts +136 -0
- package/dist/webafx-mailer/types.d.ts.map +1 -0
- package/dist/webafx-mailer/types.js +13 -0
- package/dist/webafx-mailer/types.js.map +1 -0
- package/package.json +159 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { NextFunction, Request, Response } from 'express';
|
|
2
|
+
import { ApplicationSettings } from './application-settings.js';
|
|
3
|
+
/**
|
|
4
|
+
* Factory function for creating singleton services.
|
|
5
|
+
* Called once during application startup and the result is cached.
|
|
6
|
+
*
|
|
7
|
+
* @template T - The type of service this factory creates
|
|
8
|
+
*/
|
|
9
|
+
export type SingletonFactory<T = unknown> = (container: ServiceContainer, settings: ApplicationSettings) => T | Promise<T>;
|
|
10
|
+
/**
|
|
11
|
+
* Factory function for creating per-request services.
|
|
12
|
+
* Called for each HTTP request with the full request context.
|
|
13
|
+
* The req, res, and next parameters are always provided during
|
|
14
|
+
* request handling — they are required, not optional.
|
|
15
|
+
*
|
|
16
|
+
* @template T - The type of service this factory creates
|
|
17
|
+
*/
|
|
18
|
+
export type PerRequestFactory<T = unknown> = (container: ServiceContainer, settings: ApplicationSettings, req: Request, res: Response, next: NextFunction) => T | Promise<T>;
|
|
19
|
+
/**
|
|
20
|
+
* Service definition for dependency injection container.
|
|
21
|
+
*
|
|
22
|
+
* @template T - The type of service this definition creates
|
|
23
|
+
*/
|
|
24
|
+
export interface ServiceDefinition<T = unknown> {
|
|
25
|
+
name: string;
|
|
26
|
+
factory: SingletonFactory<T> | PerRequestFactory<T>;
|
|
27
|
+
type: 'singleton' | 'per-request';
|
|
28
|
+
dependencies?: string[];
|
|
29
|
+
/** Optional cleanup function called on application shutdown */
|
|
30
|
+
dispose?: (instance: T) => void | Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Service registry containing service definitions and singleton instances.
|
|
34
|
+
* Each WebApplication instance owns its own registry to prevent state leakage.
|
|
35
|
+
*/
|
|
36
|
+
export interface ServiceRegistry {
|
|
37
|
+
/** Service definitions (blueprints) */
|
|
38
|
+
definitions: Record<string, ServiceDefinition>;
|
|
39
|
+
/** Cached singleton instances */
|
|
40
|
+
singletons: Record<string, unknown>;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Dependency injection container for managing service lifecycle.
|
|
44
|
+
* Supports both singleton (application-scoped) and per-request services.
|
|
45
|
+
*
|
|
46
|
+
* @remarks
|
|
47
|
+
* Each ServiceContainer instance is tied to a ServiceRegistry owned by a
|
|
48
|
+
* WebApplication instance. This eliminates global state and ensures proper
|
|
49
|
+
* isolation between application instances and test runs.
|
|
50
|
+
*/
|
|
51
|
+
export declare class ServiceContainer {
|
|
52
|
+
protected registry: ServiceRegistry;
|
|
53
|
+
protected settings: ApplicationSettings;
|
|
54
|
+
protected request: Request | undefined;
|
|
55
|
+
protected response: Response | undefined;
|
|
56
|
+
protected next: NextFunction | undefined;
|
|
57
|
+
protected services: Record<string, unknown>;
|
|
58
|
+
protected resolvingServices: Set<string>;
|
|
59
|
+
/**
|
|
60
|
+
* Creates a new ServiceContainer instance.
|
|
61
|
+
*
|
|
62
|
+
* @param registry - Service registry containing definitions and singletons
|
|
63
|
+
* @param settings - Application settings
|
|
64
|
+
* @param req - Optional Express request (for per-request services)
|
|
65
|
+
* @param res - Optional Express response (for per-request services)
|
|
66
|
+
* @param next - Optional Express next function (for per-request services)
|
|
67
|
+
*/
|
|
68
|
+
constructor(registry: ServiceRegistry, settings: ApplicationSettings, req?: Request, res?: Response, next?: NextFunction);
|
|
69
|
+
/**
|
|
70
|
+
* Get the authenticated user from the service container.
|
|
71
|
+
* @returns The user object or undefined if not authenticated
|
|
72
|
+
*/
|
|
73
|
+
getUser<T = unknown>(): T | undefined;
|
|
74
|
+
/**
|
|
75
|
+
* Get validated request parameters (merged from params, query, and body).
|
|
76
|
+
* @returns The validated parameters object
|
|
77
|
+
*/
|
|
78
|
+
getParams<T = unknown>(): T;
|
|
79
|
+
/**
|
|
80
|
+
* Get separated request input sources (params, query, body).
|
|
81
|
+
* Provides type-safe access to individual input sources without merging.
|
|
82
|
+
*
|
|
83
|
+
* @returns Object with separated params, query, and body
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```typescript
|
|
87
|
+
* const input = req.services.getInput<{
|
|
88
|
+
* params: { id: string };
|
|
89
|
+
* query: { sort: string };
|
|
90
|
+
* body: { name: string };
|
|
91
|
+
* }>();
|
|
92
|
+
* console.log(input.params.id);
|
|
93
|
+
* console.log(input.query.sort);
|
|
94
|
+
* console.log(input.body.name);
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
getInput<T = {
|
|
98
|
+
params: Record<string, unknown>;
|
|
99
|
+
query: Record<string, unknown>;
|
|
100
|
+
body: Record<string, unknown>;
|
|
101
|
+
}>(): T;
|
|
102
|
+
/**
|
|
103
|
+
* Manually set a service instance in the container.
|
|
104
|
+
* @param name - Service name
|
|
105
|
+
* @param service - Service instance
|
|
106
|
+
*/
|
|
107
|
+
set(name: string, service: unknown): void;
|
|
108
|
+
/**
|
|
109
|
+
* Resolve and return a service instance.
|
|
110
|
+
* Handles dependency resolution and lifecycle management.
|
|
111
|
+
* @param name - Service name
|
|
112
|
+
* @param defaultValue - Optional default value if service not found
|
|
113
|
+
* @returns The resolved service instance
|
|
114
|
+
* @throws Error if service not registered and no default provided
|
|
115
|
+
* @throws Error if circular dependency detected
|
|
116
|
+
* @throws Error if per-request service accessed outside request context
|
|
117
|
+
*/
|
|
118
|
+
get<T = unknown>(name: string, defaultValue?: T): Promise<T>;
|
|
119
|
+
/**
|
|
120
|
+
* Register a service definition in this instance's registry.
|
|
121
|
+
* @param service - Service definition to register
|
|
122
|
+
*/
|
|
123
|
+
registerService(service: ServiceDefinition): void;
|
|
124
|
+
/**
|
|
125
|
+
* Check if a service is registered in this instance's registry.
|
|
126
|
+
* @param name - Service name
|
|
127
|
+
* @returns True if service is registered
|
|
128
|
+
*/
|
|
129
|
+
isRegistered(name: string): boolean;
|
|
130
|
+
/**
|
|
131
|
+
* Get all registered service names from this instance's registry.
|
|
132
|
+
* @returns Array of service names
|
|
133
|
+
*/
|
|
134
|
+
getRegisteredServices(): string[];
|
|
135
|
+
/**
|
|
136
|
+
* Dispose all singleton services in the registry.
|
|
137
|
+
* Calls the optional dispose function for each singleton if provided.
|
|
138
|
+
* Typically called during application shutdown.
|
|
139
|
+
*
|
|
140
|
+
* @returns Promise that resolves when all disposals complete
|
|
141
|
+
*/
|
|
142
|
+
disposeAll(): Promise<void>;
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=service-container.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-container.d.ts","sourceRoot":"","sources":["../../src/application/service-container.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency injection container for managing service lifecycle.
|
|
3
|
+
* Supports both singleton (application-scoped) and per-request services.
|
|
4
|
+
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* Each ServiceContainer instance is tied to a ServiceRegistry owned by a
|
|
7
|
+
* WebApplication instance. This eliminates global state and ensures proper
|
|
8
|
+
* isolation between application instances and test runs.
|
|
9
|
+
*/
|
|
10
|
+
export class ServiceContainer {
|
|
11
|
+
registry;
|
|
12
|
+
settings;
|
|
13
|
+
request;
|
|
14
|
+
response;
|
|
15
|
+
next;
|
|
16
|
+
services;
|
|
17
|
+
resolvingServices;
|
|
18
|
+
/**
|
|
19
|
+
* Creates a new ServiceContainer instance.
|
|
20
|
+
*
|
|
21
|
+
* @param registry - Service registry containing definitions and singletons
|
|
22
|
+
* @param settings - Application settings
|
|
23
|
+
* @param req - Optional Express request (for per-request services)
|
|
24
|
+
* @param res - Optional Express response (for per-request services)
|
|
25
|
+
* @param next - Optional Express next function (for per-request services)
|
|
26
|
+
*/
|
|
27
|
+
constructor(registry, settings, req, res, next) {
|
|
28
|
+
this.registry = registry;
|
|
29
|
+
this.settings = settings;
|
|
30
|
+
this.request = req;
|
|
31
|
+
this.response = res;
|
|
32
|
+
this.next = next;
|
|
33
|
+
// Pre-populate with existing singletons from registry
|
|
34
|
+
this.services = { ...registry.singletons };
|
|
35
|
+
this.resolvingServices = new Set();
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get the authenticated user from the service container.
|
|
39
|
+
* @returns The user object or undefined if not authenticated
|
|
40
|
+
*/
|
|
41
|
+
getUser() {
|
|
42
|
+
return this.services['user'];
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Get validated request parameters (merged from params, query, and body).
|
|
46
|
+
* @returns The validated parameters object
|
|
47
|
+
*/
|
|
48
|
+
getParams() {
|
|
49
|
+
return (this.services['request-params'] || {});
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Get separated request input sources (params, query, body).
|
|
53
|
+
* Provides type-safe access to individual input sources without merging.
|
|
54
|
+
*
|
|
55
|
+
* @returns Object with separated params, query, and body
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```typescript
|
|
59
|
+
* const input = req.services.getInput<{
|
|
60
|
+
* params: { id: string };
|
|
61
|
+
* query: { sort: string };
|
|
62
|
+
* body: { name: string };
|
|
63
|
+
* }>();
|
|
64
|
+
* console.log(input.params.id);
|
|
65
|
+
* console.log(input.query.sort);
|
|
66
|
+
* console.log(input.body.name);
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
getInput() {
|
|
70
|
+
return (this.services['request-input'] || { params: {}, query: {}, body: {} });
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Manually set a service instance in the container.
|
|
74
|
+
* @param name - Service name
|
|
75
|
+
* @param service - Service instance
|
|
76
|
+
*/
|
|
77
|
+
set(name, service) {
|
|
78
|
+
this.services[name] = service;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Resolve and return a service instance.
|
|
82
|
+
* Handles dependency resolution and lifecycle management.
|
|
83
|
+
* @param name - Service name
|
|
84
|
+
* @param defaultValue - Optional default value if service not found
|
|
85
|
+
* @returns The resolved service instance
|
|
86
|
+
* @throws Error if service not registered and no default provided
|
|
87
|
+
* @throws Error if circular dependency detected
|
|
88
|
+
* @throws Error if per-request service accessed outside request context
|
|
89
|
+
*/
|
|
90
|
+
async get(name, defaultValue) {
|
|
91
|
+
// Return already resolved service
|
|
92
|
+
if (this.services[name] !== undefined) {
|
|
93
|
+
return this.services[name];
|
|
94
|
+
}
|
|
95
|
+
// Check if service is registered in this instance's registry
|
|
96
|
+
const serviceDef = this.registry.definitions[name];
|
|
97
|
+
if (!serviceDef) {
|
|
98
|
+
if (arguments.length > 1) {
|
|
99
|
+
return defaultValue;
|
|
100
|
+
}
|
|
101
|
+
throw new Error(`Service "${name}" is not registered`);
|
|
102
|
+
}
|
|
103
|
+
// Detect circular dependencies
|
|
104
|
+
if (this.resolvingServices.has(name)) {
|
|
105
|
+
const chain = Array.from(this.resolvingServices).join(' -> ');
|
|
106
|
+
throw new Error(`Circular dependency detected: ${chain} -> ${name}`);
|
|
107
|
+
}
|
|
108
|
+
// Mark service as being resolved
|
|
109
|
+
this.resolvingServices.add(name);
|
|
110
|
+
try {
|
|
111
|
+
// Resolve dependencies first
|
|
112
|
+
const dependencies = serviceDef.dependencies || [];
|
|
113
|
+
for (const depName of dependencies) {
|
|
114
|
+
await this.get(depName);
|
|
115
|
+
}
|
|
116
|
+
// Create service instance
|
|
117
|
+
let instance;
|
|
118
|
+
if (serviceDef.type === 'singleton') {
|
|
119
|
+
// Check if singleton already exists in registry
|
|
120
|
+
if (this.registry.singletons[name] !== undefined) {
|
|
121
|
+
instance = this.registry.singletons[name];
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
// Safe to cast: we've verified type === 'singleton' so factory is SingletonFactory
|
|
125
|
+
const factory = serviceDef.factory;
|
|
126
|
+
instance = await factory(this, this.settings);
|
|
127
|
+
// Cache in registry for reuse across all containers
|
|
128
|
+
this.registry.singletons[name] = instance;
|
|
129
|
+
}
|
|
130
|
+
this.services[name] = instance;
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
// Per-request service — requires request context
|
|
134
|
+
if (!this.request || !this.response || !this.next) {
|
|
135
|
+
throw new Error(`Service "${name}" is per-request and can only be accessed during HTTP request handling`);
|
|
136
|
+
}
|
|
137
|
+
// Safe to cast: we've verified type === 'per-request' so factory is PerRequestFactory
|
|
138
|
+
const factory = serviceDef.factory;
|
|
139
|
+
instance = await factory(this, this.settings, this.request, this.response, this.next);
|
|
140
|
+
this.services[name] = instance;
|
|
141
|
+
}
|
|
142
|
+
return instance;
|
|
143
|
+
}
|
|
144
|
+
finally {
|
|
145
|
+
// Remove from resolving set
|
|
146
|
+
this.resolvingServices.delete(name);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Register a service definition in this instance's registry.
|
|
151
|
+
* @param service - Service definition to register
|
|
152
|
+
*/
|
|
153
|
+
registerService(service) {
|
|
154
|
+
this.registry.definitions[service.name] = service;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Check if a service is registered in this instance's registry.
|
|
158
|
+
* @param name - Service name
|
|
159
|
+
* @returns True if service is registered
|
|
160
|
+
*/
|
|
161
|
+
isRegistered(name) {
|
|
162
|
+
return this.registry.definitions[name] !== undefined;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Get all registered service names from this instance's registry.
|
|
166
|
+
* @returns Array of service names
|
|
167
|
+
*/
|
|
168
|
+
getRegisteredServices() {
|
|
169
|
+
return Object.keys(this.registry.definitions);
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Dispose all singleton services in the registry.
|
|
173
|
+
* Calls the optional dispose function for each singleton if provided.
|
|
174
|
+
* Typically called during application shutdown.
|
|
175
|
+
*
|
|
176
|
+
* @returns Promise that resolves when all disposals complete
|
|
177
|
+
*/
|
|
178
|
+
async disposeAll() {
|
|
179
|
+
const disposals = [];
|
|
180
|
+
for (const [name, instance] of Object.entries(this.registry.singletons)) {
|
|
181
|
+
const def = this.registry.definitions[name];
|
|
182
|
+
if (def?.dispose) {
|
|
183
|
+
disposals.push(Promise.resolve(def.dispose(instance)));
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// Wait for all disposals to complete
|
|
187
|
+
await Promise.all(disposals);
|
|
188
|
+
// Clear singletons after disposal
|
|
189
|
+
Object.keys(this.registry.singletons).forEach(key => delete this.registry.singletons[key]);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=service-container.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-container.js","sourceRoot":"","sources":["../../src/application/service-container.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Preparse service names
|
|
3
|
+
*
|
|
4
|
+
* @deprecated Use const objects instead of static class properties.
|
|
5
|
+
* This function will be removed in the next major version.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* // OLD (deprecated):
|
|
10
|
+
* class MyServiceNames {
|
|
11
|
+
* static LOGGER_SERVICE: string;
|
|
12
|
+
* static SOME_SERVICE: string;
|
|
13
|
+
* }
|
|
14
|
+
* preparseServiceNames(MyServiceNames);
|
|
15
|
+
*
|
|
16
|
+
* // NEW (recommended):
|
|
17
|
+
* export const ServiceNames = {
|
|
18
|
+
* LOGGER_SERVICE: 'LOGGER_SERVICE',
|
|
19
|
+
* SOME_SERVICE: 'SOME_SERVICE',
|
|
20
|
+
* } as const;
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* @export
|
|
24
|
+
* @param {*} clazz
|
|
25
|
+
*/
|
|
26
|
+
export declare function preparseServiceNames(clazz: any): void;
|
|
27
|
+
//# sourceMappingURL=services.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../../src/application/services.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,GAAG,QAQ9C"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Preparse service names
|
|
3
|
+
*
|
|
4
|
+
* @deprecated Use const objects instead of static class properties.
|
|
5
|
+
* This function will be removed in the next major version.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* // OLD (deprecated):
|
|
10
|
+
* class MyServiceNames {
|
|
11
|
+
* static LOGGER_SERVICE: string;
|
|
12
|
+
* static SOME_SERVICE: string;
|
|
13
|
+
* }
|
|
14
|
+
* preparseServiceNames(MyServiceNames);
|
|
15
|
+
*
|
|
16
|
+
* // NEW (recommended):
|
|
17
|
+
* export const ServiceNames = {
|
|
18
|
+
* LOGGER_SERVICE: 'LOGGER_SERVICE',
|
|
19
|
+
* SOME_SERVICE: 'SOME_SERVICE',
|
|
20
|
+
* } as const;
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* @export
|
|
24
|
+
* @param {*} clazz
|
|
25
|
+
*/
|
|
26
|
+
export function preparseServiceNames(clazz) {
|
|
27
|
+
console.warn('[WebAFX DEPRECATION WARNING] preparseServiceNames() is deprecated. ' +
|
|
28
|
+
'Use const objects instead: const ServiceNames = { KEY: "KEY" } as const;');
|
|
29
|
+
Object.keys(clazz).forEach(key => {
|
|
30
|
+
clazz[key] = key;
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=services.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"services.js","sourceRoot":"","sources":["../../src/application/services.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAU;IAC7C,OAAO,CAAC,IAAI,CACV,qEAAqE;QACnE,0EAA0E,CAC7E,CAAC;IACF,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QAC/B,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACnB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { LogLevel } from './console-logger.js';
|
|
2
|
+
import { Logger } from './type.js';
|
|
3
|
+
/**
|
|
4
|
+
* Structured log entry format for JSON output.
|
|
5
|
+
*/
|
|
6
|
+
export interface LogEntry {
|
|
7
|
+
/** ISO 8601 timestamp */
|
|
8
|
+
timestamp: string;
|
|
9
|
+
/** Log level */
|
|
10
|
+
level: 'ERROR' | 'WARN' | 'INFO' | 'DEBUG';
|
|
11
|
+
/** Log message */
|
|
12
|
+
message: string;
|
|
13
|
+
/** Optional logger prefix */
|
|
14
|
+
prefix?: string;
|
|
15
|
+
/** Optional request ID from async context */
|
|
16
|
+
requestId?: string;
|
|
17
|
+
/** Optional additional data */
|
|
18
|
+
data?: Record<string, unknown>;
|
|
19
|
+
/** Any additional context from contextFn */
|
|
20
|
+
[key: string]: unknown;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Structured JSON logger implementation.
|
|
24
|
+
* Outputs logs as JSON objects for production environments with log aggregation.
|
|
25
|
+
*
|
|
26
|
+
* @remarks
|
|
27
|
+
* This logger is ideal for:
|
|
28
|
+
* - Production environments with centralized logging (e.g., ELK, CloudWatch)
|
|
29
|
+
* - Log parsing and filtering by log aggregation systems
|
|
30
|
+
* - Structured querying of logs
|
|
31
|
+
*
|
|
32
|
+
* Use ConsoleLogger for development where human-readable output is preferred.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* ```typescript
|
|
36
|
+
* const logger = new StructuredLogger('API', 'INFO');
|
|
37
|
+
* await logger.info('User login', { userId: 123 });
|
|
38
|
+
* // Output: {"timestamp":"2026-02-08T18:30:00.000Z","level":"INFO","message":"User login","prefix":"API","data":{"userId":123}}
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export declare class StructuredLogger implements Logger {
|
|
42
|
+
protected prefix: string | undefined;
|
|
43
|
+
protected level: number;
|
|
44
|
+
protected contextFn?: () => Record<string, unknown>;
|
|
45
|
+
/**
|
|
46
|
+
* Creates a new StructuredLogger instance.
|
|
47
|
+
*
|
|
48
|
+
* @param prefix - Optional prefix for log messages (e.g., 'APP', 'Plugin:Auth')
|
|
49
|
+
* @param logLevel - Optional log level (defaults to process.env.LOG_LEVEL or 'ERROR')
|
|
50
|
+
* @param contextFn - Optional function to add dynamic context to every log entry (e.g., request ID)
|
|
51
|
+
*/
|
|
52
|
+
constructor(prefix?: string, logLevel?: LogLevel, contextFn?: () => Record<string, unknown>);
|
|
53
|
+
/**
|
|
54
|
+
* Logs an error message as JSON.
|
|
55
|
+
*
|
|
56
|
+
* @param message - Error message
|
|
57
|
+
* @param data - Optional additional data to include in log entry
|
|
58
|
+
*/
|
|
59
|
+
error(message: string, data?: Record<string, unknown>): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Logs a warning message as JSON.
|
|
62
|
+
*
|
|
63
|
+
* @param message - Warning message
|
|
64
|
+
* @param data - Optional additional data to include in log entry
|
|
65
|
+
*/
|
|
66
|
+
warn(message: string, data?: Record<string, unknown>): Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* Logs an informational message as JSON.
|
|
69
|
+
*
|
|
70
|
+
* @param message - Info message
|
|
71
|
+
* @param data - Optional additional data to include in log entry
|
|
72
|
+
*/
|
|
73
|
+
info(message: string, data?: Record<string, unknown>): Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Logs a debug message as JSON.
|
|
76
|
+
*
|
|
77
|
+
* @param message - Debug message
|
|
78
|
+
* @param data - Optional additional data to include in log entry
|
|
79
|
+
*/
|
|
80
|
+
debug(message: string, data?: Record<string, unknown>): Promise<void>;
|
|
81
|
+
/**
|
|
82
|
+
* Determines if a message at the given level should be logged.
|
|
83
|
+
*
|
|
84
|
+
* @param level - Log level of the message (1=ERROR, 2=WARN, 3=INFO, 4=DEBUG)
|
|
85
|
+
* @returns True if message should be logged
|
|
86
|
+
* @internal
|
|
87
|
+
*/
|
|
88
|
+
protected shouldLog(level: number): boolean;
|
|
89
|
+
/**
|
|
90
|
+
* Writes a structured log entry as JSON to stdout or stderr.
|
|
91
|
+
*
|
|
92
|
+
* @param level - Log level string
|
|
93
|
+
* @param message - Log message
|
|
94
|
+
* @param data - Optional additional data
|
|
95
|
+
* @internal
|
|
96
|
+
*/
|
|
97
|
+
protected write(level: string, message: string, data?: Record<string, unknown>): void;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=structured-logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structured-logger.d.ts","sourceRoot":"","sources":["../../src/application/structured-logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAanC;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,yBAAyB;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB;IAChB,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAC3C,kBAAkB;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+BAA+B;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,4CAA4C;IAC5C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,gBAAiB,YAAW,MAAM;IAC7C,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEpD;;;;;;OAMG;gBACS,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAQ3F;;;;;OAKG;IACG,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3E;;;;;OAKG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAM1E;;;;;OAKG;IACG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAM1E;;;;;OAKG;IACG,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3E;;;;;;OAMG;IACH,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI3C;;;;;;;OAOG;IACH,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;CAsBtF"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Map log level names to numeric values for comparison.
|
|
3
|
+
* Lower numbers = higher priority (ERROR is highest).
|
|
4
|
+
*/
|
|
5
|
+
const LOG_LEVEL_MAP = {
|
|
6
|
+
ERROR: 1,
|
|
7
|
+
WARN: 2,
|
|
8
|
+
INFO: 3,
|
|
9
|
+
DEBUG: 4,
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Structured JSON logger implementation.
|
|
13
|
+
* Outputs logs as JSON objects for production environments with log aggregation.
|
|
14
|
+
*
|
|
15
|
+
* @remarks
|
|
16
|
+
* This logger is ideal for:
|
|
17
|
+
* - Production environments with centralized logging (e.g., ELK, CloudWatch)
|
|
18
|
+
* - Log parsing and filtering by log aggregation systems
|
|
19
|
+
* - Structured querying of logs
|
|
20
|
+
*
|
|
21
|
+
* Use ConsoleLogger for development where human-readable output is preferred.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* const logger = new StructuredLogger('API', 'INFO');
|
|
26
|
+
* await logger.info('User login', { userId: 123 });
|
|
27
|
+
* // Output: {"timestamp":"2026-02-08T18:30:00.000Z","level":"INFO","message":"User login","prefix":"API","data":{"userId":123}}
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export class StructuredLogger {
|
|
31
|
+
prefix;
|
|
32
|
+
level;
|
|
33
|
+
contextFn;
|
|
34
|
+
/**
|
|
35
|
+
* Creates a new StructuredLogger instance.
|
|
36
|
+
*
|
|
37
|
+
* @param prefix - Optional prefix for log messages (e.g., 'APP', 'Plugin:Auth')
|
|
38
|
+
* @param logLevel - Optional log level (defaults to process.env.LOG_LEVEL or 'ERROR')
|
|
39
|
+
* @param contextFn - Optional function to add dynamic context to every log entry (e.g., request ID)
|
|
40
|
+
*/
|
|
41
|
+
constructor(prefix, logLevel, contextFn) {
|
|
42
|
+
this.prefix = prefix;
|
|
43
|
+
// Use provided log level, fall back to process.env.LOG_LEVEL, then default to ERROR
|
|
44
|
+
const levelFromEnv = (process.env.LOG_LEVEL || 'ERROR').toUpperCase();
|
|
45
|
+
this.level = LOG_LEVEL_MAP[logLevel || levelFromEnv] ?? 1;
|
|
46
|
+
this.contextFn = contextFn;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Logs an error message as JSON.
|
|
50
|
+
*
|
|
51
|
+
* @param message - Error message
|
|
52
|
+
* @param data - Optional additional data to include in log entry
|
|
53
|
+
*/
|
|
54
|
+
async error(message, data) {
|
|
55
|
+
if (this.shouldLog(1)) {
|
|
56
|
+
this.write('ERROR', message, data);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Logs a warning message as JSON.
|
|
61
|
+
*
|
|
62
|
+
* @param message - Warning message
|
|
63
|
+
* @param data - Optional additional data to include in log entry
|
|
64
|
+
*/
|
|
65
|
+
async warn(message, data) {
|
|
66
|
+
if (this.shouldLog(2)) {
|
|
67
|
+
this.write('WARN', message, data);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Logs an informational message as JSON.
|
|
72
|
+
*
|
|
73
|
+
* @param message - Info message
|
|
74
|
+
* @param data - Optional additional data to include in log entry
|
|
75
|
+
*/
|
|
76
|
+
async info(message, data) {
|
|
77
|
+
if (this.shouldLog(3)) {
|
|
78
|
+
this.write('INFO', message, data);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Logs a debug message as JSON.
|
|
83
|
+
*
|
|
84
|
+
* @param message - Debug message
|
|
85
|
+
* @param data - Optional additional data to include in log entry
|
|
86
|
+
*/
|
|
87
|
+
async debug(message, data) {
|
|
88
|
+
if (this.shouldLog(4) || process.env.DEBUG === 'true') {
|
|
89
|
+
this.write('DEBUG', message, data);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Determines if a message at the given level should be logged.
|
|
94
|
+
*
|
|
95
|
+
* @param level - Log level of the message (1=ERROR, 2=WARN, 3=INFO, 4=DEBUG)
|
|
96
|
+
* @returns True if message should be logged
|
|
97
|
+
* @internal
|
|
98
|
+
*/
|
|
99
|
+
shouldLog(level) {
|
|
100
|
+
return level <= this.level;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Writes a structured log entry as JSON to stdout or stderr.
|
|
104
|
+
*
|
|
105
|
+
* @param level - Log level string
|
|
106
|
+
* @param message - Log message
|
|
107
|
+
* @param data - Optional additional data
|
|
108
|
+
* @internal
|
|
109
|
+
*/
|
|
110
|
+
write(level, message, data) {
|
|
111
|
+
const entry = {
|
|
112
|
+
timestamp: new Date().toISOString(),
|
|
113
|
+
level: level,
|
|
114
|
+
message,
|
|
115
|
+
// Add prefix if set
|
|
116
|
+
...(this.prefix && { prefix: this.prefix }),
|
|
117
|
+
// Add dynamic context from contextFn if provided
|
|
118
|
+
...(this.contextFn && this.contextFn()),
|
|
119
|
+
// Add additional data if provided
|
|
120
|
+
...(data && { data }),
|
|
121
|
+
};
|
|
122
|
+
const output = JSON.stringify(entry);
|
|
123
|
+
// Use console.error for ERROR level, console.log for all others
|
|
124
|
+
if (level === 'ERROR') {
|
|
125
|
+
console.error(output);
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
console.log(output);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=structured-logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structured-logger.js","sourceRoot":"","sources":["../../src/application/structured-logger.ts"],"names":[],"mappings":"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"}
|