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,258 @@
|
|
|
1
|
+
import { readFile, readdir } from "node:fs/promises";
|
|
2
|
+
import { basename, resolve, dirname } from "node:path";
|
|
3
|
+
/**
|
|
4
|
+
* Translation source that loads from JSON files.
|
|
5
|
+
*
|
|
6
|
+
* Supports two file formats:
|
|
7
|
+
* 1. Multi-locale: `{ key: { locale: value } }` — all locales in one file
|
|
8
|
+
* 2. Single-locale: `{ key: value }` — one file per locale, locale from filename
|
|
9
|
+
*
|
|
10
|
+
* Format is auto-detected per file based on the structure of the first value.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* const source = new JsonFileSource({
|
|
15
|
+
* paths: ["./translations/*.json"],
|
|
16
|
+
* });
|
|
17
|
+
* const catalog = await source.load();
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export class JsonFileSource {
|
|
21
|
+
/** @inheritdoc */
|
|
22
|
+
name = "JsonFileSource";
|
|
23
|
+
/** Source configuration */
|
|
24
|
+
config;
|
|
25
|
+
/**
|
|
26
|
+
* Create a new JsonFileSource.
|
|
27
|
+
*
|
|
28
|
+
* @param config - File paths or glob patterns configuration
|
|
29
|
+
*/
|
|
30
|
+
constructor(config) {
|
|
31
|
+
this.config = config;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Load all translations from configured JSON file paths.
|
|
35
|
+
*
|
|
36
|
+
* 1. Resolves all glob patterns to file paths
|
|
37
|
+
* 2. Reads and parses each JSON file
|
|
38
|
+
* 3. Auto-detects format (multi-locale vs single-locale)
|
|
39
|
+
* 4. Normalizes into TranslationCatalog entries
|
|
40
|
+
* 5. Merges all entries (later files override earlier for same key+locale)
|
|
41
|
+
*
|
|
42
|
+
* @returns The complete translation catalog from all matched files
|
|
43
|
+
* @throws Error if a file cannot be read or parsed
|
|
44
|
+
*/
|
|
45
|
+
async load() {
|
|
46
|
+
const catalog = {};
|
|
47
|
+
// Resolve all glob patterns to file paths
|
|
48
|
+
const filePaths = await resolveGlobs(this.config.paths);
|
|
49
|
+
for (const filePath of filePaths) {
|
|
50
|
+
const content = await readFile(filePath, "utf-8");
|
|
51
|
+
let data;
|
|
52
|
+
try {
|
|
53
|
+
data = JSON.parse(content);
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
throw new Error(`Failed to parse JSON file "${filePath}": ${error instanceof Error ? error.message : String(error)}`);
|
|
57
|
+
}
|
|
58
|
+
// Auto-detect format and normalize into catalog
|
|
59
|
+
const format = detectFormat(data);
|
|
60
|
+
if (format === "multi-locale") {
|
|
61
|
+
// Multi-locale: { key: { locale: value } }
|
|
62
|
+
mergeMultiLocale(catalog, data);
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
// Single-locale: { key: value }, locale from filename
|
|
66
|
+
const locale = extractLocaleFromFilename(basename(filePath));
|
|
67
|
+
mergeSingleLocale(catalog, data, locale);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return catalog;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Create a JsonFileSource instance. Convenience factory for plugin configuration.
|
|
75
|
+
*
|
|
76
|
+
* @param config - JSON file source configuration
|
|
77
|
+
* @returns A new JsonFileSource instance
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* ```typescript
|
|
81
|
+
* app.use(createI18nPlugin({
|
|
82
|
+
* sources: [
|
|
83
|
+
* jsonFileSource({ paths: ["./translations/*.json"] }),
|
|
84
|
+
* ],
|
|
85
|
+
* }));
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
export function jsonFileSource(config) {
|
|
89
|
+
return new JsonFileSource(config);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Detect if a JSON file is multi-locale or single-locale format.
|
|
93
|
+
*
|
|
94
|
+
* Heuristic: Look at the first value in the object.
|
|
95
|
+
* - If it's a string or array → single-locale (flat key→value)
|
|
96
|
+
* - If it's a plain object → multi-locale (key→{locale: value})
|
|
97
|
+
* - Empty object → defaults to multi-locale (no keys to process anyway)
|
|
98
|
+
*
|
|
99
|
+
* @param data - Parsed JSON object
|
|
100
|
+
* @returns "multi-locale" or "single-locale"
|
|
101
|
+
*/
|
|
102
|
+
function detectFormat(data) {
|
|
103
|
+
const firstValue = Object.values(data)[0];
|
|
104
|
+
// Empty file — treat as multi-locale (no entries either way)
|
|
105
|
+
if (firstValue === undefined) {
|
|
106
|
+
return "multi-locale";
|
|
107
|
+
}
|
|
108
|
+
// String or array → single-locale format
|
|
109
|
+
if (typeof firstValue === "string" || Array.isArray(firstValue)) {
|
|
110
|
+
return "single-locale";
|
|
111
|
+
}
|
|
112
|
+
// Object → multi-locale format
|
|
113
|
+
if (typeof firstValue === "object" && firstValue !== null) {
|
|
114
|
+
return "multi-locale";
|
|
115
|
+
}
|
|
116
|
+
// Fallback: treat as single-locale
|
|
117
|
+
return "single-locale";
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Extract locale from a filename.
|
|
121
|
+
*
|
|
122
|
+
* Supports patterns:
|
|
123
|
+
* - "en.json" → "en"
|
|
124
|
+
* - "nl_NL.json" → "nl_NL"
|
|
125
|
+
* - "translations.en.json" → "en"
|
|
126
|
+
* - "strings.nl.json" → "nl"
|
|
127
|
+
*
|
|
128
|
+
* Uses the last segment before the final .json extension.
|
|
129
|
+
*
|
|
130
|
+
* @param filename - The file name (without directory path)
|
|
131
|
+
* @returns The extracted locale string
|
|
132
|
+
* @throws Error if no locale can be determined from the filename
|
|
133
|
+
*/
|
|
134
|
+
function extractLocaleFromFilename(filename) {
|
|
135
|
+
// Remove the .json extension
|
|
136
|
+
const withoutExt = filename.replace(/\.json$/i, "");
|
|
137
|
+
// Split by dots and take the last segment
|
|
138
|
+
const segments = withoutExt.split(".");
|
|
139
|
+
const locale = segments[segments.length - 1];
|
|
140
|
+
if (!locale) {
|
|
141
|
+
throw new Error(`Cannot determine locale from filename "${filename}"`);
|
|
142
|
+
}
|
|
143
|
+
return locale;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Merge a multi-locale file's data into an existing catalog.
|
|
147
|
+
*
|
|
148
|
+
* Multi-locale format: { key: { locale: value } }
|
|
149
|
+
*
|
|
150
|
+
* @param catalog - The target catalog to merge into (mutated)
|
|
151
|
+
* @param data - The multi-locale file data
|
|
152
|
+
*/
|
|
153
|
+
function mergeMultiLocale(catalog, data) {
|
|
154
|
+
for (const [key, localeMap] of Object.entries(data)) {
|
|
155
|
+
if (!catalog[key]) {
|
|
156
|
+
catalog[key] = {};
|
|
157
|
+
}
|
|
158
|
+
for (const [locale, value] of Object.entries(localeMap)) {
|
|
159
|
+
// Normalize the value to TranslationValue
|
|
160
|
+
catalog[key][locale] = normalizeValue(value);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Merge a single-locale file's data into an existing catalog.
|
|
166
|
+
*
|
|
167
|
+
* Single-locale format: { key: value } with locale from filename.
|
|
168
|
+
*
|
|
169
|
+
* @param catalog - The target catalog to merge into (mutated)
|
|
170
|
+
* @param data - The single-locale file data
|
|
171
|
+
* @param locale - The locale extracted from the filename
|
|
172
|
+
*/
|
|
173
|
+
function mergeSingleLocale(catalog, data, locale) {
|
|
174
|
+
for (const [key, value] of Object.entries(data)) {
|
|
175
|
+
if (!catalog[key]) {
|
|
176
|
+
catalog[key] = {};
|
|
177
|
+
}
|
|
178
|
+
catalog[key][locale] = normalizeValue(value);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Normalize a raw JSON value to a TranslationValue.
|
|
183
|
+
*
|
|
184
|
+
* - Strings pass through as-is
|
|
185
|
+
* - Arrays of exactly 2 strings become [singular, plural] tuples
|
|
186
|
+
* - Other values are converted to string via String()
|
|
187
|
+
*
|
|
188
|
+
* @param value - The raw value from JSON
|
|
189
|
+
* @returns Normalized TranslationValue
|
|
190
|
+
*/
|
|
191
|
+
function normalizeValue(value) {
|
|
192
|
+
if (typeof value === "string") {
|
|
193
|
+
return value;
|
|
194
|
+
}
|
|
195
|
+
// Check for plural array [singular, plural]
|
|
196
|
+
if (Array.isArray(value) && value.length === 2 && typeof value[0] === "string" && typeof value[1] === "string") {
|
|
197
|
+
return value;
|
|
198
|
+
}
|
|
199
|
+
// Fallback: convert to string
|
|
200
|
+
return String(value);
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Resolve glob patterns to file paths.
|
|
204
|
+
*
|
|
205
|
+
* Supports simple glob patterns like "dir/*.json" by listing the
|
|
206
|
+
* directory and filtering by extension. Non-glob paths are returned
|
|
207
|
+
* as-is (resolved to absolute).
|
|
208
|
+
*
|
|
209
|
+
* @param patterns - Array of file paths or glob patterns
|
|
210
|
+
* @returns Array of resolved file paths, sorted for deterministic ordering
|
|
211
|
+
*/
|
|
212
|
+
async function resolveGlobs(patterns) {
|
|
213
|
+
const allPaths = [];
|
|
214
|
+
for (const pattern of patterns) {
|
|
215
|
+
// Check if it's a glob pattern (contains * or ?)
|
|
216
|
+
if (pattern.includes("*") || pattern.includes("?")) {
|
|
217
|
+
const matches = await expandSimpleGlob(pattern);
|
|
218
|
+
allPaths.push(...matches);
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
// Plain file path — resolve to absolute
|
|
222
|
+
allPaths.push(resolve(pattern));
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
// Sort for deterministic file ordering
|
|
226
|
+
return allPaths.sort();
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Expand a simple glob pattern like "dir/*.json" into matching file paths.
|
|
230
|
+
*
|
|
231
|
+
* Supports only `*` wildcards in the filename part (not recursive `**`).
|
|
232
|
+
* This covers the primary use case for translation files without needing
|
|
233
|
+
* an external glob library.
|
|
234
|
+
*
|
|
235
|
+
* @param pattern - A glob pattern (e.g., "./translations/*.json")
|
|
236
|
+
* @returns Array of matching absolute file paths
|
|
237
|
+
*/
|
|
238
|
+
async function expandSimpleGlob(pattern) {
|
|
239
|
+
const dir = dirname(pattern);
|
|
240
|
+
const filePattern = basename(pattern);
|
|
241
|
+
// Convert glob pattern to regex: * → [^/]*, ? → [^/]
|
|
242
|
+
const regexStr = filePattern
|
|
243
|
+
.replace(/[.+^${}()|[\]\\]/g, "\\$&") // Escape regex special chars (except * and ?)
|
|
244
|
+
.replace(/\*/g, "[^/]*")
|
|
245
|
+
.replace(/\?/g, "[^/]");
|
|
246
|
+
const regex = new RegExp(`^${regexStr}$`);
|
|
247
|
+
try {
|
|
248
|
+
const entries = await readdir(resolve(dir));
|
|
249
|
+
return entries
|
|
250
|
+
.filter((entry) => regex.test(entry))
|
|
251
|
+
.map((entry) => resolve(dir, entry));
|
|
252
|
+
}
|
|
253
|
+
catch {
|
|
254
|
+
// Directory doesn't exist — return empty (no matches)
|
|
255
|
+
return [];
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=json-file-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-file-source.js","sourceRoot":"","sources":["../src/json-file-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { TranslationCatalog } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Merge multiple translation catalogs into one.
|
|
4
|
+
*
|
|
5
|
+
* Catalogs are merged in array order. For duplicate key+locale pairs,
|
|
6
|
+
* the later source wins (predictable override order). This allows
|
|
7
|
+
* layered translation loading where database overrides can sit on top
|
|
8
|
+
* of file-based defaults.
|
|
9
|
+
*
|
|
10
|
+
* @param catalogs - Array of catalogs to merge (in priority order, last wins)
|
|
11
|
+
* @returns The merged catalog containing all keys from all sources
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* const base = { greeting: { en: "Hello", nl: "Hallo" } };
|
|
15
|
+
* const overrides = { greeting: { en: "Hi" } };
|
|
16
|
+
* mergeCatalogs([base, overrides]);
|
|
17
|
+
* // → { greeting: { en: "Hi", nl: "Hallo" } }
|
|
18
|
+
*/
|
|
19
|
+
export declare function mergeCatalogs(catalogs: TranslationCatalog[]): TranslationCatalog;
|
|
20
|
+
//# sourceMappingURL=merge-catalogs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-catalogs.d.ts","sourceRoot":"","sources":["../src/merge-catalogs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,kBAAkB,CAgBhF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merge multiple translation catalogs into one.
|
|
3
|
+
*
|
|
4
|
+
* Catalogs are merged in array order. For duplicate key+locale pairs,
|
|
5
|
+
* the later source wins (predictable override order). This allows
|
|
6
|
+
* layered translation loading where database overrides can sit on top
|
|
7
|
+
* of file-based defaults.
|
|
8
|
+
*
|
|
9
|
+
* @param catalogs - Array of catalogs to merge (in priority order, last wins)
|
|
10
|
+
* @returns The merged catalog containing all keys from all sources
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* const base = { greeting: { en: "Hello", nl: "Hallo" } };
|
|
14
|
+
* const overrides = { greeting: { en: "Hi" } };
|
|
15
|
+
* mergeCatalogs([base, overrides]);
|
|
16
|
+
* // → { greeting: { en: "Hi", nl: "Hallo" } }
|
|
17
|
+
*/
|
|
18
|
+
export function mergeCatalogs(catalogs) {
|
|
19
|
+
const result = {};
|
|
20
|
+
for (const catalog of catalogs) {
|
|
21
|
+
for (const [key, entry] of Object.entries(catalog)) {
|
|
22
|
+
if (!result[key]) {
|
|
23
|
+
// First occurrence of this key — copy the entry
|
|
24
|
+
result[key] = { ...entry };
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
// Merge locale entries — later sources override earlier
|
|
28
|
+
Object.assign(result[key], entry);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=merge-catalogs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-catalogs.js","sourceRoot":"","sources":["../src/merge-catalogs.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,aAAa,CAAC,QAA8B;IACxD,MAAM,MAAM,GAAuB,EAAE,CAAC;IAEtC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC7B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACjD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;gBACf,gDAAgD;gBAChD,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;YAC/B,CAAC;iBAAM,CAAC;gBACJ,wDAAwD;gBACxD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;YACtC,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node.js entry point for @blendsdk/i18n.
|
|
3
|
+
*
|
|
4
|
+
* This module re-exports the entire browser-safe core (Translator, mergeCatalogs,
|
|
5
|
+
* types, TranslationSource) plus the Node.js-only file-based translation sources
|
|
6
|
+
* (JsonFileSource, ContentFileSource) that depend on `node:fs` and `node:path`.
|
|
7
|
+
*
|
|
8
|
+
* **Import paths:**
|
|
9
|
+
* - `@blendsdk/i18n` — Browser-safe core (works everywhere)
|
|
10
|
+
* - `@blendsdk/i18n/node` — Full package including file-based sources (Node.js only)
|
|
11
|
+
*
|
|
12
|
+
* @module @blendsdk/i18n/node
|
|
13
|
+
*/
|
|
14
|
+
export { Translator, mergeCatalogs, } from "./index.js";
|
|
15
|
+
export type { TranslationValue, TranslationEntry, TranslationCatalog, TranslatorConfig, LocaleParts, TranslationSource, } from "./index.js";
|
|
16
|
+
export { JsonFileSource, jsonFileSource } from "./json-file-source.js";
|
|
17
|
+
export type { JsonFileSourceConfig } from "./json-file-source.js";
|
|
18
|
+
export { ContentFileSource, contentFileSource } from "./content-file-source.js";
|
|
19
|
+
export type { ContentFileSourceConfig } from "./content-file-source.js";
|
|
20
|
+
//# sourceMappingURL=node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EACH,UAAU,EACV,aAAa,GAChB,MAAM,YAAY,CAAC;AAEpB,YAAY,EACR,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,EACX,iBAAiB,GACpB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvE,YAAY,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAChF,YAAY,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Node.js entry point for @blendsdk/i18n.
|
|
3
|
+
*
|
|
4
|
+
* This module re-exports the entire browser-safe core (Translator, mergeCatalogs,
|
|
5
|
+
* types, TranslationSource) plus the Node.js-only file-based translation sources
|
|
6
|
+
* (JsonFileSource, ContentFileSource) that depend on `node:fs` and `node:path`.
|
|
7
|
+
*
|
|
8
|
+
* **Import paths:**
|
|
9
|
+
* - `@blendsdk/i18n` — Browser-safe core (works everywhere)
|
|
10
|
+
* - `@blendsdk/i18n/node` — Full package including file-based sources (Node.js only)
|
|
11
|
+
*
|
|
12
|
+
* @module @blendsdk/i18n/node
|
|
13
|
+
*/
|
|
14
|
+
// Re-export everything from the browser-safe core
|
|
15
|
+
export { Translator, mergeCatalogs, } from "./index.js";
|
|
16
|
+
// Node.js-only sources
|
|
17
|
+
export { JsonFileSource, jsonFileSource } from "./json-file-source.js";
|
|
18
|
+
export { ContentFileSource, contentFileSource } from "./content-file-source.js";
|
|
19
|
+
//# sourceMappingURL=node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,kDAAkD;AAClD,OAAO,EACH,UAAU,EACV,aAAa,GAChB,MAAM,YAAY,CAAC;AAWpB,uBAAuB;AACvB,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { TranslationCatalog } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Abstract interface for translation data sources.
|
|
4
|
+
*
|
|
5
|
+
* A TranslationSource loads translations from an external backend
|
|
6
|
+
* (JSON files, database, remote API, etc.) and returns them as a
|
|
7
|
+
* TranslationCatalog. Sources are composable — multiple sources
|
|
8
|
+
* can be loaded and merged into a single catalog.
|
|
9
|
+
*
|
|
10
|
+
* Each source implementation is responsible for:
|
|
11
|
+
* 1. Connecting to its backend (file system, database, etc.)
|
|
12
|
+
* 2. Reading translation data
|
|
13
|
+
* 3. Normalizing data into the TranslationCatalog format
|
|
14
|
+
*
|
|
15
|
+
* Sources are loaded at application startup and optionally re-loaded
|
|
16
|
+
* when a reload is triggered (e.g., via pub/sub).
|
|
17
|
+
*/
|
|
18
|
+
export interface TranslationSource {
|
|
19
|
+
/**
|
|
20
|
+
* Human-readable name for logging (e.g., "JsonFileSource", "PostgreSQLSource").
|
|
21
|
+
*/
|
|
22
|
+
readonly name: string;
|
|
23
|
+
/**
|
|
24
|
+
* Load all translations from this source.
|
|
25
|
+
*
|
|
26
|
+
* Called at application startup and on reload events.
|
|
27
|
+
* Must return a complete TranslationCatalog.
|
|
28
|
+
* If the source is unavailable, should throw with a descriptive error.
|
|
29
|
+
*
|
|
30
|
+
* @returns The complete translation catalog from this source
|
|
31
|
+
* @throws Error if the source cannot be read
|
|
32
|
+
*/
|
|
33
|
+
load(): Promise<TranslationCatalog>;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=translation-source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"translation-source.d.ts","sourceRoot":"","sources":["../src/translation-source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,iBAAiB;IAC9B;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;;;;;;;;OASG;IACH,IAAI,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACvC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"translation-source.js","sourceRoot":"","sources":["../src/translation-source.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import type { TranslationCatalog, TranslationEntry, TranslationValue, TranslatorConfig, LocaleParts } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Core translation engine.
|
|
4
|
+
*
|
|
5
|
+
* Provides translation lookup with locale fallback, plural support,
|
|
6
|
+
* and string interpolation via `formatString`. The catalog is treated
|
|
7
|
+
* as immutable after construction — use `setCatalog()` for atomic
|
|
8
|
+
* replacement (e.g., on reload).
|
|
9
|
+
*
|
|
10
|
+
* Runtime-agnostic: no Node.js or browser-specific APIs.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* const translator = new Translator({
|
|
15
|
+
* defaultLocale: "en",
|
|
16
|
+
* catalog: {
|
|
17
|
+
* greeting: { en: "Hello ${name}", nl: "Hallo ${name}" },
|
|
18
|
+
* book: { en: ["${count} book", "${count} books"] },
|
|
19
|
+
* },
|
|
20
|
+
* });
|
|
21
|
+
*
|
|
22
|
+
* translator.translate("greeting", "en", { name: "Alice" });
|
|
23
|
+
* // → "Hello Alice"
|
|
24
|
+
*
|
|
25
|
+
* translator.translate("book", "en", { count: 5 });
|
|
26
|
+
* // → "5 books"
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export declare class Translator {
|
|
30
|
+
/** The default locale used when none is specified */
|
|
31
|
+
protected defaultLocale: string;
|
|
32
|
+
/** The translation catalog (atomic reference for reload safety) */
|
|
33
|
+
protected catalog: TranslationCatalog;
|
|
34
|
+
/** Cache for parsed locale parts to avoid repeated parsing */
|
|
35
|
+
protected localeCache: Map<string, LocaleParts>;
|
|
36
|
+
/** Optional callback for missing translations */
|
|
37
|
+
protected onMissingTranslation?: (key: string, locale: string) => void;
|
|
38
|
+
/**
|
|
39
|
+
* Create a new Translator instance.
|
|
40
|
+
*
|
|
41
|
+
* @param config - Optional configuration (defaults to "en" locale, empty catalog)
|
|
42
|
+
*/
|
|
43
|
+
constructor(config?: TranslatorConfig);
|
|
44
|
+
/**
|
|
45
|
+
* Translate a key for a given locale with optional parameter interpolation.
|
|
46
|
+
*
|
|
47
|
+
* Locale fallback chain: exact locale → language only → key as-is.
|
|
48
|
+
* Plural selection: if the translation value is a [singular, plural] tuple
|
|
49
|
+
* and params contains a `count` property, the appropriate form is selected.
|
|
50
|
+
*
|
|
51
|
+
* @param key - Translation key (e.g., "greeting", "auth.login")
|
|
52
|
+
* @param locale - Target locale (e.g., "en_GB", "nl"). Uses defaultLocale if omitted.
|
|
53
|
+
* @param params - Optional interpolation parameters
|
|
54
|
+
* @returns The translated, interpolated string
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* translator.translate("greeting", "en", { name: "Alice" })
|
|
58
|
+
* // → "Hello Alice"
|
|
59
|
+
*
|
|
60
|
+
* translator.translate("book", "en", { count: 1 })
|
|
61
|
+
* // → "1 book"
|
|
62
|
+
*
|
|
63
|
+
* translator.translate("book", "en", { count: 5 })
|
|
64
|
+
* // → "5 books"
|
|
65
|
+
*
|
|
66
|
+
* translator.translate("unknown.key", "en")
|
|
67
|
+
* // → "unknown.key" (key returned as-is)
|
|
68
|
+
*/
|
|
69
|
+
translate(key: string, locale?: string, params?: Record<string, unknown>): string;
|
|
70
|
+
/**
|
|
71
|
+
* Get all translations for a specific locale as a flat key-value map.
|
|
72
|
+
*
|
|
73
|
+
* Resolves each key using the locale fallback chain (exact → language).
|
|
74
|
+
* Plural values are returned as-is (the array form) since the client
|
|
75
|
+
* needs both forms for dynamic count-based selection.
|
|
76
|
+
*
|
|
77
|
+
* Primarily used to serve translations to frontend clients.
|
|
78
|
+
*
|
|
79
|
+
* @param locale - Target locale (e.g., "en", "nl_NL")
|
|
80
|
+
* @returns Flat map of { key: resolvedValue } for the locale
|
|
81
|
+
*
|
|
82
|
+
* @example
|
|
83
|
+
* translator.getTranslationsForLocale("nl")
|
|
84
|
+
* // → { greeting: "Hallo ${name}", book: ["${count} boek", "${count} boeken"] }
|
|
85
|
+
*/
|
|
86
|
+
getTranslationsForLocale(locale: string): Record<string, TranslationValue>;
|
|
87
|
+
/**
|
|
88
|
+
* Check if a translation key exists, optionally for a specific locale.
|
|
89
|
+
*
|
|
90
|
+
* @param key - Translation key
|
|
91
|
+
* @param locale - Optional: check for this specific locale (with fallback)
|
|
92
|
+
* @returns true if the key exists (and has a value for the locale if specified)
|
|
93
|
+
*/
|
|
94
|
+
hasKey(key: string, locale?: string): boolean;
|
|
95
|
+
/**
|
|
96
|
+
* Atomically replace the translation catalog.
|
|
97
|
+
*
|
|
98
|
+
* Used by the reload mechanism to swap in a new catalog without
|
|
99
|
+
* affecting ongoing translations. The old catalog serves current
|
|
100
|
+
* requests; the new catalog serves subsequent ones.
|
|
101
|
+
*
|
|
102
|
+
* @param catalog - The new translation catalog
|
|
103
|
+
*/
|
|
104
|
+
setCatalog(catalog: TranslationCatalog): void;
|
|
105
|
+
/**
|
|
106
|
+
* Get the current translation catalog.
|
|
107
|
+
* Primarily useful for testing and debugging.
|
|
108
|
+
*
|
|
109
|
+
* @returns The current TranslationCatalog
|
|
110
|
+
*/
|
|
111
|
+
getCatalog(): TranslationCatalog;
|
|
112
|
+
/**
|
|
113
|
+
* Get the configured default locale.
|
|
114
|
+
* @returns The default locale string
|
|
115
|
+
*/
|
|
116
|
+
getDefaultLocale(): string;
|
|
117
|
+
/**
|
|
118
|
+
* Parse and cache a locale string into its component parts.
|
|
119
|
+
*
|
|
120
|
+
* Handles formats like:
|
|
121
|
+
* - "en" → { full: "en", language: "en" }
|
|
122
|
+
* - "en_GB" → { full: "en_GB", language: "en", region: "GB" }
|
|
123
|
+
* - "en-GB" → { full: "en_GB", language: "en", region: "GB" } (normalizes dash to underscore)
|
|
124
|
+
* - "en_GB.UTF-8" → { full: "en_GB", language: "en", region: "GB" } (strips encoding)
|
|
125
|
+
*
|
|
126
|
+
* Results are cached in a Map for O(1) subsequent lookups.
|
|
127
|
+
*
|
|
128
|
+
* @param locale - The locale string to parse
|
|
129
|
+
* @returns Parsed LocaleParts
|
|
130
|
+
*/
|
|
131
|
+
protected parseLocale(locale: string): LocaleParts;
|
|
132
|
+
/**
|
|
133
|
+
* Resolve the best translation value from an entry for a given locale.
|
|
134
|
+
*
|
|
135
|
+
* Fallback chain:
|
|
136
|
+
* 1. Exact match: entry[locale_full] (e.g., entry["en_GB"])
|
|
137
|
+
* 2. Language match: entry[language] (e.g., entry["en"])
|
|
138
|
+
* 3. undefined (not found)
|
|
139
|
+
*
|
|
140
|
+
* @param entry - The translation entry for a key
|
|
141
|
+
* @param localeParts - Parsed locale parts
|
|
142
|
+
* @returns The resolved value, or undefined if no match
|
|
143
|
+
*/
|
|
144
|
+
protected resolveValue(entry: TranslationEntry, localeParts: LocaleParts): TranslationValue | undefined;
|
|
145
|
+
/**
|
|
146
|
+
* Select singular or plural form based on the `count` parameter.
|
|
147
|
+
*
|
|
148
|
+
* If the value is a [singular, plural] tuple and params.count exists
|
|
149
|
+
* and is a number:
|
|
150
|
+
* - count === 1 → singular (index 0)
|
|
151
|
+
* - count !== 1 → plural (index 1)
|
|
152
|
+
*
|
|
153
|
+
* If the value is a simple string, returns it unchanged.
|
|
154
|
+
* If count is not a valid number, defaults to singular.
|
|
155
|
+
*
|
|
156
|
+
* @param value - The translation value (string or [singular, plural])
|
|
157
|
+
* @param params - Parameters that may contain a `count` property
|
|
158
|
+
* @returns The selected string form
|
|
159
|
+
*/
|
|
160
|
+
protected selectPlural(value: TranslationValue, params?: Record<string, unknown>): string;
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=translator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"translator.d.ts","sourceRoot":"","sources":["../src/translator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACR,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACd,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,UAAU;IACnB,qDAAqD;IACrD,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC;IAEhC,mEAAmE;IACnE,SAAS,CAAC,OAAO,EAAE,kBAAkB,CAAC;IAEtC,8DAA8D;IAC9D,SAAS,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAEhD,iDAAiD;IACjD,SAAS,CAAC,oBAAoB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAEvE;;;;OAIG;gBACS,MAAM,CAAC,EAAE,gBAAgB;IAOrC;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;IA2BjF;;;;;;;;;;;;;;;OAeG;IACH,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAc1E;;;;;;OAMG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO;IAU7C;;;;;;;;OAQG;IACH,UAAU,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAM7C;;;;;OAKG;IACH,UAAU,IAAI,kBAAkB;IAIhC;;;OAGG;IACH,gBAAgB,IAAI,MAAM;IAI1B;;;;;;;;;;;;;OAaG;IACH,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW;IA4BlD;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,YAAY,CAClB,KAAK,EAAE,gBAAgB,EACvB,WAAW,EAAE,WAAW,GACzB,gBAAgB,GAAG,SAAS;IAe/B;;;;;;;;;;;;;;OAcG;IACH,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,gBAAgB,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;CAe5F"}
|