@bett3r-dev/pv3 1.0.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/build/adapters/cache/index.d.ts +2 -0
- package/build/adapters/cache/index.d.ts.map +1 -0
- package/build/adapters/cache/index.js +18 -0
- package/build/adapters/cache/index.js.map +1 -0
- package/build/adapters/cache/memory/__tests__/memoryCache.test.d.ts +1 -0
- package/build/adapters/cache/memory/__tests__/memoryCache.test.d.ts.map +1 -0
- package/build/adapters/cache/memory/__tests__/memoryCache.test.js +6 -0
- package/build/adapters/cache/memory/__tests__/memoryCache.test.js.map +1 -0
- package/build/adapters/cache/memory/index.d.ts +3 -0
- package/build/adapters/cache/memory/index.d.ts.map +1 -0
- package/build/adapters/cache/memory/index.js +119 -0
- package/build/adapters/cache/memory/index.js.map +1 -0
- package/build/adapters/configuration/__tests__/dotEnv.test.d.ts +2 -0
- package/build/adapters/configuration/__tests__/dotEnv.test.d.ts.map +1 -0
- package/build/adapters/configuration/__tests__/dotEnv.test.js +43 -0
- package/build/adapters/configuration/__tests__/dotEnv.test.js.map +1 -0
- package/build/adapters/configuration/dotEnv.d.ts +3 -0
- package/build/adapters/configuration/dotEnv.d.ts.map +1 -0
- package/build/adapters/configuration/dotEnv.js +35 -0
- package/build/adapters/configuration/dotEnv.js.map +1 -0
- package/build/adapters/configuration/index.d.ts +2 -0
- package/build/adapters/configuration/index.d.ts.map +1 -0
- package/build/adapters/configuration/index.js +18 -0
- package/build/adapters/configuration/index.js.map +1 -0
- package/build/adapters/database/index.d.ts +2 -0
- package/build/adapters/database/index.d.ts.map +1 -0
- package/build/adapters/database/index.js +18 -0
- package/build/adapters/database/index.js.map +1 -0
- package/build/adapters/database/memory/__tests__/memoryDb.test.d.ts +1 -0
- package/build/adapters/database/memory/__tests__/memoryDb.test.d.ts.map +1 -0
- package/build/adapters/database/memory/__tests__/memoryDb.test.js +36 -0
- package/build/adapters/database/memory/__tests__/memoryDb.test.js.map +1 -0
- package/build/adapters/database/memory/index.d.ts +3 -0
- package/build/adapters/database/memory/index.d.ts.map +1 -0
- package/build/adapters/database/memory/index.js +241 -0
- package/build/adapters/database/memory/index.js.map +1 -0
- package/build/adapters/endpoints/addAuthUser/index.d.ts +8 -0
- package/build/adapters/endpoints/addAuthUser/index.d.ts.map +1 -0
- package/build/adapters/endpoints/addAuthUser/index.js +57 -0
- package/build/adapters/endpoints/addAuthUser/index.js.map +1 -0
- package/build/adapters/endpoints/endpointValidation/index.d.ts +4 -0
- package/build/adapters/endpoints/endpointValidation/index.d.ts.map +1 -0
- package/build/adapters/endpoints/endpointValidation/index.js +27 -0
- package/build/adapters/endpoints/endpointValidation/index.js.map +1 -0
- package/build/adapters/endpoints/index.d.ts +4 -0
- package/build/adapters/endpoints/index.d.ts.map +1 -0
- package/build/adapters/endpoints/index.js +21 -0
- package/build/adapters/endpoints/index.js.map +1 -0
- package/build/adapters/endpoints/localAuthorization/index.d.ts +1 -0
- package/build/adapters/endpoints/localAuthorization/index.d.ts.map +1 -0
- package/build/adapters/endpoints/localAuthorization/index.js +68 -0
- package/build/adapters/endpoints/localAuthorization/index.js.map +1 -0
- package/build/adapters/endpoints/tcpConsumer/index.d.ts +3 -0
- package/build/adapters/endpoints/tcpConsumer/index.d.ts.map +1 -0
- package/build/adapters/endpoints/tcpConsumer/index.js +64 -0
- package/build/adapters/endpoints/tcpConsumer/index.js.map +1 -0
- package/build/adapters/endpoints/userSession/index.d.ts +8 -0
- package/build/adapters/endpoints/userSession/index.d.ts.map +1 -0
- package/build/adapters/endpoints/userSession/index.js +43 -0
- package/build/adapters/endpoints/userSession/index.js.map +1 -0
- package/build/adapters/eventstore/database.d.ts +3 -0
- package/build/adapters/eventstore/database.d.ts.map +1 -0
- package/build/adapters/eventstore/database.js +156 -0
- package/build/adapters/eventstore/database.js.map +1 -0
- package/build/adapters/eventstore/index.d.ts +2 -0
- package/build/adapters/eventstore/index.d.ts.map +1 -0
- package/build/adapters/eventstore/index.js +18 -0
- package/build/adapters/eventstore/index.js.map +1 -0
- package/build/adapters/infrastructure/index.d.ts +2 -0
- package/build/adapters/infrastructure/index.d.ts.map +1 -0
- package/build/adapters/infrastructure/index.js +18 -0
- package/build/adapters/infrastructure/index.js.map +1 -0
- package/build/adapters/infrastructure/local/index.d.ts +4 -0
- package/build/adapters/infrastructure/local/index.d.ts.map +1 -0
- package/build/adapters/infrastructure/local/index.js +37 -0
- package/build/adapters/infrastructure/local/index.js.map +1 -0
- package/build/adapters/logger/console.d.ts +3 -0
- package/build/adapters/logger/console.d.ts.map +1 -0
- package/build/adapters/logger/console.js +38 -0
- package/build/adapters/logger/console.js.map +1 -0
- package/build/adapters/logger/index.d.ts +2 -0
- package/build/adapters/logger/index.d.ts.map +1 -0
- package/build/adapters/logger/index.js +18 -0
- package/build/adapters/logger/index.js.map +1 -0
- package/build/index.d.ts +23 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +39 -0
- package/build/index.js.map +1 -0
- package/build/libraries/modules/fs.d.ts +12 -0
- package/build/libraries/modules/fs.d.ts.map +1 -0
- package/build/libraries/modules/fs.js +103 -0
- package/build/libraries/modules/fs.js.map +1 -0
- package/build/libraries/modules/index.d.ts +2 -0
- package/build/libraries/modules/index.d.ts.map +1 -0
- package/build/libraries/modules/index.js +18 -0
- package/build/libraries/modules/index.js.map +1 -0
- package/build/libraries/openApi/index.d.ts +2 -0
- package/build/libraries/openApi/index.d.ts.map +1 -0
- package/build/libraries/openApi/index.js +18 -0
- package/build/libraries/openApi/index.js.map +1 -0
- package/build/libraries/openApi/pruneUnusedRef.d.ts +3 -0
- package/build/libraries/openApi/pruneUnusedRef.d.ts.map +1 -0
- package/build/libraries/openApi/pruneUnusedRef.js +30 -0
- package/build/libraries/openApi/pruneUnusedRef.js.map +1 -0
- package/build/libraries/tcp/index.d.ts +8 -0
- package/build/libraries/tcp/index.d.ts.map +1 -0
- package/build/libraries/tcp/index.js +108 -0
- package/build/libraries/tcp/index.js.map +1 -0
- package/build/libraries/tcp/types.d.ts +45 -0
- package/build/libraries/tcp/types.d.ts.map +1 -0
- package/build/libraries/tcp/types.js +3 -0
- package/build/libraries/tcp/types.js.map +1 -0
- package/build/libraries/validation/__tests__/validation.test.d.ts +2 -0
- package/build/libraries/validation/__tests__/validation.test.d.ts.map +1 -0
- package/build/libraries/validation/__tests__/validation.test.js +53 -0
- package/build/libraries/validation/__tests__/validation.test.js.map +1 -0
- package/build/libraries/validation/index.d.ts +8 -0
- package/build/libraries/validation/index.d.ts.map +1 -0
- package/build/libraries/validation/index.js +51 -0
- package/build/libraries/validation/index.js.map +1 -0
- package/build/ports/authentication/index.d.ts +12 -0
- package/build/ports/authentication/index.d.ts.map +1 -0
- package/build/ports/authentication/index.js +23 -0
- package/build/ports/authentication/index.js.map +1 -0
- package/build/ports/base.d.ts +7 -0
- package/build/ports/base.d.ts.map +1 -0
- package/build/ports/base.js +25 -0
- package/build/ports/base.js.map +1 -0
- package/build/ports/cache/index.d.ts +3 -0
- package/build/ports/cache/index.d.ts.map +1 -0
- package/build/ports/cache/index.js +19 -0
- package/build/ports/cache/index.js.map +1 -0
- package/build/ports/configuration/__tests__/configurationPort.test.d.ts +2 -0
- package/build/ports/configuration/__tests__/configurationPort.test.d.ts.map +1 -0
- package/build/ports/configuration/__tests__/configurationPort.test.js +51 -0
- package/build/ports/configuration/__tests__/configurationPort.test.js.map +1 -0
- package/build/ports/configuration/args.d.ts +57 -0
- package/build/ports/configuration/args.d.ts.map +1 -0
- package/build/ports/configuration/args.js +44 -0
- package/build/ports/configuration/args.js.map +1 -0
- package/build/ports/configuration/common.d.ts +2 -0
- package/build/ports/configuration/common.d.ts.map +1 -0
- package/build/ports/configuration/common.js +19 -0
- package/build/ports/configuration/common.js.map +1 -0
- package/build/ports/configuration/index.d.ts +10 -0
- package/build/ports/configuration/index.d.ts.map +1 -0
- package/build/ports/configuration/index.js +96 -0
- package/build/ports/configuration/index.js.map +1 -0
- package/build/ports/configuration/localConfig.d.ts +3 -0
- package/build/ports/configuration/localConfig.d.ts.map +1 -0
- package/build/ports/configuration/localConfig.js +108 -0
- package/build/ports/configuration/localConfig.js.map +1 -0
- package/build/ports/database/index.d.ts +4 -0
- package/build/ports/database/index.d.ts.map +1 -0
- package/build/ports/database/index.js +27 -0
- package/build/ports/database/index.js.map +1 -0
- package/build/ports/endpoints/__tests__/endpointsCall.test.d.ts +2 -0
- package/build/ports/endpoints/__tests__/endpointsCall.test.d.ts.map +1 -0
- package/build/ports/endpoints/__tests__/endpointsCall.test.js +21 -0
- package/build/ports/endpoints/__tests__/endpointsCall.test.js.map +1 -0
- package/build/ports/endpoints/__tests__/test-client-library/base.d.ts +77 -0
- package/build/ports/endpoints/__tests__/test-client-library/base.d.ts.map +1 -0
- package/build/ports/endpoints/__tests__/test-client-library/base.js +91 -0
- package/build/ports/endpoints/__tests__/test-client-library/base.js.map +1 -0
- package/build/ports/endpoints/__tests__/test-client-library/index.d.ts +29 -0
- package/build/ports/endpoints/__tests__/test-client-library/index.d.ts.map +1 -0
- package/build/ports/endpoints/__tests__/test-client-library/index.js +43 -0
- package/build/ports/endpoints/__tests__/test-client-library/index.js.map +1 -0
- package/build/ports/endpoints/__tests__/test-client-library/services/service.d.ts +106 -0
- package/build/ports/endpoints/__tests__/test-client-library/services/service.d.ts.map +1 -0
- package/build/ports/endpoints/__tests__/test-client-library/services/service.js +62 -0
- package/build/ports/endpoints/__tests__/test-client-library/services/service.js.map +1 -0
- package/build/ports/endpoints/__tests__/utils.test.d.ts +1 -0
- package/build/ports/endpoints/__tests__/utils.test.d.ts.map +1 -0
- package/build/ports/endpoints/__tests__/utils.test.js +53 -0
- package/build/ports/endpoints/__tests__/utils.test.js.map +1 -0
- package/build/ports/endpoints/index.d.ts +29 -0
- package/build/ports/endpoints/index.d.ts.map +1 -0
- package/build/ports/endpoints/index.js +263 -0
- package/build/ports/endpoints/index.js.map +1 -0
- package/build/ports/endpoints/openApi.d.ts +16 -0
- package/build/ports/endpoints/openApi.d.ts.map +1 -0
- package/build/ports/endpoints/openApi.js +187 -0
- package/build/ports/endpoints/openApi.js.map +1 -0
- package/build/ports/endpoints/utils.d.ts +17 -0
- package/build/ports/endpoints/utils.d.ts.map +1 -0
- package/build/ports/endpoints/utils.js +31 -0
- package/build/ports/endpoints/utils.js.map +1 -0
- package/build/ports/eventsourcing/__tests__/eventhandlers.test.d.ts +2 -0
- package/build/ports/eventsourcing/__tests__/eventhandlers.test.d.ts.map +1 -0
- package/build/ports/eventsourcing/__tests__/eventhandlers.test.js +35 -0
- package/build/ports/eventsourcing/__tests__/eventhandlers.test.js.map +1 -0
- package/build/ports/eventsourcing/__tests__/invariants.test.d.ts +2 -0
- package/build/ports/eventsourcing/__tests__/invariants.test.d.ts.map +1 -0
- package/build/ports/eventsourcing/__tests__/invariants.test.js +210 -0
- package/build/ports/eventsourcing/__tests__/invariants.test.js.map +1 -0
- package/build/ports/eventsourcing/commandHandlers/index.d.ts +25 -0
- package/build/ports/eventsourcing/commandHandlers/index.d.ts.map +1 -0
- package/build/ports/eventsourcing/commandHandlers/index.js +392 -0
- package/build/ports/eventsourcing/commandHandlers/index.js.map +1 -0
- package/build/ports/eventsourcing/commandTemplates/index.d.ts +3 -0
- package/build/ports/eventsourcing/commandTemplates/index.d.ts.map +1 -0
- package/build/ports/eventsourcing/commandTemplates/index.js +19 -0
- package/build/ports/eventsourcing/commandTemplates/index.js.map +1 -0
- package/build/ports/eventsourcing/commandTemplates/multiStream.d.ts +4 -0
- package/build/ports/eventsourcing/commandTemplates/multiStream.d.ts.map +1 -0
- package/build/ports/eventsourcing/commandTemplates/multiStream.js +73 -0
- package/build/ports/eventsourcing/commandTemplates/multiStream.js.map +1 -0
- package/build/ports/eventsourcing/commandTemplates/snapshot.d.ts +9 -0
- package/build/ports/eventsourcing/commandTemplates/snapshot.d.ts.map +1 -0
- package/build/ports/eventsourcing/commandTemplates/snapshot.js +39 -0
- package/build/ports/eventsourcing/commandTemplates/snapshot.js.map +1 -0
- package/build/ports/eventsourcing/eventHandlers/index.d.ts +33 -0
- package/build/ports/eventsourcing/eventHandlers/index.d.ts.map +1 -0
- package/build/ports/eventsourcing/eventHandlers/index.js +276 -0
- package/build/ports/eventsourcing/eventHandlers/index.js.map +1 -0
- package/build/ports/eventsourcing/index.d.ts +9 -0
- package/build/ports/eventsourcing/index.d.ts.map +1 -0
- package/build/ports/eventsourcing/index.js +101 -0
- package/build/ports/eventsourcing/index.js.map +1 -0
- package/build/ports/eventsourcing/invariants/combinators.d.ts +4 -0
- package/build/ports/eventsourcing/invariants/combinators.d.ts.map +1 -0
- package/build/ports/eventsourcing/invariants/combinators.js +20 -0
- package/build/ports/eventsourcing/invariants/combinators.js.map +1 -0
- package/build/ports/eventsourcing/invariants/common.d.ts +10 -0
- package/build/ports/eventsourcing/invariants/common.d.ts.map +1 -0
- package/build/ports/eventsourcing/invariants/common.js +37 -0
- package/build/ports/eventsourcing/invariants/common.js.map +1 -0
- package/build/ports/eventsourcing/invariants/comparisons.d.ts +19 -0
- package/build/ports/eventsourcing/invariants/comparisons.d.ts.map +1 -0
- package/build/ports/eventsourcing/invariants/comparisons.js +83 -0
- package/build/ports/eventsourcing/invariants/comparisons.js.map +1 -0
- package/build/ports/eventsourcing/invariants/index.d.ts +5 -0
- package/build/ports/eventsourcing/invariants/index.d.ts.map +1 -0
- package/build/ports/eventsourcing/invariants/index.js +21 -0
- package/build/ports/eventsourcing/invariants/index.js.map +1 -0
- package/build/ports/eventsourcing/invariants/stateExistance.d.ts +4 -0
- package/build/ports/eventsourcing/invariants/stateExistance.d.ts.map +1 -0
- package/build/ports/eventsourcing/invariants/stateExistance.js +33 -0
- package/build/ports/eventsourcing/invariants/stateExistance.js.map +1 -0
- package/build/ports/eventsourcing/subscriptions/index.d.ts +2 -0
- package/build/ports/eventsourcing/subscriptions/index.d.ts.map +1 -0
- package/build/ports/eventsourcing/subscriptions/index.js +18 -0
- package/build/ports/eventsourcing/subscriptions/index.js.map +1 -0
- package/build/ports/eventsourcing/subscriptions/sseSubscriptions.d.ts +3 -0
- package/build/ports/eventsourcing/subscriptions/sseSubscriptions.d.ts.map +1 -0
- package/build/ports/eventsourcing/subscriptions/sseSubscriptions.js +81 -0
- package/build/ports/eventsourcing/subscriptions/sseSubscriptions.js.map +1 -0
- package/build/ports/eventsourcing/utils/aggregateBuilder.d.ts +4 -0
- package/build/ports/eventsourcing/utils/aggregateBuilder.d.ts.map +1 -0
- package/build/ports/eventsourcing/utils/aggregateBuilder.js +45 -0
- package/build/ports/eventsourcing/utils/aggregateBuilder.js.map +1 -0
- package/build/ports/eventsourcing/utils/commandBuilder.d.ts +3 -0
- package/build/ports/eventsourcing/utils/commandBuilder.d.ts.map +1 -0
- package/build/ports/eventsourcing/utils/commandBuilder.js +102 -0
- package/build/ports/eventsourcing/utils/commandBuilder.js.map +1 -0
- package/build/ports/eventsourcing/utils/eventHandlerBuilder.d.ts +3 -0
- package/build/ports/eventsourcing/utils/eventHandlerBuilder.d.ts.map +1 -0
- package/build/ports/eventsourcing/utils/eventHandlerBuilder.js +19 -0
- package/build/ports/eventsourcing/utils/eventHandlerBuilder.js.map +1 -0
- package/build/ports/eventsourcing/utils/externalSystemBuilder.d.ts +4 -0
- package/build/ports/eventsourcing/utils/externalSystemBuilder.d.ts.map +1 -0
- package/build/ports/eventsourcing/utils/externalSystemBuilder.js +34 -0
- package/build/ports/eventsourcing/utils/externalSystemBuilder.js.map +1 -0
- package/build/ports/eventsourcing/utils/index.d.ts +13 -0
- package/build/ports/eventsourcing/utils/index.d.ts.map +1 -0
- package/build/ports/eventsourcing/utils/index.js +45 -0
- package/build/ports/eventsourcing/utils/index.js.map +1 -0
- package/build/ports/eventsourcing/utils/policyBuilder.d.ts +3 -0
- package/build/ports/eventsourcing/utils/policyBuilder.d.ts.map +1 -0
- package/build/ports/eventsourcing/utils/policyBuilder.js +29 -0
- package/build/ports/eventsourcing/utils/policyBuilder.js.map +1 -0
- package/build/ports/eventsourcing/utils/readmodelBuilder.d.ts +5 -0
- package/build/ports/eventsourcing/utils/readmodelBuilder.d.ts.map +1 -0
- package/build/ports/eventsourcing/utils/readmodelBuilder.js +45 -0
- package/build/ports/eventsourcing/utils/readmodelBuilder.js.map +1 -0
- package/build/ports/eventstore/index.d.ts +3 -0
- package/build/ports/eventstore/index.d.ts.map +1 -0
- package/build/ports/eventstore/index.js +13 -0
- package/build/ports/eventstore/index.js.map +1 -0
- package/build/ports/infrastructure/__tests__/fixture/index.d.ts +3 -0
- package/build/ports/infrastructure/__tests__/fixture/index.d.ts.map +1 -0
- package/build/ports/infrastructure/__tests__/fixture/index.js +19 -0
- package/build/ports/infrastructure/__tests__/fixture/index.js.map +1 -0
- package/build/ports/infrastructure/__tests__/fixture/infrastructureServices.d.ts +19 -0
- package/build/ports/infrastructure/__tests__/fixture/infrastructureServices.d.ts.map +1 -0
- package/build/ports/infrastructure/__tests__/fixture/infrastructureServices.js +76 -0
- package/build/ports/infrastructure/__tests__/fixture/infrastructureServices.js.map +1 -0
- package/build/ports/infrastructure/__tests__/fixture/structureState.d.ts +177 -0
- package/build/ports/infrastructure/__tests__/fixture/structureState.d.ts.map +1 -0
- package/build/ports/infrastructure/__tests__/fixture/structureState.js +258 -0
- package/build/ports/infrastructure/__tests__/fixture/structureState.js.map +1 -0
- package/build/ports/infrastructure/__tests__/infrastructure.test.d.ts +2 -0
- package/build/ports/infrastructure/__tests__/infrastructure.test.d.ts.map +1 -0
- package/build/ports/infrastructure/__tests__/infrastructure.test.js +11 -0
- package/build/ports/infrastructure/__tests__/infrastructure.test.js.map +1 -0
- package/build/ports/infrastructure/index.d.ts +53 -0
- package/build/ports/infrastructure/index.d.ts.map +1 -0
- package/build/ports/infrastructure/index.js +149 -0
- package/build/ports/infrastructure/index.js.map +1 -0
- package/build/ports/infrastructure/utils.d.ts +14 -0
- package/build/ports/infrastructure/utils.d.ts.map +1 -0
- package/build/ports/infrastructure/utils.js +126 -0
- package/build/ports/infrastructure/utils.js.map +1 -0
- package/build/ports/logger/index.d.ts +3 -0
- package/build/ports/logger/index.d.ts.map +1 -0
- package/build/ports/logger/index.js +32 -0
- package/build/ports/logger/index.js.map +1 -0
- package/build/utils/index.d.ts +35 -0
- package/build/utils/index.d.ts.map +1 -0
- package/build/utils/index.js +190 -0
- package/build/utils/index.js.map +1 -0
- package/package.json +28 -0
- package/src/adapters/cache/index.ts +1 -0
- package/src/adapters/cache/memory/__tests__/memoryCache.test.ts +6 -0
- package/src/adapters/cache/memory/index.ts +142 -0
- package/src/adapters/configuration/__tests__/.env +4 -0
- package/src/adapters/configuration/__tests__/dotEnv.test.ts +38 -0
- package/src/adapters/configuration/dotEnv.ts +33 -0
- package/src/adapters/configuration/index.ts +1 -0
- package/src/adapters/database/index.ts +1 -0
- package/src/adapters/database/memory/__tests__/memoryDb.test.ts +37 -0
- package/src/adapters/database/memory/index.ts +279 -0
- package/src/adapters/endpoints/addAuthUser/index.ts +55 -0
- package/src/adapters/endpoints/endpointValidation/index.ts +26 -0
- package/src/adapters/endpoints/index.ts +4 -0
- package/src/adapters/endpoints/localAuthorization/index.ts +75 -0
- package/src/adapters/endpoints/tcpConsumer/index.ts +69 -0
- package/src/adapters/endpoints/userSession/index.ts +40 -0
- package/src/adapters/eventstore/database.ts +178 -0
- package/src/adapters/eventstore/index.ts +1 -0
- package/src/adapters/infrastructure/index.ts +1 -0
- package/src/adapters/infrastructure/local/index.ts +40 -0
- package/src/adapters/logger/console.ts +42 -0
- package/src/adapters/logger/index.ts +1 -0
- package/src/index.ts +25 -0
- package/src/libraries/modules/fs.ts +88 -0
- package/src/libraries/modules/index.ts +1 -0
- package/src/libraries/openApi/index.ts +1 -0
- package/src/libraries/openApi/pruneUnusedRef.ts +35 -0
- package/src/libraries/tcp/index.ts +98 -0
- package/src/libraries/tcp/types.ts +43 -0
- package/src/libraries/validation/__tests__/validation.test.ts +25 -0
- package/src/libraries/validation/index.ts +48 -0
- package/src/ports/authentication/index.ts +25 -0
- package/src/ports/base.ts +20 -0
- package/src/ports/cache/index.ts +17 -0
- package/src/ports/configuration/__tests__/configurationPort.test.ts +47 -0
- package/src/ports/configuration/args.ts +39 -0
- package/src/ports/configuration/common.ts +12 -0
- package/src/ports/configuration/index.ts +110 -0
- package/src/ports/configuration/localConfig.ts +117 -0
- package/src/ports/database/index.ts +25 -0
- package/src/ports/endpoints/__tests__/endpointsCall.test.ts +20 -0
- package/src/ports/endpoints/__tests__/test-client-library/base.ts +167 -0
- package/src/ports/endpoints/__tests__/test-client-library/index.ts +23 -0
- package/src/ports/endpoints/__tests__/test-client-library/services/service.ts +181 -0
- package/src/ports/endpoints/__tests__/utils.test.ts +54 -0
- package/src/ports/endpoints/index.ts +272 -0
- package/src/ports/endpoints/openApi.ts +191 -0
- package/src/ports/endpoints/utils.ts +31 -0
- package/src/ports/eventsourcing/__tests__/eventhandlers.test.ts +30 -0
- package/src/ports/eventsourcing/__tests__/invariants.test.ts +213 -0
- package/src/ports/eventsourcing/commandHandlers/index.ts +625 -0
- package/src/ports/eventsourcing/commandTemplates/index.ts +2 -0
- package/src/ports/eventsourcing/commandTemplates/multiStream.ts +70 -0
- package/src/ports/eventsourcing/commandTemplates/snapshot.ts +43 -0
- package/src/ports/eventsourcing/eventHandlers/index.ts +429 -0
- package/src/ports/eventsourcing/index.ts +98 -0
- package/src/ports/eventsourcing/invariants/combinators.ts +25 -0
- package/src/ports/eventsourcing/invariants/common.ts +42 -0
- package/src/ports/eventsourcing/invariants/comparisons.ts +90 -0
- package/src/ports/eventsourcing/invariants/index.ts +4 -0
- package/src/ports/eventsourcing/invariants/stateExistance.ts +34 -0
- package/src/ports/eventsourcing/subscriptions/index.ts +1 -0
- package/src/ports/eventsourcing/subscriptions/sseSubscriptions.ts +103 -0
- package/src/ports/eventsourcing/utils/aggregateBuilder.ts +49 -0
- package/src/ports/eventsourcing/utils/commandBuilder.ts +113 -0
- package/src/ports/eventsourcing/utils/eventHandlerBuilder.ts +22 -0
- package/src/ports/eventsourcing/utils/externalSystemBuilder.ts +42 -0
- package/src/ports/eventsourcing/utils/index.ts +25 -0
- package/src/ports/eventsourcing/utils/policyBuilder.ts +31 -0
- package/src/ports/eventsourcing/utils/readmodelBuilder.ts +52 -0
- package/src/ports/eventstore/index.ts +11 -0
- package/src/ports/infrastructure/__tests__/fixture/index.ts +2 -0
- package/src/ports/infrastructure/__tests__/fixture/infrastructureServices.ts +72 -0
- package/src/ports/infrastructure/__tests__/fixture/structureState.ts +254 -0
- package/src/ports/infrastructure/__tests__/infrastructure.test.ts +11 -0
- package/src/ports/infrastructure/index.ts +162 -0
- package/src/ports/infrastructure/utils.ts +130 -0
- package/src/ports/logger/index.ts +34 -0
- package/src/utils/index.ts +186 -0
- package/tsconfig.json +19 -0
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import { ensureArray, map, reduce } from '@bett3r-dev/bett3r-utils';
|
|
2
|
+
import { CollectionFilter, CollectionSort, CommittedEvent, DatabasePort, DatabaseTransaction, EventStoreAdapter, EventStoreConfig, EventToCommit, LoggerPort, ReadMultipleStreamOptions, ReadStreamOptions } from '@bett3r-dev/pv3-types';
|
|
3
|
+
import { always, clone, flatten, path, pathOr } from 'ramda';
|
|
4
|
+
import { ConcurrencyError, createError, dieOnError } from '../..';
|
|
5
|
+
import { createPort } from '../../ports/base';
|
|
6
|
+
|
|
7
|
+
export const DatabaseEventstore = ( config: EventStoreConfig, loggerPort: LoggerPort, database: DatabasePort ): EventStoreAdapter => {
|
|
8
|
+
const logger = loggerPort.createLoggerInstance( 'eventstore' );
|
|
9
|
+
const collection = config.collection || 'eventstore';
|
|
10
|
+
|
|
11
|
+
if ( config.enabled !== false )
|
|
12
|
+
database.onStarted(() => {
|
|
13
|
+
const eventstoreCollection = database.getCollection<CommittedEvent>( collection );
|
|
14
|
+
Promise.resolve()
|
|
15
|
+
.then(() => eventstoreCollection.ensureIndex([ 'stream', 'version' ], { isUnique: true }))
|
|
16
|
+
.then(() => eventstoreCollection.ensureIndex(['id'], { isUnique: true }))
|
|
17
|
+
.then(() => eventstoreCollection.ensureIndex(['name']))
|
|
18
|
+
.then(() => eventstoreCollection.ensureIndex(['metadata.correlationId']))
|
|
19
|
+
.then(() => {
|
|
20
|
+
eventstorePort.isStarted = true;
|
|
21
|
+
eventstorePort.emitter.emit( 'started' );
|
|
22
|
+
})
|
|
23
|
+
.catch( dieOnError( logger ));
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
const getNextEventPosition = () =>
|
|
27
|
+
database.getCollection( '__counters' ).atomicIncrement( 'eventPosition', { field: 'eventStore', op:'eq', value: collection });
|
|
28
|
+
|
|
29
|
+
const createEventToCommit = ( stream: string, actualVersion: number )=> ({ name, data, metadata, stream: eventCommit }: EventToCommit, index: number ): Promise<CommittedEvent> => {
|
|
30
|
+
return getNextEventPosition()
|
|
31
|
+
.then(( commit = 1 ) => ({
|
|
32
|
+
id: commit,
|
|
33
|
+
name,
|
|
34
|
+
version: actualVersion + index + 1,
|
|
35
|
+
timestamp: new Date().toISOString(),
|
|
36
|
+
data,
|
|
37
|
+
stream: eventCommit || stream,
|
|
38
|
+
metadata: {
|
|
39
|
+
...metadata,
|
|
40
|
+
}
|
|
41
|
+
}));
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const validateExpectedVersion = ( expectedVersion?: number ) => ( actualVersion: number ) => {
|
|
45
|
+
if ( expectedVersion === undefined || expectedVersion === actualVersion )
|
|
46
|
+
return Promise.resolve( actualVersion );
|
|
47
|
+
else
|
|
48
|
+
return Promise.reject( createError( ConcurrencyError(), {
|
|
49
|
+
details:{
|
|
50
|
+
expectedVersion: expectedVersion.toString(),
|
|
51
|
+
actualVersion: actualVersion.toString()
|
|
52
|
+
}
|
|
53
|
+
}));
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
const ensureNumber = ( value: string ) => value ? Number( value ) : 0;
|
|
57
|
+
|
|
58
|
+
const extractAndValidateExpectedVersion = ( expectedVersion: number | undefined ) => ( event: CommittedEvent ) => {
|
|
59
|
+
return Promise.resolve( event )
|
|
60
|
+
.then( pathOr( '0', ['version']))
|
|
61
|
+
.then( ensureNumber )
|
|
62
|
+
.then( validateExpectedVersion( expectedVersion ));
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
const appendToStream = <Type>(
|
|
66
|
+
stream: string,
|
|
67
|
+
events: EventToCommit|EventToCommit[],
|
|
68
|
+
expectedVersion?: number,
|
|
69
|
+
transaction?: DatabaseTransaction
|
|
70
|
+
): Promise<CommittedEvent<Type>[]> =>{
|
|
71
|
+
const eventstoreCollection = transaction ? transaction.getCollection<CommittedEvent>( collection ) : database.getCollection<CommittedEvent>( collection );
|
|
72
|
+
return eventstoreCollection
|
|
73
|
+
.query({ filter:[{ field:'stream', op:'eq', value: stream }], sort:[{ field: 'version', direction:'desc' }], limit:1, select:['version']})
|
|
74
|
+
.then( path(['0']))
|
|
75
|
+
.then( extractAndValidateExpectedVersion( expectedVersion ))
|
|
76
|
+
.then(( actualVersion )=> map( createEventToCommit( stream, actualVersion ), ensureArray( events )) as unknown as Promise<CommittedEvent>[])
|
|
77
|
+
.then<CommittedEvent[]>(( promises ) => Promise.all( promises ))
|
|
78
|
+
.then(( events: CommittedEvent[]) => eventstoreCollection.createMany( clone( events )).then( always( events )));
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
const appendToMultipleStreams = <Type>(
|
|
82
|
+
streams: Record<string, {
|
|
83
|
+
events: EventToCommit|EventToCommit[]
|
|
84
|
+
expectedVersion?: number,
|
|
85
|
+
}>,
|
|
86
|
+
// transaction?: DatabaseTransaction
|
|
87
|
+
): Promise<CommittedEvent<Type>[]> =>{
|
|
88
|
+
return database.initTransaction(( getCollection ) => {
|
|
89
|
+
const eventstoreCollection = getCollection<CommittedEvent>( collection );
|
|
90
|
+
return Promise.all( Object.keys( streams ).map(( stream ) => {
|
|
91
|
+
return eventstoreCollection
|
|
92
|
+
.query({ filter:[{ field:'stream', op:'eq', value: stream }], sort:[{ field: 'version', direction:'desc' }], limit:1, select:[ 'stream','version' ]});
|
|
93
|
+
}))
|
|
94
|
+
.then( flatten )
|
|
95
|
+
.then( reduce(( promise, e )=>{
|
|
96
|
+
return Promise.resolve( e )
|
|
97
|
+
.then( extractAndValidateExpectedVersion( streams[e.stream].expectedVersion ))
|
|
98
|
+
.then( actualVersion => Promise.all([ promise, actualVersion ]))
|
|
99
|
+
.then(([ state, actualVersion ]) => {
|
|
100
|
+
state[e.stream] = actualVersion;
|
|
101
|
+
return state;
|
|
102
|
+
});
|
|
103
|
+
}, Promise.resolve({})))
|
|
104
|
+
.then(( actualVersions )=> {
|
|
105
|
+
return Object.keys( streams ).map(( stream ) => {
|
|
106
|
+
return map( createEventToCommit( stream, actualVersions[stream]), ensureArray( streams[stream].events ));
|
|
107
|
+
}).flat();
|
|
108
|
+
})
|
|
109
|
+
.then<CommittedEvent[]>(( promises ) => Promise.all( promises ))
|
|
110
|
+
.then(( events: CommittedEvent[]) => eventstoreCollection.createMany( clone( events )).then( always( events )));
|
|
111
|
+
});
|
|
112
|
+
};
|
|
113
|
+
const readStream = async <ReducedModel=any>( readOptions: ReadStreamOptions, callback: ( event: CommittedEvent, stop: () => void ) => Partial<ReducedModel> | Promise<Partial<ReducedModel>> ): Promise<ReducedModel> => {
|
|
114
|
+
const eventstoreCollection = database.getCollection<CommittedEvent>( collection );
|
|
115
|
+
const filter: CollectionFilter<CommittedEvent>[] = [];
|
|
116
|
+
if ( readOptions.stream )
|
|
117
|
+
filter.push({ field:'stream', op:'eq', value: readOptions.stream } as CollectionFilter<CommittedEvent> );
|
|
118
|
+
if ( readOptions.fromVersion )
|
|
119
|
+
filter.push({ field:'version', op:'gt', value: readOptions.fromVersion } as CollectionFilter<CommittedEvent> );
|
|
120
|
+
const sort = ( readOptions.direction === 'backwards' ? [{ field: 'id', direction:'desc' }] : [{ field: 'id', direction:'asc' }]) as CollectionSort<CommittedEvent>[];
|
|
121
|
+
let result: Partial<ReducedModel>;
|
|
122
|
+
await eventstoreCollection.forEach({
|
|
123
|
+
limit: readOptions.limit,
|
|
124
|
+
after: readOptions.from,
|
|
125
|
+
filter,
|
|
126
|
+
sort,
|
|
127
|
+
}, async ( record: CommittedEvent, stop ) => {
|
|
128
|
+
result = await callback( record, stop );
|
|
129
|
+
});
|
|
130
|
+
return result! as ReducedModel;
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
const readMultipleStream = async <Model=unknown>( readOptions: ReadMultipleStreamOptions, callback: ( event: CommittedEvent, stop: () => void ) => Record<string,Partial<Model>> | Promise<Record<string,Partial<Model>>> ): Promise<Record<string, Model>> => {
|
|
134
|
+
const eventstoreCollection = database.getCollection<CommittedEvent>( collection );
|
|
135
|
+
const filter = readOptions.streams ? [{ field:'stream', op:'in', value: readOptions.streams } as CollectionFilter<CommittedEvent>] : undefined;
|
|
136
|
+
const sort = ( readOptions.direction === 'backwards' ? [{ field: 'id', direction:'desc' }] : [{ field: 'id', direction:'asc' }]) as CollectionSort<CommittedEvent>[];
|
|
137
|
+
let result: Record<string,Partial<Model>>;
|
|
138
|
+
await eventstoreCollection.forEach({
|
|
139
|
+
limit: readOptions.limit,
|
|
140
|
+
after: readOptions.from,
|
|
141
|
+
filter,
|
|
142
|
+
sort,
|
|
143
|
+
}, async ( record: CommittedEvent, stop ) => {
|
|
144
|
+
result = await callback( record, stop );
|
|
145
|
+
});
|
|
146
|
+
return result! as Record<string,Model>;
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
const flush = async () => {
|
|
150
|
+
if ( process.env.NODE_ENV !== 'production' ){
|
|
151
|
+
const eventstoreCollection = database.getCollection<CommittedEvent>( collection );
|
|
152
|
+
await eventstoreCollection.destroyMany([]);
|
|
153
|
+
const countersCollection = database.getCollection<CommittedEvent>( '__counters' );
|
|
154
|
+
await countersCollection.destroyMany([]);
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
const subscribe = ( onEvent: ( event: CommittedEvent ) => void, onError?: ( e: Error ) => void ) => {
|
|
159
|
+
return database.getCollection<CommittedEvent>( collection ).watch(['insert'], ( data ) => {
|
|
160
|
+
onEvent( data.data! );
|
|
161
|
+
}, onError );
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
const eventstorePort = createPort({
|
|
165
|
+
name: 'database',
|
|
166
|
+
appendToStream,
|
|
167
|
+
appendToMultipleStreams,
|
|
168
|
+
readStream,
|
|
169
|
+
readMultipleStream,
|
|
170
|
+
subscribe,
|
|
171
|
+
flush,
|
|
172
|
+
start: async () => {},
|
|
173
|
+
stop: async () => {},
|
|
174
|
+
_adapter: () => database
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
return eventstorePort;
|
|
178
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './database';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './local';
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Ports } from '@bett3r-dev/pv3-types';
|
|
2
|
+
import { EnvironmentServiceType, InfrastructureAdapterType } from '@bett3r-dev/pv3-types';
|
|
3
|
+
import { getThisServiceIps } from '../../../ports/infrastructure/utils';
|
|
4
|
+
import { HttpConfigSchema } from '@bett3r-dev/pv3-types';
|
|
5
|
+
|
|
6
|
+
export const LocalInfrastructure = ( ports: Pick<Ports, 'configuration'|'endpoints'> ): InfrastructureAdapterType => {
|
|
7
|
+
const start = async () => {};
|
|
8
|
+
let { config } = ports.configuration.getModuleConfig( 'http', HttpConfigSchema );
|
|
9
|
+
|
|
10
|
+
const getServices = async (): Promise<EnvironmentServiceType[]> => {
|
|
11
|
+
const ips = getThisServiceIps();
|
|
12
|
+
return [
|
|
13
|
+
{
|
|
14
|
+
openApi: ports.endpoints.getOpenApiSpec(),
|
|
15
|
+
// FIXME: Hard coded
|
|
16
|
+
openApiEndpoint: '/documentation/json',
|
|
17
|
+
service: ips[0],
|
|
18
|
+
instances: [{ host: ips[0], timeRunning: 0 }],
|
|
19
|
+
port: Number( config.port ),
|
|
20
|
+
}
|
|
21
|
+
];
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const listenForInfrastructureChanges = () => {};
|
|
25
|
+
|
|
26
|
+
const reloadLoadBalancer = async () => {};
|
|
27
|
+
|
|
28
|
+
const stop = async () => {};
|
|
29
|
+
|
|
30
|
+
return {
|
|
31
|
+
_adapter: () => {},
|
|
32
|
+
name: 'local-environment',
|
|
33
|
+
scaleService: async () => {},
|
|
34
|
+
reloadLoadBalancer,
|
|
35
|
+
start,
|
|
36
|
+
stop,
|
|
37
|
+
getServices,
|
|
38
|
+
listenForInfrastructureChanges,
|
|
39
|
+
};
|
|
40
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { compose, prepend } from 'ramda';
|
|
2
|
+
import { LoggerAdapter } from '@bett3r-dev/pv3-types';
|
|
3
|
+
|
|
4
|
+
export const ConsoleLogger = (): LoggerAdapter => {
|
|
5
|
+
const consoleLog = ( args: string[], level: string ) => {
|
|
6
|
+
level = level === 'silly' ? 'debug' : level;
|
|
7
|
+
console[level]( ...args );
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
function formatLogDateTime( date ) {
|
|
11
|
+
const timeMethods = [
|
|
12
|
+
'getHours',
|
|
13
|
+
'getMinutes',
|
|
14
|
+
'getSeconds',
|
|
15
|
+
];
|
|
16
|
+
if ( typeof date === 'string' ) date = +date;
|
|
17
|
+
date = new Date( date );
|
|
18
|
+
const str = `${date.toLocaleDateString()} ${timeMethods.map( m=>date[m]().toString().padStart( 2, '0' )).join( ':' )}.${date.getMilliseconds().toString().padStart( 3,'0' )}`;
|
|
19
|
+
return str;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const formatArgs = ( originalArgs: any[], level: string, module: string ): string[] => {
|
|
23
|
+
const timestamp = formatLogDateTime( new Date());
|
|
24
|
+
return compose(
|
|
25
|
+
prepend( `[${level}]` ),
|
|
26
|
+
prepend( `[${module}]` ),
|
|
27
|
+
prepend( `[${timestamp }]` ),
|
|
28
|
+
)([...originalArgs]) as string[];
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const log = ( originalArgs: any[], level: string, module: string ) => {
|
|
32
|
+
consoleLog( formatArgs( originalArgs, level, module ), level );
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
return {
|
|
36
|
+
_adapter: () => {},
|
|
37
|
+
start: async()=>{},
|
|
38
|
+
stop: async()=>{},
|
|
39
|
+
name: 'console',
|
|
40
|
+
log
|
|
41
|
+
};
|
|
42
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './console';
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export * from './ports/authentication';
|
|
2
|
+
export * from './ports/base';
|
|
3
|
+
export * from './ports/cache';
|
|
4
|
+
export * from './ports/configuration';
|
|
5
|
+
export * from './ports/database';
|
|
6
|
+
export * from './ports/endpoints';
|
|
7
|
+
export * from './ports/eventsourcing';
|
|
8
|
+
export * from './ports/eventstore';
|
|
9
|
+
export * from './ports/logger';
|
|
10
|
+
export * from './ports/infrastructure';
|
|
11
|
+
|
|
12
|
+
export * from './adapters/cache';
|
|
13
|
+
export * from './adapters/configuration';
|
|
14
|
+
export * from './adapters/database';
|
|
15
|
+
export * from './adapters/endpoints';
|
|
16
|
+
export * from './adapters/logger';
|
|
17
|
+
export * from './adapters/eventstore';
|
|
18
|
+
export * from './adapters/infrastructure';
|
|
19
|
+
|
|
20
|
+
export * from './libraries/tcp';
|
|
21
|
+
export * from './libraries/validation';
|
|
22
|
+
export * from './libraries/modules';
|
|
23
|
+
export * from './libraries/openApi';
|
|
24
|
+
|
|
25
|
+
export * from './utils';
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { Ports } from '@bett3r-dev/pv3-types';
|
|
2
|
+
import fs from 'fs/promises';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
|
|
5
|
+
export type LoadModuleOptions = {
|
|
6
|
+
whiteList?: ( string|RegExp )[]
|
|
7
|
+
blackList?: ( string|RegExp )[]
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
function rejectFilename( filename:string, module:string, { whiteList, blackList }: LoadModuleOptions ) {
|
|
11
|
+
if (
|
|
12
|
+
filename === '.git' ||
|
|
13
|
+
filename === '.DS_Store' ||
|
|
14
|
+
( whiteList?.length && !whiteList?.some(( match: any ) => !match.test ? match === module : match.test( module ))) ||
|
|
15
|
+
( blackList?.length && blackList?.some(( match: any ) => !match.test ? match === module : match.test( module )))
|
|
16
|
+
)
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const getArtifactsFromModule = async ( modulesPath:string, moduleName: string, artifactsList: string[] = []): Promise<string[]> => {
|
|
21
|
+
const files = await fs.readdir( path.join( modulesPath, moduleName ));
|
|
22
|
+
for ( const file of files ) {
|
|
23
|
+
const stat = await fs.stat( path.join( modulesPath, moduleName, file ));
|
|
24
|
+
if ( stat.isDirectory()){
|
|
25
|
+
artifactsList = await getArtifactsFromModule( path.join( modulesPath, moduleName ), file, artifactsList );
|
|
26
|
+
} else {
|
|
27
|
+
if ( file.search( /\.(readmodel|aggregate|externalSystem|system|policy)\.(j|t)s/mig ) !== -1 ){
|
|
28
|
+
artifactsList.push( file.replace( /\.(j|t)s/mig, '' ));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return artifactsList;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export async function loadModulesFromDirectory( modulesPath: string, options: LoadModuleOptions = {}): Promise<{modules: Record<string, {create: ( ports: Partial<Ports> ) => any}>, modulesList: Record<string,string[]>}> {
|
|
36
|
+
const modules = await fs.readdir( modulesPath );
|
|
37
|
+
const modulesList = modules.reduce(( acc, component ) => {
|
|
38
|
+
acc[component] = {};
|
|
39
|
+
return acc;
|
|
40
|
+
}, {});
|
|
41
|
+
|
|
42
|
+
// const e = Error('x');
|
|
43
|
+
// const line = e.stack?.split('\n')[2];
|
|
44
|
+
// // regex to extract folder name from generic line
|
|
45
|
+
// // const line = 'at Object.routeEventHandler (/Users/tomasruiz/Documents/development/pv3/src/ports/eventsourcing/index.ts:79:40)';
|
|
46
|
+
// //REVIEW: Esto hay que probarlo en windows
|
|
47
|
+
// const folder = line?.match(/[\/\\].+?\.(j|t)s/g)?.[0];
|
|
48
|
+
// if (folder){
|
|
49
|
+
// const f = path.basename(folder);
|
|
50
|
+
// fs.readdir(folder).then(async files => {
|
|
51
|
+
// for (const file of files) {
|
|
52
|
+
// const stat = await fs.stat(path.join(folder, file))
|
|
53
|
+
// if (stat.isDirectory()){
|
|
54
|
+
|
|
55
|
+
// } else {
|
|
56
|
+
// console.log(files)
|
|
57
|
+
// }
|
|
58
|
+
// }
|
|
59
|
+
// })
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
// }
|
|
63
|
+
|
|
64
|
+
// console.log('%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%', e.stack);
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
if ( options.whiteList ){
|
|
68
|
+
const missing = options.whiteList.reduce(( errors, w ) => {
|
|
69
|
+
!modules.some( c => RegExp( w ).test( c )) && errors.push( w );
|
|
70
|
+
return errors;
|
|
71
|
+
}, [] as any[]);
|
|
72
|
+
if ( missing.length )
|
|
73
|
+
throw Error( `Whitelisted module or pattern not found or returned 0 matches: ${missing.join( ', ' )}` );
|
|
74
|
+
}
|
|
75
|
+
const modulesMap: Record<string, any> = {};
|
|
76
|
+
for ( let moduleName of modules ) {
|
|
77
|
+
const module = path.parse( moduleName ).name;
|
|
78
|
+
modulesList[moduleName] = await getArtifactsFromModule( modulesPath, moduleName );
|
|
79
|
+
const filePath = `${modulesPath}/${moduleName}`;
|
|
80
|
+
if ( rejectFilename( moduleName, module, options ))
|
|
81
|
+
continue;
|
|
82
|
+
else modulesMap[module] = await import( filePath );
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
modules: modulesMap,
|
|
86
|
+
modulesList
|
|
87
|
+
};
|
|
88
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './fs';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './pruneUnusedRef';
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { OpenAPIV3_1 } from 'openapi-types';
|
|
2
|
+
|
|
3
|
+
const collectRefs = ( obj: object, refs = new Set<string>()) => {
|
|
4
|
+
if ( !obj || typeof obj !== 'object' ) return refs;
|
|
5
|
+
|
|
6
|
+
if ( obj['$ref'] && typeof obj['$ref'] === 'string' ) {
|
|
7
|
+
refs.add( obj['$ref']);
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
for ( let key in obj ) {
|
|
11
|
+
if ( obj.hasOwnProperty( key )) {
|
|
12
|
+
collectRefs( obj[key], refs );
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
return refs;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export const pruneUnusedRefs = ( spec: OpenAPIV3_1.Document ) => {
|
|
20
|
+
const refs = collectRefs( spec );
|
|
21
|
+
const definedSchemas = spec.components && spec.components.schemas ? Object.keys( spec.components.schemas ) : [];
|
|
22
|
+
|
|
23
|
+
const unusedSchemas = definedSchemas.filter( schema => {
|
|
24
|
+
const ref = `#/components/schemas/${schema}`;
|
|
25
|
+
return !refs.has( ref );
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
unusedSchemas.forEach( schema => {
|
|
29
|
+
delete spec.components!.schemas![schema];
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
return spec;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { LoggerPort } from '@bett3r-dev/pv3-types';
|
|
2
|
+
import { stream } from 'flyd';
|
|
3
|
+
import net, { Server, Socket } from 'net';
|
|
4
|
+
import { Connections, TcpClientObject, TcpServerConnectionHandler, TcpServerObject, TcpSocket, TcpType } from './types';
|
|
5
|
+
export * from './types';
|
|
6
|
+
|
|
7
|
+
export const send = ( socket: Socket ) => ( message:string | Buffer ) => new Promise<void>(( resolve, reject ) => socket.write( message, ( err?: Error ) => err ? reject( err ) : resolve( undefined )));
|
|
8
|
+
|
|
9
|
+
export const Tcp = ( loggerPort: LoggerPort ): TcpType => {
|
|
10
|
+
const logger = loggerPort.createLoggerInstance( 'Tcp' );
|
|
11
|
+
|
|
12
|
+
const createTcpServerConnectionHandler = ( idGenerator: () => string, connections: Connections ): TcpServerConnectionHandler => {
|
|
13
|
+
const connectedStream: flyd.Stream<{socket: Socket}> = stream();
|
|
14
|
+
const disconnectedStream: flyd.Stream<any> = stream();
|
|
15
|
+
const dataStream: flyd.Stream<any> = stream();
|
|
16
|
+
const errorStream: flyd.Stream<any> = stream();
|
|
17
|
+
const handleClientTcpConnection = ( socket: TcpSocket ) => {
|
|
18
|
+
const id = idGenerator();
|
|
19
|
+
socket.id = id;
|
|
20
|
+
socket.send = send( socket );
|
|
21
|
+
socket.on( 'data', message=>dataStream({ socket, message }));
|
|
22
|
+
socket.on( 'error', message=>errorStream({ socket, message: message.toString() }));
|
|
23
|
+
socket.on( 'close', () => {
|
|
24
|
+
disconnectedStream( id );
|
|
25
|
+
delete connections[id];
|
|
26
|
+
});
|
|
27
|
+
connections[id] = socket;
|
|
28
|
+
connectedStream({ socket });
|
|
29
|
+
};
|
|
30
|
+
const broadcast = message => Object.values( connections ).forEach(( socket: any ) => socket.write( message ));
|
|
31
|
+
|
|
32
|
+
return {
|
|
33
|
+
handleClientTcpConnection,
|
|
34
|
+
streams: {
|
|
35
|
+
connectedStream,
|
|
36
|
+
disconnectedStream,
|
|
37
|
+
dataStream,
|
|
38
|
+
errorStream,
|
|
39
|
+
broadcast,
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const clientTcpConnection = ( socket: TcpSocket ): TcpClientObject => {
|
|
45
|
+
const dataStream: flyd.Stream<any> = stream();
|
|
46
|
+
const errorStream: flyd.Stream<any> = stream();
|
|
47
|
+
const disconnectedStream: flyd.Stream<any> = stream();
|
|
48
|
+
socket.send = send( socket );
|
|
49
|
+
socket.on( 'data', message => dataStream({ socket, message }));
|
|
50
|
+
socket.on( 'error', message => errorStream({ socket, message }));
|
|
51
|
+
socket.on( 'close', () => { disconnectedStream( true ); disconnectedStream.end( true ); dataStream.end( true ); });
|
|
52
|
+
return {
|
|
53
|
+
socket,
|
|
54
|
+
send: socket.send,
|
|
55
|
+
dataStream,
|
|
56
|
+
errorStream,
|
|
57
|
+
disconnectedStream,
|
|
58
|
+
destroy: () => !socket.destroyed ? socket.destroy() : socket
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const createTCPClient = ( tcpPort: number, tcpServerAddress: string, timeout: number = 15000 ): Promise<TcpClientObject> =>
|
|
63
|
+
new Promise(( resolve, reject ) => {
|
|
64
|
+
const client: TcpSocket = net.createConnection( tcpPort, tcpServerAddress, () => {
|
|
65
|
+
clearTimeout( destroyTimeout );
|
|
66
|
+
client.id = `${tcpServerAddress}:${tcpPort}`;
|
|
67
|
+
const handler = clientTcpConnection( client );
|
|
68
|
+
resolve( handler );
|
|
69
|
+
});
|
|
70
|
+
client.on( 'error', reject );
|
|
71
|
+
const destroyTimeout = setTimeout(() => {
|
|
72
|
+
client.destroy();
|
|
73
|
+
reject( 'Connection TimedOut' );
|
|
74
|
+
}, timeout );
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
const createTCPServer = ( tcpPort: number, idGenerator:() => string = () => ( Math.floor( Math.random() * 1000000 )).toString(), connections: Connections = {}) : Promise<TcpServerObject> =>
|
|
78
|
+
new Promise(( resolve ) => {
|
|
79
|
+
const manager: TcpServerConnectionHandler = createTcpServerConnectionHandler( idGenerator, connections );
|
|
80
|
+
const server: Server = net.createServer( manager.handleClientTcpConnection );
|
|
81
|
+
server.listen( tcpPort, () => {
|
|
82
|
+
logger.log( 'TCP Server listening at tcpPort: ', tcpPort );
|
|
83
|
+
resolve({
|
|
84
|
+
...manager.streams,
|
|
85
|
+
close: () => new Promise(( resolve, reject ) => {
|
|
86
|
+
Object.values( connections ).map(( c : TcpSocket )=>c.destroy());
|
|
87
|
+
server.close( err => err ? reject( err ) : resolve({}));
|
|
88
|
+
})
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
return {
|
|
95
|
+
createTCPServer,
|
|
96
|
+
createTCPClient
|
|
97
|
+
};
|
|
98
|
+
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Socket } from 'net';
|
|
2
|
+
import {} from 'flyd';
|
|
3
|
+
|
|
4
|
+
export type Connections = { [id:string|number] : TcpSocket }
|
|
5
|
+
|
|
6
|
+
export type TcpSocket = Socket & {
|
|
7
|
+
id?: string
|
|
8
|
+
send?: ( message: string ) => Promise<void>
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export type TcpServerConnectionStreams = {
|
|
12
|
+
connectedStream: flyd.Stream<{socket: Socket}>,
|
|
13
|
+
disconnectedStream: flyd.Stream<any>,
|
|
14
|
+
dataStream: flyd.Stream<{socket: TcpSocket, message: string}>,
|
|
15
|
+
errorStream: flyd.Stream<any>,
|
|
16
|
+
broadcast: ( message: string ) => void,
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export type TcpServerConnectionHandler = {
|
|
20
|
+
handleClientTcpConnection: ( socket: TcpSocket ) => void,
|
|
21
|
+
streams: TcpServerConnectionStreams
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export type TcpServerObject = TcpServerConnectionStreams & {
|
|
25
|
+
close: () => Promise<unknown>
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export type TcpDataMessage = {socket: TcpSocket, message: string};
|
|
29
|
+
|
|
30
|
+
export type TcpClientObject = {
|
|
31
|
+
socket: TcpSocket,
|
|
32
|
+
disconnectedStream: flyd.Stream<any>,
|
|
33
|
+
dataStream: flyd.Stream<TcpDataMessage>,
|
|
34
|
+
errorStream: flyd.Stream<any>,
|
|
35
|
+
send?: ( message: string ) => Promise<void>
|
|
36
|
+
destroy: ( error?: Error ) => TcpSocket
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
export type TcpType = {
|
|
41
|
+
createTCPServer: ( tcpPort:number, idGenerator?: () => string, connections?: Connections ) => Promise<TcpServerObject>,
|
|
42
|
+
createTCPClient: ( tcpPort: number, tcpServer: string, timeout?: number ) => Promise<TcpClientObject>,
|
|
43
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import S from '@bett3r-dev/jsonschema-definer';
|
|
2
|
+
import * as validation from '..';
|
|
3
|
+
|
|
4
|
+
describe( 'validation', () => {
|
|
5
|
+
describe( 'validateResult', () => {
|
|
6
|
+
const schema = S.shape({
|
|
7
|
+
string: S.string(),
|
|
8
|
+
number: S.number()
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
it( 'returns the same value being validated is ok', () => {
|
|
12
|
+
const val = validation.validateSchema( schema )({ string:'asdf', number:12 });
|
|
13
|
+
expect( val ).toEqual({ string:'asdf', number:12 });
|
|
14
|
+
});
|
|
15
|
+
it( 'returns err detail if value being validated is not ok', () => {
|
|
16
|
+
try{
|
|
17
|
+
//@ts-ignore for testing purposes
|
|
18
|
+
validation.validateSchema( schema )({ string:34, number:12 });
|
|
19
|
+
} catch ( err ) {
|
|
20
|
+
expect( err ).toBeInstanceOf( Error );
|
|
21
|
+
expect( err.name ).toEqual( 'BadRequestError' );
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
});
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { BaseSchema } from '@bett3r-dev/jsonschema-definer';
|
|
2
|
+
import { EndpointActionParams, EndpointSchemas } from '@bett3r-dev/pv3-types';
|
|
3
|
+
import Ajv from 'ajv';
|
|
4
|
+
import addFormats from 'ajv-formats';
|
|
5
|
+
import { ValidationError, createError } from '../../utils';
|
|
6
|
+
|
|
7
|
+
const ajv = new Ajv({ allErrors: true, schemaId: '$id', useDefaults: true });
|
|
8
|
+
addFormats( ajv );
|
|
9
|
+
const schemas = new WeakMap();
|
|
10
|
+
|
|
11
|
+
const getCompiledSchema = ( schema: object, coerceTypes: boolean ) => {
|
|
12
|
+
ajv.opts.coerceTypes = coerceTypes;
|
|
13
|
+
const compiled = schemas.get( schema );
|
|
14
|
+
if ( !compiled ){
|
|
15
|
+
const compiled = ajv.compile( schema );
|
|
16
|
+
schemas.set( schema, compiled );
|
|
17
|
+
return compiled;
|
|
18
|
+
}
|
|
19
|
+
return compiled;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export const validateSchema = <T>( schema: BaseSchema<T>, coerceTypes = false )=> ( value:T ): T => {
|
|
23
|
+
const compiled = getCompiledSchema( schema.plain, coerceTypes );
|
|
24
|
+
|
|
25
|
+
if ( schema === null && value !== undefined ){
|
|
26
|
+
throw createError( ValidationError(), { description: 'Must not have body', details: [value]});
|
|
27
|
+
}
|
|
28
|
+
if ( !compiled( value )){
|
|
29
|
+
throw createError( ValidationError(), { description: 'Validation Error', details: compiled.errors });
|
|
30
|
+
}
|
|
31
|
+
return value;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export const validateEndpoint = <B=any,Q=any,P=any>( validateSchema: <T>( schema: BaseSchema<T> ) => ( value:T ) => T, schemas?: EndpointSchemas<B,Q,P> ) => async ( epParams: EndpointActionParams<B> ): Promise<EndpointActionParams<B>> =>{
|
|
35
|
+
const response = {
|
|
36
|
+
...epParams,
|
|
37
|
+
query: schemas?.query && epParams.query ? validateSchema( schemas.query )( epParams.query ) : epParams.query,
|
|
38
|
+
params: schemas?.params && epParams.params ? validateSchema( schemas.params )( epParams.params ) : epParams.params,
|
|
39
|
+
body: schemas?.body && epParams.body ? validateSchema( schemas.body )( epParams.body ) : epParams.body
|
|
40
|
+
};
|
|
41
|
+
return response;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export function dieOnError ( logger: {error: ( err:any ) => void} = console, err?: any ) {
|
|
45
|
+
if ( arguments.length === 1 ) return ( err: any ) => dieOnError( logger, err );
|
|
46
|
+
logger.error( err );
|
|
47
|
+
process.exit( 1 );
|
|
48
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @packageDocumentation
|
|
3
|
+
* Provides the abstraction over the Authentication and Authorization functionality with an external provider like Auth0, Okta, Keycloak, etc.
|
|
4
|
+
*/
|
|
5
|
+
import { AuthenticationAdapter, AuthenticationPort, RouteAuthManagerFactory } from '@bett3r-dev/pv3-types';
|
|
6
|
+
import { createPort } from '../base';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @category Factories
|
|
10
|
+
* @param adapter
|
|
11
|
+
* @returns
|
|
12
|
+
*/
|
|
13
|
+
export const Authentication = ( adapter: AuthenticationAdapter, routesAuthManager: RouteAuthManagerFactory ): AuthenticationPort => {
|
|
14
|
+
const authentication = createPort({
|
|
15
|
+
...adapter,
|
|
16
|
+
RouteManager: routesAuthManager
|
|
17
|
+
});
|
|
18
|
+
adapter.start()
|
|
19
|
+
.then(() => {
|
|
20
|
+
authentication.isStarted = true;
|
|
21
|
+
authentication.emitter.emit( 'started' );
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
return authentication;
|
|
25
|
+
};
|