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,240 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Abstract base class for all authentication provider implementations.
|
|
3
|
+
*
|
|
4
|
+
* Provides the common authentication lifecycle (extract token → validate → return
|
|
5
|
+
* identity) and a configurable token extraction chain. Each concrete provider
|
|
6
|
+
* implements only the `validate()` method — everything else is shared.
|
|
7
|
+
*
|
|
8
|
+
* Design principles:
|
|
9
|
+
* - Application-wide singleton (not per-request)
|
|
10
|
+
* - Configurable token extraction chain (header, cookie, query, custom)
|
|
11
|
+
* - Silent failure pattern: invalid tokens return `undefined`, not throw
|
|
12
|
+
* - Infrastructure errors (network, DNS) are the only thrown exceptions
|
|
13
|
+
* - Claims mapping is pluggable via `mapClaims` config option
|
|
14
|
+
*
|
|
15
|
+
* @packageDocumentation
|
|
16
|
+
*/
|
|
17
|
+
import { DEFAULT_COOKIE_NAME, DEFAULT_QUERY_PARAM_NAME, DEFAULT_SERVICE_NAME, DEFAULT_TOKEN_SOURCES, } from "./types.js";
|
|
18
|
+
/**
|
|
19
|
+
* Abstract base class for authentication providers.
|
|
20
|
+
*
|
|
21
|
+
* All auth backends (JWT, Introspection, OIDC, Tenant, Memory) derive from
|
|
22
|
+
* this class. Provides a configurable token extraction chain and a standard
|
|
23
|
+
* `authenticate()` lifecycle that concrete providers inherit without changes.
|
|
24
|
+
*
|
|
25
|
+
* Usage through concrete implementations:
|
|
26
|
+
* ```typescript
|
|
27
|
+
* const provider = new JwtAuthProvider({ secret: 'my-secret' });
|
|
28
|
+
* const result = await provider.authenticate(req);
|
|
29
|
+
* // result is AuthResult | undefined
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export class AuthProvider {
|
|
33
|
+
/** Service name for WebAFX service container registration */
|
|
34
|
+
_serviceName;
|
|
35
|
+
/**
|
|
36
|
+
* Ordered chain of token extractor functions.
|
|
37
|
+
* Built from the `tokenSources` config at construction time.
|
|
38
|
+
* Each function tries to extract a token from a different request location.
|
|
39
|
+
*/
|
|
40
|
+
tokenExtractors;
|
|
41
|
+
/** Claims mapping function — transforms raw claims into AuthResult */
|
|
42
|
+
claimsMapper;
|
|
43
|
+
/** Cookie name used by the 'cookie' token source */
|
|
44
|
+
cookieName;
|
|
45
|
+
/** Query parameter name used by the 'query' token source */
|
|
46
|
+
queryParamName;
|
|
47
|
+
/**
|
|
48
|
+
* Initialize the auth provider with base configuration.
|
|
49
|
+
*
|
|
50
|
+
* Builds the token extraction chain from `tokenSources` config and
|
|
51
|
+
* sets up the claims mapper (custom or default).
|
|
52
|
+
*
|
|
53
|
+
* @param config - Base configuration with token sources, cookie name, etc.
|
|
54
|
+
*/
|
|
55
|
+
constructor(config = {}) {
|
|
56
|
+
this._serviceName = config.serviceName ?? DEFAULT_SERVICE_NAME;
|
|
57
|
+
this.cookieName = config.cookieName ?? DEFAULT_COOKIE_NAME;
|
|
58
|
+
this.queryParamName = config.queryParamName ?? DEFAULT_QUERY_PARAM_NAME;
|
|
59
|
+
// Use custom claims mapper if provided, otherwise fall back to the default.
|
|
60
|
+
// The default mapper handles common JWT/OAuth2 claim formats (sub, exp, scope).
|
|
61
|
+
this.claimsMapper = config.mapClaims ?? this.defaultClaimsMapper;
|
|
62
|
+
// Build the ordered token extraction chain from config.
|
|
63
|
+
// Each source becomes a function that tries one extraction strategy.
|
|
64
|
+
this.tokenExtractors = this.buildExtractors(config.tokenSources ?? DEFAULT_TOKEN_SOURCES);
|
|
65
|
+
}
|
|
66
|
+
// -----------------------------------------------------------------------
|
|
67
|
+
// Public Accessors
|
|
68
|
+
// -----------------------------------------------------------------------
|
|
69
|
+
/** Get the service name used for WebAFX service container registration */
|
|
70
|
+
get serviceName() {
|
|
71
|
+
return this._serviceName;
|
|
72
|
+
}
|
|
73
|
+
// -----------------------------------------------------------------------
|
|
74
|
+
// Token Extraction (public — used by TenantAuthProvider and tests)
|
|
75
|
+
// -----------------------------------------------------------------------
|
|
76
|
+
/**
|
|
77
|
+
* Extract a raw token string from the request.
|
|
78
|
+
*
|
|
79
|
+
* Tries each configured token source in order (header → cookie → query → custom).
|
|
80
|
+
* Returns the first non-empty match, or `undefined` if no token is found.
|
|
81
|
+
* This is NOT an error — unauthenticated requests are normal for public routes.
|
|
82
|
+
*
|
|
83
|
+
* @param req - Express request object
|
|
84
|
+
* @returns The extracted token string, or undefined if no token found
|
|
85
|
+
*/
|
|
86
|
+
extractToken(req) {
|
|
87
|
+
// Walk the extraction chain in priority order — first match wins.
|
|
88
|
+
// This allows applications to configure fallback strategies
|
|
89
|
+
// (e.g., try header first, then fall back to cookie for browser clients).
|
|
90
|
+
for (const extractor of this.tokenExtractors) {
|
|
91
|
+
const token = extractor(req);
|
|
92
|
+
if (token) {
|
|
93
|
+
return token;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return undefined;
|
|
97
|
+
}
|
|
98
|
+
// -----------------------------------------------------------------------
|
|
99
|
+
// Authentication Lifecycle (public — called by plugin middleware)
|
|
100
|
+
// -----------------------------------------------------------------------
|
|
101
|
+
/**
|
|
102
|
+
* Complete authentication flow: extract → validate → return result.
|
|
103
|
+
*
|
|
104
|
+
* This is the main entry point called by the plugin middleware on every
|
|
105
|
+
* request. It is implemented once in the base class and works for all
|
|
106
|
+
* providers — concrete providers only need to implement `validate()`.
|
|
107
|
+
*
|
|
108
|
+
* Returns `undefined` if:
|
|
109
|
+
* - No token found in the request (unauthenticated, not an error)
|
|
110
|
+
* - Token is invalid or expired (silent failure)
|
|
111
|
+
*
|
|
112
|
+
* Throws only on infrastructure failures (network errors, DNS failures).
|
|
113
|
+
*
|
|
114
|
+
* @param req - Express request object
|
|
115
|
+
* @returns AuthResult if authenticated, undefined otherwise
|
|
116
|
+
*/
|
|
117
|
+
async authenticate(req) {
|
|
118
|
+
const token = this.extractToken(req);
|
|
119
|
+
if (!token) {
|
|
120
|
+
return undefined;
|
|
121
|
+
}
|
|
122
|
+
return this.validate(token);
|
|
123
|
+
}
|
|
124
|
+
// -----------------------------------------------------------------------
|
|
125
|
+
// Protected Helpers (used by concrete providers)
|
|
126
|
+
// -----------------------------------------------------------------------
|
|
127
|
+
/**
|
|
128
|
+
* Default claims mapper: extracts sub, exp, and scopes from raw claims.
|
|
129
|
+
*
|
|
130
|
+
* Handles multiple common claim formats:
|
|
131
|
+
* - `sub` or `subject` for the subject identifier
|
|
132
|
+
* - `exp` for expiration (numeric seconds since epoch)
|
|
133
|
+
* - `scope` (space-separated string) or `scopes` (array) for permissions
|
|
134
|
+
*
|
|
135
|
+
* Providers can override this by passing `mapClaims` in config.
|
|
136
|
+
*
|
|
137
|
+
* @param token - Original raw token string
|
|
138
|
+
* @param rawClaims - Raw claims object from token validation
|
|
139
|
+
* @returns Standardized AuthResult
|
|
140
|
+
*/
|
|
141
|
+
defaultClaimsMapper(token, rawClaims) {
|
|
142
|
+
// Extract subject — try 'sub' first (OAuth2/JWT standard), then 'subject'
|
|
143
|
+
const sub = String(rawClaims.sub ?? rawClaims.subject ?? "unknown");
|
|
144
|
+
// Extract expiration — must be a numeric timestamp (seconds since epoch)
|
|
145
|
+
const exp = typeof rawClaims.exp === "number" ? rawClaims.exp : undefined;
|
|
146
|
+
// Extract scopes from various claim formats:
|
|
147
|
+
// - OAuth2 standard: "scope" as space-separated string (RFC 6749)
|
|
148
|
+
// - Some providers: "scopes" as array
|
|
149
|
+
// - Some providers: "scope" as array
|
|
150
|
+
let scopes;
|
|
151
|
+
if (typeof rawClaims.scope === "string") {
|
|
152
|
+
scopes = rawClaims.scope.split(" ").filter(Boolean);
|
|
153
|
+
}
|
|
154
|
+
else if (Array.isArray(rawClaims.scopes)) {
|
|
155
|
+
scopes = rawClaims.scopes.map(String);
|
|
156
|
+
}
|
|
157
|
+
else if (Array.isArray(rawClaims.scope)) {
|
|
158
|
+
scopes = rawClaims.scope.map(String);
|
|
159
|
+
}
|
|
160
|
+
return { sub, claims: rawClaims, token, exp, scopes };
|
|
161
|
+
}
|
|
162
|
+
// -----------------------------------------------------------------------
|
|
163
|
+
// Private Helpers (token extraction chain construction)
|
|
164
|
+
// -----------------------------------------------------------------------
|
|
165
|
+
/**
|
|
166
|
+
* Build the ordered token extractor chain from configuration.
|
|
167
|
+
*
|
|
168
|
+
* Each configured source becomes a function that attempts to extract
|
|
169
|
+
* a token from a specific request location. The resulting array is
|
|
170
|
+
* walked in order by `extractToken()`.
|
|
171
|
+
*
|
|
172
|
+
* @param sources - Configured token sources in priority order
|
|
173
|
+
* @returns Array of extractor functions
|
|
174
|
+
* @throws Error if an unknown token source type is provided
|
|
175
|
+
*/
|
|
176
|
+
buildExtractors(sources) {
|
|
177
|
+
return sources.map((source) => {
|
|
178
|
+
if (source === "header") {
|
|
179
|
+
return (req) => this.extractFromHeader(req);
|
|
180
|
+
}
|
|
181
|
+
if (source === "cookie") {
|
|
182
|
+
return (req) => this.extractFromCookie(req);
|
|
183
|
+
}
|
|
184
|
+
if (source === "query") {
|
|
185
|
+
return (req) => this.extractFromQuery(req);
|
|
186
|
+
}
|
|
187
|
+
if (typeof source === "object" && source.extractor) {
|
|
188
|
+
return source.extractor;
|
|
189
|
+
}
|
|
190
|
+
throw new Error(`Unknown token source: ${JSON.stringify(source)}. ` +
|
|
191
|
+
`Supported: "header", "cookie", "query", or { extractor: fn }`);
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Extract Bearer token from the Authorization header.
|
|
196
|
+
*
|
|
197
|
+
* Expects the format: `Authorization: Bearer <token>`
|
|
198
|
+
* Returns undefined if the header is missing or doesn't start with "Bearer ".
|
|
199
|
+
*
|
|
200
|
+
* @param req - Express request object
|
|
201
|
+
* @returns The token string without the "Bearer " prefix, or undefined
|
|
202
|
+
*/
|
|
203
|
+
extractFromHeader(req) {
|
|
204
|
+
const authHeader = req.headers.authorization;
|
|
205
|
+
if (authHeader?.startsWith("Bearer ")) {
|
|
206
|
+
return authHeader.substring(7);
|
|
207
|
+
}
|
|
208
|
+
return undefined;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Extract token from a named cookie.
|
|
212
|
+
*
|
|
213
|
+
* Requires cookie-parser middleware to be installed (already built into
|
|
214
|
+
* WebAFX's core middleware). The cookie name is configured via `cookieName`
|
|
215
|
+
* (default: `'auth_token'`).
|
|
216
|
+
*
|
|
217
|
+
* @param req - Express request object
|
|
218
|
+
* @returns The cookie value as a string, or undefined
|
|
219
|
+
*/
|
|
220
|
+
extractFromCookie(req) {
|
|
221
|
+
// req.cookies is populated by cookie-parser middleware.
|
|
222
|
+
// If cookie-parser is not installed, req.cookies will be undefined.
|
|
223
|
+
return req.cookies?.[this.cookieName];
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Extract token from a query parameter.
|
|
227
|
+
*
|
|
228
|
+
* Useful for webhook callbacks, email verification links, and SSE endpoints
|
|
229
|
+
* where headers can't be set. The parameter name is configured via
|
|
230
|
+
* `queryParamName` (default: `'token'`).
|
|
231
|
+
*
|
|
232
|
+
* @param req - Express request object
|
|
233
|
+
* @returns The query parameter value as a string, or undefined
|
|
234
|
+
*/
|
|
235
|
+
extractFromQuery(req) {
|
|
236
|
+
const value = req.query?.[this.queryParamName];
|
|
237
|
+
return typeof value === "string" ? value : undefined;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=abstract-auth-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abstract-auth-provider.js","sourceRoot":"","sources":["../src/abstract-auth-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @blendsdk/webafx-auth — Token validation and authentication plugin for WebAFX
|
|
3
|
+
*
|
|
4
|
+
* Provides an abstract AuthProvider base class with a configurable token
|
|
5
|
+
* extraction chain and five concrete provider implementations:
|
|
6
|
+
*
|
|
7
|
+
* **Providers:**
|
|
8
|
+
* - AuthProvider (abstract) — base class with extract → validate → authenticate lifecycle
|
|
9
|
+
* - JwtAuthProvider — local JWT verification (HMAC/RSA via oauth4webapi)
|
|
10
|
+
* - IntrospectionAuthProvider — OAuth2 token introspection (RFC 7662) with cache
|
|
11
|
+
* - OidcAuthProvider — OIDC JWT validation with JWKS discovery (openid-client)
|
|
12
|
+
* - TenantAuthProvider — multi-tenant delegation with per-tenant providers
|
|
13
|
+
* - MemoryAuthProvider — testing mock with pre-configured valid tokens
|
|
14
|
+
*
|
|
15
|
+
* **Plugin integration:**
|
|
16
|
+
* - createAuthPlugin() — generic plugin from any AuthProvider
|
|
17
|
+
* - jwtAuthPlugin(), introspectionAuthPlugin(), oidcAuthPlugin(), etc.
|
|
18
|
+
* - createAuthProvider() — environment-based factory
|
|
19
|
+
*
|
|
20
|
+
* @packageDocumentation
|
|
21
|
+
*/
|
|
22
|
+
export type { AuthResult, AuthProviderConfig, JwtAuthConfig, IntrospectionAuthConfig, OidcAuthConfig, TenantAuthConfig, MemoryAuthConfig, AuthFactoryConfig, TokenSource, TokenExtractor, ClaimsMapper, TenantResolver, TenantProviderFactory, AuthProviderLike, } from "./types.js";
|
|
23
|
+
export { DEFAULT_SERVICE_NAME, DEFAULT_PLUGIN_PRIORITY, DEFAULT_COOKIE_NAME, DEFAULT_QUERY_PARAM_NAME, DEFAULT_TOKEN_SOURCES, } from "./types.js";
|
|
24
|
+
export { AuthProvider } from "./abstract-auth-provider.js";
|
|
25
|
+
export { MemoryAuthProvider } from "./memory-auth-provider.js";
|
|
26
|
+
export { JwtAuthProvider } from "./jwt-auth-provider.js";
|
|
27
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAKH,YAAY,EACR,UAAU,EACV,kBAAkB,EAClB,aAAa,EACb,uBAAuB,EACvB,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,EACX,cAAc,EACd,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,gBAAgB,GACnB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACH,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EACnB,wBAAwB,EACxB,qBAAqB,GACxB,MAAM,YAAY,CAAC;AAKpB,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAK3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @blendsdk/webafx-auth — Token validation and authentication plugin for WebAFX
|
|
3
|
+
*
|
|
4
|
+
* Provides an abstract AuthProvider base class with a configurable token
|
|
5
|
+
* extraction chain and five concrete provider implementations:
|
|
6
|
+
*
|
|
7
|
+
* **Providers:**
|
|
8
|
+
* - AuthProvider (abstract) — base class with extract → validate → authenticate lifecycle
|
|
9
|
+
* - JwtAuthProvider — local JWT verification (HMAC/RSA via oauth4webapi)
|
|
10
|
+
* - IntrospectionAuthProvider — OAuth2 token introspection (RFC 7662) with cache
|
|
11
|
+
* - OidcAuthProvider — OIDC JWT validation with JWKS discovery (openid-client)
|
|
12
|
+
* - TenantAuthProvider — multi-tenant delegation with per-tenant providers
|
|
13
|
+
* - MemoryAuthProvider — testing mock with pre-configured valid tokens
|
|
14
|
+
*
|
|
15
|
+
* **Plugin integration:**
|
|
16
|
+
* - createAuthPlugin() — generic plugin from any AuthProvider
|
|
17
|
+
* - jwtAuthPlugin(), introspectionAuthPlugin(), oidcAuthPlugin(), etc.
|
|
18
|
+
* - createAuthProvider() — environment-based factory
|
|
19
|
+
*
|
|
20
|
+
* @packageDocumentation
|
|
21
|
+
*/
|
|
22
|
+
export { DEFAULT_SERVICE_NAME, DEFAULT_PLUGIN_PRIORITY, DEFAULT_COOKIE_NAME, DEFAULT_QUERY_PARAM_NAME, DEFAULT_TOKEN_SOURCES, } from "./types.js";
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Abstract Base Class
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
export { AuthProvider } from "./abstract-auth-provider.js";
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
// Concrete Providers
|
|
29
|
+
// ---------------------------------------------------------------------------
|
|
30
|
+
export { MemoryAuthProvider } from "./memory-auth-provider.js";
|
|
31
|
+
export { JwtAuthProvider } from "./jwt-auth-provider.js";
|
|
32
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAsBH,OAAO,EACH,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EACnB,wBAAwB,EACxB,qBAAqB,GACxB,MAAM,YAAY,CAAC;AAEpB,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAC9E,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3D,8EAA8E;AAC9E,qBAAqB;AACrB,8EAA8E;AAC9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JWT authentication provider for self-issued token verification.
|
|
3
|
+
*
|
|
4
|
+
* Validates JWTs locally using HMAC or RSA/EC keys via the `jose` library.
|
|
5
|
+
* No network calls required — verification is a pure cryptographic operation.
|
|
6
|
+
*
|
|
7
|
+
* Supports:
|
|
8
|
+
* - **HMAC** (HS256, HS384, HS512) — string secrets
|
|
9
|
+
* - **RSA/EC** (RS256, ES256, etc.) — CryptoKey public keys
|
|
10
|
+
* - Issuer validation (`iss` claim)
|
|
11
|
+
* - Audience validation (`aud` claim)
|
|
12
|
+
* - Clock tolerance for `exp`/`nbf` checks
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* const provider = new JwtAuthProvider({
|
|
17
|
+
* secret: 'my-256-bit-secret',
|
|
18
|
+
* algorithms: ['HS256'],
|
|
19
|
+
* issuer: 'https://api.example.com',
|
|
20
|
+
* audience: 'my-client-id',
|
|
21
|
+
* clockTolerance: 5,
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* const result = await provider.authenticate(req);
|
|
25
|
+
* // result is AuthResult if JWT is valid, undefined otherwise
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* @packageDocumentation
|
|
29
|
+
*/
|
|
30
|
+
import { AuthProvider } from "./abstract-auth-provider.js";
|
|
31
|
+
import type { AuthResult, JwtAuthConfig } from "./types.js";
|
|
32
|
+
/**
|
|
33
|
+
* JWT authentication provider using the `jose` library.
|
|
34
|
+
*
|
|
35
|
+
* Verifies JWT signatures locally — no network calls needed. Supports both
|
|
36
|
+
* symmetric (HMAC) and asymmetric (RSA, EC) algorithms. The signing key is
|
|
37
|
+
* lazily converted to the format `jose` expects on first use.
|
|
38
|
+
*
|
|
39
|
+
* Invalid or expired tokens silently return `undefined` (not throw).
|
|
40
|
+
* Only truly unexpected errors (e.g., corrupt CryptoKey) propagate as exceptions.
|
|
41
|
+
*/
|
|
42
|
+
export declare class JwtAuthProvider extends AuthProvider {
|
|
43
|
+
/** Provider configuration */
|
|
44
|
+
protected config: JwtAuthConfig;
|
|
45
|
+
/**
|
|
46
|
+
* Cached key in the format jose expects.
|
|
47
|
+
* For string secrets (HMAC): encoded as Uint8Array.
|
|
48
|
+
* For CryptoKey (RSA/EC): used directly.
|
|
49
|
+
* Lazy-initialized on first validate() call.
|
|
50
|
+
*/
|
|
51
|
+
protected resolvedKey: CryptoKey | Uint8Array | null;
|
|
52
|
+
/**
|
|
53
|
+
* Create a new JWT auth provider.
|
|
54
|
+
*
|
|
55
|
+
* @param config - JWT configuration with secret/key, algorithms, issuer, audience
|
|
56
|
+
*/
|
|
57
|
+
constructor(config: JwtAuthConfig);
|
|
58
|
+
/**
|
|
59
|
+
* Validate a JWT by verifying its signature, expiration, and claims.
|
|
60
|
+
*
|
|
61
|
+
* Uses `jose.jwtVerify()` which checks:
|
|
62
|
+
* - Signature against the configured secret/key
|
|
63
|
+
* - `exp` claim (token not expired, with clock tolerance)
|
|
64
|
+
* - `nbf` claim (token not used before valid time)
|
|
65
|
+
* - `iss` claim (if issuer is configured)
|
|
66
|
+
* - `aud` claim (if audience is configured)
|
|
67
|
+
*
|
|
68
|
+
* @param token - Raw JWT string (header.payload.signature)
|
|
69
|
+
* @returns AuthResult if valid, undefined if invalid/expired
|
|
70
|
+
*/
|
|
71
|
+
validate(token: string): Promise<AuthResult | undefined>;
|
|
72
|
+
/**
|
|
73
|
+
* Health check — verifies that the signing secret/key is configured.
|
|
74
|
+
*
|
|
75
|
+
* JWT verification is a local CPU operation with no external dependencies,
|
|
76
|
+
* so health only checks that the key material is present.
|
|
77
|
+
*
|
|
78
|
+
* @returns true if a secret or key is configured
|
|
79
|
+
*/
|
|
80
|
+
health(): Promise<boolean>;
|
|
81
|
+
/**
|
|
82
|
+
* Graceful shutdown — releases the cached CryptoKey.
|
|
83
|
+
*
|
|
84
|
+
* After shutdown, the key will be re-created on next `validate()` call.
|
|
85
|
+
*/
|
|
86
|
+
shutdown(): Promise<void>;
|
|
87
|
+
/**
|
|
88
|
+
* Get or create the signing key in jose-compatible format.
|
|
89
|
+
*
|
|
90
|
+
* For string secrets (HMAC): encodes to Uint8Array using TextEncoder.
|
|
91
|
+
* For CryptoKey (RSA/EC): uses the key directly as-is.
|
|
92
|
+
*
|
|
93
|
+
* The result is cached for the lifetime of the provider to avoid
|
|
94
|
+
* repeated encoding on every request.
|
|
95
|
+
*
|
|
96
|
+
* @returns The key in a format jose's jwtVerify() accepts
|
|
97
|
+
*/
|
|
98
|
+
protected getOrCreateKey(): CryptoKey | Uint8Array;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=jwt-auth-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt-auth-provider.d.ts","sourceRoot":"","sources":["../src/jwt-auth-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAKH,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE5D;;;;;;;;;GASG;AACH,qBAAa,eAAgB,SAAQ,YAAY;IAC7C,6BAA6B;IAC7B,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC;IAEhC;;;;;OAKG;IACH,SAAS,CAAC,WAAW,EAAE,SAAS,GAAG,UAAU,GAAG,IAAI,CAAQ;IAE5D;;;;OAIG;gBACS,MAAM,EAAE,aAAa;IASjC;;;;;;;;;;;;OAYG;IACG,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAsC9D;;;;;;;OAOG;IACG,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAIhC;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ/B;;;;;;;;;;OAUG;IACH,SAAS,CAAC,cAAc,IAAI,SAAS,GAAG,UAAU;CAkBrD"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JWT authentication provider for self-issued token verification.
|
|
3
|
+
*
|
|
4
|
+
* Validates JWTs locally using HMAC or RSA/EC keys via the `jose` library.
|
|
5
|
+
* No network calls required — verification is a pure cryptographic operation.
|
|
6
|
+
*
|
|
7
|
+
* Supports:
|
|
8
|
+
* - **HMAC** (HS256, HS384, HS512) — string secrets
|
|
9
|
+
* - **RSA/EC** (RS256, ES256, etc.) — CryptoKey public keys
|
|
10
|
+
* - Issuer validation (`iss` claim)
|
|
11
|
+
* - Audience validation (`aud` claim)
|
|
12
|
+
* - Clock tolerance for `exp`/`nbf` checks
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* const provider = new JwtAuthProvider({
|
|
17
|
+
* secret: 'my-256-bit-secret',
|
|
18
|
+
* algorithms: ['HS256'],
|
|
19
|
+
* issuer: 'https://api.example.com',
|
|
20
|
+
* audience: 'my-client-id',
|
|
21
|
+
* clockTolerance: 5,
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* const result = await provider.authenticate(req);
|
|
25
|
+
* // result is AuthResult if JWT is valid, undefined otherwise
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* @packageDocumentation
|
|
29
|
+
*/
|
|
30
|
+
import { jwtVerify } from "jose";
|
|
31
|
+
import { AuthProvider } from "./abstract-auth-provider.js";
|
|
32
|
+
/**
|
|
33
|
+
* JWT authentication provider using the `jose` library.
|
|
34
|
+
*
|
|
35
|
+
* Verifies JWT signatures locally — no network calls needed. Supports both
|
|
36
|
+
* symmetric (HMAC) and asymmetric (RSA, EC) algorithms. The signing key is
|
|
37
|
+
* lazily converted to the format `jose` expects on first use.
|
|
38
|
+
*
|
|
39
|
+
* Invalid or expired tokens silently return `undefined` (not throw).
|
|
40
|
+
* Only truly unexpected errors (e.g., corrupt CryptoKey) propagate as exceptions.
|
|
41
|
+
*/
|
|
42
|
+
export class JwtAuthProvider extends AuthProvider {
|
|
43
|
+
/** Provider configuration */
|
|
44
|
+
config;
|
|
45
|
+
/**
|
|
46
|
+
* Cached key in the format jose expects.
|
|
47
|
+
* For string secrets (HMAC): encoded as Uint8Array.
|
|
48
|
+
* For CryptoKey (RSA/EC): used directly.
|
|
49
|
+
* Lazy-initialized on first validate() call.
|
|
50
|
+
*/
|
|
51
|
+
resolvedKey = null;
|
|
52
|
+
/**
|
|
53
|
+
* Create a new JWT auth provider.
|
|
54
|
+
*
|
|
55
|
+
* @param config - JWT configuration with secret/key, algorithms, issuer, audience
|
|
56
|
+
*/
|
|
57
|
+
constructor(config) {
|
|
58
|
+
super(config);
|
|
59
|
+
this.config = config;
|
|
60
|
+
}
|
|
61
|
+
// -----------------------------------------------------------------------
|
|
62
|
+
// Abstract Method Implementations
|
|
63
|
+
// -----------------------------------------------------------------------
|
|
64
|
+
/**
|
|
65
|
+
* Validate a JWT by verifying its signature, expiration, and claims.
|
|
66
|
+
*
|
|
67
|
+
* Uses `jose.jwtVerify()` which checks:
|
|
68
|
+
* - Signature against the configured secret/key
|
|
69
|
+
* - `exp` claim (token not expired, with clock tolerance)
|
|
70
|
+
* - `nbf` claim (token not used before valid time)
|
|
71
|
+
* - `iss` claim (if issuer is configured)
|
|
72
|
+
* - `aud` claim (if audience is configured)
|
|
73
|
+
*
|
|
74
|
+
* @param token - Raw JWT string (header.payload.signature)
|
|
75
|
+
* @returns AuthResult if valid, undefined if invalid/expired
|
|
76
|
+
*/
|
|
77
|
+
async validate(token) {
|
|
78
|
+
try {
|
|
79
|
+
const key = this.getOrCreateKey();
|
|
80
|
+
// Build verification options from config.
|
|
81
|
+
// jose uses these to validate standard JWT claims after
|
|
82
|
+
// signature verification succeeds.
|
|
83
|
+
const options = {
|
|
84
|
+
algorithms: this.config.algorithms ?? ["HS256"],
|
|
85
|
+
clockTolerance: this.config.clockTolerance ?? 0,
|
|
86
|
+
};
|
|
87
|
+
// Only set issuer/audience if configured — undefined means "don't check"
|
|
88
|
+
if (this.config.issuer) {
|
|
89
|
+
options.issuer = this.config.issuer;
|
|
90
|
+
}
|
|
91
|
+
if (this.config.audience) {
|
|
92
|
+
options.audience = this.config.audience;
|
|
93
|
+
}
|
|
94
|
+
const result = await jwtVerify(token, key, options);
|
|
95
|
+
// Map the verified JWT payload to our standardized AuthResult format
|
|
96
|
+
return this.claimsMapper(token, result.payload);
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// Any verification failure (bad signature, expired, wrong issuer, malformed)
|
|
100
|
+
// returns undefined — the silent failure pattern.
|
|
101
|
+
return undefined;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Health check — verifies that the signing secret/key is configured.
|
|
106
|
+
*
|
|
107
|
+
* JWT verification is a local CPU operation with no external dependencies,
|
|
108
|
+
* so health only checks that the key material is present.
|
|
109
|
+
*
|
|
110
|
+
* @returns true if a secret or key is configured
|
|
111
|
+
*/
|
|
112
|
+
async health() {
|
|
113
|
+
return this.config.secret !== undefined && this.config.secret !== null;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Graceful shutdown — releases the cached CryptoKey.
|
|
117
|
+
*
|
|
118
|
+
* After shutdown, the key will be re-created on next `validate()` call.
|
|
119
|
+
*/
|
|
120
|
+
async shutdown() {
|
|
121
|
+
this.resolvedKey = null;
|
|
122
|
+
}
|
|
123
|
+
// -----------------------------------------------------------------------
|
|
124
|
+
// Protected Helpers
|
|
125
|
+
// -----------------------------------------------------------------------
|
|
126
|
+
/**
|
|
127
|
+
* Get or create the signing key in jose-compatible format.
|
|
128
|
+
*
|
|
129
|
+
* For string secrets (HMAC): encodes to Uint8Array using TextEncoder.
|
|
130
|
+
* For CryptoKey (RSA/EC): uses the key directly as-is.
|
|
131
|
+
*
|
|
132
|
+
* The result is cached for the lifetime of the provider to avoid
|
|
133
|
+
* repeated encoding on every request.
|
|
134
|
+
*
|
|
135
|
+
* @returns The key in a format jose's jwtVerify() accepts
|
|
136
|
+
*/
|
|
137
|
+
getOrCreateKey() {
|
|
138
|
+
if (this.resolvedKey) {
|
|
139
|
+
return this.resolvedKey;
|
|
140
|
+
}
|
|
141
|
+
const { secret } = this.config;
|
|
142
|
+
if (typeof secret === "string") {
|
|
143
|
+
// HMAC secrets: encode the string to bytes for jose.
|
|
144
|
+
// jose accepts Uint8Array for symmetric algorithms (HS256/384/512).
|
|
145
|
+
this.resolvedKey = new TextEncoder().encode(secret);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
// CryptoKey: use directly for asymmetric algorithms (RS256, ES256, etc.)
|
|
149
|
+
this.resolvedKey = secret;
|
|
150
|
+
}
|
|
151
|
+
return this.resolvedKey;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=jwt-auth-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt-auth-provider.js","sourceRoot":"","sources":["../src/jwt-auth-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAGjC,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAG3D;;;;;;;;;GASG;AACH,MAAM,OAAO,eAAgB,SAAQ,YAAY;IAC7C,6BAA6B;IACnB,MAAM,CAAgB;IAEhC;;;;;OAKG;IACO,WAAW,GAAkC,IAAI,CAAC;IAE5D;;;;OAIG;IACH,YAAY,MAAqB;QAC7B,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAED,0EAA0E;IAC1E,kCAAkC;IAClC,0EAA0E;IAE1E;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,QAAQ,CAAC,KAAa;QACxB,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;YAElC,0CAA0C;YAC1C,wDAAwD;YACxD,mCAAmC;YACnC,MAAM,OAAO,GAAoC;gBAC7C,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC;gBAC/C,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC;aAClD,CAAC;YAEF,yEAAyE;YACzE,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;gBACrB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;YACxC,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACvB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;YAC5C,CAAC;YAED,MAAM,MAAM,GAAoB,MAAM,SAAS,CAC3C,KAAK,EACL,GAAG,EACH,OAAO,CACV,CAAC;YAEF,qEAAqE;YACrE,OAAO,IAAI,CAAC,YAAY,CACpB,KAAK,EACL,MAAM,CAAC,OAAkC,CAC5C,CAAC;QACN,CAAC;QAAC,MAAM,CAAC;YACL,6EAA6E;YAC7E,kDAAkD;YAClD,OAAO,SAAS,CAAC;QACrB,CAAC;IACL,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,MAAM;QACR,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC;IAC3E,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ;QACV,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC5B,CAAC;IAED,0EAA0E;IAC1E,oBAAoB;IACpB,0EAA0E;IAE1E;;;;;;;;;;OAUG;IACO,cAAc;QACpB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,WAAW,CAAC;QAC5B,CAAC;QAED,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC;QAE/B,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC7B,qDAAqD;YACrD,oEAAoE;YACpE,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACJ,yEAAyE;YACzE,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC;QAC9B,CAAC;QAED,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;CACJ"}
|