alepha 0.18.2 → 0.18.3
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/assets/devtools-ui/200.html +2 -2
- package/assets/devtools-ui/200.html.br +0 -0
- package/assets/devtools-ui/404.html +2 -2
- package/assets/devtools-ui/404.html.br +0 -0
- package/assets/devtools-ui/{asset.BfSBZ5Dd.css → asset.hG_f8HuK.css} +1 -1
- package/assets/devtools-ui/asset.hG_f8HuK.css.br +0 -0
- package/assets/devtools-ui/chunk.B3au4Lhg.js +1 -0
- package/assets/devtools-ui/chunk.B3au4Lhg.js.br +0 -0
- package/assets/devtools-ui/chunk.BLOrlnMB.js +1 -0
- package/assets/devtools-ui/chunk.BLOrlnMB.js.br +0 -0
- package/assets/devtools-ui/chunk.BLR01ljW.js +1 -0
- package/assets/devtools-ui/chunk.BLR01ljW.js.br +0 -0
- package/assets/devtools-ui/chunk.BTXaIUlA.js +1 -0
- package/assets/devtools-ui/chunk.BTXaIUlA.js.br +0 -0
- package/assets/devtools-ui/{chunk.lJL-lgnW.js → chunk.BhJaxmm8.js} +1 -1
- package/assets/devtools-ui/chunk.BhJaxmm8.js.br +0 -0
- package/assets/devtools-ui/chunk.BtoNxFuL.js +1 -0
- package/assets/devtools-ui/chunk.BtoNxFuL.js.br +0 -0
- package/assets/devtools-ui/chunk.C8YUV2Wd.js +1 -0
- package/assets/devtools-ui/chunk.C8YUV2Wd.js.br +0 -0
- package/assets/devtools-ui/{chunk.M6wyKO_3.js → chunk.CBbIgDzE.js} +2 -2
- package/assets/devtools-ui/chunk.CBbIgDzE.js.br +0 -0
- package/assets/devtools-ui/chunk.CFqIniwA.js +1 -0
- package/assets/devtools-ui/chunk.CFqIniwA.js.br +0 -0
- package/assets/devtools-ui/chunk.CLFF7f7-.js +1 -0
- package/assets/devtools-ui/chunk.CLFF7f7-.js.br +0 -0
- package/assets/devtools-ui/chunk.CRsBbA10.js +1 -0
- package/assets/devtools-ui/chunk.CRsBbA10.js.br +0 -0
- package/assets/devtools-ui/{chunk.DbEH1oOB.js → chunk.CZPo6v95.js} +1 -1
- package/assets/devtools-ui/chunk.CZPo6v95.js.br +0 -0
- package/assets/devtools-ui/chunk.D0fWgNos.js +1 -0
- package/assets/devtools-ui/chunk.D0fWgNos.js.br +1 -0
- package/assets/devtools-ui/chunk.D7-0ziQ6.js +1 -0
- package/assets/devtools-ui/chunk.D7-0ziQ6.js.br +0 -0
- package/assets/devtools-ui/chunk.DAewe0vm.js +1 -0
- package/assets/devtools-ui/chunk.DAewe0vm.js.br +0 -0
- package/assets/devtools-ui/chunk.DJRQEYqK.js +1 -0
- package/assets/devtools-ui/chunk.DJRQEYqK.js.br +0 -0
- package/assets/devtools-ui/{chunk.CZl6J9DF.js → chunk.DMAxv14p.js} +1 -1
- package/assets/devtools-ui/chunk.DMAxv14p.js.br +0 -0
- package/assets/devtools-ui/{chunk.BT2IiBkZ.js → chunk.DMImnNjU.js} +1 -1
- package/assets/devtools-ui/chunk.DMImnNjU.js.br +0 -0
- package/assets/devtools-ui/chunk.DeeQsidk.js +9 -0
- package/assets/devtools-ui/chunk.DeeQsidk.js.br +0 -0
- package/assets/devtools-ui/chunk.DqEwn9Vj.js +7 -0
- package/assets/devtools-ui/chunk.DqEwn9Vj.js.br +0 -0
- package/assets/devtools-ui/chunk.Dt8OsQey.js +1 -0
- package/assets/devtools-ui/chunk.Dt8OsQey.js.br +0 -0
- package/assets/devtools-ui/{chunk.B9pX3zit.js → chunk.Dtp8oa_f.js} +1 -1
- package/assets/devtools-ui/chunk.Dtp8oa_f.js.br +0 -0
- package/assets/devtools-ui/chunk.Dx3JzAYM.js +1 -0
- package/assets/devtools-ui/chunk.Dx3JzAYM.js.br +0 -0
- package/assets/devtools-ui/chunk.GCOj1-5E.js +1 -0
- package/assets/devtools-ui/chunk.GCOj1-5E.js.br +0 -0
- package/assets/devtools-ui/chunk.IC1LD8BH.js +1 -0
- package/assets/devtools-ui/chunk.IC1LD8BH.js.br +0 -0
- package/assets/devtools-ui/chunk.IwuB_TqW.js +1 -0
- package/assets/devtools-ui/chunk.IwuB_TqW.js.br +0 -0
- package/assets/devtools-ui/chunk.Qqapj2zq.js +1 -0
- package/assets/devtools-ui/chunk.Qqapj2zq.js.br +0 -0
- package/assets/devtools-ui/{chunk.C79YouPp.js → chunk.TKKKndOy.js} +1 -1
- package/assets/devtools-ui/chunk.TKKKndOy.js.br +0 -0
- package/assets/devtools-ui/chunk.YHTVhFQT.js +1 -0
- package/assets/devtools-ui/chunk.YHTVhFQT.js.br +0 -0
- package/assets/devtools-ui/chunk.fnod6uEi.js +1 -0
- package/assets/devtools-ui/chunk.fnod6uEi.js.br +0 -0
- package/assets/devtools-ui/chunk.mOCRmXjo.js +1 -0
- package/assets/devtools-ui/chunk.mOCRmXjo.js.br +0 -0
- package/assets/devtools-ui/chunk.qZTNEAK0.js +1 -0
- package/assets/devtools-ui/chunk.qZTNEAK0.js.br +0 -0
- package/assets/devtools-ui/chunk.rc9m0y4-.js +1 -0
- package/assets/devtools-ui/chunk.rc9m0y4-.js.br +0 -0
- package/assets/devtools-ui/entry.Cxc5QLCU.js +80 -0
- package/assets/devtools-ui/entry.Cxc5QLCU.js.br +0 -0
- package/assets/devtools-ui/index.html +2 -2
- package/assets/devtools-ui/index.html.br +0 -0
- package/assets/swagger-ui/swagger-ui-bundle.js +1 -1
- package/assets/swagger-ui/swagger-ui.css +1 -1
- package/dist/api/audits/index.d.ts +61 -5
- package/dist/api/audits/index.d.ts.map +1 -1
- package/dist/api/files/index.d.ts +61 -5
- package/dist/api/files/index.d.ts.map +1 -1
- package/dist/api/jobs/index.d.ts +61 -5
- package/dist/api/jobs/index.d.ts.map +1 -1
- package/dist/api/jobs/index.js +4 -2
- package/dist/api/jobs/index.js.map +1 -1
- package/dist/api/keys/index.d.ts +5 -5
- package/dist/api/notifications/index.browser.js +44 -1
- package/dist/api/notifications/index.browser.js.map +1 -1
- package/dist/api/notifications/index.d.ts +187 -2
- package/dist/api/notifications/index.d.ts.map +1 -1
- package/dist/api/notifications/index.js +143 -8
- package/dist/api/notifications/index.js.map +1 -1
- package/dist/api/parameters/index.d.ts +61 -5
- package/dist/api/parameters/index.d.ts.map +1 -1
- package/dist/api/users/index.d.ts +330 -93
- package/dist/api/users/index.d.ts.map +1 -1
- package/dist/api/users/index.js +27 -36
- package/dist/api/users/index.js.map +1 -1
- package/dist/cli/config/index.d.ts +46 -0
- package/dist/cli/config/index.d.ts.map +1 -0
- package/dist/cli/config/index.js +20 -0
- package/dist/cli/config/index.js.map +1 -0
- package/dist/cli/core/index.d.ts +69 -66
- package/dist/cli/core/index.d.ts.map +1 -1
- package/dist/cli/core/index.js +329 -196
- package/dist/cli/core/index.js.map +1 -1
- package/dist/cli/platform/index.d.ts +302 -63
- package/dist/cli/platform/index.d.ts.map +1 -1
- package/dist/cli/platform/index.js +455 -25
- package/dist/cli/platform/index.js.map +1 -1
- package/dist/core/index.browser.js +125 -87
- package/dist/core/index.browser.js.map +1 -1
- package/dist/core/index.d.ts +62 -53
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +125 -87
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.native.js +125 -87
- package/dist/core/index.native.js.map +1 -1
- package/dist/core/index.workerd.js +125 -87
- package/dist/core/index.workerd.js.map +1 -1
- package/dist/crypto/index.d.ts +18 -1
- package/dist/crypto/index.d.ts.map +1 -1
- package/dist/crypto/index.js +29 -3
- package/dist/crypto/index.js.map +1 -1
- package/dist/devtools/index.js +3 -12
- package/dist/devtools/index.js.map +1 -1
- package/dist/logger/index.d.ts +10 -1
- package/dist/logger/index.d.ts.map +1 -1
- package/dist/logger/index.js +19 -9
- package/dist/logger/index.js.map +1 -1
- package/dist/orm/core/index.browser.js +57 -1
- package/dist/orm/core/index.browser.js.map +1 -1
- package/dist/orm/core/index.bun.js +378 -19
- package/dist/orm/core/index.bun.js.map +1 -1
- package/dist/orm/core/index.d.ts +328 -9
- package/dist/orm/core/index.d.ts.map +1 -1
- package/dist/orm/core/index.js +384 -21
- package/dist/orm/core/index.js.map +1 -1
- package/dist/orm/postgres/index.bun.js +49 -17
- package/dist/orm/postgres/index.bun.js.map +1 -1
- package/dist/orm/postgres/index.d.ts +47 -21
- package/dist/orm/postgres/index.d.ts.map +1 -1
- package/dist/orm/postgres/index.js +52 -17
- package/dist/orm/postgres/index.js.map +1 -1
- package/dist/react/core/index.d.ts +1 -1
- package/dist/react/core/index.d.ts.map +1 -1
- package/dist/react/core/index.js +6 -1
- package/dist/react/core/index.js.map +1 -1
- package/dist/react/form/index.d.ts +28 -18
- package/dist/react/form/index.d.ts.map +1 -1
- package/dist/react/form/index.js +92 -56
- package/dist/react/form/index.js.map +1 -1
- package/dist/react/router/index.browser.js +448 -116
- package/dist/react/router/index.browser.js.map +1 -1
- package/dist/react/router/index.d.ts +102 -40
- package/dist/react/router/index.d.ts.map +1 -1
- package/dist/react/router/index.js +453 -92
- package/dist/react/router/index.js.map +1 -1
- package/dist/security/index.d.ts +3 -11
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security/index.js +6 -11
- package/dist/security/index.js.map +1 -1
- package/dist/server/auth/index.d.ts +22 -24
- package/dist/server/auth/index.d.ts.map +1 -1
- package/dist/server/auth/index.js +102 -82
- package/dist/server/auth/index.js.map +1 -1
- package/dist/server/cookies/index.d.ts +7 -4
- package/dist/server/cookies/index.d.ts.map +1 -1
- package/dist/server/cookies/index.js +13 -12
- package/dist/server/cookies/index.js.map +1 -1
- package/dist/server/core/index.d.ts +288 -4
- package/dist/server/core/index.d.ts.map +1 -1
- package/dist/server/core/index.js +375 -2
- package/dist/server/core/index.js.map +1 -1
- package/dist/server/links/index.browser.js +10 -71
- package/dist/server/links/index.browser.js.map +1 -1
- package/dist/server/links/index.d.ts +32 -49
- package/dist/server/links/index.d.ts.map +1 -1
- package/dist/server/links/index.js +73 -100
- package/dist/server/links/index.js.map +1 -1
- package/dist/system/index.browser.js +221 -2
- package/dist/system/index.browser.js.map +1 -1
- package/dist/system/index.d.ts +63 -1
- package/dist/system/index.d.ts.map +1 -1
- package/dist/system/index.js +221 -1
- package/dist/system/index.js.map +1 -1
- package/dist/system/index.workerd.js +224 -4
- package/dist/system/index.workerd.js.map +1 -1
- package/package.json +10 -5
- package/src/api/jobs/providers/JobProvider.ts +6 -3
- package/src/api/notifications/controllers/AdminNotificationController.ts +83 -0
- package/src/api/notifications/index.browser.ts +3 -0
- package/src/api/notifications/index.ts +14 -2
- package/src/api/notifications/jobs/NotificationJobs.ts +11 -2
- package/src/api/notifications/schemas/notificationDetailResourceSchema.ts +20 -0
- package/src/api/notifications/schemas/notificationQuerySchema.ts +19 -0
- package/src/api/notifications/schemas/notificationResourceSchema.ts +18 -0
- package/src/api/notifications/services/NotificationSenderService.ts +15 -2
- package/src/api/users/atoms/realmAuthSettingsAtom.ts +28 -32
- package/src/api/users/buckets/UserBuckets.ts +1 -1
- package/src/api/users/jobs/UserJobs.ts +1 -1
- package/src/api/users/primitives/$realm.ts +8 -49
- package/src/api/users/providers/RealmProvider.ts +2 -3
- package/src/api/users/services/RegistrationService.spec.ts +7 -7
- package/src/api/users/services/RegistrationService.ts +3 -3
- package/src/api/users/services/SessionService.spec.ts +4 -4
- package/src/api/users/services/SessionService.ts +3 -3
- package/src/cli/{core → config}/defineConfig.ts +14 -20
- package/src/cli/config/index.ts +1 -0
- package/src/cli/core/commands/db.ts +65 -1
- package/src/cli/core/commands/dev.ts +1 -0
- package/src/cli/core/commands/init.ts +2 -192
- package/src/cli/core/index.ts +34 -11
- package/src/cli/core/providers/ViteDevServerProvider.ts +52 -13
- package/src/cli/core/services/PackageManagerUtils.ts +43 -21
- package/src/cli/core/services/ProjectScaffolder.ts +214 -2
- package/src/cli/core/services/ViteUtils.ts +57 -0
- package/src/cli/core/tasks/BuildClientTask.ts +7 -2
- package/src/cli/core/tasks/BuildCloudflareTask.ts +4 -12
- package/src/cli/core/tasks/BuildServerTask.ts +2 -0
- package/src/cli/core/tasks/BuildVercelTask.ts +165 -168
- package/src/cli/core/templates/alephaConfigTs.ts +1 -1
- package/src/cli/core/templates/apiAppSecurityTs.ts +5 -8
- package/src/cli/core/templates/tsconfigJson.ts +6 -1
- package/src/cli/platform/adapters/CloudflareAdapter.spec.ts +1 -1
- package/src/cli/platform/adapters/CloudflareAdapter.ts +30 -29
- package/src/cli/platform/atoms/platformOptions.ts +21 -0
- package/src/cli/platform/commands/SecretsCommand.spec.ts +298 -0
- package/src/cli/platform/commands/SecretsCommand.ts +283 -0
- package/src/cli/platform/commands/platform.ts +12 -0
- package/src/cli/platform/index.ts +14 -28
- package/src/cli/platform/providers/GitHubSecretStore.spec.ts +153 -0
- package/src/cli/platform/providers/GitHubSecretStore.ts +112 -0
- package/src/cli/platform/providers/MemorySecretStore.ts +114 -0
- package/src/cli/platform/providers/SecretStoreProvider.ts +39 -0
- package/src/cli/platform/schemas/cloudflare.ts +2 -0
- package/src/cli/platform/services/CloudflareApi.ts +5 -2
- package/src/cli/platform/services/DockerComposeGenerator.spec.ts +115 -0
- package/src/cli/platform/services/DockerComposeGenerator.ts +46 -1
- package/src/cli/platform/services/SecretFilterService.spec.ts +111 -0
- package/src/cli/platform/services/SecretFilterService.ts +54 -0
- package/src/core/Alepha.ts +94 -25
- package/src/core/__tests__/Alepha-parseEnv.spec.ts +20 -0
- package/src/core/primitives/$memoize.ts +38 -26
- package/src/core/providers/AlsProvider.ts +2 -0
- package/src/core/providers/EventManager.ts +4 -0
- package/src/core/providers/KeylessJsonSchemaCodec.spec.ts +1 -4
- package/src/core/providers/KeylessJsonSchemaCodec.ts +19 -125
- package/src/core/providers/SchemaValidator.spec.ts +36 -0
- package/src/core/providers/SchemaValidator.ts +9 -0
- package/src/crypto/index.ts +6 -1
- package/src/crypto/providers/SecretProvider.ts +36 -0
- package/src/devtools/providers/DevToolsProvider.ts +3 -12
- package/src/logger/index.ts +33 -6
- package/src/logger/providers/PrettyFormatterProvider.ts +5 -3
- package/src/orm/__tests__/orm-next-tests.ts +492 -0
- package/src/orm/__tests__/orm-next.spec.ts +140 -0
- package/src/orm/core/constants/PG_SYMBOLS.ts +17 -0
- package/src/orm/core/index.bun.ts +3 -6
- package/src/orm/core/index.shared-server.ts +2 -0
- package/src/orm/core/index.shared.ts +2 -0
- package/src/orm/core/index.ts +5 -7
- package/src/orm/core/interfaces/AggregateQuery.ts +103 -0
- package/src/orm/core/interfaces/PgQueryWhere.ts +7 -0
- package/src/orm/core/primitives/$entity.ts +8 -0
- package/src/orm/core/primitives/$repository.ts +6 -3
- package/src/orm/core/primitives/$view.ts +88 -0
- package/src/orm/core/providers/DbCacheProvider.ts +66 -0
- package/src/orm/core/providers/DrizzleKitProvider.ts +42 -0
- package/src/orm/core/providers/drivers/BunSqliteProvider.ts +2 -3
- package/src/orm/core/providers/drivers/CloudflareD1Provider.ts +12 -0
- package/src/orm/core/providers/drivers/DatabaseProvider.ts +39 -0
- package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +2 -3
- package/src/orm/core/schemas/databaseEnvSchema.ts +31 -0
- package/src/orm/core/schemas/insertSchema.ts +13 -3
- package/src/orm/core/schemas/updateSchema.ts +14 -3
- package/src/orm/core/services/ModelBuilder.ts +26 -14
- package/src/orm/core/services/QueryManager.ts +13 -0
- package/src/orm/core/services/Repository.ts +307 -5
- package/src/orm/core/services/SqliteModelBuilder.ts +38 -0
- package/src/orm/postgres/index.bun.ts +4 -7
- package/src/orm/postgres/index.ts +4 -7
- package/src/orm/postgres/providers/BunPostgresProvider.ts +12 -2
- package/src/orm/postgres/providers/NodePostgresProvider.ts +7 -0
- package/src/orm/postgres/providers/PglitePostgresProvider.ts +10 -17
- package/src/orm/postgres/providers/PostgresProvider.ts +7 -36
- package/src/orm/postgres/schemas/postgresEnvSchema.ts +32 -0
- package/src/orm/postgres/services/PostgresModelBuilder.ts +40 -0
- package/src/react/core/components/ErrorBoundary.tsx +5 -2
- package/src/react/form/hooks/useFieldValue.ts +34 -0
- package/src/react/form/hooks/useForm.browser.spec.tsx +94 -9
- package/src/react/form/hooks/useForm.ts +14 -2
- package/src/react/form/hooks/useFormState.ts +10 -10
- package/src/react/form/hooks/useFormValues.ts +29 -0
- package/src/react/form/index.ts +3 -1
- package/src/react/form/services/FormModel.ts +53 -122
- package/src/react/router/components/ErrorViewer.tsx +333 -34
- package/src/react/router/components/NestedView.tsx +10 -3
- package/src/react/router/primitives/$page.browser.spec.tsx +34 -0
- package/src/react/router/primitives/$page.spec.tsx +20 -0
- package/src/react/router/primitives/$page.ts +24 -0
- package/src/react/router/providers/ReactBrowserRouterProvider.ts +14 -2
- package/src/react/router/providers/ReactPageProvider.ts +156 -73
- package/src/react/router/providers/ReactServerProvider.ts +40 -2
- package/src/react/router/providers/ReactServerTemplateProvider.ts +13 -1
- package/src/security/providers/SecurityProvider.ts +5 -27
- package/src/server/auth/primitives/$auth.ts +52 -19
- package/src/server/auth/providers/ServerAuthProvider.ts +145 -139
- package/src/server/cookies/providers/ServerCookiesProvider.ts +12 -24
- package/src/server/core/index.ts +3 -1
- package/src/server/core/primitives/$sse.spec.ts +315 -0
- package/src/server/core/primitives/$sse.ts +715 -0
- package/src/server/links/index.browser.ts +1 -3
- package/src/server/links/index.ts +0 -3
- package/src/server/links/providers/LinkProvider.spec.ts +12 -21
- package/src/server/links/providers/LinkProvider.ts +20 -52
- package/src/server/links/providers/ServerLinksProvider.spec.ts +106 -0
- package/src/server/links/providers/ServerLinksProvider.ts +113 -73
- package/src/server/links/schemas/apiLinksResponseSchema.ts +4 -21
- package/src/server/links/services/BatchCollector.ts +5 -3
- package/src/system/index.browser.ts +1 -0
- package/src/system/index.ts +3 -0
- package/src/system/index.workerd.ts +39 -1
- package/src/system/providers/WorkerdFileSystemProvider.ts +365 -0
- package/assets/devtools-ui/asset.BfSBZ5Dd.css.br +0 -0
- package/assets/devtools-ui/chunk.2NYaoqWt.js +0 -1
- package/assets/devtools-ui/chunk.2NYaoqWt.js.br +0 -0
- package/assets/devtools-ui/chunk.B052Z_xQ.js +0 -1
- package/assets/devtools-ui/chunk.B052Z_xQ.js.br +0 -0
- package/assets/devtools-ui/chunk.B4kVY90C.js +0 -1
- package/assets/devtools-ui/chunk.B4kVY90C.js.br +0 -0
- package/assets/devtools-ui/chunk.B7QJXctB.js +0 -1
- package/assets/devtools-ui/chunk.B7QJXctB.js.br +0 -0
- package/assets/devtools-ui/chunk.B9pX3zit.js.br +0 -0
- package/assets/devtools-ui/chunk.BKF9JxIo.js +0 -1
- package/assets/devtools-ui/chunk.BKF9JxIo.js.br +0 -0
- package/assets/devtools-ui/chunk.BOHgdTP-.js +0 -1
- package/assets/devtools-ui/chunk.BOHgdTP-.js.br +0 -0
- package/assets/devtools-ui/chunk.BOVFxkYC.js +0 -1
- package/assets/devtools-ui/chunk.BOVFxkYC.js.br +0 -0
- package/assets/devtools-ui/chunk.BR842zj5.js +0 -1
- package/assets/devtools-ui/chunk.BR842zj5.js.br +0 -0
- package/assets/devtools-ui/chunk.BT2IiBkZ.js.br +0 -0
- package/assets/devtools-ui/chunk.C79YouPp.js.br +0 -0
- package/assets/devtools-ui/chunk.C8mlBrjW.js +0 -9
- package/assets/devtools-ui/chunk.C8mlBrjW.js.br +0 -0
- package/assets/devtools-ui/chunk.CK0ow3AZ.js +0 -1
- package/assets/devtools-ui/chunk.CK0ow3AZ.js.br +0 -0
- package/assets/devtools-ui/chunk.CZl6J9DF.js.br +0 -0
- package/assets/devtools-ui/chunk.CdNr0YzS.js +0 -1
- package/assets/devtools-ui/chunk.CdNr0YzS.js.br +0 -0
- package/assets/devtools-ui/chunk.Ce6_6iIF.js +0 -1
- package/assets/devtools-ui/chunk.Ce6_6iIF.js.br +0 -0
- package/assets/devtools-ui/chunk.CpyDMr6O.js +0 -1
- package/assets/devtools-ui/chunk.CpyDMr6O.js.br +0 -0
- package/assets/devtools-ui/chunk.CyPmvPnY.js +0 -1
- package/assets/devtools-ui/chunk.CyPmvPnY.js.br +0 -0
- package/assets/devtools-ui/chunk.DTI_geWu.js +0 -1
- package/assets/devtools-ui/chunk.DTI_geWu.js.br +0 -0
- package/assets/devtools-ui/chunk.DbEH1oOB.js.br +0 -0
- package/assets/devtools-ui/chunk.Ddeqj5gv.js +0 -1
- package/assets/devtools-ui/chunk.Ddeqj5gv.js.br +0 -0
- package/assets/devtools-ui/chunk.DpRnB4vJ.js +0 -1
- package/assets/devtools-ui/chunk.DpRnB4vJ.js.br +0 -0
- package/assets/devtools-ui/chunk.DxPGTlsg.js +0 -1
- package/assets/devtools-ui/chunk.DxPGTlsg.js.br +0 -0
- package/assets/devtools-ui/chunk.G7_MMBJS.js +0 -1
- package/assets/devtools-ui/chunk.G7_MMBJS.js.br +0 -0
- package/assets/devtools-ui/chunk.M6wyKO_3.js.br +0 -0
- package/assets/devtools-ui/chunk.OUxNGmQ6.js +0 -1
- package/assets/devtools-ui/chunk.OUxNGmQ6.js.br +0 -0
- package/assets/devtools-ui/chunk.T1kle-fF.js +0 -1
- package/assets/devtools-ui/chunk.T1kle-fF.js.br +0 -0
- package/assets/devtools-ui/chunk.WjpsbQAv.js +0 -1
- package/assets/devtools-ui/chunk.WjpsbQAv.js.br +0 -0
- package/assets/devtools-ui/chunk.c6YgVx86.js +0 -1
- package/assets/devtools-ui/chunk.c6YgVx86.js.br +0 -0
- package/assets/devtools-ui/chunk.dwU3E_MU.js +0 -1
- package/assets/devtools-ui/chunk.dwU3E_MU.js.br +0 -0
- package/assets/devtools-ui/chunk.lJL-lgnW.js.br +0 -0
- package/assets/devtools-ui/chunk.lPWRmvA-.js +0 -7
- package/assets/devtools-ui/chunk.lPWRmvA-.js.br +0 -0
- package/assets/devtools-ui/chunk.p3HJvugM.js +0 -1
- package/assets/devtools-ui/chunk.p3HJvugM.js.br +0 -0
- package/assets/devtools-ui/chunk.r_Xoa_CI.js +0 -1
- package/assets/devtools-ui/chunk.r_Xoa_CI.js.br +0 -0
- package/assets/devtools-ui/chunk.sRNuTYXb.js +0 -1
- package/assets/devtools-ui/chunk.sRNuTYXb.js.br +0 -0
- package/assets/devtools-ui/chunk.tUjcyX5C.js +0 -1
- package/assets/devtools-ui/chunk.tUjcyX5C.js.br +0 -0
- package/assets/devtools-ui/chunk.thjBxvCA.js +0 -1
- package/assets/devtools-ui/chunk.thjBxvCA.js.br +0 -0
- package/assets/devtools-ui/entry.GYhBVRpC.js +0 -78
- package/assets/devtools-ui/entry.GYhBVRpC.js.br +0 -0
- package/src/server/links/services/DefinitionsPool.spec.ts +0 -86
- package/src/server/links/services/DefinitionsPool.ts +0 -43
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { TArray, TObject, TSchema, TUnion } from "typebox";
|
|
2
|
-
import { AlephaError } from "../errors/AlephaError.ts";
|
|
3
2
|
import { $hook } from "../primitives/$hook.ts";
|
|
4
3
|
import { SchemaCodec } from "./SchemaCodec.ts";
|
|
5
4
|
import { type Static, t } from "./TypeProvider.ts";
|
|
@@ -18,9 +17,6 @@ import { type Static, t } from "./TypeProvider.ts";
|
|
|
18
17
|
// Keyless: ["Alice",30,true] (17 bytes)
|
|
19
18
|
// =============================================================================
|
|
20
19
|
|
|
21
|
-
// Security: Keys that could enable prototype pollution attacks
|
|
22
|
-
const UNSAFE_KEYS = new Set(["__proto__", "constructor", "prototype"]);
|
|
23
|
-
|
|
24
20
|
export interface KeylessCodec<T = any> {
|
|
25
21
|
encode: (value: T) => string;
|
|
26
22
|
decode: (str: string) => T;
|
|
@@ -34,30 +30,6 @@ export interface KeylessCodecOptions {
|
|
|
34
30
|
* @default Auto-detected: false in browser (CSP compatibility), true on server
|
|
35
31
|
*/
|
|
36
32
|
useFunctionCompilation?: boolean;
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Maximum allowed array length during encoding/decoding.
|
|
40
|
-
* Prevents DoS attacks via large arrays.
|
|
41
|
-
*
|
|
42
|
-
* @default 10000
|
|
43
|
-
*/
|
|
44
|
-
maxArrayLength?: number;
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Maximum allowed string length during encoding/decoding.
|
|
48
|
-
* Prevents DoS attacks via large strings.
|
|
49
|
-
*
|
|
50
|
-
* @default 1000000 (1MB)
|
|
51
|
-
*/
|
|
52
|
-
maxStringLength?: number;
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Maximum recursion depth for nested objects.
|
|
56
|
-
* Prevents stack overflow attacks.
|
|
57
|
-
*
|
|
58
|
-
* @default 50
|
|
59
|
-
*/
|
|
60
|
-
maxDepth?: number;
|
|
61
33
|
}
|
|
62
34
|
|
|
63
35
|
/**
|
|
@@ -71,12 +43,7 @@ export class KeylessJsonSchemaCodec extends SchemaCodec {
|
|
|
71
43
|
protected readonly textEncoder = new TextEncoder();
|
|
72
44
|
protected readonly textDecoder = new TextDecoder();
|
|
73
45
|
protected varCounter = 0;
|
|
74
|
-
|
|
75
|
-
// Options with defaults
|
|
76
46
|
protected useFunctionCompilation = true;
|
|
77
|
-
protected maxArrayLength = 10000;
|
|
78
|
-
protected maxStringLength = 1000000;
|
|
79
|
-
protected maxDepth = 50;
|
|
80
47
|
|
|
81
48
|
/**
|
|
82
49
|
* Configure codec options.
|
|
@@ -86,15 +53,6 @@ export class KeylessJsonSchemaCodec extends SchemaCodec {
|
|
|
86
53
|
this.useFunctionCompilation = options.useFunctionCompilation;
|
|
87
54
|
this.cache.clear(); // Clear cache when compilation mode changes
|
|
88
55
|
}
|
|
89
|
-
if (options.maxArrayLength !== undefined) {
|
|
90
|
-
this.maxArrayLength = options.maxArrayLength;
|
|
91
|
-
}
|
|
92
|
-
if (options.maxStringLength !== undefined) {
|
|
93
|
-
this.maxStringLength = options.maxStringLength;
|
|
94
|
-
}
|
|
95
|
-
if (options.maxDepth !== undefined) {
|
|
96
|
-
this.maxDepth = options.maxDepth;
|
|
97
|
-
}
|
|
98
56
|
return this;
|
|
99
57
|
}
|
|
100
58
|
|
|
@@ -152,10 +110,6 @@ export class KeylessJsonSchemaCodec extends SchemaCodec {
|
|
|
152
110
|
return value as T;
|
|
153
111
|
}
|
|
154
112
|
|
|
155
|
-
// ===========================================================================
|
|
156
|
-
// Security Validation
|
|
157
|
-
// ===========================================================================
|
|
158
|
-
|
|
159
113
|
/**
|
|
160
114
|
* Test if `new Function()` is available (not blocked by CSP).
|
|
161
115
|
*/
|
|
@@ -168,72 +122,6 @@ export class KeylessJsonSchemaCodec extends SchemaCodec {
|
|
|
168
122
|
}
|
|
169
123
|
}
|
|
170
124
|
|
|
171
|
-
/**
|
|
172
|
-
* Validate schema keys for prototype pollution.
|
|
173
|
-
* Uses a visited set to avoid infinite recursion on recursive schemas.
|
|
174
|
-
*/
|
|
175
|
-
protected validateSchemaKeys(
|
|
176
|
-
schema: TSchema,
|
|
177
|
-
depth = 0,
|
|
178
|
-
visited = new Set<TSchema>(),
|
|
179
|
-
): void {
|
|
180
|
-
// Avoid infinite recursion on recursive schemas
|
|
181
|
-
if (visited.has(schema)) {
|
|
182
|
-
return;
|
|
183
|
-
}
|
|
184
|
-
visited.add(schema);
|
|
185
|
-
|
|
186
|
-
if (depth > this.maxDepth) {
|
|
187
|
-
throw new AlephaError(
|
|
188
|
-
`Schema depth exceeds maximum allowed (${this.maxDepth})`,
|
|
189
|
-
);
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
if (t.schema.isObject(schema)) {
|
|
193
|
-
const objSchema = schema as TObject;
|
|
194
|
-
const props = objSchema.properties as Record<string, TSchema>;
|
|
195
|
-
|
|
196
|
-
for (const key of Object.keys(props)) {
|
|
197
|
-
if (UNSAFE_KEYS.has(key)) {
|
|
198
|
-
throw new AlephaError(
|
|
199
|
-
`Unsafe schema key "${key}" detected. This key is blocked to prevent prototype pollution.`,
|
|
200
|
-
);
|
|
201
|
-
}
|
|
202
|
-
// Depth increases for object properties
|
|
203
|
-
this.validateSchemaKeys(props[key], depth + 1, visited);
|
|
204
|
-
}
|
|
205
|
-
} else if (t.schema.isArray(schema)) {
|
|
206
|
-
const arrSchema = schema as TArray;
|
|
207
|
-
// Depth increases for array items
|
|
208
|
-
this.validateSchemaKeys(arrSchema.items, depth + 1, visited);
|
|
209
|
-
} else if (t.schema.isUnion(schema) || t.schema.isOptional(schema)) {
|
|
210
|
-
// Optional/union wrappers don't increase depth - they're type modifiers
|
|
211
|
-
this.validateSchemaKeys(this.unwrap(schema), depth, visited);
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
/**
|
|
216
|
-
* Validate array length.
|
|
217
|
-
*/
|
|
218
|
-
protected validateArrayLength(arr: unknown[]): void {
|
|
219
|
-
if (arr.length > this.maxArrayLength) {
|
|
220
|
-
throw new AlephaError(
|
|
221
|
-
`Array length (${arr.length}) exceeds maximum allowed (${this.maxArrayLength})`,
|
|
222
|
-
);
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
/**
|
|
227
|
-
* Validate string length.
|
|
228
|
-
*/
|
|
229
|
-
protected validateStringLength(str: string): void {
|
|
230
|
-
if (str.length > this.maxStringLength) {
|
|
231
|
-
throw new AlephaError(
|
|
232
|
-
`String length (${str.length}) exceeds maximum allowed (${this.maxStringLength})`,
|
|
233
|
-
);
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
|
|
237
125
|
// ===========================================================================
|
|
238
126
|
// Codec Compilation
|
|
239
127
|
// ===========================================================================
|
|
@@ -493,12 +381,14 @@ export class KeylessJsonSchemaCodec extends SchemaCodec {
|
|
|
493
381
|
for (const { key, isOpt, isNullable, inner } of this.getObjectFields(
|
|
494
382
|
schema as TObject,
|
|
495
383
|
)) {
|
|
496
|
-
const
|
|
384
|
+
const sk = JSON.stringify(key);
|
|
385
|
+
const access = `${ve}[${sk}]`;
|
|
386
|
+
const innerEnc = this.genEnc(inner, access);
|
|
497
387
|
|
|
498
388
|
if (isOpt) {
|
|
499
|
-
parts.push(`${
|
|
389
|
+
parts.push(`${access}!==undefined?${innerEnc}:null`);
|
|
500
390
|
} else if (isNullable) {
|
|
501
|
-
parts.push(`${
|
|
391
|
+
parts.push(`${access}!==null?${innerEnc}:null`);
|
|
502
392
|
} else {
|
|
503
393
|
parts.push(innerEnc);
|
|
504
394
|
}
|
|
@@ -557,32 +447,35 @@ export class KeylessJsonSchemaCodec extends SchemaCodec {
|
|
|
557
447
|
);
|
|
558
448
|
|
|
559
449
|
if (simple) {
|
|
560
|
-
const fieldExprs = fields.map(
|
|
450
|
+
const fieldExprs = fields.map(
|
|
451
|
+
({ key }) => `${JSON.stringify(key)}:a[i++]`,
|
|
452
|
+
);
|
|
561
453
|
return { code: "", result: `{${fieldExprs.join(",")}}` };
|
|
562
454
|
}
|
|
563
455
|
|
|
564
456
|
let code = `const ${v}={};`;
|
|
565
457
|
for (const { key, isOpt, isNullable, inner } of fields) {
|
|
458
|
+
const sk = JSON.stringify(key);
|
|
566
459
|
if (isOpt) {
|
|
567
460
|
const nested = this.genDecFromValue(inner, "t");
|
|
568
|
-
code += `{const t=a[i++];if(t!==null){${v}
|
|
461
|
+
code += `{const t=a[i++];if(t!==null){${v}[${sk}]=${nested};}}`;
|
|
569
462
|
} else if (isNullable) {
|
|
570
463
|
const nested = this.genDecFromValue(inner, "t");
|
|
571
|
-
code += `{const t=a[i++];if(t===null){${v}
|
|
464
|
+
code += `{const t=a[i++];if(t===null){${v}[${sk}]=null;}else{${v}[${sk}]=${nested};}}`;
|
|
572
465
|
} else if (t.schema.isObject(inner)) {
|
|
573
466
|
const nested = this.genDecFromValue(inner, "a[i++]");
|
|
574
|
-
code += `${v}
|
|
467
|
+
code += `${v}[${sk}]=${nested};`;
|
|
575
468
|
} else if (t.schema.isArray(inner)) {
|
|
576
469
|
// Handle arrays - check if items need transformation
|
|
577
470
|
const arrSchema = inner as TArray;
|
|
578
471
|
if (t.schema.isObject(arrSchema.items)) {
|
|
579
472
|
const itemTransform = this.genDecFromValue(arrSchema.items, "e");
|
|
580
|
-
code += `${v}
|
|
473
|
+
code += `${v}[${sk}]=a[i++].map(e=>${itemTransform});`;
|
|
581
474
|
} else {
|
|
582
|
-
code += `${v}
|
|
475
|
+
code += `${v}[${sk}]=a[i++];`;
|
|
583
476
|
}
|
|
584
477
|
} else {
|
|
585
|
-
code += `${v}
|
|
478
|
+
code += `${v}[${sk}]=a[i++];`;
|
|
586
479
|
}
|
|
587
480
|
}
|
|
588
481
|
|
|
@@ -620,13 +513,14 @@ export class KeylessJsonSchemaCodec extends SchemaCodec {
|
|
|
620
513
|
const fields = keys.map((k, idx) => {
|
|
621
514
|
const inner = this.unwrap(props[k]);
|
|
622
515
|
const innerExpr = `${v}[${idx}]`;
|
|
516
|
+
const sk = JSON.stringify(k);
|
|
623
517
|
if (t.schema.isObject(inner)) {
|
|
624
|
-
return `${
|
|
518
|
+
return `${sk}:${this.genDecFromValue(inner, innerExpr)}`;
|
|
625
519
|
}
|
|
626
520
|
if (t.schema.isBigInt(inner)) {
|
|
627
|
-
return `${
|
|
521
|
+
return `${sk}:BigInt(${innerExpr}.slice(0,-1))`;
|
|
628
522
|
}
|
|
629
|
-
return `${
|
|
523
|
+
return `${sk}:${innerExpr}`;
|
|
630
524
|
});
|
|
631
525
|
return `((${v}=${expr})=>({${fields.join(",")}}))()`;
|
|
632
526
|
}
|
|
@@ -209,6 +209,42 @@ describe("SchemaValidator", () => {
|
|
|
209
209
|
expect(result.tags).toEqual(["tag1", "tag2"]);
|
|
210
210
|
});
|
|
211
211
|
|
|
212
|
+
test("should unwrap optional arrays and preprocess items", async ({
|
|
213
|
+
expect,
|
|
214
|
+
}) => {
|
|
215
|
+
const alepha = Alepha.create();
|
|
216
|
+
const validator = alepha.inject(SchemaValidator);
|
|
217
|
+
|
|
218
|
+
const schema = t.object({
|
|
219
|
+
tags: t.optional(t.array(t.text({ trim: true }))),
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
const data = {
|
|
223
|
+
tags: [" tag1 ", " tag2 "],
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
const result = validator.validate(schema, data);
|
|
227
|
+
expect(result.tags).toEqual(["tag1", "tag2"]);
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
test("should unwrap nullable arrays and preprocess items", async ({
|
|
231
|
+
expect,
|
|
232
|
+
}) => {
|
|
233
|
+
const alepha = Alepha.create();
|
|
234
|
+
const validator = alepha.inject(SchemaValidator);
|
|
235
|
+
|
|
236
|
+
const schema = t.object({
|
|
237
|
+
tags: t.union([t.array(t.text({ trim: true })), t.null()]),
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
const data = {
|
|
241
|
+
tags: [" tag1 ", " tag2 "],
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
const result = validator.validate(schema, data);
|
|
245
|
+
expect(result.tags).toEqual(["tag1", "tag2"]);
|
|
246
|
+
});
|
|
247
|
+
|
|
212
248
|
test("should delete undefined values when option is enabled", async ({
|
|
213
249
|
expect,
|
|
214
250
|
}) => {
|
|
@@ -67,6 +67,15 @@ export class SchemaValidator {
|
|
|
67
67
|
return undefined;
|
|
68
68
|
}
|
|
69
69
|
|
|
70
|
+
// Unwrap optional/union to access the inner type schema (e.g. array items, object properties).
|
|
71
|
+
// Must happen after the null check above which needs the original schema for nullability.
|
|
72
|
+
if (!schema.type && schema.anyOf) {
|
|
73
|
+
schema =
|
|
74
|
+
schema.anyOf.find(
|
|
75
|
+
(s: any) => s.type !== "null" && s.type !== "undefined",
|
|
76
|
+
) || schema;
|
|
77
|
+
}
|
|
78
|
+
|
|
70
79
|
if (Array.isArray(value)) {
|
|
71
80
|
return value.map((it) => this.beforeParse(schema.items, it, options));
|
|
72
81
|
}
|
package/src/crypto/index.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { $module } from "alepha";
|
|
2
2
|
import { CryptoProvider } from "./providers/CryptoProvider.ts";
|
|
3
|
+
import { SecretProvider } from "./providers/SecretProvider.ts";
|
|
3
4
|
|
|
4
5
|
export * from "./providers/CryptoProvider.ts";
|
|
6
|
+
export * from "./providers/SecretProvider.ts";
|
|
5
7
|
|
|
6
8
|
/**
|
|
7
9
|
* Cryptographic utilities: hashing, HMAC, AES-256-GCM encryption, password hashing, and secure random generation.
|
|
@@ -10,5 +12,8 @@ export * from "./providers/CryptoProvider.ts";
|
|
|
10
12
|
*/
|
|
11
13
|
export const AlephaCrypto = $module({
|
|
12
14
|
name: "alepha.crypto",
|
|
13
|
-
services: [CryptoProvider],
|
|
15
|
+
services: [CryptoProvider, SecretProvider],
|
|
16
|
+
register: (alepha) => {
|
|
17
|
+
alepha.with(CryptoProvider);
|
|
18
|
+
},
|
|
14
19
|
});
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { $env, $hook, $inject, Alepha, t } from "alepha";
|
|
2
|
+
import { $logger } from "alepha/logger";
|
|
3
|
+
|
|
4
|
+
export const DEFAULT_SECRET_KEY_VALUE = "change-me-in-production";
|
|
5
|
+
|
|
6
|
+
export const alephaSecretEnvSchema = t.object({
|
|
7
|
+
APP_SECRET: t.text({
|
|
8
|
+
default: DEFAULT_SECRET_KEY_VALUE,
|
|
9
|
+
description:
|
|
10
|
+
"The secret key used for signing JWTs, encrypting cookies, and other security features.",
|
|
11
|
+
}),
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
export class SecretProvider {
|
|
15
|
+
protected readonly log = $logger();
|
|
16
|
+
protected readonly alepha = $inject(Alepha);
|
|
17
|
+
protected readonly env = $env(alephaSecretEnvSchema);
|
|
18
|
+
|
|
19
|
+
public get secretKey(): string {
|
|
20
|
+
return this.env.APP_SECRET;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
protected readonly configure = $hook({
|
|
24
|
+
on: "configure",
|
|
25
|
+
handler: async () => {
|
|
26
|
+
if (
|
|
27
|
+
this.secretKey === DEFAULT_SECRET_KEY_VALUE &&
|
|
28
|
+
this.alepha.isProduction()
|
|
29
|
+
) {
|
|
30
|
+
this.log.warn(
|
|
31
|
+
"Using default secret key. Please set a secure APP_SECRET environment variable.",
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
}
|
|
@@ -30,10 +30,8 @@ export class DevToolsProvider {
|
|
|
30
30
|
*/
|
|
31
31
|
protected readonly onLog = $hook({
|
|
32
32
|
on: "log",
|
|
33
|
-
handler: ({
|
|
34
|
-
|
|
35
|
-
this.memoryDestination.write(message, entry);
|
|
36
|
-
}
|
|
33
|
+
handler: ({ entry }) => {
|
|
34
|
+
this.memoryDestination.write("", entry);
|
|
37
35
|
},
|
|
38
36
|
});
|
|
39
37
|
|
|
@@ -106,15 +104,8 @@ export class DevToolsProvider {
|
|
|
106
104
|
}),
|
|
107
105
|
},
|
|
108
106
|
handler: ({ query }) => {
|
|
109
|
-
let memoryProvider: MemoryDestinationProvider;
|
|
110
|
-
try {
|
|
111
|
-
memoryProvider = this.alepha.inject(MemoryDestinationProvider);
|
|
112
|
-
} catch {
|
|
113
|
-
return { logs: [], total: 0 };
|
|
114
|
-
}
|
|
115
|
-
|
|
116
107
|
const levelOrder = ["TRACE", "DEBUG", "INFO", "WARN", "ERROR"];
|
|
117
|
-
let entries =
|
|
108
|
+
let entries = this.memoryDestination.logs;
|
|
118
109
|
|
|
119
110
|
if (query.level) {
|
|
120
111
|
const minIndex = levelOrder.indexOf(query.level.toUpperCase());
|
package/src/logger/index.ts
CHANGED
|
@@ -37,7 +37,7 @@ export * from "./services/Logger.ts";
|
|
|
37
37
|
* - Console destination
|
|
38
38
|
* - Memory destination (for devtools)
|
|
39
39
|
* - Custom handlers
|
|
40
|
-
* - Configuration via `LOG_LEVEL` and `
|
|
40
|
+
* - Configuration via `LOG_LEVEL`, `LOG_FORMAT`, and `DEBUG`
|
|
41
41
|
*
|
|
42
42
|
* @module alepha.logger
|
|
43
43
|
*/
|
|
@@ -56,10 +56,22 @@ export const AlephaLogger = $module({
|
|
|
56
56
|
register: (alepha) => {
|
|
57
57
|
const env = alepha.parseEnv(envSchema);
|
|
58
58
|
|
|
59
|
+
// Support DEBUG env var (debug package convention) as shorthand for LOG_LEVEL/LOG_FORMAT.
|
|
60
|
+
// DEBUG=alepha:* → LOG_LEVEL=alepha.*:debug,info LOG_FORMAT=pretty
|
|
61
|
+
let logLevel = env.LOG_LEVEL;
|
|
62
|
+
let logFormat = env.LOG_FORMAT;
|
|
63
|
+
if (env.DEBUG) {
|
|
64
|
+
const patterns = env.DEBUG.split(",")
|
|
65
|
+
.map((p) => p.trim().replaceAll(":", "."))
|
|
66
|
+
.filter(Boolean);
|
|
67
|
+
logLevel ??= `${patterns.map((p) => `${p}:debug`).join(",")},info`;
|
|
68
|
+
logFormat ??= "pretty";
|
|
69
|
+
}
|
|
70
|
+
|
|
59
71
|
const getLogDestinationProvider = () => {
|
|
60
72
|
// in test mode, if no LOG_LEVEL is set, use MemoryDestinationProvider to capture logs for inspection.
|
|
61
73
|
// logs will be printed to console only if the test fails.
|
|
62
|
-
if (alepha.isTest() && !
|
|
74
|
+
if (alepha.isTest() && !logLevel) {
|
|
63
75
|
const printOnError = (ev: any) => {
|
|
64
76
|
if (ev.task?.result?.state === "fail") {
|
|
65
77
|
const output = alepha.inject(MemoryDestinationProvider);
|
|
@@ -83,11 +95,11 @@ export const AlephaLogger = $module({
|
|
|
83
95
|
};
|
|
84
96
|
|
|
85
97
|
const getLogFormatterProvider = () => {
|
|
86
|
-
if (
|
|
87
|
-
if (
|
|
98
|
+
if (logFormat) {
|
|
99
|
+
if (logFormat === "json") {
|
|
88
100
|
return JsonFormatterProvider;
|
|
89
101
|
}
|
|
90
|
-
if (
|
|
102
|
+
if (logFormat === "raw") {
|
|
91
103
|
return RawFormatterProvider;
|
|
92
104
|
}
|
|
93
105
|
return PrettyFormatterProvider;
|
|
@@ -122,7 +134,7 @@ export const AlephaLogger = $module({
|
|
|
122
134
|
|
|
123
135
|
alepha.store.set(
|
|
124
136
|
"alepha.logger.level",
|
|
125
|
-
|
|
137
|
+
logLevel ?? (alepha.isTest() ? "trace" : "info"),
|
|
126
138
|
);
|
|
127
139
|
},
|
|
128
140
|
});
|
|
@@ -130,6 +142,21 @@ export const AlephaLogger = $module({
|
|
|
130
142
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
131
143
|
|
|
132
144
|
const envSchema = t.object({
|
|
145
|
+
/**
|
|
146
|
+
* Enable debug logging for specific modules using the `debug` package convention.
|
|
147
|
+
*
|
|
148
|
+
* @example
|
|
149
|
+
* DEBUG=alepha:* # Enable debug logging for all alepha modules
|
|
150
|
+
* DEBUG=alepha:orm:* # Enable debug logging for alepha.orm modules
|
|
151
|
+
* DEBUG=* # Enable debug logging for all modules
|
|
152
|
+
*/
|
|
153
|
+
DEBUG: t.optional(
|
|
154
|
+
t.text({
|
|
155
|
+
description:
|
|
156
|
+
"Enable debug logging for specific modules using the debug package convention. Example: DEBUG=alepha:*",
|
|
157
|
+
}),
|
|
158
|
+
),
|
|
159
|
+
|
|
133
160
|
/**
|
|
134
161
|
* Default log level for the application.
|
|
135
162
|
*
|
|
@@ -18,14 +18,16 @@ export class PrettyFormatterProvider extends LogFormatterProvider {
|
|
|
18
18
|
details = this.formatError(data);
|
|
19
19
|
} else if (data) {
|
|
20
20
|
let error = "";
|
|
21
|
+
let jsonData = data;
|
|
21
22
|
if ("error" in data && data.error instanceof Error) {
|
|
22
23
|
error = this.formatError(data.error);
|
|
23
|
-
|
|
24
|
+
const { error: _, ...rest } = data;
|
|
25
|
+
jsonData = rest;
|
|
24
26
|
}
|
|
25
27
|
|
|
26
|
-
if (Object.keys(
|
|
28
|
+
if (Object.keys(jsonData).length > 0) {
|
|
27
29
|
try {
|
|
28
|
-
details = JSON.stringify(
|
|
30
|
+
details = JSON.stringify(jsonData);
|
|
29
31
|
} catch {
|
|
30
32
|
details = "[Unserializable Object]";
|
|
31
33
|
}
|