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,5 @@
|
|
|
1
1
|
import { $atom, $inject, $module, $use, Alepha, AlephaError, t } from "alepha";
|
|
2
|
-
import { AlephaCli, AlephaCliUtils, AppEntryProvider, PackageManagerUtils, ViteBuildProvider
|
|
2
|
+
import { AlephaCli, AlephaCliUtils, AppEntryProvider, PackageManagerUtils, ViteBuildProvider } from "alepha/cli";
|
|
3
3
|
import { $command, Asker, EnvUtils, Runner } from "alepha/command";
|
|
4
4
|
import { $logger, ConsoleColorProvider } from "alepha/logger";
|
|
5
5
|
import { FileSystemProvider, ShellProvider } from "alepha/system";
|
|
@@ -112,7 +112,11 @@ const cloudflareSecretSchema = t.object({
|
|
|
112
112
|
name: t.string(),
|
|
113
113
|
type: t.string()
|
|
114
114
|
});
|
|
115
|
-
const createD1BodySchema = t.object({
|
|
115
|
+
const createD1BodySchema = t.object({
|
|
116
|
+
name: t.string(),
|
|
117
|
+
primary_location_hint: t.optional(t.string()),
|
|
118
|
+
jurisdiction: t.optional(t.string())
|
|
119
|
+
});
|
|
116
120
|
const createKVBodySchema = t.object({ title: t.string() });
|
|
117
121
|
const createR2BodySchema = t.object({ name: t.string() });
|
|
118
122
|
const createQueueBodySchema = t.object({ queue_name: t.string() });
|
|
@@ -270,11 +274,14 @@ var CloudflareApi = class CloudflareApi {
|
|
|
270
274
|
const accountId = await this.resolveAccountId();
|
|
271
275
|
return await this.fetch(`/accounts/${accountId}/d1/database`, { schema: t.array(cloudflareD1Schema) });
|
|
272
276
|
}
|
|
273
|
-
async createD1(name) {
|
|
277
|
+
async createD1(name, location = "weur") {
|
|
274
278
|
const accountId = await this.resolveAccountId();
|
|
275
279
|
return await this.fetch(`/accounts/${accountId}/d1/database`, {
|
|
276
280
|
method: "POST",
|
|
277
|
-
body: {
|
|
281
|
+
body: {
|
|
282
|
+
name,
|
|
283
|
+
primary_location_hint: location
|
|
284
|
+
},
|
|
278
285
|
bodySchema: createD1BodySchema,
|
|
279
286
|
schema: cloudflareD1Schema
|
|
280
287
|
});
|
|
@@ -899,21 +906,6 @@ var CloudflareAdapter = class CloudflareAdapter extends PlatformAdapter {
|
|
|
899
906
|
}
|
|
900
907
|
});
|
|
901
908
|
}
|
|
902
|
-
if (ctx.apps.some((a) => a.resources.hasBucket)) {
|
|
903
|
-
const name = ctx.naming.r2();
|
|
904
|
-
await run({
|
|
905
|
-
name: `delete r2 ${name}`,
|
|
906
|
-
handler: async () => {
|
|
907
|
-
try {
|
|
908
|
-
await this.api.deleteR2(name);
|
|
909
|
-
} catch (error) {
|
|
910
|
-
const msg = String(error.message || "");
|
|
911
|
-
if (msg.includes("does not exist") || msg.includes("NoSuchBucket")) {} else if (msg.includes("not empty") || msg.includes("BucketNotEmpty")) this.log.warn(`Bucket ${name} is not empty -- skipped. Empty it manually.`);
|
|
912
|
-
else this.log.warn(`Failed to delete r2 ${name}: ${msg}`);
|
|
913
|
-
}
|
|
914
|
-
}
|
|
915
|
-
});
|
|
916
|
-
}
|
|
917
909
|
if (ctx.apps.some((a) => a.resources.hasDatabase)) if (await this.isPostgres(ctx)) {
|
|
918
910
|
const name = ctx.naming.hyperdrive();
|
|
919
911
|
await run({
|
|
@@ -1045,6 +1037,7 @@ var DockerComposeGenerator = class {
|
|
|
1045
1037
|
const volumes = [];
|
|
1046
1038
|
const needsPostgres = this.anyAppHas(options.apps, "hasDatabase") && !options.envVars.DATABASE_URL;
|
|
1047
1039
|
const needsRedis = (this.anyAppHas(options.apps, "hasKV") || this.anyAppHas(options.apps, "hasQueue")) && !options.envVars.REDIS_URL;
|
|
1040
|
+
const needsRustFS = this.anyAppHas(options.apps, "hasBucket") && !options.envVars.S3_ENDPOINT;
|
|
1048
1041
|
if (needsPostgres) {
|
|
1049
1042
|
const dbName = `${options.project}_${options.env}`.replace(/-/g, "_");
|
|
1050
1043
|
services.push([
|
|
@@ -1065,6 +1058,19 @@ var DockerComposeGenerator = class {
|
|
|
1065
1058
|
" image: redis:7-alpine",
|
|
1066
1059
|
" ports: [\"6379:6379\"]"
|
|
1067
1060
|
].join("\n"));
|
|
1061
|
+
if (needsRustFS) {
|
|
1062
|
+
services.push([
|
|
1063
|
+
" rustfs:",
|
|
1064
|
+
" image: rustfs/rustfs:latest",
|
|
1065
|
+
" ports: [\"9000:9000\"]",
|
|
1066
|
+
" environment:",
|
|
1067
|
+
" RUSTFS_ROOT_USER: alepha",
|
|
1068
|
+
" RUSTFS_ROOT_PASSWORD: alepha",
|
|
1069
|
+
" volumes:",
|
|
1070
|
+
" - rustfs_data:/data"
|
|
1071
|
+
].join("\n"));
|
|
1072
|
+
volumes.push(" rustfs_data:");
|
|
1073
|
+
}
|
|
1068
1074
|
if (services.length === 0) return null;
|
|
1069
1075
|
const parts = [
|
|
1070
1076
|
"# Auto-generated by Alepha. Do not edit.",
|
|
@@ -1110,6 +1116,7 @@ var DockerComposeGenerator = class {
|
|
|
1110
1116
|
const deps = [];
|
|
1111
1117
|
if (app.resources.hasDatabase && !options.envVars.DATABASE_URL) deps.push(" - postgres");
|
|
1112
1118
|
if ((app.resources.hasKV || app.resources.hasQueue) && !options.envVars.REDIS_URL) deps.push(" - redis");
|
|
1119
|
+
if (app.resources.hasBucket && !options.envVars.S3_ENDPOINT) deps.push(" - rustfs");
|
|
1113
1120
|
if (deps.length > 0) appLines.push(" depends_on:", ...deps);
|
|
1114
1121
|
services.push(appLines.join("\n"));
|
|
1115
1122
|
}
|
|
@@ -1135,6 +1142,21 @@ var DockerComposeGenerator = class {
|
|
|
1135
1142
|
redisLines.push(" restart: unless-stopped");
|
|
1136
1143
|
services.push(redisLines.join("\n"));
|
|
1137
1144
|
}
|
|
1145
|
+
if (this.anyAppHas(options.apps, "hasBucket") && !options.envVars.S3_ENDPOINT) {
|
|
1146
|
+
const rustfsLines = [
|
|
1147
|
+
" rustfs:",
|
|
1148
|
+
" image: rustfs/rustfs:latest",
|
|
1149
|
+
" environment:",
|
|
1150
|
+
" RUSTFS_ROOT_USER: alepha",
|
|
1151
|
+
" RUSTFS_ROOT_PASSWORD: ${S3_SECRET_KEY}",
|
|
1152
|
+
" volumes:",
|
|
1153
|
+
" - rustfs_data:/data"
|
|
1154
|
+
];
|
|
1155
|
+
if (hasDomain) rustfsLines.push(" networks:", " - internal");
|
|
1156
|
+
rustfsLines.push(" restart: unless-stopped");
|
|
1157
|
+
services.push(rustfsLines.join("\n"));
|
|
1158
|
+
volumes.push(" rustfs_data:");
|
|
1159
|
+
}
|
|
1138
1160
|
const parts = [
|
|
1139
1161
|
"# Auto-generated by Alepha. Do not edit.",
|
|
1140
1162
|
"services:",
|
|
@@ -1164,7 +1186,7 @@ var DockerComposeGenerator = class {
|
|
|
1164
1186
|
return apps.some((app) => app.resources[resource]);
|
|
1165
1187
|
}
|
|
1166
1188
|
anyAppNeedsInternal(apps, envVars) {
|
|
1167
|
-
return this.anyAppHas(apps, "hasDatabase") && !envVars.DATABASE_URL || (this.anyAppHas(apps, "hasKV") || this.anyAppHas(apps, "hasQueue")) && !envVars.REDIS_URL;
|
|
1189
|
+
return this.anyAppHas(apps, "hasDatabase") && !envVars.DATABASE_URL || (this.anyAppHas(apps, "hasKV") || this.anyAppHas(apps, "hasQueue")) && !envVars.REDIS_URL || this.anyAppHas(apps, "hasBucket") && !envVars.S3_ENDPOINT;
|
|
1168
1190
|
}
|
|
1169
1191
|
};
|
|
1170
1192
|
|
|
@@ -1879,6 +1901,10 @@ const platformOptions = $atom({
|
|
|
1879
1901
|
name: t.optional(t.text()),
|
|
1880
1902
|
apps: t.optional(t.array(t.text())),
|
|
1881
1903
|
default: t.optional(t.text()),
|
|
1904
|
+
secrets: t.optional(t.object({
|
|
1905
|
+
store: t.enum(["github"]),
|
|
1906
|
+
environmentPattern: t.optional(t.text())
|
|
1907
|
+
})),
|
|
1882
1908
|
environments: t.record(t.text(), t.object({
|
|
1883
1909
|
adapter: t.enum([
|
|
1884
1910
|
"cloudflare",
|
|
@@ -2149,6 +2175,296 @@ var PlatformOrchestrator = class {
|
|
|
2149
2175
|
}
|
|
2150
2176
|
};
|
|
2151
2177
|
|
|
2178
|
+
//#endregion
|
|
2179
|
+
//#region ../../src/cli/platform/providers/GitHubSecretStore.ts
|
|
2180
|
+
/**
|
|
2181
|
+
* GitHub Actions secret store backed by the `gh` CLI.
|
|
2182
|
+
*
|
|
2183
|
+
* Requires the GitHub CLI (`gh`) to be installed and authenticated.
|
|
2184
|
+
* Pushes secrets into GitHub Actions environments.
|
|
2185
|
+
*/
|
|
2186
|
+
var GitHubSecretStore = class {
|
|
2187
|
+
log = $logger();
|
|
2188
|
+
shell = $inject(ShellProvider);
|
|
2189
|
+
fs = $inject(FileSystemProvider);
|
|
2190
|
+
/**
|
|
2191
|
+
* Verify that `gh` is installed and authenticated.
|
|
2192
|
+
*/
|
|
2193
|
+
async ensureAvailable() {
|
|
2194
|
+
if (!await this.shell.isInstalled("gh")) throw new AlephaError("GitHub CLI (gh) is not installed. Install it from https://cli.github.com");
|
|
2195
|
+
try {
|
|
2196
|
+
await this.shell.run("gh auth status", { capture: true });
|
|
2197
|
+
} catch {
|
|
2198
|
+
throw new AlephaError("GitHub CLI is not authenticated. Run `gh auth login` first.");
|
|
2199
|
+
}
|
|
2200
|
+
}
|
|
2201
|
+
/**
|
|
2202
|
+
* Create the GitHub Actions environment if it doesn't exist.
|
|
2203
|
+
*/
|
|
2204
|
+
async ensureEnvironment(environment) {
|
|
2205
|
+
await this.shell.run(`gh api --method PUT /repos/{owner}/{repo}/environments/${environment} --silent`, { capture: true });
|
|
2206
|
+
this.log.debug(`Ensured environment "${environment}" exists`);
|
|
2207
|
+
}
|
|
2208
|
+
/**
|
|
2209
|
+
* List all secrets in a GitHub Actions environment.
|
|
2210
|
+
*/
|
|
2211
|
+
async list(environment) {
|
|
2212
|
+
try {
|
|
2213
|
+
const output = await this.shell.run(`gh secret list --env ${environment} --json name,updatedAt`, { capture: true });
|
|
2214
|
+
return JSON.parse(output || "[]").map((s) => ({
|
|
2215
|
+
name: s.name,
|
|
2216
|
+
updatedAt: s.updatedAt
|
|
2217
|
+
}));
|
|
2218
|
+
} catch (error) {
|
|
2219
|
+
this.log.debug("Failed to list secrets", {
|
|
2220
|
+
environment,
|
|
2221
|
+
error
|
|
2222
|
+
});
|
|
2223
|
+
return [];
|
|
2224
|
+
}
|
|
2225
|
+
}
|
|
2226
|
+
/**
|
|
2227
|
+
* Set a secret in a GitHub Actions environment.
|
|
2228
|
+
*
|
|
2229
|
+
* Writes a dotenv-formatted file and uses `gh secret set --env-file` to
|
|
2230
|
+
* avoid shell pipe issues with NodeShellProvider escaping the `|` character.
|
|
2231
|
+
*/
|
|
2232
|
+
async set(environment, key, value) {
|
|
2233
|
+
const tmpFile = `/tmp/alepha-secret-${key}-${Date.now()}`;
|
|
2234
|
+
const escaped = value.replace(/\\/g, "\\\\").replace(/"/g, "\\\"").replace(/\n/g, "\\n");
|
|
2235
|
+
await this.fs.writeFile(tmpFile, `${key}="${escaped}"\n`);
|
|
2236
|
+
try {
|
|
2237
|
+
const output = await this.shell.run(`gh secret set -f ${tmpFile} --env ${environment}`, { capture: true });
|
|
2238
|
+
this.log.debug(`Secret set: ${key}`, { output });
|
|
2239
|
+
} finally {
|
|
2240
|
+
await this.fs.rm(tmpFile);
|
|
2241
|
+
}
|
|
2242
|
+
}
|
|
2243
|
+
/**
|
|
2244
|
+
* Delete a secret from a GitHub Actions environment.
|
|
2245
|
+
*/
|
|
2246
|
+
async delete(environment, key) {
|
|
2247
|
+
await this.shell.run(`gh secret delete ${key} --env ${environment}`, { capture: true });
|
|
2248
|
+
}
|
|
2249
|
+
};
|
|
2250
|
+
|
|
2251
|
+
//#endregion
|
|
2252
|
+
//#region ../../src/cli/platform/services/SecretFilterService.ts
|
|
2253
|
+
/**
|
|
2254
|
+
* Filters environment variables for secret store syncing.
|
|
2255
|
+
*
|
|
2256
|
+
* Excludes platform-managed vars (NODE_ENV), build-time vars (VITE_*),
|
|
2257
|
+
* and empty values. Keeps everything else — including DATABASE_URL
|
|
2258
|
+
* and POSTGRES_SCHEMA which GitHub Actions needs.
|
|
2259
|
+
*
|
|
2260
|
+
* Also handles renaming GITHUB_* keys since GitHub Actions rejects
|
|
2261
|
+
* secret names starting with GITHUB_.
|
|
2262
|
+
*/
|
|
2263
|
+
var SecretFilterService = class SecretFilterService {
|
|
2264
|
+
static EXCLUDED_KEYS = new Set(["NODE_ENV"]);
|
|
2265
|
+
static GITHUB_PREFIX = "GITHUB_";
|
|
2266
|
+
static REMOTE_PREFIX = "APP_GITHUB_";
|
|
2267
|
+
/**
|
|
2268
|
+
* Return only the entries that should be pushed to a secret store.
|
|
2269
|
+
*/
|
|
2270
|
+
filter(envVars) {
|
|
2271
|
+
const result = {};
|
|
2272
|
+
for (const [key, value] of Object.entries(envVars)) {
|
|
2273
|
+
if (!value) continue;
|
|
2274
|
+
if (SecretFilterService.EXCLUDED_KEYS.has(key)) continue;
|
|
2275
|
+
if (key.startsWith("VITE_")) continue;
|
|
2276
|
+
result[key] = value;
|
|
2277
|
+
}
|
|
2278
|
+
return result;
|
|
2279
|
+
}
|
|
2280
|
+
/**
|
|
2281
|
+
* Convert a local env key to a remote secret name.
|
|
2282
|
+
*
|
|
2283
|
+
* GITHUB_* keys are prefixed with APP_ since GitHub Actions rejects
|
|
2284
|
+
* secret names starting with GITHUB_.
|
|
2285
|
+
*/
|
|
2286
|
+
toRemoteName(key) {
|
|
2287
|
+
if (key.startsWith(SecretFilterService.GITHUB_PREFIX)) return `${SecretFilterService.REMOTE_PREFIX}${key.slice(SecretFilterService.GITHUB_PREFIX.length)}`;
|
|
2288
|
+
return key;
|
|
2289
|
+
}
|
|
2290
|
+
/**
|
|
2291
|
+
* Convert a remote secret name back to the local env key.
|
|
2292
|
+
*/
|
|
2293
|
+
toLocalName(remoteName) {
|
|
2294
|
+
if (remoteName.startsWith(SecretFilterService.REMOTE_PREFIX)) return `${SecretFilterService.GITHUB_PREFIX}${remoteName.slice(SecretFilterService.REMOTE_PREFIX.length)}`;
|
|
2295
|
+
return remoteName;
|
|
2296
|
+
}
|
|
2297
|
+
};
|
|
2298
|
+
|
|
2299
|
+
//#endregion
|
|
2300
|
+
//#region ../../src/cli/platform/commands/SecretsCommand.ts
|
|
2301
|
+
var SecretsCommand = class {
|
|
2302
|
+
log = $logger();
|
|
2303
|
+
options = $use(platformOptions);
|
|
2304
|
+
inspector = $inject(PlatformInspector);
|
|
2305
|
+
naming = $inject(NamingService);
|
|
2306
|
+
envUtils = $inject(EnvUtils);
|
|
2307
|
+
githubStore = $inject(GitHubSecretStore);
|
|
2308
|
+
filter = $inject(SecretFilterService);
|
|
2309
|
+
color = $inject(ConsoleColorProvider);
|
|
2310
|
+
envFlags = t.object({ env: t.optional(t.text({
|
|
2311
|
+
aliases: ["e"],
|
|
2312
|
+
description: "Target environment"
|
|
2313
|
+
})) });
|
|
2314
|
+
list = $command({
|
|
2315
|
+
name: "list",
|
|
2316
|
+
aliases: ["ls"],
|
|
2317
|
+
description: "List secrets in the remote store",
|
|
2318
|
+
flags: t.object({
|
|
2319
|
+
env: t.optional(t.text({
|
|
2320
|
+
aliases: ["e"],
|
|
2321
|
+
description: "Target environment"
|
|
2322
|
+
})),
|
|
2323
|
+
format: t.optional(t.text({
|
|
2324
|
+
aliases: ["f"],
|
|
2325
|
+
description: "Output format: table (default), gha"
|
|
2326
|
+
}))
|
|
2327
|
+
}),
|
|
2328
|
+
handler: async ({ flags, root, run }) => {
|
|
2329
|
+
const config = await this.inspector.resolveConfig(root);
|
|
2330
|
+
const env = flags.env ?? config.defaultEnv;
|
|
2331
|
+
const envName = this.resolveEnvironmentName(config.project, env);
|
|
2332
|
+
const format = flags.format ?? "table";
|
|
2333
|
+
const store = this.resolveStore();
|
|
2334
|
+
await store.ensureAvailable();
|
|
2335
|
+
const remoteSecrets = await store.list(envName);
|
|
2336
|
+
run.end();
|
|
2337
|
+
if (format === "gha") {
|
|
2338
|
+
process.stdout.write(`# Generated by alepha — environment: ${envName}\n`);
|
|
2339
|
+
process.stdout.write("env:\n");
|
|
2340
|
+
for (const secret of remoteSecrets) {
|
|
2341
|
+
const localName = this.filter.toLocalName(secret.name);
|
|
2342
|
+
process.stdout.write(` ${localName}: \${{ secrets.${secret.name} }}\n`);
|
|
2343
|
+
}
|
|
2344
|
+
return;
|
|
2345
|
+
}
|
|
2346
|
+
const c = this.color;
|
|
2347
|
+
if (remoteSecrets.length === 0) {
|
|
2348
|
+
process.stdout.write(`\nNo secrets in environment ${c.set("CYAN", envName)}.\n\n`);
|
|
2349
|
+
return;
|
|
2350
|
+
}
|
|
2351
|
+
process.stdout.write(`\n${c.set("GREY_LIGHT", "Environment:")} ${c.set("CYAN", envName)}\n\n`);
|
|
2352
|
+
const maxNameLen = Math.max(...remoteSecrets.map((s) => s.name.length), 4);
|
|
2353
|
+
process.stdout.write(` ${c.set("GREY_LIGHT", "NAME".padEnd(maxNameLen + 2))}${c.set("GREY_LIGHT", "UPDATED")}\n`);
|
|
2354
|
+
for (const secret of remoteSecrets) {
|
|
2355
|
+
const updated = secret.updatedAt ? new Date(secret.updatedAt).toLocaleString() : "-";
|
|
2356
|
+
process.stdout.write(` ${c.set("CYAN", secret.name.padEnd(maxNameLen + 2))}${c.set("GREY_DARK", updated)}\n`);
|
|
2357
|
+
}
|
|
2358
|
+
process.stdout.write("\n");
|
|
2359
|
+
}
|
|
2360
|
+
});
|
|
2361
|
+
diff = $command({
|
|
2362
|
+
name: "diff",
|
|
2363
|
+
description: "Compare local .env keys with remote store",
|
|
2364
|
+
flags: this.envFlags,
|
|
2365
|
+
handler: async ({ flags, root, run }) => {
|
|
2366
|
+
const config = await this.inspector.resolveConfig(root);
|
|
2367
|
+
const env = flags.env ?? config.defaultEnv;
|
|
2368
|
+
const envName = this.resolveEnvironmentName(config.project, env);
|
|
2369
|
+
const envVars = await this.envUtils.parseEnv(root, [`.env.${env}`]);
|
|
2370
|
+
const filtered = this.filter.filter(envVars);
|
|
2371
|
+
const localKeys = new Set(Object.keys(filtered).map((k) => this.filter.toRemoteName(k)));
|
|
2372
|
+
const store = this.resolveStore();
|
|
2373
|
+
await store.ensureAvailable();
|
|
2374
|
+
const remoteSecrets = await store.list(envName);
|
|
2375
|
+
const remoteKeys = new Set(remoteSecrets.map((s) => s.name));
|
|
2376
|
+
run.end();
|
|
2377
|
+
const c = this.color;
|
|
2378
|
+
const allKeys = [...new Set([...localKeys, ...remoteKeys])].sort();
|
|
2379
|
+
process.stdout.write(`\n${c.set("GREY_LIGHT", "Environment:")} ${c.set("CYAN", envName)}\n\n`);
|
|
2380
|
+
let hasChanges = false;
|
|
2381
|
+
for (const key of allKeys) {
|
|
2382
|
+
const inLocal = localKeys.has(key);
|
|
2383
|
+
const inRemote = remoteKeys.has(key);
|
|
2384
|
+
if (inLocal && !inRemote) {
|
|
2385
|
+
process.stdout.write(` ${c.set("GREEN", "+")} ${key}\n`);
|
|
2386
|
+
hasChanges = true;
|
|
2387
|
+
} else if (!inLocal && inRemote) {
|
|
2388
|
+
process.stdout.write(` ${c.set("RED", "-")} ${key}\n`);
|
|
2389
|
+
hasChanges = true;
|
|
2390
|
+
} else process.stdout.write(` ${c.set("GREY_DARK", "=")} ${key}\n`);
|
|
2391
|
+
}
|
|
2392
|
+
if (!hasChanges) process.stdout.write(` ${c.set("GREEN", "Local and remote are in sync.")}\n`);
|
|
2393
|
+
process.stdout.write("\n");
|
|
2394
|
+
}
|
|
2395
|
+
});
|
|
2396
|
+
apply = $command({
|
|
2397
|
+
name: "apply",
|
|
2398
|
+
description: "Push local .env secrets to the remote store",
|
|
2399
|
+
flags: t.object({
|
|
2400
|
+
env: t.optional(t.text({
|
|
2401
|
+
aliases: ["e"],
|
|
2402
|
+
description: "Target environment"
|
|
2403
|
+
})),
|
|
2404
|
+
"dry-run": t.optional(t.boolean({ description: "Preview changes without pushing" }))
|
|
2405
|
+
}),
|
|
2406
|
+
handler: async ({ flags, root, run }) => {
|
|
2407
|
+
const config = await this.inspector.resolveConfig(root);
|
|
2408
|
+
const env = flags.env ?? config.defaultEnv;
|
|
2409
|
+
const envName = this.resolveEnvironmentName(config.project, env);
|
|
2410
|
+
const dryRun = flags["dry-run"] ?? false;
|
|
2411
|
+
const envVars = await this.envUtils.parseEnv(root, [`.env.${env}`]);
|
|
2412
|
+
const filtered = this.filter.filter(envVars);
|
|
2413
|
+
const keys = Object.keys(filtered);
|
|
2414
|
+
if (keys.length === 0) {
|
|
2415
|
+
run.end();
|
|
2416
|
+
process.stdout.write("\nNo secrets to push.\n\n");
|
|
2417
|
+
return;
|
|
2418
|
+
}
|
|
2419
|
+
if (dryRun) {
|
|
2420
|
+
run.end();
|
|
2421
|
+
const c = this.color;
|
|
2422
|
+
process.stdout.write(`\n${c.set("GREY_LIGHT", "Dry run — environment:")} ${c.set("CYAN", envName)}\n\n`);
|
|
2423
|
+
for (const key of keys) process.stdout.write(` ${c.set("GREEN", "+")} ${key}\n`);
|
|
2424
|
+
process.stdout.write(`\n ${keys.length} secret(s) would be pushed.\n\n`);
|
|
2425
|
+
return;
|
|
2426
|
+
}
|
|
2427
|
+
const store = this.resolveStore();
|
|
2428
|
+
await store.ensureAvailable();
|
|
2429
|
+
await store.ensureEnvironment(envName);
|
|
2430
|
+
for (const key of keys) {
|
|
2431
|
+
const remoteName = this.filter.toRemoteName(key);
|
|
2432
|
+
await run({
|
|
2433
|
+
name: `push ${remoteName}`,
|
|
2434
|
+
handler: async () => {
|
|
2435
|
+
await store.set(envName, remoteName, filtered[key]);
|
|
2436
|
+
}
|
|
2437
|
+
});
|
|
2438
|
+
}
|
|
2439
|
+
run.end();
|
|
2440
|
+
process.stdout.write(`\n${keys.length} secret(s) pushed to ${envName}.\n`);
|
|
2441
|
+
}
|
|
2442
|
+
});
|
|
2443
|
+
secrets = $command({
|
|
2444
|
+
name: "secrets",
|
|
2445
|
+
aliases: ["sec"],
|
|
2446
|
+
description: "Manage secrets in external stores",
|
|
2447
|
+
children: [
|
|
2448
|
+
this.list,
|
|
2449
|
+
this.diff,
|
|
2450
|
+
this.apply
|
|
2451
|
+
],
|
|
2452
|
+
handler: async ({ help }) => {
|
|
2453
|
+
help();
|
|
2454
|
+
}
|
|
2455
|
+
});
|
|
2456
|
+
resolveStore() {
|
|
2457
|
+
const storeName = this.options?.secrets?.store ?? "github";
|
|
2458
|
+
switch (storeName) {
|
|
2459
|
+
case "github": return this.githubStore;
|
|
2460
|
+
default: throw new AlephaError(`Unknown secret store "${storeName}". Available: github`);
|
|
2461
|
+
}
|
|
2462
|
+
}
|
|
2463
|
+
resolveEnvironmentName(project, env) {
|
|
2464
|
+
return (this.options?.secrets?.environmentPattern ?? "{project}-{env}").replace("{project}", this.naming.slugify(project)).replace("{env}", this.naming.slugify(env));
|
|
2465
|
+
}
|
|
2466
|
+
};
|
|
2467
|
+
|
|
2152
2468
|
//#endregion
|
|
2153
2469
|
//#region ../../src/cli/platform/commands/platform.ts
|
|
2154
2470
|
var PlatformCommand = class {
|
|
@@ -2161,6 +2477,7 @@ var PlatformCommand = class {
|
|
|
2161
2477
|
viteBuild = $inject(ViteBuildProvider);
|
|
2162
2478
|
color = $inject(ConsoleColorProvider);
|
|
2163
2479
|
envUtils = $inject(EnvUtils);
|
|
2480
|
+
secretsCommand = $inject(SecretsCommand);
|
|
2164
2481
|
/**
|
|
2165
2482
|
* Common flags for env/app targeting.
|
|
2166
2483
|
*/
|
|
@@ -2226,6 +2543,16 @@ var PlatformCommand = class {
|
|
|
2226
2543
|
});
|
|
2227
2544
|
}
|
|
2228
2545
|
}
|
|
2546
|
+
if (adapterName === "docker" || adapterName === "docker-compose") {
|
|
2547
|
+
if (hasDB && !envVars.DATABASE_URL) resources.push({
|
|
2548
|
+
label: "Postgres",
|
|
2549
|
+
value: "postgres:17-alpine"
|
|
2550
|
+
});
|
|
2551
|
+
if (hasBucket && !envVars.S3_ENDPOINT) resources.push({
|
|
2552
|
+
label: "RustFS",
|
|
2553
|
+
value: "rustfs/rustfs:latest"
|
|
2554
|
+
});
|
|
2555
|
+
}
|
|
2229
2556
|
const excludedKeys = adapterName === "vercel" ? VercelAdapter.EXCLUDED_SECRET_KEYS : CloudflareAdapter.EXCLUDED_SECRET_KEYS;
|
|
2230
2557
|
const secretCount = Object.entries(envVars).filter(([key, value]) => value && !excludedKeys.has(key) && !key.startsWith("VITE_")).length;
|
|
2231
2558
|
if (flags.json) {
|
|
@@ -2507,7 +2834,8 @@ var PlatformCommand = class {
|
|
|
2507
2834
|
this.status,
|
|
2508
2835
|
this.build,
|
|
2509
2836
|
this.deploy,
|
|
2510
|
-
this.migrate
|
|
2837
|
+
this.migrate,
|
|
2838
|
+
this.secretsCommand.secrets
|
|
2511
2839
|
],
|
|
2512
2840
|
handler: async ({ help, root }) => {
|
|
2513
2841
|
await this.inspector.resolveConfig(root);
|
|
@@ -2590,6 +2918,107 @@ var PlatformCommand = class {
|
|
|
2590
2918
|
}
|
|
2591
2919
|
};
|
|
2592
2920
|
|
|
2921
|
+
//#endregion
|
|
2922
|
+
//#region ../../src/cli/platform/providers/MemorySecretStore.ts
|
|
2923
|
+
/**
|
|
2924
|
+
* In-memory implementation of SecretStoreProvider for testing.
|
|
2925
|
+
* Records all operations and stores secrets in a nested Map.
|
|
2926
|
+
*/
|
|
2927
|
+
var MemorySecretStore = class {
|
|
2928
|
+
/**
|
|
2929
|
+
* Secrets keyed by environment, then by key.
|
|
2930
|
+
*/
|
|
2931
|
+
secrets = /* @__PURE__ */ new Map();
|
|
2932
|
+
/**
|
|
2933
|
+
* All recorded operations.
|
|
2934
|
+
*/
|
|
2935
|
+
calls = [];
|
|
2936
|
+
/**
|
|
2937
|
+
* When set, ensureAvailable() will throw with this message.
|
|
2938
|
+
*/
|
|
2939
|
+
availableError = null;
|
|
2940
|
+
async ensureAvailable() {
|
|
2941
|
+
this.calls.push({ method: "ensureAvailable" });
|
|
2942
|
+
if (this.availableError) throw new Error(this.availableError);
|
|
2943
|
+
}
|
|
2944
|
+
async ensureEnvironment(environment) {
|
|
2945
|
+
this.calls.push({
|
|
2946
|
+
method: "ensureEnvironment",
|
|
2947
|
+
environment
|
|
2948
|
+
});
|
|
2949
|
+
if (!this.secrets.has(environment)) this.secrets.set(environment, /* @__PURE__ */ new Map());
|
|
2950
|
+
}
|
|
2951
|
+
async list(environment) {
|
|
2952
|
+
this.calls.push({
|
|
2953
|
+
method: "list",
|
|
2954
|
+
environment
|
|
2955
|
+
});
|
|
2956
|
+
const envSecrets = this.secrets.get(environment);
|
|
2957
|
+
if (!envSecrets) return [];
|
|
2958
|
+
return Array.from(envSecrets.keys()).map((name) => ({ name }));
|
|
2959
|
+
}
|
|
2960
|
+
async set(environment, key, value) {
|
|
2961
|
+
this.calls.push({
|
|
2962
|
+
method: "set",
|
|
2963
|
+
environment,
|
|
2964
|
+
key,
|
|
2965
|
+
value
|
|
2966
|
+
});
|
|
2967
|
+
let envSecrets = this.secrets.get(environment);
|
|
2968
|
+
if (!envSecrets) {
|
|
2969
|
+
envSecrets = /* @__PURE__ */ new Map();
|
|
2970
|
+
this.secrets.set(environment, envSecrets);
|
|
2971
|
+
}
|
|
2972
|
+
envSecrets.set(key, value);
|
|
2973
|
+
}
|
|
2974
|
+
async delete(environment, key) {
|
|
2975
|
+
this.calls.push({
|
|
2976
|
+
method: "delete",
|
|
2977
|
+
environment,
|
|
2978
|
+
key
|
|
2979
|
+
});
|
|
2980
|
+
this.secrets.get(environment)?.delete(key);
|
|
2981
|
+
}
|
|
2982
|
+
/**
|
|
2983
|
+
* Check if set() was called for a given environment and key.
|
|
2984
|
+
*/
|
|
2985
|
+
wasSet(environment, key) {
|
|
2986
|
+
return this.calls.some((c) => c.method === "set" && c.environment === environment && c.key === key);
|
|
2987
|
+
}
|
|
2988
|
+
/**
|
|
2989
|
+
* Check if delete() was called for a given environment and key.
|
|
2990
|
+
*/
|
|
2991
|
+
wasDeleted(environment, key) {
|
|
2992
|
+
return this.calls.some((c) => c.method === "delete" && c.environment === environment && c.key === key);
|
|
2993
|
+
}
|
|
2994
|
+
/**
|
|
2995
|
+
* Get all set() calls for a given environment.
|
|
2996
|
+
*/
|
|
2997
|
+
getSetCalls(environment) {
|
|
2998
|
+
return this.calls.filter((c) => c.method === "set" && c.environment === environment).map((c) => ({
|
|
2999
|
+
key: c.key,
|
|
3000
|
+
value: c.value
|
|
3001
|
+
}));
|
|
3002
|
+
}
|
|
3003
|
+
/**
|
|
3004
|
+
* Reset all state.
|
|
3005
|
+
*/
|
|
3006
|
+
reset() {
|
|
3007
|
+
this.secrets.clear();
|
|
3008
|
+
this.calls = [];
|
|
3009
|
+
this.availableError = null;
|
|
3010
|
+
}
|
|
3011
|
+
};
|
|
3012
|
+
|
|
3013
|
+
//#endregion
|
|
3014
|
+
//#region ../../src/cli/platform/providers/SecretStoreProvider.ts
|
|
3015
|
+
/**
|
|
3016
|
+
* Abstract provider for managing secrets in an external store.
|
|
3017
|
+
*
|
|
3018
|
+
* Implementations: GitHubSecretStore, MemorySecretStore
|
|
3019
|
+
*/
|
|
3020
|
+
var SecretStoreProvider = class {};
|
|
3021
|
+
|
|
2593
3022
|
//#endregion
|
|
2594
3023
|
//#region ../../src/cli/platform/schemas/platform.ts
|
|
2595
3024
|
const platformStatusWorkerSchema = t.object({
|
|
@@ -2654,14 +3083,12 @@ const platformPlanSchema = t.object({
|
|
|
2654
3083
|
|
|
2655
3084
|
//#endregion
|
|
2656
3085
|
//#region ../../src/cli/platform/index.ts
|
|
2657
|
-
registerConfigProcessor((alepha, config) => {
|
|
2658
|
-
if (config.platform) alepha.set(platformOptions, config.platform);
|
|
2659
|
-
});
|
|
2660
3086
|
const AlephaCliPlatform = $module({
|
|
2661
3087
|
name: "alepha.cli.platform",
|
|
2662
3088
|
services: [
|
|
2663
3089
|
AlephaCli,
|
|
2664
3090
|
PlatformCommand,
|
|
3091
|
+
SecretsCommand,
|
|
2665
3092
|
CloudflareAdapter,
|
|
2666
3093
|
CloudflareApi,
|
|
2667
3094
|
DockerAdapter,
|
|
@@ -2672,12 +3099,15 @@ const AlephaCliPlatform = $module({
|
|
|
2672
3099
|
VercelCli,
|
|
2673
3100
|
WranglerApi,
|
|
2674
3101
|
PlatformCacheProvider,
|
|
3102
|
+
GitHubSecretStore,
|
|
3103
|
+
MemorySecretStore,
|
|
2675
3104
|
NamingService,
|
|
3105
|
+
SecretFilterService,
|
|
2676
3106
|
PlatformInspector,
|
|
2677
3107
|
PlatformOrchestrator
|
|
2678
3108
|
]
|
|
2679
3109
|
});
|
|
2680
3110
|
|
|
2681
3111
|
//#endregion
|
|
2682
|
-
export { AlephaCliPlatform, CloudflareAdapter, CloudflareApi, DockerAdapter, DockerComposeGenerator, DockerSshService, NamingContext, NamingService, PlatformAdapter, PlatformCacheProvider, PlatformCommand, PlatformInspector, PlatformOrchestrator, VercelAdapter, VercelApi, VercelCli, WranglerApi, cloudflareAccountSchema, cloudflareApiErrorSchema, cloudflareD1Schema, cloudflareDeploymentListSchema, cloudflareDeploymentSchema, cloudflareDeploymentVersionSchema, cloudflareHyperdriveOriginSchema, cloudflareHyperdriveSchema, cloudflareKVSchema, cloudflareQueueConsumerSchema, cloudflareQueueSchema, cloudflareR2ListSchema, cloudflareR2Schema, cloudflareSecretSchema, cloudflareVersionListSchema, cloudflareVersionSchema, cloudflareWorkerSchema, createD1BodySchema, createEnvVarBodySchema, createHyperdriveBodySchema, createHyperdriveOriginSchema, createKVBodySchema, createProjectBodySchema, createQueueBodySchema, createR2BodySchema, platformOptions, platformPlanAppResourcesSchema, platformPlanAppSchema, platformPlanEnvironmentSchema, platformPlanResourceSchema, platformPlanSchema, platformStatusResourceSchema, platformStatusSchema, platformStatusSecretSchema, platformStatusWorkerSchema, putSecretBodySchema, vercelDeploymentSchema, vercelEnvVarSchema, vercelProjectSchema };
|
|
3112
|
+
export { AlephaCliPlatform, CloudflareAdapter, CloudflareApi, DockerAdapter, DockerComposeGenerator, DockerSshService, GitHubSecretStore, MemorySecretStore, NamingContext, NamingService, PlatformAdapter, PlatformCacheProvider, PlatformCommand, PlatformInspector, PlatformOrchestrator, SecretFilterService, SecretStoreProvider, SecretsCommand, VercelAdapter, VercelApi, VercelCli, WranglerApi, cloudflareAccountSchema, cloudflareApiErrorSchema, cloudflareD1Schema, cloudflareDeploymentListSchema, cloudflareDeploymentSchema, cloudflareDeploymentVersionSchema, cloudflareHyperdriveOriginSchema, cloudflareHyperdriveSchema, cloudflareKVSchema, cloudflareQueueConsumerSchema, cloudflareQueueSchema, cloudflareR2ListSchema, cloudflareR2Schema, cloudflareSecretSchema, cloudflareVersionListSchema, cloudflareVersionSchema, cloudflareWorkerSchema, createD1BodySchema, createEnvVarBodySchema, createHyperdriveBodySchema, createHyperdriveOriginSchema, createKVBodySchema, createProjectBodySchema, createQueueBodySchema, createR2BodySchema, platformOptions, platformPlanAppResourcesSchema, platformPlanAppSchema, platformPlanEnvironmentSchema, platformPlanResourceSchema, platformPlanSchema, platformStatusResourceSchema, platformStatusSchema, platformStatusSecretSchema, platformStatusWorkerSchema, putSecretBodySchema, vercelDeploymentSchema, vercelEnvVarSchema, vercelProjectSchema };
|
|
2683
3113
|
//# sourceMappingURL=index.js.map
|