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
|
@@ -192,124 +192,407 @@ const NotFound = (props) => /* @__PURE__ */ jsxs("div", {
|
|
|
192
192
|
})]
|
|
193
193
|
});
|
|
194
194
|
|
|
195
|
+
//#endregion
|
|
196
|
+
//#region ../../src/react/router/errors/Redirection.ts
|
|
197
|
+
/**
|
|
198
|
+
* Used for Redirection during the page loading.
|
|
199
|
+
*
|
|
200
|
+
* Depends on the context, it can be thrown or just returned.
|
|
201
|
+
*
|
|
202
|
+
* @example
|
|
203
|
+
* ```ts
|
|
204
|
+
* import { Redirection } from "alepha/react";
|
|
205
|
+
*
|
|
206
|
+
* const MyPage = $page({
|
|
207
|
+
* loader: async () => {
|
|
208
|
+
* if (needRedirect) {
|
|
209
|
+
* throw new Redirection("/new-path");
|
|
210
|
+
* }
|
|
211
|
+
* },
|
|
212
|
+
* });
|
|
213
|
+
* ```
|
|
214
|
+
*/
|
|
215
|
+
var Redirection = class extends AlephaError {
|
|
216
|
+
redirect;
|
|
217
|
+
constructor(redirect) {
|
|
218
|
+
super("Redirection");
|
|
219
|
+
this.redirect = redirect;
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
//#endregion
|
|
224
|
+
//#region ../../src/react/router/hooks/useRouterState.ts
|
|
225
|
+
const useRouterState = () => {
|
|
226
|
+
const [state] = useStore("alepha.react.router.state");
|
|
227
|
+
if (!state) throw new AlephaError("Missing react router state");
|
|
228
|
+
return state;
|
|
229
|
+
};
|
|
230
|
+
|
|
195
231
|
//#endregion
|
|
196
232
|
//#region ../../src/react/router/components/ErrorViewer.tsx
|
|
197
233
|
const mono = "ui-monospace, \"JetBrains Mono\", SFMono-Regular, Menlo, Monaco, Consolas, monospace";
|
|
198
|
-
const ErrorViewer = (
|
|
199
|
-
if (alepha.isProduction()) return /* @__PURE__ */ jsx(
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
234
|
+
const ErrorViewer = (props) => {
|
|
235
|
+
if (props.alepha.isProduction()) return /* @__PURE__ */ jsx(ProdErrorPage, { error: props.error });
|
|
236
|
+
return /* @__PURE__ */ jsx(DevErrorPage, { ...props });
|
|
237
|
+
};
|
|
238
|
+
const DevErrorPage = (props) => {
|
|
239
|
+
const [copied, setCopied] = useState(false);
|
|
240
|
+
const pathname = useRouterState().url.pathname;
|
|
241
|
+
const handleCopy = () => {
|
|
242
|
+
const text = buildErrorText(props.error);
|
|
243
|
+
if (typeof navigator !== "undefined" && navigator.clipboard) {
|
|
244
|
+
navigator.clipboard.writeText(text);
|
|
245
|
+
setCopied(true);
|
|
246
|
+
setTimeout(() => setCopied(false), 2e3);
|
|
247
|
+
}
|
|
248
|
+
};
|
|
249
|
+
const status = getHttpStatus(props.error);
|
|
203
250
|
return /* @__PURE__ */ jsx("div", {
|
|
204
|
-
style:
|
|
205
|
-
children: /* @__PURE__ */
|
|
251
|
+
style: dev.overlay,
|
|
252
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
253
|
+
style: dev.card,
|
|
254
|
+
children: [
|
|
255
|
+
/* @__PURE__ */ jsxs("div", {
|
|
256
|
+
style: dev.header,
|
|
257
|
+
children: [/* @__PURE__ */ jsxs("div", {
|
|
258
|
+
style: dev.headerLeft,
|
|
259
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
260
|
+
style: dev.icon,
|
|
261
|
+
children: "!"
|
|
262
|
+
}), /* @__PURE__ */ jsx("div", {
|
|
263
|
+
style: dev.title,
|
|
264
|
+
children: props.error.name || "Error"
|
|
265
|
+
})]
|
|
266
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
267
|
+
style: dev.headerRight,
|
|
268
|
+
children: [props.onRetry && /* @__PURE__ */ jsx("button", {
|
|
269
|
+
type: "button",
|
|
270
|
+
style: dev.retryBtn,
|
|
271
|
+
onClick: props.onRetry,
|
|
272
|
+
children: "Retry"
|
|
273
|
+
}), /* @__PURE__ */ jsx("button", {
|
|
274
|
+
type: "button",
|
|
275
|
+
style: dev.copyBtn,
|
|
276
|
+
onClick: handleCopy,
|
|
277
|
+
children: copied ? "Copied" : "Copy"
|
|
278
|
+
})]
|
|
279
|
+
})]
|
|
280
|
+
}),
|
|
281
|
+
/* @__PURE__ */ jsx(ErrorBlock, { error: props.error }),
|
|
282
|
+
/* @__PURE__ */ jsxs("div", {
|
|
283
|
+
style: dev.meta,
|
|
284
|
+
children: [
|
|
285
|
+
pathname && /* @__PURE__ */ jsx("span", {
|
|
286
|
+
style: dev.metaItem,
|
|
287
|
+
children: pathname
|
|
288
|
+
}),
|
|
289
|
+
/* @__PURE__ */ jsx("span", {
|
|
290
|
+
style: dev.metaItem,
|
|
291
|
+
children: (/* @__PURE__ */ new Date()).toLocaleTimeString()
|
|
292
|
+
}),
|
|
293
|
+
status && /* @__PURE__ */ jsx("span", {
|
|
294
|
+
style: dev.statusBadge,
|
|
295
|
+
children: status
|
|
296
|
+
})
|
|
297
|
+
]
|
|
298
|
+
})
|
|
299
|
+
]
|
|
300
|
+
})
|
|
206
301
|
});
|
|
207
302
|
};
|
|
208
|
-
|
|
303
|
+
const ErrorBlock = (props) => {
|
|
304
|
+
const { error, depth = 0 } = props;
|
|
209
305
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
210
306
|
depth > 0 && /* @__PURE__ */ jsx("div", {
|
|
211
|
-
style:
|
|
307
|
+
style: dev.causedBy,
|
|
212
308
|
children: "Caused by:"
|
|
213
309
|
}),
|
|
214
|
-
/* @__PURE__ */ jsxs("
|
|
215
|
-
style:
|
|
310
|
+
/* @__PURE__ */ jsxs("pre", {
|
|
311
|
+
style: dev.messageBlock,
|
|
216
312
|
children: [
|
|
217
313
|
error.name,
|
|
218
314
|
": ",
|
|
219
315
|
error.message
|
|
220
316
|
]
|
|
221
317
|
}),
|
|
222
|
-
error.stack && /* @__PURE__ */ jsx("
|
|
223
|
-
style:
|
|
318
|
+
error.stack && /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("div", {
|
|
319
|
+
style: dev.stackLabel,
|
|
320
|
+
children: "STACK TRACE"
|
|
321
|
+
}), /* @__PURE__ */ jsx("pre", {
|
|
322
|
+
style: dev.stackBlock,
|
|
224
323
|
children: cleanStack(error.stack)
|
|
225
|
-
}),
|
|
324
|
+
})] }),
|
|
226
325
|
error.cause instanceof Error && /* @__PURE__ */ jsx(ErrorBlock, {
|
|
227
326
|
error: error.cause,
|
|
228
327
|
depth: depth + 1
|
|
229
328
|
})
|
|
230
329
|
] });
|
|
231
|
-
}
|
|
330
|
+
};
|
|
331
|
+
const ProdErrorPage = (props) => {
|
|
332
|
+
const requestId = props.error.requestId;
|
|
333
|
+
const handleReload = () => {
|
|
334
|
+
if (typeof window !== "undefined") window.location.reload();
|
|
335
|
+
};
|
|
336
|
+
return /* @__PURE__ */ jsx("div", {
|
|
337
|
+
style: prod.page,
|
|
338
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
339
|
+
style: prod.card,
|
|
340
|
+
children: [
|
|
341
|
+
/* @__PURE__ */ jsx("div", {
|
|
342
|
+
style: prod.heading,
|
|
343
|
+
children: "Something went wrong"
|
|
344
|
+
}),
|
|
345
|
+
/* @__PURE__ */ jsx("div", {
|
|
346
|
+
style: prod.subtitle,
|
|
347
|
+
children: "We're having trouble processing your request."
|
|
348
|
+
}),
|
|
349
|
+
requestId && /* @__PURE__ */ jsxs("div", {
|
|
350
|
+
style: prod.refText,
|
|
351
|
+
children: ["Reference: ", requestId]
|
|
352
|
+
}),
|
|
353
|
+
/* @__PURE__ */ jsxs("div", {
|
|
354
|
+
style: prod.actions,
|
|
355
|
+
children: [/* @__PURE__ */ jsx("button", {
|
|
356
|
+
type: "button",
|
|
357
|
+
style: prod.reloadBtn,
|
|
358
|
+
onClick: handleReload,
|
|
359
|
+
children: "Reload page"
|
|
360
|
+
}), /* @__PURE__ */ jsx("a", {
|
|
361
|
+
href: "/",
|
|
362
|
+
style: prod.homeLink,
|
|
363
|
+
children: "Go home"
|
|
364
|
+
})]
|
|
365
|
+
})
|
|
366
|
+
]
|
|
367
|
+
})
|
|
368
|
+
});
|
|
369
|
+
};
|
|
232
370
|
function cleanStack(stack) {
|
|
233
371
|
return stack.split("\n").slice(1).map((l) => l.trim()).join("\n");
|
|
234
372
|
}
|
|
235
|
-
|
|
236
|
-
|
|
373
|
+
function buildErrorText(error) {
|
|
374
|
+
const parts = [];
|
|
375
|
+
const append = (err, depth) => {
|
|
376
|
+
if (depth > 0) parts.push(`\nCaused by:`);
|
|
377
|
+
parts.push(`${err.name}: ${err.message}`);
|
|
378
|
+
if (err.stack) parts.push(cleanStack(err.stack));
|
|
379
|
+
if (err.cause instanceof Error) append(err.cause, depth + 1);
|
|
380
|
+
};
|
|
381
|
+
append(error, 0);
|
|
382
|
+
return parts.join("\n");
|
|
383
|
+
}
|
|
384
|
+
function getHttpStatus(error) {
|
|
385
|
+
if ("status" in error && typeof error.status === "number") return error.status;
|
|
386
|
+
}
|
|
387
|
+
const dev = {
|
|
388
|
+
overlay: {
|
|
389
|
+
position: "fixed",
|
|
390
|
+
inset: 0,
|
|
391
|
+
zIndex: 2147483647,
|
|
392
|
+
display: "flex",
|
|
393
|
+
alignItems: "center",
|
|
394
|
+
justifyContent: "center",
|
|
237
395
|
padding: "24px",
|
|
396
|
+
backgroundColor: "rgba(0, 0, 0, 0.75)",
|
|
397
|
+
backdropFilter: "blur(4px)",
|
|
238
398
|
fontFamily: mono,
|
|
239
399
|
fontSize: "13px",
|
|
240
|
-
color: "#
|
|
241
|
-
|
|
400
|
+
color: "#e5e7eb",
|
|
401
|
+
boxSizing: "border-box",
|
|
402
|
+
overflow: "auto"
|
|
242
403
|
},
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
404
|
+
card: {
|
|
405
|
+
width: "100%",
|
|
406
|
+
maxWidth: "900px",
|
|
407
|
+
maxHeight: "90vh",
|
|
408
|
+
overflow: "auto",
|
|
409
|
+
padding: "24px",
|
|
410
|
+
backgroundColor: "#111",
|
|
411
|
+
borderLeft: "4px solid #ef4444",
|
|
412
|
+
borderRadius: "8px",
|
|
413
|
+
boxShadow: "0 25px 50px rgba(0, 0, 0, 0.5)"
|
|
414
|
+
},
|
|
415
|
+
header: {
|
|
416
|
+
display: "flex",
|
|
417
|
+
alignItems: "center",
|
|
418
|
+
justifyContent: "space-between",
|
|
419
|
+
marginBottom: "20px",
|
|
420
|
+
flexWrap: "wrap",
|
|
421
|
+
gap: "12px"
|
|
422
|
+
},
|
|
423
|
+
headerLeft: {
|
|
424
|
+
display: "flex",
|
|
425
|
+
alignItems: "center",
|
|
426
|
+
gap: "12px",
|
|
427
|
+
minWidth: 0
|
|
428
|
+
},
|
|
429
|
+
headerRight: {
|
|
430
|
+
display: "flex",
|
|
431
|
+
gap: "8px",
|
|
432
|
+
flexShrink: 0
|
|
433
|
+
},
|
|
434
|
+
icon: {
|
|
435
|
+
width: "28px",
|
|
436
|
+
height: "28px",
|
|
437
|
+
borderRadius: "50%",
|
|
438
|
+
backgroundColor: "#ef4444",
|
|
439
|
+
color: "#fff",
|
|
440
|
+
display: "flex",
|
|
441
|
+
alignItems: "center",
|
|
442
|
+
justifyContent: "center",
|
|
443
|
+
fontWeight: 700,
|
|
444
|
+
fontSize: "16px",
|
|
445
|
+
flexShrink: 0
|
|
446
|
+
},
|
|
447
|
+
title: {
|
|
448
|
+
color: "#f87171",
|
|
449
|
+
fontSize: "18px",
|
|
450
|
+
fontWeight: 700
|
|
451
|
+
},
|
|
452
|
+
retryBtn: {
|
|
453
|
+
padding: "6px 16px",
|
|
454
|
+
backgroundColor: "#2563eb",
|
|
455
|
+
color: "#fff",
|
|
456
|
+
border: "none",
|
|
457
|
+
borderRadius: "6px",
|
|
458
|
+
cursor: "pointer",
|
|
459
|
+
fontFamily: mono,
|
|
460
|
+
fontSize: "12px",
|
|
461
|
+
fontWeight: 600
|
|
462
|
+
},
|
|
463
|
+
copyBtn: {
|
|
464
|
+
padding: "6px 16px",
|
|
465
|
+
backgroundColor: "transparent",
|
|
466
|
+
color: "#9ca3af",
|
|
467
|
+
border: "1px solid #374151",
|
|
468
|
+
borderRadius: "6px",
|
|
469
|
+
cursor: "pointer",
|
|
470
|
+
fontFamily: mono,
|
|
471
|
+
fontSize: "12px",
|
|
472
|
+
fontWeight: 600
|
|
249
473
|
},
|
|
250
|
-
|
|
474
|
+
messageBlock: {
|
|
475
|
+
margin: "0 0 12px",
|
|
476
|
+
padding: "12px",
|
|
477
|
+
backgroundColor: "#1f2937",
|
|
478
|
+
borderRadius: "6px",
|
|
479
|
+
color: "#f9fafb",
|
|
480
|
+
fontSize: "13px",
|
|
481
|
+
lineHeight: 1.6,
|
|
482
|
+
whiteSpace: "pre-wrap",
|
|
483
|
+
wordBreak: "break-word",
|
|
484
|
+
overflow: "auto"
|
|
485
|
+
},
|
|
486
|
+
stackLabel: {
|
|
487
|
+
fontSize: "10px",
|
|
488
|
+
color: "#6b7280",
|
|
489
|
+
textTransform: "uppercase",
|
|
490
|
+
letterSpacing: "1.5px",
|
|
491
|
+
marginBottom: "6px",
|
|
492
|
+
fontWeight: 600
|
|
493
|
+
},
|
|
494
|
+
stackBlock: {
|
|
251
495
|
margin: "0 0 20px",
|
|
252
496
|
padding: "12px",
|
|
253
|
-
backgroundColor: "#
|
|
254
|
-
borderRadius: "
|
|
255
|
-
|
|
497
|
+
backgroundColor: "#0f172a",
|
|
498
|
+
borderRadius: "6px",
|
|
499
|
+
color: "#94a3b8",
|
|
256
500
|
fontSize: "12px",
|
|
257
501
|
lineHeight: 1.6,
|
|
258
|
-
color: "#666",
|
|
259
|
-
overflow: "auto",
|
|
260
502
|
whiteSpace: "pre-wrap",
|
|
261
|
-
wordBreak: "break-all"
|
|
503
|
+
wordBreak: "break-all",
|
|
504
|
+
overflow: "auto"
|
|
262
505
|
},
|
|
263
|
-
|
|
264
|
-
fontSize: "
|
|
265
|
-
color: "#
|
|
506
|
+
causedBy: {
|
|
507
|
+
fontSize: "10px",
|
|
508
|
+
color: "#6b7280",
|
|
266
509
|
textTransform: "uppercase",
|
|
267
|
-
letterSpacing: "
|
|
268
|
-
marginBottom: "
|
|
269
|
-
paddingTop: "
|
|
270
|
-
borderTop: "1px solid #
|
|
510
|
+
letterSpacing: "1.5px",
|
|
511
|
+
marginBottom: "8px",
|
|
512
|
+
paddingTop: "12px",
|
|
513
|
+
borderTop: "1px solid #374151",
|
|
514
|
+
fontWeight: 600
|
|
515
|
+
},
|
|
516
|
+
meta: {
|
|
517
|
+
display: "flex",
|
|
518
|
+
gap: "16px",
|
|
519
|
+
alignItems: "center",
|
|
520
|
+
paddingTop: "12px",
|
|
521
|
+
borderTop: "1px solid #1f2937",
|
|
522
|
+
flexWrap: "wrap"
|
|
523
|
+
},
|
|
524
|
+
metaItem: {
|
|
525
|
+
fontSize: "11px",
|
|
526
|
+
color: "#6b7280"
|
|
527
|
+
},
|
|
528
|
+
statusBadge: {
|
|
529
|
+
fontSize: "11px",
|
|
530
|
+
color: "#fbbf24",
|
|
531
|
+
backgroundColor: "#422006",
|
|
532
|
+
padding: "2px 8px",
|
|
533
|
+
borderRadius: "4px",
|
|
534
|
+
fontWeight: 600
|
|
271
535
|
}
|
|
272
536
|
};
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
537
|
+
const prod = {
|
|
538
|
+
page: {
|
|
539
|
+
minHeight: "100vh",
|
|
540
|
+
display: "flex",
|
|
541
|
+
alignItems: "center",
|
|
542
|
+
justifyContent: "center",
|
|
543
|
+
backgroundColor: "#0f172a",
|
|
544
|
+
fontFamily: "-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif",
|
|
545
|
+
padding: "24px"
|
|
546
|
+
},
|
|
547
|
+
card: {
|
|
548
|
+
textAlign: "center",
|
|
549
|
+
maxWidth: "440px"
|
|
550
|
+
},
|
|
551
|
+
heading: {
|
|
552
|
+
fontSize: "28px",
|
|
553
|
+
fontWeight: 700,
|
|
554
|
+
color: "#f1f5f9",
|
|
555
|
+
marginBottom: "12px"
|
|
556
|
+
},
|
|
557
|
+
subtitle: {
|
|
558
|
+
fontSize: "16px",
|
|
559
|
+
color: "#94a3b8",
|
|
560
|
+
marginBottom: "24px",
|
|
561
|
+
lineHeight: 1.5
|
|
562
|
+
},
|
|
563
|
+
refText: {
|
|
564
|
+
fontSize: "13px",
|
|
565
|
+
color: "#64748b",
|
|
566
|
+
marginBottom: "24px",
|
|
567
|
+
fontFamily: mono
|
|
568
|
+
},
|
|
569
|
+
actions: {
|
|
570
|
+
display: "flex",
|
|
571
|
+
gap: "12px",
|
|
572
|
+
justifyContent: "center",
|
|
573
|
+
alignItems: "center"
|
|
574
|
+
},
|
|
575
|
+
reloadBtn: {
|
|
576
|
+
padding: "10px 24px",
|
|
577
|
+
backgroundColor: "#2563eb",
|
|
578
|
+
color: "#fff",
|
|
579
|
+
border: "none",
|
|
580
|
+
borderRadius: "8px",
|
|
581
|
+
cursor: "pointer",
|
|
582
|
+
fontSize: "14px",
|
|
583
|
+
fontWeight: 600
|
|
584
|
+
},
|
|
585
|
+
homeLink: {
|
|
586
|
+
padding: "10px 24px",
|
|
587
|
+
color: "#94a3b8",
|
|
588
|
+
textDecoration: "none",
|
|
589
|
+
fontSize: "14px"
|
|
303
590
|
}
|
|
304
591
|
};
|
|
305
592
|
|
|
306
593
|
//#endregion
|
|
307
|
-
//#region ../../src/react/router/
|
|
308
|
-
const
|
|
309
|
-
const [state] = useStore("alepha.react.router.state");
|
|
310
|
-
if (!state) throw new AlephaError("Missing react router state");
|
|
311
|
-
return state;
|
|
312
|
-
};
|
|
594
|
+
//#region ../../src/react/router/contexts/RouterLayerContext.ts
|
|
595
|
+
const RouterLayerContext = createContext(void 0);
|
|
313
596
|
|
|
314
597
|
//#endregion
|
|
315
598
|
//#region ../../src/react/router/components/NestedView.tsx
|
|
@@ -340,6 +623,7 @@ const NestedView = (props) => {
|
|
|
340
623
|
const onError = routerLayer?.onError;
|
|
341
624
|
const state = useRouterState();
|
|
342
625
|
const alepha = useAlepha();
|
|
626
|
+
const [boundaryKey, setBoundaryKey] = useState(0);
|
|
343
627
|
const [view, setView] = useState(state.layers[index]?.element);
|
|
344
628
|
const [animation, setAnimation] = useState("");
|
|
345
629
|
const animationExitDuration = useRef(0);
|
|
@@ -400,7 +684,7 @@ const NestedView = (props) => {
|
|
|
400
684
|
if (props.errorBoundary) return /* @__PURE__ */ jsx(ErrorBoundary, {
|
|
401
685
|
fallback: props.errorBoundary,
|
|
402
686
|
children: element
|
|
403
|
-
});
|
|
687
|
+
}, boundaryKey);
|
|
404
688
|
const fallback = (error) => {
|
|
405
689
|
const result = onError?.(error, state) ?? /* @__PURE__ */ jsx(ErrorViewer, {
|
|
406
690
|
error,
|
|
@@ -412,7 +696,7 @@ const NestedView = (props) => {
|
|
|
412
696
|
return /* @__PURE__ */ jsx(ErrorBoundary, {
|
|
413
697
|
fallback,
|
|
414
698
|
children: element
|
|
415
|
-
});
|
|
699
|
+
}, boundaryKey);
|
|
416
700
|
};
|
|
417
701
|
var NestedView_default = memo(NestedView);
|
|
418
702
|
function parseAnimation(animationLike, state, type = "enter") {
|
|
@@ -446,17 +730,49 @@ function parseAnimation(animationLike, state, type = "enter") {
|
|
|
446
730
|
const reactPageOptions = $atom({
|
|
447
731
|
name: "alepha.react.page.options",
|
|
448
732
|
description: "Configuration options for the React page provider.",
|
|
449
|
-
schema: t.object({
|
|
450
|
-
|
|
733
|
+
schema: t.object({
|
|
734
|
+
strictMode: t.boolean({ default: true }),
|
|
735
|
+
staticFilePattern: t.string()
|
|
736
|
+
}),
|
|
737
|
+
default: {
|
|
738
|
+
strictMode: true,
|
|
739
|
+
staticFilePattern: "\\.[a-zA-Z0-9]{1,10}$"
|
|
740
|
+
}
|
|
451
741
|
});
|
|
452
742
|
/**
|
|
453
743
|
* Handle page routes for React applications. (Browser and Server)
|
|
454
744
|
*/
|
|
455
745
|
var ReactPageProvider = class {
|
|
746
|
+
dateTimeProvider = $inject(DateTimeProvider);
|
|
456
747
|
log = $logger();
|
|
457
748
|
options = $use(reactPageOptions);
|
|
458
749
|
alepha = $inject(Alepha);
|
|
459
750
|
pages = [];
|
|
751
|
+
nextIdCursor = 0;
|
|
752
|
+
configure = $hook({
|
|
753
|
+
on: "configure",
|
|
754
|
+
handler: () => {
|
|
755
|
+
let hasNotFoundHandler = false;
|
|
756
|
+
const pages = this.alepha.primitives($page);
|
|
757
|
+
const hasParent = (it) => {
|
|
758
|
+
if (it.options.parent) return true;
|
|
759
|
+
for (const page of pages) if ((page.options.children ? Array.isArray(page.options.children) ? page.options.children : page.options.children() : []).includes(it)) return true;
|
|
760
|
+
};
|
|
761
|
+
for (const page of pages) {
|
|
762
|
+
if (page.options.path === "/*") hasNotFoundHandler = true;
|
|
763
|
+
if (hasParent(page)) continue;
|
|
764
|
+
this.add(this.map(pages, page));
|
|
765
|
+
}
|
|
766
|
+
if (!hasNotFoundHandler && pages.length > 0) this.add({
|
|
767
|
+
path: "/*",
|
|
768
|
+
name: "notFound",
|
|
769
|
+
component: NotFound,
|
|
770
|
+
onServerResponse: ({ reply }) => {
|
|
771
|
+
reply.status = 404;
|
|
772
|
+
}
|
|
773
|
+
});
|
|
774
|
+
}
|
|
775
|
+
});
|
|
460
776
|
getPages() {
|
|
461
777
|
return this.pages;
|
|
462
778
|
}
|
|
@@ -544,13 +860,13 @@ var ReactPageProvider = class {
|
|
|
544
860
|
this.convertStringObjectToObject(route.schema?.query, state.query);
|
|
545
861
|
config.query = route.schema?.query ? this.alepha.codec.decode(route.schema.query, state.query) : {};
|
|
546
862
|
} catch (e) {
|
|
547
|
-
it.error = e;
|
|
863
|
+
it.error = e instanceof Error ? e : new Error(String(e));
|
|
548
864
|
break;
|
|
549
865
|
}
|
|
550
866
|
try {
|
|
551
867
|
config.params = route.schema?.params ? this.alepha.codec.decode(route.schema.params, state.params) : {};
|
|
552
868
|
} catch (e) {
|
|
553
|
-
it.error = e;
|
|
869
|
+
it.error = e instanceof Error ? e : new Error(String(e));
|
|
554
870
|
break;
|
|
555
871
|
}
|
|
556
872
|
it.config = { ...config };
|
|
@@ -574,6 +890,7 @@ var ReactPageProvider = class {
|
|
|
574
890
|
}
|
|
575
891
|
forceRefresh = true;
|
|
576
892
|
}
|
|
893
|
+
if (route.redirect) return { redirect: route.redirect };
|
|
577
894
|
if (!route.loader) continue;
|
|
578
895
|
try {
|
|
579
896
|
const args = Object.create(state);
|
|
@@ -587,7 +904,7 @@ var ReactPageProvider = class {
|
|
|
587
904
|
} catch (e) {
|
|
588
905
|
if (e instanceof Redirection) return { redirect: e.redirect };
|
|
589
906
|
this.log.error("Page loader has failed", e);
|
|
590
|
-
it.error = e;
|
|
907
|
+
it.error = e instanceof Error ? e : new Error(String(e));
|
|
591
908
|
break;
|
|
592
909
|
}
|
|
593
910
|
}
|
|
@@ -614,7 +931,7 @@ var ReactPageProvider = class {
|
|
|
614
931
|
...it.route.props ? it.route.props() : {},
|
|
615
932
|
...props,
|
|
616
933
|
...context
|
|
617
|
-
});
|
|
934
|
+
}, state.url);
|
|
618
935
|
state.layers.push({
|
|
619
936
|
name: it.route.name,
|
|
620
937
|
props,
|
|
@@ -627,7 +944,7 @@ var ReactPageProvider = class {
|
|
|
627
944
|
cache: it.cache
|
|
628
945
|
});
|
|
629
946
|
} catch (e) {
|
|
630
|
-
it.error = e;
|
|
947
|
+
it.error = e instanceof Error ? e : new Error(String(e));
|
|
631
948
|
}
|
|
632
949
|
if (it.error) try {
|
|
633
950
|
let element = await state.onError(it.error, state);
|
|
@@ -643,7 +960,8 @@ var ReactPageProvider = class {
|
|
|
643
960
|
element: this.renderView(i + 1, path, element, it.route),
|
|
644
961
|
index: i + 1,
|
|
645
962
|
path,
|
|
646
|
-
route: it.route
|
|
963
|
+
route: it.route,
|
|
964
|
+
cache: it.cache
|
|
647
965
|
});
|
|
648
966
|
break;
|
|
649
967
|
} catch (e) {
|
|
@@ -661,11 +979,45 @@ var ReactPageProvider = class {
|
|
|
661
979
|
parent = parent.parent;
|
|
662
980
|
}
|
|
663
981
|
}
|
|
664
|
-
async createElement(page, props) {
|
|
982
|
+
async createElement(page, props, targetUrl) {
|
|
665
983
|
if (page.lazy && page.component) this.log.warn(`Page ${page.name} has both lazy and component options, lazy will be used`);
|
|
666
|
-
if (page.lazy)
|
|
984
|
+
if (page.lazy) try {
|
|
985
|
+
return createElement((await page.lazy()).default, props);
|
|
986
|
+
} catch (error) {
|
|
987
|
+
if (this.alepha.isBrowser() && this.isChunkLoadError(error)) {
|
|
988
|
+
if (this.reloadAfterChunkError(targetUrl)) return;
|
|
989
|
+
}
|
|
990
|
+
throw error;
|
|
991
|
+
}
|
|
667
992
|
if (page.component) return createElement(page.component, props);
|
|
668
993
|
}
|
|
994
|
+
/**
|
|
995
|
+
* Detect chunk load errors caused by stale dynamic imports after a deployment.
|
|
996
|
+
* When new assets are deployed with different hashes, old chunk URLs return 404.
|
|
997
|
+
*/
|
|
998
|
+
isChunkLoadError(error) {
|
|
999
|
+
if (!(error instanceof Error)) return false;
|
|
1000
|
+
const msg = error.message;
|
|
1001
|
+
return /Failed to fetch dynamically imported module/.test(msg) || /error loading dynamically imported module/i.test(msg) || /Unable to preload CSS/.test(msg) || /Importing a module script failed/.test(msg);
|
|
1002
|
+
}
|
|
1003
|
+
/**
|
|
1004
|
+
* Navigate to the target URL to fetch updated assets after a chunk load failure.
|
|
1005
|
+
* Uses sessionStorage to prevent infinite reload loops.
|
|
1006
|
+
* Returns true if navigation was initiated.
|
|
1007
|
+
*/
|
|
1008
|
+
reloadAfterChunkError(url) {
|
|
1009
|
+
const key = "alepha:chunk-reload";
|
|
1010
|
+
const lastReload = sessionStorage.getItem(key);
|
|
1011
|
+
const now = this.dateTimeProvider.nowMillis();
|
|
1012
|
+
if (lastReload && now - Number(lastReload) < 1e4) {
|
|
1013
|
+
this.log.error("Chunk load failed after recent reload, not retrying to avoid loop");
|
|
1014
|
+
return false;
|
|
1015
|
+
}
|
|
1016
|
+
this.log.warn("Chunk load failed after deployment, reloading page");
|
|
1017
|
+
sessionStorage.setItem(key, String(now));
|
|
1018
|
+
window.location.assign(url ? url.pathname + url.search : window.location.href);
|
|
1019
|
+
return true;
|
|
1020
|
+
}
|
|
669
1021
|
renderError(error) {
|
|
670
1022
|
return createElement(ErrorViewer, {
|
|
671
1023
|
error,
|
|
@@ -700,30 +1052,6 @@ var ReactPageProvider = class {
|
|
|
700
1052
|
onError: this.getErrorHandler(page) ?? ((error) => this.renderError(error))
|
|
701
1053
|
} }, element);
|
|
702
1054
|
}
|
|
703
|
-
configure = $hook({
|
|
704
|
-
on: "configure",
|
|
705
|
-
handler: () => {
|
|
706
|
-
let hasNotFoundHandler = false;
|
|
707
|
-
const pages = this.alepha.primitives($page);
|
|
708
|
-
const hasParent = (it) => {
|
|
709
|
-
if (it.options.parent) return true;
|
|
710
|
-
for (const page of pages) if ((page.options.children ? Array.isArray(page.options.children) ? page.options.children : page.options.children() : []).includes(it)) return true;
|
|
711
|
-
};
|
|
712
|
-
for (const page of pages) {
|
|
713
|
-
if (page.options.path === "/*") hasNotFoundHandler = true;
|
|
714
|
-
if (hasParent(page)) continue;
|
|
715
|
-
this.add(this.map(pages, page));
|
|
716
|
-
}
|
|
717
|
-
if (!hasNotFoundHandler && pages.length > 0) this.add({
|
|
718
|
-
path: "/*",
|
|
719
|
-
name: "notFound",
|
|
720
|
-
component: NotFound,
|
|
721
|
-
onServerResponse: ({ reply }) => {
|
|
722
|
-
reply.status = 404;
|
|
723
|
-
}
|
|
724
|
-
});
|
|
725
|
-
}
|
|
726
|
-
});
|
|
727
1055
|
map(pages, target) {
|
|
728
1056
|
const children = target.options.children ? Array.isArray(target.options.children) ? target.options.children : target.options.children() : [];
|
|
729
1057
|
const getChildrenFromParent = (it) => {
|
|
@@ -761,10 +1089,9 @@ var ReactPageProvider = class {
|
|
|
761
1089
|
if (path.endsWith("/") && path !== "/") path = path.slice(0, -1);
|
|
762
1090
|
return path;
|
|
763
1091
|
}
|
|
764
|
-
_next = 0;
|
|
765
1092
|
nextId() {
|
|
766
|
-
this.
|
|
767
|
-
return `P${this.
|
|
1093
|
+
this.nextIdCursor += 1;
|
|
1094
|
+
return `P${this.nextIdCursor}`;
|
|
768
1095
|
}
|
|
769
1096
|
};
|
|
770
1097
|
const isPageRoute = (it) => {
|
|
@@ -787,7 +1114,7 @@ var ReactBrowserRouterProvider = class extends RouterProvider {
|
|
|
787
1114
|
configure = $hook({
|
|
788
1115
|
on: "configure",
|
|
789
1116
|
handler: async () => {
|
|
790
|
-
for (const page of this.pageApi.getPages()) if (page.component || page.lazy) this.push({
|
|
1117
|
+
for (const page of this.pageApi.getPages()) if (page.component || page.lazy || page.redirect) this.push({
|
|
791
1118
|
path: page.match,
|
|
792
1119
|
page
|
|
793
1120
|
});
|
|
@@ -832,9 +1159,14 @@ var ReactBrowserRouterProvider = class extends RouterProvider {
|
|
|
832
1159
|
await this.alepha.events.emit("react:transition:success", { state });
|
|
833
1160
|
} catch (e) {
|
|
834
1161
|
this.log.error("Transition has failed", e);
|
|
1162
|
+
let element;
|
|
1163
|
+
try {
|
|
1164
|
+
const result = state.onError(e, state);
|
|
1165
|
+
if (result != null && !(result instanceof Redirection)) element = result;
|
|
1166
|
+
} catch {}
|
|
835
1167
|
state.layers = [{
|
|
836
1168
|
name: "error",
|
|
837
|
-
element: this.pageApi.renderError(e),
|
|
1169
|
+
element: element ?? this.pageApi.renderError(e),
|
|
838
1170
|
index: 0,
|
|
839
1171
|
path: "/"
|
|
840
1172
|
}];
|