From 0bfcb5ad71355dc5f3af73cfe2fd2fa937a1a5c0 Mon Sep 17 00:00:00 2001 From: Shishant Biswas Date: Sun, 27 Sep 2026 19:34:06 +0530 Subject: [PATCH] bknd is dead long live userbase --- .cursor/mcp.json | 2 +- .github/workflows/test.yml | 2 +- CONTRIBUTING.md | 44 +- README.md | 70 +- app/.gitignore | 2 +- app/__test__/app/code-only.test.ts | 2 +- app/__test__/app/mcp/mcp.auth.test.ts | 2 +- app/__test__/app/mcp/mcp.data.test.ts | 4 +- app/__test__/app/mcp/mcp.media.test.ts | 2 +- app/__test__/app/mcp/mcp.server.test.ts | 2 +- app/__test__/app/mcp/mcp.system.test.ts | 2 +- app/__test__/auth/authorize/authorize.spec.ts | 2 +- .../auth/authorize/data.permissions.test.ts | 2 +- .../auth/authorize/permissions.spec.ts | 6 +- app/__test__/data/postgres.test.ts | 10 +- app/__test__/debug/jsonv-resolution.test.ts | 4 +- app/__test__/helper.ts | 2 +- .../integration/auth.integration.test.ts | 14 +- app/__test__/modules/AppAuth.spec.ts | 2 +- .../modules/migrations/migrations.spec.ts | 6 +- .../modules/migrations/samples/v8.json | 2 +- app/__test__/modules/module-test-suite.ts | 2 +- .../ui/client/utils/AppReduced.spec.ts | 42 +- app/build.cli.ts | 4 +- app/build.ts | 16 +- app/internal/docs.build-assets.ts | 2 +- app/package.json | 12 +- app/src/Api.ts | 4 +- app/src/App.ts | 4 +- app/src/adapter/adapter-test-suite.ts | 6 +- app/src/adapter/astro/astro.adapter.ts | 8 +- app/src/adapter/aws/aws-lambda.adapter.ts | 14 +- app/src/adapter/browser/OpfsStorageAdapter.ts | 6 +- ...dBrowserApp.tsx => UserbaseBrowserApp.tsx} | 38 +- app/src/adapter/browser/index.ts | 2 +- app/src/adapter/bun/bun.adapter.ts | 14 +- .../bun/connection/BunSqliteConnection.ts | 4 +- .../cloudflare-workers.adapter.spec.ts | 4 +- .../cloudflare/cloudflare-workers.adapter.ts | 14 +- app/src/adapter/cloudflare/config.ts | 21 +- .../cloudflare/connection/D1Connection.ts | 2 +- .../cloudflare/connection/DoConnection.ts | 2 +- app/src/adapter/cloudflare/index.ts | 4 +- app/src/adapter/cloudflare/proxy.ts | 10 +- .../cloudflare/storage/StorageR2Adapter.ts | 6 +- app/src/adapter/cloudflare/vite.ts | 4 +- app/src/adapter/index.ts | 32 +- app/src/adapter/nextjs/nextjs.adapter.spec.ts | 4 +- app/src/adapter/nextjs/nextjs.adapter.ts | 12 +- .../node/connection/NodeSqliteConnection.ts | 4 +- app/src/adapter/node/node.adapter.ts | 16 +- .../node/storage/StorageLocalAdapter.ts | 6 +- app/src/adapter/node/storage/index.ts | 2 +- app/src/adapter/nuxt/nuxt.adapter.ts | 14 +- .../react-router/react-router.adapter.ts | 8 +- .../solid-start/solid-start.adapter.spec.ts | 4 +- .../solid-start/solid-start.adapter.ts | 14 +- app/src/adapter/sqlite/bun.ts | 2 +- app/src/adapter/sqlite/edge.ts | 2 +- app/src/adapter/sqlite/node.ts | 2 +- .../adapter/sveltekit/sveltekit.adapter.ts | 14 +- .../tanstack-start/tanstack-start.adapter.ts | 10 +- app/src/adapter/vite/vite.adapter.ts | 16 +- app/src/auth/AppAuth.ts | 6 +- app/src/auth/AppUserPool.ts | 2 +- app/src/auth/api/AuthApi.ts | 4 +- app/src/auth/api/AuthController.ts | 4 +- app/src/auth/auth-schema.ts | 2 +- app/src/auth/authenticate/Authenticator.ts | 4 +- .../strategies/PasswordStrategy.ts | 4 +- .../auth/authenticate/strategies/Strategy.ts | 2 +- .../strategies/oauth/CustomOAuthStrategy.ts | 2 +- .../strategies/oauth/OAuthStrategy.ts | 2 +- .../strategies/oauth/issuers/github.ts | 2 +- app/src/auth/authorize/Guard.ts | 4 +- app/src/auth/authorize/Permission.ts | 2 +- app/src/auth/authorize/Policy.ts | 2 +- app/src/auth/authorize/Role.ts | 2 +- app/src/auth/errors.ts | 2 +- app/src/auth/middlewares/auth.middleware.ts | 2 +- .../auth/middlewares/permission.middleware.ts | 2 +- app/src/cli/commands/config.ts | 2 +- app/src/cli/commands/create/create.ts | 16 +- app/src/cli/commands/create/npm.ts | 4 +- app/src/cli/commands/create/templates/aws.ts | 4 +- .../commands/create/templates/cloudflare.ts | 6 +- app/src/cli/commands/create/templates/deno.ts | 6 +- .../cli/commands/create/templates/index.ts | 26 +- app/src/cli/commands/debug.ts | 2 +- app/src/cli/commands/mcp/mcp.ts | 2 +- app/src/cli/commands/run/platform.ts | 4 +- app/src/cli/commands/run/run.ts | 12 +- app/src/cli/commands/secrets.ts | 2 +- app/src/cli/commands/types/types.ts | 2 +- app/src/cli/commands/user.ts | 2 +- app/src/cli/index.ts | 4 +- app/src/cli/types.d.ts | 4 +- app/src/cli/utils/sys.ts | 2 +- app/src/cli/utils/telemetry.ts | 4 +- .../core/drivers/email/mailchannels.spec.ts | 4 +- app/src/core/drivers/email/mailchannels.ts | 2 +- app/src/core/drivers/email/plunk.spec.ts | 6 +- app/src/core/drivers/email/resend.spec.ts | 5 +- app/src/core/errors.ts | 4 +- app/src/core/events/EventListener.ts | 2 +- app/src/core/events/EventManager.ts | 2 +- app/src/core/object/SchemaObject.ts | 2 +- app/src/core/object/query/query.ts | 2 +- app/src/core/server/flash.ts | 2 +- app/src/core/test/utils.ts | 8 +- app/src/core/utils/schema/index.ts | 4 +- app/src/core/utils/schema/secret.ts | 2 +- app/src/data/AppData.ts | 2 +- app/src/data/api/DataApi.ts | 2 +- app/src/data/api/DataController.ts | 8 +- app/src/data/connection/Connection.ts | 4 +- .../data/connection/connection-test-suite.ts | 2 +- .../sqlite/GenericSqliteConnection.ts | 2 +- .../sqlite/sqlocal/SQLocalConnection.ts | 2 +- app/src/data/data-schema.ts | 4 +- app/src/data/entities/Entity.ts | 4 +- app/src/data/entities/EntityManager.ts | 4 +- app/src/data/entities/EntityTypescript.ts | 12 +- app/src/data/entities/Result.ts | 2 +- app/src/data/entities/mutation/Mutator.ts | 2 +- .../data/entities/mutation/MutatorResult.ts | 2 +- app/src/data/entities/query/Repository.ts | 4 +- .../data/entities/query/RepositoryResult.ts | 2 +- app/src/data/entities/query/WithBuilder.ts | 4 +- app/src/data/errors.ts | 2 +- app/src/data/events/index.ts | 4 +- app/src/data/fields/BooleanField.ts | 2 +- app/src/data/fields/DateField.ts | 2 +- app/src/data/fields/EnumField.ts | 4 +- app/src/data/fields/Field.ts | 2 +- app/src/data/fields/JsonField.ts | 4 +- app/src/data/fields/JsonSchemaField.ts | 4 +- app/src/data/fields/NumberField.ts | 2 +- app/src/data/fields/PrimaryField.ts | 2 +- app/src/data/fields/TextField.ts | 2 +- app/src/data/fields/VirtualField.ts | 2 +- app/src/data/permissions/index.ts | 2 +- app/src/data/relations/EntityRelation.ts | 4 +- app/src/data/relations/ManyToManyRelation.ts | 2 +- app/src/data/relations/ManyToOneRelation.ts | 4 +- app/src/data/relations/PolymorphicRelation.ts | 4 +- app/src/data/relations/RelationField.ts | 2 +- app/src/data/relations/RelationMutator.ts | 2 +- app/src/data/schema/SchemaManager.ts | 6 +- app/src/data/schema/constructor.ts | 2 +- app/src/data/server/query.spec.ts | 2 +- app/src/data/server/query.ts | 2 +- app/src/flows/AppFlows.ts | 2 +- app/src/flows/flows-schema.ts | 2 +- app/src/flows/flows/Execution.ts | 2 +- app/src/flows/flows/Flow.ts | 2 +- .../flows/flows/executors/RuntimeExecutor.ts | 2 +- app/src/flows/flows/triggers/EventTrigger.ts | 2 +- app/src/flows/flows/triggers/HttpTrigger.ts | 2 +- app/src/flows/flows/triggers/Trigger.ts | 2 +- app/src/flows/tasks/Task.tsx | 16 +- app/src/flows/tasks/TaskConnection.ts | 2 +- app/src/flows/tasks/presets/FetchTask.ts | 2 +- app/src/flows/tasks/presets/LogTask.ts | 2 +- app/src/flows/tasks/presets/RenderTask.ts | 2 +- app/src/flows/tasks/presets/SubFlowTask.ts | 2 +- app/src/index.ts | 4 +- app/src/media/AppMedia.ts | 6 +- app/src/media/MediaField.ts | 2 +- app/src/media/api/MediaApi.ts | 2 +- app/src/media/api/MediaController.ts | 2 +- app/src/media/media-registry.ts | 2 +- app/src/media/media-schema.ts | 2 +- app/src/media/storage/Storage.ts | 2 +- app/src/media/storage/StorageAdapter.ts | 4 +- .../storage/adapters/adapter-test-suite.ts | 2 +- .../cloudinary/StorageCloudinaryAdapter.ts | 2 +- .../storage/adapters/s3/StorageS3Adapter.ts | 2 +- app/src/media/utils/index.ts | 2 +- app/src/modes/code.ts | 18 +- app/src/modes/hybrid.ts | 24 +- app/src/modes/shared.ts | 22 +- app/src/modules/Controller.ts | 4 +- app/src/modules/Module.ts | 4 +- app/src/modules/ModuleApi.ts | 4 +- app/src/modules/ModuleHelper.ts | 2 +- app/src/modules/ModuleManager.ts | 2 +- app/src/modules/db/DbModuleManager.ts | 24 +- app/src/modules/db/migrations.ts | 4 +- app/src/modules/mcp/$object.ts | 2 +- app/src/modules/mcp/$record.ts | 4 +- app/src/modules/mcp/$schema.ts | 2 +- app/src/modules/mcp/McpSchemaHelper.ts | 6 +- app/src/modules/mcp/system-mcp.ts | 4 +- app/src/modules/mcp/utils.ts | 2 +- app/src/modules/permissions/index.ts | 2 +- app/src/modules/server/AdminController.tsx | 24 +- app/src/modules/server/AppServer.ts | 4 +- app/src/modules/server/SystemController.ts | 14 +- app/src/plugins/auth/email-otp.plugin.ts | 6 +- .../cloudflare/image-optimization.plugin.ts | 4 +- app/src/plugins/data/sort.plugin.spec.ts | 2 +- app/src/plugins/data/sort.plugin.ts | 8 +- app/src/plugins/data/timestamp.plugin.spec.ts | 2 +- app/src/plugins/data/timestamps.plugin.ts | 10 +- app/src/plugins/dev/show-routes.plugin.ts | 4 +- app/src/plugins/dev/sync-config.plugin.ts | 4 +- app/src/plugins/dev/sync-secrets.plugin.ts | 4 +- app/src/plugins/dev/sync-types.plugin.ts | 4 +- app/src/ui/Admin.tsx | 32 +- app/src/ui/client/ClientProvider.tsx | 10 +- ...{BkndProvider.tsx => UserbaseProvider.tsx} | 30 +- app/src/ui/client/api/use-entity.ts | 6 +- app/src/ui/client/bknd.ts | 1 - app/src/ui/client/index.ts | 4 +- app/src/ui/client/schema/actions.ts | 2 +- app/src/ui/client/schema/auth/use-auth.ts | 4 +- ...{use-bknd-auth.ts => use-userbase-auth.ts} | 16 +- ...{use-bknd-data.ts => use-userbase-data.ts} | 32 +- app/src/ui/client/schema/flows/use-flows.ts | 8 +- ...se-bknd-media.ts => use-userbase-media.ts} | 10 +- ...-bknd-system.ts => use-userbase-system.ts} | 10 +- app/src/ui/client/use-theme.ts | 6 +- app/src/ui/client/userbase.ts | 1 + app/src/ui/client/utils/AppReduced.ts | 4 +- app/src/ui/components/code/JsonViewer.tsx | 2 +- .../ui/components/form/Formy/components.tsx | 2 +- .../components/form/json-schema-form/utils.ts | 4 +- .../form/json-schema/JsonvTsValidator.ts | 2 +- app/src/ui/components/modal/Modal2.tsx | 2 +- app/src/ui/components/wouter/Link.tsx | 8 +- app/src/ui/container/use-flows.ts | 6 +- app/src/ui/elements/auth/AuthForm.tsx | 4 +- app/src/ui/elements/auth/AuthScreen.tsx | 2 +- app/src/ui/elements/auth/SocialLink.tsx | 2 +- app/src/ui/elements/hooks/use-auth.ts | 2 +- app/src/ui/elements/media/Dropzone.tsx | 4 +- .../ui/elements/media/DropzoneContainer.tsx | 4 +- app/src/ui/elements/media/DropzoneInner.tsx | 2 +- app/src/ui/hooks/use-search.ts | 2 +- app/src/ui/index.ts | 4 +- app/src/ui/layouts/AppShell/AppShell.tsx | 2 +- app/src/ui/layouts/AppShell/Header.tsx | 14 +- app/src/ui/lib/mantine/theme.ts | 4 +- app/src/ui/lib/routes.ts | 12 +- app/src/ui/main.css | 18 +- app/src/ui/modals/debug/OverlayModal.tsx | 2 +- app/src/ui/modals/debug/SchemaFormModal.tsx | 2 +- app/src/ui/modals/debug/TestModal.tsx | 2 +- app/src/ui/modals/index.tsx | 4 +- app/src/ui/modals/media/MediaInfoModal.tsx | 9 +- .../auth/hooks/use-create-user-modal.ts | 12 +- .../ui/modules/data/components/EntityForm.tsx | 6 +- .../modules/data/components/EntityTable.tsx | 2 +- .../modules/data/components/EntityTable2.tsx | 2 +- .../components/canvas/DataSchemaCanvas.tsx | 4 +- .../fields/EntityJsonSchemaFormField.tsx | 2 +- .../fields/EntityRelationalFormField.tsx | 8 +- .../components/schema/create-modal/schema.ts | 2 +- .../schema/create-modal/step.create.tsx | 8 +- .../create-modal/step.entity.fields.tsx | 6 +- .../schema/create-modal/step.entity.tsx | 2 +- .../schema/create-modal/step.relation.tsx | 6 +- .../media/template.media.component.tsx | 6 +- .../ui/modules/data/hooks/useEntityForm.tsx | 2 +- .../flows/components/TriggerComponent.tsx | 2 +- .../flows/components/form/TemplateField.tsx | 2 +- .../components2/nodes/tasks/FetchTaskNode.tsx | 2 +- .../nodes/triggers/TriggerNode.tsx | 2 +- .../ui/modules/flows/hooks/use-flow/index.tsx | 4 +- app/src/ui/options/app-shell.ts | 6 +- app/src/ui/options/entities.ts | 28 +- app/src/ui/routes/auth/_auth.root.tsx | 4 +- app/src/ui/routes/auth/auth.index.tsx | 10 +- .../ui/routes/auth/auth.roles.edit.$role.tsx | 22 +- app/src/ui/routes/auth/auth.roles.tsx | 16 +- app/src/ui/routes/auth/auth.settings.tsx | 10 +- app/src/ui/routes/auth/auth.strategies.tsx | 12 +- app/src/ui/routes/auth/forms/role.form.tsx | 6 +- app/src/ui/routes/data/_data.root.tsx | 18 +- app/src/ui/routes/data/data.$entity.$id.tsx | 16 +- .../ui/routes/data/data.$entity.create.tsx | 10 +- app/src/ui/routes/data/data.$entity.index.tsx | 14 +- .../ui/routes/data/data.schema.$entity.tsx | 16 +- app/src/ui/routes/data/data.schema.index.tsx | 6 +- .../routes/data/forms/entity.fields.form.tsx | 4 +- app/src/ui/routes/flows/_flows.root.tsx | 4 +- .../flows/components/FlowCreateModal.tsx | 2 +- app/src/ui/routes/flows_old/_flows.root.tsx | 4 +- app/src/ui/routes/flows_old/flow.$key.tsx | 4 +- app/src/ui/routes/index.tsx | 20 +- app/src/ui/routes/media/_media.root.tsx | 4 +- app/src/ui/routes/media/media.index.tsx | 8 +- app/src/ui/routes/media/media.settings.tsx | 12 +- app/src/ui/routes/root.tsx | 2 +- .../ui/routes/settings/components/Setting.tsx | 6 +- .../settings/components/SettingNewModal.tsx | 6 +- app/src/ui/routes/settings/index.tsx | 10 +- .../routes/settings/routes/auth.settings.tsx | 4 +- .../routes/settings/routes/data.settings.tsx | 4 +- .../routes/settings/routes/flows.settings.tsx | 4 +- .../settings/routes/server.settings.tsx | 4 +- app/src/ui/routes/settings/utils/schema.ts | 2 +- .../test/tests/flow-create-schema-test.tsx | 2 +- .../routes/test/tests/json-schema-form3.tsx | 8 +- .../routes/test/tests/react-hook-errors.tsx | 2 +- app/src/ui/routes/test/tests/schema-test.tsx | 4 +- app/src/ui/routes/test/tests/swr-and-api.tsx | 2 +- .../routes/tools/mcp/hooks/use-mcp-client.ts | 6 +- app/src/ui/routes/tools/mcp/mcp.tsx | 4 +- app/tsconfig.json | 14 +- bun.lock | 692 ++---------------- docker/Dockerfile | 8 +- docker/README.md | 14 +- docker/debug/run-minimal.sh | 4 +- docs/README.md | 2 +- docs/app/[[...slug]]/page.tsx | 2 +- docs/app/_components/FooterIcons.tsx | 2 +- docs/app/_components/Logo.tsx | 8 +- docs/app/_components/StackBlitz.tsx | 4 +- docs/bknd_ui_in_docs.patch | 82 +-- .../docs/(documentation)/extending/admin.mdx | 32 +- .../docs/(documentation)/extending/config.mdx | 76 +- .../docs/(documentation)/extending/events.mdx | 16 +- .../(documentation)/extending/plugins.mdx | 68 +- .../integration/(frameworks)/astro.mdx | 58 +- .../integration/(frameworks)/nextjs.mdx | 64 +- .../integration/(frameworks)/nuxt.mdx | 70 +- .../integration/(frameworks)/react-router.mdx | 64 +- .../integration/(frameworks)/solid-start.mdx | 68 +- .../integration/(frameworks)/sveltekit.mdx | 66 +- .../(frameworks)/tanstack-start.mdx | 56 +- .../integration/(frameworks)/vite.mdx | 52 +- .../integration/(runtimes)/aws.mdx | 30 +- .../integration/(runtimes)/bun.mdx | 18 +- .../integration/(runtimes)/cloudflare.mdx | 70 +- .../integration/(runtimes)/deno.mdx | 28 +- .../integration/(runtimes)/docker.mdx | 32 +- .../integration/(runtimes)/node.mdx | 20 +- .../integration/introduction.mdx | 14 +- .../docs/(documentation)/modules/auth.mdx | 10 +- .../docs/(documentation)/modules/data.mdx | 6 +- .../docs/(documentation)/modules/flows.mdx | 2 +- .../docs/(documentation)/modules/media.mdx | 24 +- .../docs/(documentation)/modules/overview.mdx | 2 +- .../docs/(documentation)/modules/server.mdx | 2 +- .../docs/(documentation)/motivation.mdx | 12 +- docs/content/docs/(documentation)/start.mdx | 36 +- .../docs/(documentation)/usage/cli.mdx | 98 +-- .../docs/(documentation)/usage/database.mdx | 104 +-- .../docs/(documentation)/usage/elements.mdx | 18 +- .../(documentation)/usage/mcp/overview.mdx | 40 +- .../docs/(documentation)/usage/react.mdx | 58 +- .../docs/(documentation)/usage/sdk.mdx | 22 +- .../docs/(documentation)/usage/setup.mdx | 72 +- docs/content/docs/guide/(setup)/admin-ui.mdx | 2 +- .../docs/guide/(setup)/introduction.mdx | 2 +- docs/content/docs/guide/(setup)/setup.mdx | 2 +- docs/content/docs/guide/auth/permissions.mdx | 2 +- docs/content/docs/guide/auth/roles.mdx | 2 +- docs/content/docs/guide/auth/users.mdx | 2 +- docs/content/docs/guide/data/entities.mdx | 2 +- docs/content/docs/guide/data/fields.mdx | 2 +- docs/content/docs/guide/data/indices.mdx | 2 +- docs/content/docs/guide/data/relation.mdx | 2 +- .../content/docs/guide/flows/introduction.mdx | 2 +- .../content/docs/guide/media/introduction.mdx | 2 +- docs/content/docs/guide/media/overview.mdx | 2 +- .../docs/guide/media/transformations.mdx | 2 +- docs/content/docs/guide/meta.json | 2 +- docs/mcp.json | 14 +- docs/next.config.mjs | 2 +- docs/openapi.json | 2 +- docs/package-lock.json | 4 +- docs/package.json | 2 +- docs/tsconfig.json | 2 +- docs/wrangler.json | 2 +- examples/astro/README.md | 8 +- examples/astro/bknd.config.ts | 18 +- examples/astro/package.json | 2 +- examples/astro/src/bknd.ts | 6 +- examples/astro/src/layouts/Layout.astro | 2 +- .../astro/src/pages/admin/[...admin].astro | 6 +- examples/astro/src/pages/api/[...api].ts | 4 +- examples/astro/src/pages/index.astro | 2 +- examples/astro/src/pages/ssr.astro | 2 +- examples/aws-lambda/clean.sh | 4 +- examples/aws-lambda/deploy.sh | 6 +- examples/aws-lambda/index.mjs | 4 +- examples/aws-lambda/package.json | 2 +- examples/bun/README.md | 8 +- examples/bun/index.ts | 4 +- examples/bun/package.json | 2 +- examples/cloudflare-vite-code/README.md | 80 +- examples/cloudflare-vite-code/bknd.config.ts | 6 +- examples/cloudflare-vite-code/config.ts | 12 +- examples/cloudflare-vite-code/index.html | 2 +- examples/cloudflare-vite-code/package.json | 14 +- examples/cloudflare-vite-code/seed.ts | 8 +- examples/cloudflare-vite-code/src/app/App.tsx | 2 +- .../cloudflare-vite-code/src/app/main.tsx | 2 +- .../src/app/routes/admin.tsx | 8 +- .../src/app/routes/home.tsx | 6 +- .../cloudflare-vite-code/src/worker/index.ts | 4 +- examples/cloudflare-vite-code/wrangler.json | 2 +- examples/cloudflare-vite-hybrid/README.md | 78 +- .../cloudflare-vite-hybrid/bknd-config.json | 2 +- .../cloudflare-vite-hybrid/bknd-types.d.ts | 10 +- .../cloudflare-vite-hybrid/bknd.config.ts | 6 +- examples/cloudflare-vite-hybrid/config.ts | 18 +- examples/cloudflare-vite-hybrid/index.html | 2 +- examples/cloudflare-vite-hybrid/package.json | 12 +- .../cloudflare-vite-hybrid/src/app/App.tsx | 2 +- .../cloudflare-vite-hybrid/src/app/main.tsx | 2 +- .../src/app/routes/admin.tsx | 8 +- .../src/app/routes/home.tsx | 6 +- .../src/worker/index.ts | 2 +- examples/cloudflare-vite-hybrid/tsconfig.json | 2 +- .../cloudflare-vite-hybrid/vite.config.ts | 2 +- examples/cloudflare-vite-hybrid/wrangler.json | 2 +- examples/cloudflare-worker/.gitignore | 2 +- examples/cloudflare-worker/README.md | 8 +- examples/cloudflare-worker/bknd.config.ts | 2 +- examples/cloudflare-worker/config.ts | 4 +- examples/cloudflare-worker/package.json | 6 +- examples/cloudflare-worker/src/index.ts | 2 +- examples/cloudflare-worker/tsconfig.json | 4 +- examples/cloudflare-worker/wrangler.json | 6 +- examples/deno/deno.json | 2 +- examples/deno/main.ts | 2 +- examples/nextjs/README.md | 16 +- examples/nextjs/bknd.config.ts | 20 +- examples/nextjs/package.json | 2 +- examples/nextjs/src/app/(main)/layout.tsx | 4 +- examples/nextjs/src/app/(main)/page.tsx | 2 +- examples/nextjs/src/app/(main)/ssr/page.tsx | 4 +- .../src/app/admin/[[...admin]]/Admin.tsx | 4 +- .../src/app/admin/[[...admin]]/page.tsx | 4 +- .../nextjs/src/app/api/[[...bknd]]/route.ts | 6 +- examples/nextjs/src/app/layout.tsx | 4 +- examples/nextjs/src/bknd.ts | 6 +- examples/nextjs/src/components/Buttons.tsx | 2 +- examples/nextjs/src/components/Footer.tsx | 4 +- examples/node/README.md | 8 +- examples/node/index.js | 4 +- examples/node/package.json | 2 +- examples/nuxt/README.md | 24 +- examples/nuxt/app/components/Buttons.vue | 8 +- examples/nuxt/app/components/Footer.vue | 4 +- .../nuxt/app/composables/useTodoActions.ts | 2 +- examples/nuxt/app/composables/useUser.ts | 2 +- examples/nuxt/app/pages/index.vue | 2 +- examples/nuxt/app/pages/user.vue | 6 +- examples/nuxt/bknd.config.ts | 16 +- examples/nuxt/nuxt.config.ts | 2 +- examples/nuxt/package.json | 8 +- examples/nuxt/server/middleware/bknd.ts | 4 +- examples/nuxt/server/utils/bknd.ts | 8 +- examples/plasmic/package.json | 4 +- examples/plasmic/src/App.tsx | 2 +- examples/plasmic/src/admin.tsx | 4 +- examples/plasmic/src/main.tsx | 2 +- examples/plasmic/src/server.ts | 10 +- examples/plasmic/vite.config.ts | 2 +- examples/postgres/neon.ts | 6 +- examples/postgres/package.json | 2 +- examples/postgres/tsconfig.json | 4 +- examples/postgres/xata.ts | 6 +- examples/react-router/README.md | 10 +- examples/react-router/app/bknd.ts | 6 +- examples/react-router/app/routes/_index.tsx | 8 +- examples/react-router/app/routes/admin.$.tsx | 6 +- examples/react-router/app/routes/api.$.ts | 2 +- examples/react-router/bknd.config.ts | 18 +- examples/react-router/package.json | 2 +- examples/react/README.md | 2 +- examples/react/package.json | 2 +- examples/react/src/App.tsx | 16 +- examples/react/src/routes/_index.tsx | 8 +- examples/react/src/routes/admin.tsx | 6 +- examples/solid/README.md | 22 +- examples/solid/bknd.config.ts | 14 +- examples/solid/package.json | 6 +- examples/solid/src/app.tsx | 2 +- examples/solid/src/components/Footer.tsx | 4 +- examples/solid/src/lib/bknd.ts | 8 +- examples/solid/src/middleware/index.ts | 4 +- examples/solid/src/routes/index.tsx | 8 +- examples/solid/src/routes/user.tsx | 20 +- examples/sveltekit/README.md | 8 +- examples/sveltekit/bknd.config.ts | 10 +- examples/sveltekit/package.json | 6 +- examples/sveltekit/src/hooks.server.ts | 10 +- examples/sveltekit/src/routes/+page.server.ts | 4 +- examples/sveltekit/src/routes/+page.svelte | 2 +- examples/sw/package.json | 6 +- examples/sw/sw.ts | 14 +- examples/tanstack-start/README.md | 10 +- examples/tanstack-start/bknd.config.ts | 12 +- examples/tanstack-start/package.json | 4 +- examples/tanstack-start/src/bknd.ts | 5 +- .../tanstack-start/src/components/Footer.tsx | 4 +- examples/tanstack-start/src/routes/__root.tsx | 4 +- .../tanstack-start/src/routes/admin.$.tsx | 6 +- examples/tanstack-start/src/routes/api.$.ts | 4 +- examples/tanstack-start/src/routes/index.tsx | 6 +- examples/tanstack-start/src/routes/ssr.tsx | 18 +- examples/waku/bknd.config.ts | 18 +- examples/waku/package.json | 2 +- examples/waku/src/bknd.ts | 4 +- examples/waku/src/lib/waku/server.ts | 2 +- examples/waku/src/pages/_layout.tsx | 2 +- examples/waku/src/pages/admin/[...admin].tsx | 2 +- .../src/pages/admin/_components/AdminImpl.tsx | 4 +- .../pages/admin/_components/AdminLoader.tsx | 4 +- examples/waku/src/pages/api/[...api].ts | 2 +- package.json | 2 +- packages/cli/package.json | 2 +- packages/plasmic/README.md | 2 +- packages/plasmic/package.json | 6 +- packages/plasmic/src/components/Image.tsx | 3 +- .../plasmic/src/components/LazyRender.tsx | 2 +- .../plasmic/src/components/data/BkndData.tsx | 30 +- packages/plasmic/src/components/index.ts | 2 +- packages/plasmic/src/contexts/BkndContext.tsx | 46 +- packages/plasmic/src/contexts/index.ts | 2 +- packages/plasmic/src/index.ts | 10 +- packages/plasmic/src/nextjs/index.tsx | 2 +- packages/plasmic/tsconfig.json | 2 +- 529 files changed, 2385 insertions(+), 2924 deletions(-) rename app/src/adapter/browser/{BkndBrowserApp.tsx => UserbaseBrowserApp.tsx} (77%) rename app/src/ui/client/{BkndProvider.tsx => UserbaseProvider.tsx} (86%) delete mode 100644 app/src/ui/client/bknd.ts rename app/src/ui/client/schema/auth/{use-bknd-auth.ts => use-userbase-auth.ts} (76%) rename app/src/ui/client/schema/data/{use-bknd-data.ts => use-userbase-data.ts} (77%) rename app/src/ui/client/schema/media/{use-bknd-media.ts => use-userbase-media.ts} (57%) rename app/src/ui/client/schema/system/{use-bknd-system.ts => use-userbase-system.ts} (63%) create mode 100644 app/src/ui/client/userbase.ts diff --git a/.cursor/mcp.json b/.cursor/mcp.json index 8cd1d99e..475104b2 100644 --- a/.cursor/mcp.json +++ b/.cursor/mcp.json @@ -1,6 +1,6 @@ { "mcpServers": { - "bknd": { + "userbase": { "url": "http://localhost:28623/api/system/mcp" } } diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 1b30ca61..98f971ac 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -15,7 +15,7 @@ jobs: env: POSTGRES_PASSWORD: postgres POSTGRES_USER: postgres - POSTGRES_DB: bknd + POSTGRES_DB: userbase # ports: # - 5430:5432 options: >- diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ed2e73c4..fc7ebd22 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ -# Contributing to bknd +# Contributing to userbase -Thank you for your interest in contributing to bknd. This guide will help you get started, understand the codebase, and submit contributions that align with the project's direction. +Thank you for your interest in contributing to userbase. This guide will help you get started, understand the codebase, and submit contributions that align with the project's direction. ## Table of Contents @@ -23,7 +23,7 @@ Thank you for your interest in contributing to bknd. This guide will help you ge **Open a GitHub Issue before writing code.** This is the preferred way to propose any change. It lets maintainers and the community align on the approach before time is spent on implementation. If you have discussed a contribution in the [Discord server](https://discord.com/invite/952SFk8Tb8) instead, include a link to the relevant Discord thread in your pull request. Pull requests submitted without a corresponding issue or Discord discussion may be closed. -**Unsolicited architectural changes will be closed.** The internal architecture of bknd is intentional. Refactors, restructuring, or changes to core patterns must be discussed and approved before any code is written. +**Unsolicited architectural changes will be closed.** The internal architecture of userbase is intentional. Refactors, restructuring, or changes to core patterns must be discussed and approved before any code is written. Contributions that are generally welcome (after opening an issue): @@ -33,12 +33,12 @@ Contributions that are generally welcome (after opening an issue): - New examples - Test coverage improvements -**A note on versioning**: bknd is pre-1.0 and under active development. Full backward compatibility is not guaranteed before v1.0.0. Contributors should be aware that APIs and internal interfaces may change between releases. +**A note on versioning**: userbase is pre-1.0 and under active development. Full backward compatibility is not guaranteed before v1.0.0. Contributors should be aware that APIs and internal interfaces may change between releases. ## Important Resources -- **Documentation**: https://docs.bknd.io -- **Issue Tracker**: https://github.com/bknd-io/bknd/issues +- **Documentation**: https://docs.userbase.io +- **Issue Tracker**: https://github.com/userbase-io/userbase/issues - **Discord**: https://discord.com/invite/952SFk8Tb8 - **FAQ / Search**: https://www.answeroverflow.com/c/1308395750564302952 @@ -86,8 +86,8 @@ Contributions that are generally welcome (after opening an issue): This is a Bun monorepo using workspaces. The vast majority of the code lives in `app/`. ``` -bknd/ - app/ # Main "bknd" npm package (this is where most work happens) +userbase/ + app/ # Main "userbase" npm package (this is where most work happens) src/ adapter/ # Runtime/framework adapters (node, bun, cloudflare, nextjs, astro, etc.) auth/ # Authentication module (strategies, sessions, user pool) @@ -100,9 +100,9 @@ bknd/ modules/ # Module system, MCP server, permissions framework plugins/ # Built-in plugins (auth, data, cloudflare, dev) ui/ # All frontend code - client/ # TypeScript SDK and React hooks (exported as bknd/client) - elements/ # React components for auth/media (exported as bknd/elements) - (everything else) # Admin UI (exported as bknd/ui) + client/ # TypeScript SDK and React hooks (exported as userbase/client) + elements/ # React components for auth/media (exported as userbase/elements) + (everything else) # Admin UI (exported as userbase/ui) App.ts # Central application orchestrator index.ts # Main package exports __test__/ # Unit tests (mirrors src/ structure) @@ -110,11 +110,11 @@ bknd/ build.ts # Build script (tsup/esbuild) build.cli.ts # CLI build script packages/ # Small satellite packages - cli/ # Standalone CLI package (bknd-cli) + cli/ # Standalone CLI package (userbase-cli) plasmic/ # Plasmic integration postgres/ # Postgres helper sqlocal/ # SQLocal helper - docs/ # Documentation site (Next.js + Fumadocs, deployed to docs.bknd.io) + docs/ # Documentation site (Next.js + Fumadocs, deployed to docs.userbase.io) examples/ # Example projects across runtimes and frameworks docker/ # Docker configuration ``` @@ -127,7 +127,7 @@ The project uses TypeScript path aliases defined in `app/tsconfig.json`. Imports ### Module System -bknd is built around four core modules, each with its own schema, API routes, and permissions: +userbase is built around four core modules, each with its own schema, API routes, and permissions: - **Data** -- entity definitions, field types, relations, queries (backed by Kysely) - **Auth** -- authentication strategies, sessions, user management @@ -138,7 +138,7 @@ These modules are managed by the `ModuleManager` (in `app/src/modules/`), which ### Adapter Pattern -Adapters in `app/src/adapter/` allow bknd to run on different runtimes and frameworks. Each adapter provides the glue between bknd's Hono-based server and a specific environment (Node, Bun, Cloudflare Workers, Next.js, Astro, etc.). +Adapters in `app/src/adapter/` allow userbase to run on different runtimes and frameworks. Each adapter provides the glue between userbase's Hono-based server and a specific environment (Node, Bun, Cloudflare Workers, Next.js, Astro, etc.). ### Plugin System @@ -242,26 +242,26 @@ Open a GitHub Issue with: - A clear title describing the problem. - Steps to reproduce the bug. - Expected behavior vs. actual behavior. -- Your environment (runtime, database, adapter, bknd version). +- Your environment (runtime, database, adapter, userbase version). - Any relevant error messages or logs. ## Getting Help - **Discord**: https://discord.com/invite/952SFk8Tb8 - **FAQ / Search**: https://www.answeroverflow.com/c/1308395750564302952 -- **GitHub Issues**: https://github.com/bknd-io/bknd/issues +- **GitHub Issues**: https://github.com/userbase-io/userbase/issues ## Contributors -Thank you to everyone who has contributed to bknd. +Thank you to everyone who has contributed to userbase. - - + + Made with [contrib.rocks](https://contrib.rocks). ## Maintainers -- **Dennis** ([@dswbx](https://github.com/dswbx)) -- Creator and maintainer of bknd -- **Cameron Pak** ([@cameronapak](https://github.com/cameronapak)) -- Maintainer of bknd docs +- **Dennis** ([@dswbx](https://github.com/dswbx)) -- Creator and maintainer of userbase +- **Cameron Pak** ([@cameronapak](https://github.com/cameronapak)) -- Maintainer of userbase docs diff --git a/README.md b/README.md index a28f54ba..1a4f7411 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,16 @@ -[![npm version](https://img.shields.io/npm/v/bknd.svg)](https://npmjs.org/package/bknd) +This is an independently maintained fork of [userbase](https://github.com/userbase-io/userbase) which is a drop in replacement for the original package. It is intended to be used in projects that require a more up-to-date version of userbase, or that need to use features that are not available in the original package. -![bknd](https://raw.githubusercontent.com/bknd-io/bknd/refs/heads/main/docs/public/assets/poster.png) +[![npm version](https://img.shields.io/npm/v/userbase.svg)](https://npmjs.org/package/userbase) + +![userbase](https://raw.githubusercontent.com/userbase-io/userbase/refs/heads/main/docs/public/assets/poster.png)

- + ⭐ Live Demo

-bknd simplifies app development by providing a fully functional visual backend for database management, authentication, media and workflows. Being lightweight and built on Web Standards, it can be deployed nearly anywhere, including running inside your framework of choice. No more deploying multiple separate services! +userbase simplifies app development by providing a fully functional visual backend for database management, authentication, media and workflows. Being lightweight and built on Web Standards, it can be deployed nearly anywhere, including running inside your framework of choice. No more deploying multiple separate services! It's designed to avoid vendor lock-in and architectural limitations. Built exclusively on [WinterTC Minimum Common Web Platform API](https://min-common-api.proposal.wintertc.org/) for universal compatibility, all functionality (data, auth, media, flows) is modular and opt-in, and infrastructure access is adapter-based with direct access to underlying drivers giving you full control without abstractions getting in your way. @@ -20,17 +22,17 @@ It's designed to avoid vendor lock-in and architectural limitations. Built exclu * **Storage**: AWS S3, S3-compatible (Tigris, R2, Minio, etc.), Cloudflare R2 (binding), Cloudinary, Filesystem, Origin Private File System (OPFS) * **Deployment**: Standalone, Docker, Cloudflare Workers, Vercel, Netlify, Deno Deploy, AWS Lambda, Valtown etc. -**For documentation and examples, please visit https://docs.bknd.io.** +**For documentation and examples, please visit https://docs.userbase.io.** > [!WARNING] > This project requires Node.js 22.13 or higher (because of `node:sqlite`). > -> Please keep in mind that **bknd** is still under active development +> Please keep in mind that **userbase** is still under active development > and therefore full backward compatibility is not guaranteed before reaching v1.0.0. ## Use Cases -bknd is a general purpose backend system that implements the primitives almost any backend needs. This way, you can use it for any backend use case, including but not limited to: +userbase is a general purpose backend system that implements the primitives almost any backend needs. This way, you can use it for any backend use case, including but not limited to: - **Content Management System (CMS)** as Wordpress alternative, hosted separately or embedded in your frontend - **AI Agent Backends** for managing agent state with built-in data persistence, regardless where it is hosted. Optionally communicate over the integrated MCP server. @@ -41,14 +43,14 @@ bknd is a general purpose backend system that implements the primitives almost a ## Size -![gzipped size of bknd](https://img.shields.io/bundlejs/size/bknd?label=bknd) -![gzipped size of bknd/client](https://img.badgesize.io/https://unpkg.com/bknd@latest/dist/ui/client/index.js?compression=gzip&label=bknd/client) -![gzipped size of bknd/elements](https://img.badgesize.io/https://unpkg.com/bknd@latest/dist/ui/elements/index.js?compression=gzip&label=bknd/elements&t=1) -![gzipped size of bknd/ui](https://img.badgesize.io/https://unpkg.com/bknd@latest/dist/ui/index.js?compression=gzip&label=bknd/ui&t=1) +![gzipped size of userbase](https://img.shields.io/bundlejs/size/userbase?label=userbase) +![gzipped size of userbase/client](https://img.badgesize.io/https://unpkg.com/userbase@latest/dist/ui/client/index.js?compression=gzip&label=userbase/client) +![gzipped size of userbase/elements](https://img.badgesize.io/https://unpkg.com/userbase@latest/dist/ui/elements/index.js?compression=gzip&label=userbase/elements&t=1) +![gzipped size of userbase/ui](https://img.badgesize.io/https://unpkg.com/userbase@latest/dist/ui/index.js?compression=gzip&label=userbase/ui&t=1) -The size on npm is misleading, as the `bknd` package includes the backend, the ui components as well as the whole backend bundled into the cli including static assets. +The size on npm is misleading, as the `userbase` package includes the backend, the ui components as well as the whole backend bundled into the cli including static assets. -Depending on what you use, the size can be higher as additional dependencies are getting pulled in. The minimal size of a full `bknd` app as an API is around 300 kB gzipped (e.g. deployed as Cloudflare Worker). +Depending on what you use, the size can be higher as additional dependencies are getting pulled in. The minimal size of a full `userbase` app as an API is around 300 kB gzipped (e.g. deployed as Cloudflare Worker). ## Motivation Creating digital products always requires developing both the backend (the logic) and the frontend (the appearance). Building a backend from scratch demands deep knowledge in areas such as authentication and database management. Using a backend framework can speed up initial development, but it still requires ongoing effort to work within its constraints (e.g., *"how to do X with Y?"*), which can quickly slow you down. Choosing a backend system is a tough decision, as you might not be aware of its limitations until you encounter them. @@ -75,33 +77,33 @@ The package is mainly split into 4 parts, each serving a specific purpose: | Import | Purpose | |-----------------------------|------------------------------------------------------| -| `bknd`
`bknd/adapter/*` | Backend including APIs and adapters | -| `bknd/ui` | Admin UI components for react frameworks | -| `bknd/client` | TypeScript SDK and React hooks for the API endpoints | -| `bknd/elements` | React components for authentication and media | +| `userbase`
`userbase/adapter/*` | Backend including APIs and adapters | +| `userbase/ui` | Admin UI components for react frameworks | +| `userbase/client` | TypeScript SDK and React hooks for the API endpoints | +| `userbase/elements` | React components for authentication and media | -### The backend (`bknd`) +### The backend (`userbase`) Serve the backend as an API for any JS runtime or framework. The latter is especially handy, as it allows you to deploy your frontend and backend bundled together. Furthermore it allows adding additional logic in a way you're already familar with. Just add another route and you're good to go. Here is an example of serving the API using node: ```js index.js -import { serve } from "bknd/adapter/node" +import { serve } from "userbase/adapter/node" serve(); ``` -### Integrated admin UI (`bknd/ui`) +### Integrated admin UI (`userbase/ui`) The admin UI allows to manage your data including full configuration of your backend using a graphical user interface. Using `vite`, your admin route looks like this: ```tsx -import { Admin } from "bknd/ui" -import "bknd/dist/styles.css"; +import { Admin } from "userbase/ui" +import "userbase/dist/styles.css"; export default function AdminPage() { return } ``` -### Using the REST API or TypeScript SDK (`bknd/client`) +### Using the REST API or TypeScript SDK (`userbase/client`) If you're not using a JavaScript environment, you can still access any endpoint using the REST API: ```bash curl -XGET /api/data/entity/ @@ -116,7 +118,7 @@ curl -XGET /api/data/entity/ In a JavaScript environment, you can use the TypeScript SDK with type-safety. The above example would look like this: ```ts -import { Api } from "bknd/client"; +import { Api } from "userbase/client"; const api = new Api({ host: "" }); const { data } = await api.data.readMany(""); @@ -126,7 +128,7 @@ If you're using React, there are 2 hooks exposed (`useApi`, `useEntity`), as wel ```tsx import { useState } from "react"; -import { useEntityQuery } from "bknd/client"; +import { useEntityQuery } from "userbase/client"; export default function App() { const { data } = useEntityQuery("todos"); @@ -138,11 +140,11 @@ export default function App() { } ``` -### React elements (`bknd/elements`) +### React elements (`userbase/elements`) You don't have to figure out API details to include media uploads to your app. For an user avatar upload, this is all you need: ```tsx -import { Media } from "bknd/elements" -import "bknd/dist/main.css" +import { Media } from "userbase/elements" +import "userbase/dist/main.css" export function UserAvatar() { return } ``` -The import path also exports components for login and registration forms which are automatically pointed to the `bknd` defaults. +The import path also exports components for login and registration forms which are automatically pointed to the `userbase` defaults. ## 🚀 Quick start To quickly spin up an instance, run: ```bash -npx bknd run +npx userbase run ``` ### Installation ```bash -npm install bknd +npm install userbase ``` ## Contributing @@ -174,10 +176,10 @@ Before writing code, please open a GitHub Issue or start a conversation in [Disc ## Contributors -Thank you to everyone who has contributed to bknd. +Thank you to everyone who has contributed to userbase. - - + + Made with [contrib.rocks](https://contrib.rocks). diff --git a/app/.gitignore b/app/.gitignore index c7044f84..503aa182 100644 --- a/app/.gitignore +++ b/app/.gitignore @@ -1,5 +1,5 @@ playwright-report test-results -bknd.config.* +userbase.config.* __test__/helper.d.ts .env.local \ No newline at end of file diff --git a/app/__test__/app/code-only.test.ts b/app/__test__/app/code-only.test.ts index 003c1e40..2291e010 100644 --- a/app/__test__/app/code-only.test.ts +++ b/app/__test__/app/code-only.test.ts @@ -1,5 +1,5 @@ import { describe, expect, mock, test, beforeAll, afterAll } from "bun:test"; -import { createApp as internalCreateApp, type CreateAppConfig } from "bknd"; +import { createApp as internalCreateApp, type CreateAppConfig } from "userbase"; import { getDummyConnection } from "../../__test__/helper"; import { ModuleManager } from "modules/ModuleManager"; import { em, entity, text } from "data/prototype"; diff --git a/app/__test__/app/mcp/mcp.auth.test.ts b/app/__test__/app/mcp/mcp.auth.test.ts index 2636730e..b269f8ab 100644 --- a/app/__test__/app/mcp/mcp.auth.test.ts +++ b/app/__test__/app/mcp/mcp.auth.test.ts @@ -1,7 +1,7 @@ import { describe, test, expect, beforeEach, beforeAll, afterAll } from "bun:test"; import { type App, createApp, createMcpToolCaller } from "core/test/utils"; import { disableConsoleLog, enableConsoleLog } from "core/utils"; -import type { McpServer } from "bknd/utils"; +import type { McpServer } from "userbase/utils"; beforeAll(disableConsoleLog); afterAll(enableConsoleLog); diff --git a/app/__test__/app/mcp/mcp.data.test.ts b/app/__test__/app/mcp/mcp.data.test.ts index 43aecf5a..30f4fec4 100644 --- a/app/__test__/app/mcp/mcp.data.test.ts +++ b/app/__test__/app/mcp/mcp.data.test.ts @@ -1,8 +1,8 @@ import { describe, test, expect, beforeEach, beforeAll, afterAll } from "bun:test"; import { type App, createApp, createMcpToolCaller } from "core/test/utils"; import { getSystemMcp } from "modules/mcp/system-mcp"; -import { pickKeys, type McpServer } from "bknd/utils"; -import { entity, text } from "bknd"; +import { pickKeys, type McpServer } from "userbase/utils"; +import { entity, text } from "userbase"; import { disableConsoleLog, enableConsoleLog } from "core/utils"; beforeAll(disableConsoleLog); diff --git a/app/__test__/app/mcp/mcp.media.test.ts b/app/__test__/app/mcp/mcp.media.test.ts index ad5383e2..889889fb 100644 --- a/app/__test__/app/mcp/mcp.media.test.ts +++ b/app/__test__/app/mcp/mcp.media.test.ts @@ -4,7 +4,7 @@ import { getSystemMcp } from "modules/mcp/system-mcp"; import { registries } from "index"; import { StorageLocalAdapter } from "adapter/node/storage/StorageLocalAdapter"; import { disableConsoleLog, enableConsoleLog } from "core/utils"; -import type { McpServer } from "bknd/utils"; +import type { McpServer } from "userbase/utils"; beforeAll(disableConsoleLog); afterAll(enableConsoleLog); diff --git a/app/__test__/app/mcp/mcp.server.test.ts b/app/__test__/app/mcp/mcp.server.test.ts index ce072b67..fec4c0a2 100644 --- a/app/__test__/app/mcp/mcp.server.test.ts +++ b/app/__test__/app/mcp/mcp.server.test.ts @@ -1,6 +1,6 @@ import { describe, test, expect, beforeAll, afterAll } from "bun:test"; import { type App, createApp, createMcpToolCaller } from "core/test/utils"; -import type { McpServer } from "bknd/utils"; +import type { McpServer } from "userbase/utils"; import { disableConsoleLog, enableConsoleLog } from "core/utils/test"; beforeAll(() => disableConsoleLog()); diff --git a/app/__test__/app/mcp/mcp.system.test.ts b/app/__test__/app/mcp/mcp.system.test.ts index 63f6880a..df804317 100644 --- a/app/__test__/app/mcp/mcp.system.test.ts +++ b/app/__test__/app/mcp/mcp.system.test.ts @@ -1,7 +1,7 @@ import { AppEvents } from "App"; import { describe, test, expect, beforeAll, mock, afterAll } from "bun:test"; import { type App, createApp, createMcpToolCaller } from "core/test/utils"; -import type { McpServer } from "bknd/utils"; +import type { McpServer } from "userbase/utils"; import { disableConsoleLog, enableConsoleLog } from "core/utils/test"; beforeAll(disableConsoleLog); diff --git a/app/__test__/auth/authorize/authorize.spec.ts b/app/__test__/auth/authorize/authorize.spec.ts index 2f920ff6..33f45aea 100644 --- a/app/__test__/auth/authorize/authorize.spec.ts +++ b/app/__test__/auth/authorize/authorize.spec.ts @@ -2,7 +2,7 @@ import { describe, expect, test, beforeAll, afterAll } from "bun:test"; import { Guard, type GuardConfig } from "auth/authorize/Guard"; import { Permission } from "auth/authorize/Permission"; import { Role, type RoleSchema } from "auth/authorize/Role"; -import { objectTransform, s } from "bknd/utils"; +import { objectTransform, s } from "userbase/utils"; import { disableConsoleLog, enableConsoleLog } from "core/utils/test"; beforeAll(disableConsoleLog); diff --git a/app/__test__/auth/authorize/data.permissions.test.ts b/app/__test__/auth/authorize/data.permissions.test.ts index 5b796c23..846594b4 100644 --- a/app/__test__/auth/authorize/data.permissions.test.ts +++ b/app/__test__/auth/authorize/data.permissions.test.ts @@ -3,7 +3,7 @@ import { createApp } from "core/test/utils"; import type { CreateAppConfig } from "App"; import * as proto from "data/prototype"; import { mergeObject } from "core/utils/objects"; -import type { App, DB } from "bknd"; +import type { App, DB } from "userbase"; import type { CreateUserPayload } from "auth/AppAuth"; import { disableConsoleLog, enableConsoleLog } from "core/utils/test"; diff --git a/app/__test__/auth/authorize/permissions.spec.ts b/app/__test__/auth/authorize/permissions.spec.ts index 411ad20a..55e44bd6 100644 --- a/app/__test__/auth/authorize/permissions.spec.ts +++ b/app/__test__/auth/authorize/permissions.spec.ts @@ -1,5 +1,5 @@ import { describe, it, expect } from "bun:test"; -import { s } from "bknd/utils"; +import { s } from "userbase/utils"; import { Permission } from "auth/authorize/Permission"; import { Policy } from "auth/authorize/Policy"; import { Hono } from "hono"; @@ -7,7 +7,7 @@ import { getPermissionRoutes, permission } from "auth/middlewares/permission.mid import { auth } from "auth/middlewares/auth.middleware"; import { Guard, mergeFilters, type GuardConfig } from "auth/authorize/Guard"; import { Role, RolePermission } from "auth/authorize/Role"; -import { Exception } from "bknd"; +import { Exception } from "userbase"; import { convert } from "core/object/query/object-query"; describe("Permission", () => { @@ -421,7 +421,7 @@ describe("permission middleware", () => { ); const res = await hono.request("/test"); - // expecting 500 because bknd should have handled it correctly + // expecting 500 because userbase should have handled it correctly expect(res.status).toBe(500); }); diff --git a/app/__test__/data/postgres.test.ts b/app/__test__/data/postgres.test.ts index 3f9364a1..3b4e6616 100644 --- a/app/__test__/data/postgres.test.ts +++ b/app/__test__/data/postgres.test.ts @@ -1,9 +1,9 @@ import { describe, beforeAll, afterAll, test } from "bun:test"; import type { PostgresConnection } from "data/connection/postgres/PostgresConnection"; -import { pg, postgresJs } from "bknd"; +import { pg, postgresJs } from "userbase"; import { Pool } from "pg"; import postgres from "postgres"; -import { disableConsoleLog, enableConsoleLog, $waitUntil } from "bknd/utils"; +import { disableConsoleLog, enableConsoleLog, $waitUntil } from "userbase/utils"; import { $ } from "bun"; import { connectionTestSuite } from "data/connection/connection-test-suite"; import { bunTestRunner } from "adapter/bun/test"; @@ -15,7 +15,7 @@ const credentials = { port: 5432, user: "postgres", password: "postgres", - database: "bknd", + database: "userbase", }; async function cleanDatabase(connection: InstanceType) { @@ -47,7 +47,7 @@ describe("postgres", () => { } if (!(await isPostgresRunning())) { - await $`docker run --rm --name bknd-test-postgres -d -e POSTGRES_PASSWORD=${credentials.password} -e POSTGRES_USER=${credentials.user} -e POSTGRES_DB=${credentials.database} -p ${credentials.port}:5432 postgres:17`; + await $`docker run --rm --name userbase-test-postgres -d -e POSTGRES_PASSWORD=${credentials.password} -e POSTGRES_USER=${credentials.user} -e POSTGRES_DB=${credentials.database} -p ${credentials.port}:5432 postgres:17`; await $waitUntil("Postgres is running", isPostgresRunning, 500, 20); await new Promise((resolve) => setTimeout(resolve, 500)); } @@ -57,7 +57,7 @@ describe("postgres", () => { afterAll(async () => { if (await isPostgresRunning()) { try { - await $`docker stop bknd-test-postgres`; + await $`docker stop userbase-test-postgres`; } catch (e) {} } diff --git a/app/__test__/debug/jsonv-resolution.test.ts b/app/__test__/debug/jsonv-resolution.test.ts index 64b60e42..0a926aa6 100644 --- a/app/__test__/debug/jsonv-resolution.test.ts +++ b/app/__test__/debug/jsonv-resolution.test.ts @@ -1,10 +1,10 @@ import { describe, it, expect } from "bun:test"; import * as sDirect from "jsonv-ts"; -import { s as sFromBknd } from "bknd/utils"; +import { s as sFromUserbase } from "userbase/utils"; describe("jsonv-ts resolution", () => { it("should resolve to a single instance", () => { - const sameNamespace = sDirect === (sFromBknd as unknown as typeof sDirect); + const sameNamespace = sDirect === (sFromUserbase as unknown as typeof sDirect); // If this fails, two instances are being loaded via different specifiers/paths expect(sameNamespace).toBe(true); }); diff --git a/app/__test__/helper.ts b/app/__test__/helper.ts index aaf88d29..e7a653c5 100644 --- a/app/__test__/helper.ts +++ b/app/__test__/helper.ts @@ -5,7 +5,7 @@ import { format as sqlFormat } from "sql-formatter"; import type { em as protoEm } from "../src/data/prototype"; import { writeFile } from "node:fs/promises"; import { join } from "node:path"; -import { slugify } from "bknd/utils"; +import { slugify } from "userbase/utils"; import { type Connection, SqliteLocalConnection } from "data/connection"; import { EntityManager } from "data/entities/EntityManager"; diff --git a/app/__test__/integration/auth.integration.test.ts b/app/__test__/integration/auth.integration.test.ts index b63b2b50..73e96dc4 100644 --- a/app/__test__/integration/auth.integration.test.ts +++ b/app/__test__/integration/auth.integration.test.ts @@ -57,11 +57,11 @@ const configs = { }, users: { normal: { - email: "normal@bknd.io", + email: "normal@userbase.io", password: "12345678", }, admin: { - email: "admin@bknd.io", + email: "admin@userbase.io", password: "12345678", role: "admin", }, @@ -271,7 +271,7 @@ describe("integration auth", () => { expect( await app .createUser({ - email: "test@bknd.io", + email: "test@userbase.io", password: "12345678", }) .then((r) => r.role), @@ -280,7 +280,7 @@ describe("integration auth", () => { // throws error if role doesn't exist expect( app.createUser({ - email: "test@bknd.io", + email: "test@userbase.io", password: "12345678", role: "doesnt exist", }), @@ -290,7 +290,7 @@ describe("integration auth", () => { expect( await app .createUser({ - email: "test2@bknd.io", + email: "test2@userbase.io", password: "12345678", role: "admin", }) @@ -301,7 +301,7 @@ describe("integration auth", () => { expect( await $fns .register({ - email: "test3@bknd.io", + email: "test3@userbase.io", password: "12345678", role: "admin", }) @@ -312,7 +312,7 @@ describe("integration auth", () => { expect( await $fns .register({ - email: "test3@bknd.io", + email: "test3@userbase.io", password: "12345678", }) .then((r) => r.data.user.role), diff --git a/app/__test__/modules/AppAuth.spec.ts b/app/__test__/modules/AppAuth.spec.ts index 15128c14..c850a4db 100644 --- a/app/__test__/modules/AppAuth.spec.ts +++ b/app/__test__/modules/AppAuth.spec.ts @@ -136,7 +136,7 @@ describe("AppAuth", () => { } }); - test("registers auth middleware for bknd routes only", async () => { + test("registers auth middleware for userbase routes only", async () => { const app = createApp({ config: { auth: { diff --git a/app/__test__/modules/migrations/migrations.spec.ts b/app/__test__/modules/migrations/migrations.spec.ts index f68b462b..0b58f49e 100644 --- a/app/__test__/modules/migrations/migrations.spec.ts +++ b/app/__test__/modules/migrations/migrations.spec.ts @@ -25,7 +25,7 @@ async function createVersionedApp( const { version, ...rest } = config; const db = dummyConnection.kysely as Kysely; - await sql`CREATE TABLE "__bknd" ( + await sql`CREATE TABLE "__userbase" ( "id" integer not null primary key autoincrement, "version" integer, "type" text, @@ -35,7 +35,7 @@ async function createVersionedApp( )`.execute(db); await db - .insertInto("__bknd") + .insertInto("__userbase") .values({ version, type: "config", @@ -61,7 +61,7 @@ async function getRawConfig( ) { const db = app.em.connection.kysely; return await db - .selectFrom("__bknd") + .selectFrom("__userbase") .selectAll() .where("version", "=", opts?.version ?? CURRENT_VERSION) .$if((opts?.types?.length ?? 0) > 0, (qb) => qb.where("type", "in", opts?.types)) diff --git a/app/__test__/modules/migrations/samples/v8.json b/app/__test__/modules/migrations/samples/v8.json index e4bacee8..24132e93 100644 --- a/app/__test__/modules/migrations/samples/v8.json +++ b/app/__test__/modules/migrations/samples/v8.json @@ -546,7 +546,7 @@ "config": { "access_key": "123", "secret_access_key": "123", - "url": "https://123.r2.cloudflarestorage.com/bknd-123" + "url": "https://123.r2.cloudflarestorage.com/userbase-123" } } }, diff --git a/app/__test__/modules/module-test-suite.ts b/app/__test__/modules/module-test-suite.ts index 1f19f4eb..aedd1ce2 100644 --- a/app/__test__/modules/module-test-suite.ts +++ b/app/__test__/modules/module-test-suite.ts @@ -7,7 +7,7 @@ import { EntityManager } from "data/entities/EntityManager"; import { Module, type ModuleBuildContext } from "modules/Module"; import { getDummyConnection } from "../helper"; import { ModuleHelper } from "modules/ModuleHelper"; -import { DebugLogger, McpServer } from "bknd/utils"; +import { DebugLogger, McpServer } from "userbase/utils"; export function makeCtx(overrides?: Partial): ModuleBuildContext { const { dummyConnection } = getDummyConnection(); diff --git a/app/__test__/ui/client/utils/AppReduced.spec.ts b/app/__test__/ui/client/utils/AppReduced.spec.ts index f0471fc9..3eaf017c 100644 --- a/app/__test__/ui/client/utils/AppReduced.spec.ts +++ b/app/__test__/ui/client/utils/AppReduced.spec.ts @@ -1,6 +1,6 @@ import { describe, it, expect, beforeEach } from "vitest"; import { AppReduced, type AppType } from "ui/client/utils/AppReduced"; -import type { BkndAdminProps } from "ui/Admin"; +import type { UserbaseAdminProps } from "ui/Admin"; // Import the normalizeAdminPath function for testing // Note: This assumes the function is exported or we need to test it indirectly through public methods @@ -24,7 +24,7 @@ describe("AppReduced", () => { describe("getSettingsPath", () => { it("should return settings path with basepath", () => { - const options: BkndAdminProps["config"] = { + const options: UserbaseAdminProps["config"] = { basepath: "/admin", logo_return_path: "/", }; @@ -36,7 +36,7 @@ describe("AppReduced", () => { }); it("should return settings path with empty basepath", () => { - const options: BkndAdminProps["config"] = { + const options: UserbaseAdminProps["config"] = { basepath: "", logo_return_path: "/", }; @@ -48,7 +48,7 @@ describe("AppReduced", () => { }); it("should append additional path segments", () => { - const options: BkndAdminProps["config"] = { + const options: UserbaseAdminProps["config"] = { basepath: "/admin", logo_return_path: "/", }; @@ -60,7 +60,7 @@ describe("AppReduced", () => { }); it("should normalize multiple slashes", () => { - const options: BkndAdminProps["config"] = { + const options: UserbaseAdminProps["config"] = { basepath: "//admin//", logo_return_path: "/", }; @@ -72,7 +72,7 @@ describe("AppReduced", () => { }); it("should handle basepath without leading slash", () => { - const options: BkndAdminProps["config"] = { + const options: UserbaseAdminProps["config"] = { basepath: "admin", logo_return_path: "/", }; @@ -86,7 +86,7 @@ describe("AppReduced", () => { describe("getAbsolutePath", () => { it("should return absolute path with basepath", () => { - const options: BkndAdminProps["config"] = { + const options: UserbaseAdminProps["config"] = { basepath: "/admin", logo_return_path: "/", }; @@ -98,7 +98,7 @@ describe("AppReduced", () => { }); it("should return base path when no path provided", () => { - const options: BkndAdminProps["config"] = { + const options: UserbaseAdminProps["config"] = { basepath: "/admin", logo_return_path: "/", }; @@ -110,7 +110,7 @@ describe("AppReduced", () => { }); it("should normalize paths correctly", () => { - const options: BkndAdminProps["config"] = { + const options: UserbaseAdminProps["config"] = { basepath: "//admin//", logo_return_path: "/", }; @@ -124,7 +124,7 @@ describe("AppReduced", () => { describe("options getter", () => { it("should return merged options with defaults", () => { - const customOptions: BkndAdminProps["config"] = { + const customOptions: UserbaseAdminProps["config"] = { basepath: "/custom-admin", logo_return_path: "/custom-home", }; @@ -139,7 +139,7 @@ describe("AppReduced", () => { }); it("should use default logo_return_path when not provided", () => { - const customOptions: BkndAdminProps["config"] = { + const customOptions: UserbaseAdminProps["config"] = { basepath: "/admin", }; @@ -153,7 +153,7 @@ describe("AppReduced", () => { describe("path normalization behavior", () => { it("should normalize duplicate slashes in settings path", () => { - const options: BkndAdminProps["config"] = { + const options: UserbaseAdminProps["config"] = { basepath: "/admin", logo_return_path: "/", }; @@ -165,7 +165,7 @@ describe("AppReduced", () => { }); it("should handle root path normalization", () => { - const options: BkndAdminProps["config"] = { + const options: UserbaseAdminProps["config"] = { basepath: "/", logo_return_path: "/", }; @@ -179,7 +179,7 @@ describe("AppReduced", () => { }); it("should preserve entity paths ending with slash", () => { - const options: BkndAdminProps["config"] = { + const options: UserbaseAdminProps["config"] = { basepath: "/admin", logo_return_path: "/", }; @@ -191,7 +191,7 @@ describe("AppReduced", () => { }); it("should remove trailing slashes from non-entity paths", () => { - const options: BkndAdminProps["config"] = { + const options: UserbaseAdminProps["config"] = { basepath: "/admin", logo_return_path: "/", }; @@ -205,7 +205,7 @@ describe("AppReduced", () => { describe("withBasePath - double slash fix (admin_basepath with trailing slash)", () => { it("should not produce double slashes when admin_basepath has trailing slash", () => { - const options: BkndAdminProps["config"] = { + const options: UserbaseAdminProps["config"] = { basepath: "/admin", logo_return_path: "/", }; @@ -218,7 +218,7 @@ describe("AppReduced", () => { }); it("should work correctly when admin_basepath has no trailing slash", () => { - const options: BkndAdminProps["config"] = { + const options: UserbaseAdminProps["config"] = { basepath: "/admin", logo_return_path: "/", }; @@ -230,7 +230,7 @@ describe("AppReduced", () => { }); it("should handle absolute paths with admin_basepath trailing slash", () => { - const options: BkndAdminProps["config"] = { + const options: UserbaseAdminProps["config"] = { basepath: "/admin", logo_return_path: "/", }; @@ -243,7 +243,7 @@ describe("AppReduced", () => { }); it("should handle settings path with admin_basepath trailing slash", () => { - const options: BkndAdminProps["config"] = { + const options: UserbaseAdminProps["config"] = { basepath: "/admin", logo_return_path: "/", }; @@ -258,7 +258,7 @@ describe("AppReduced", () => { describe("edge cases", () => { it("should handle undefined basepath", () => { - const options: BkndAdminProps["config"] = { + const options: UserbaseAdminProps["config"] = { logo_return_path: "/", }; @@ -270,7 +270,7 @@ describe("AppReduced", () => { }); it("should handle null path segments", () => { - const options: BkndAdminProps["config"] = { + const options: UserbaseAdminProps["config"] = { basepath: "/admin", logo_return_path: "/", }; diff --git a/app/build.cli.ts b/app/build.cli.ts index 0b7ca138..ea79776f 100644 --- a/app/build.cli.ts +++ b/app/build.cli.ts @@ -1,9 +1,9 @@ import pkg from "./package.json" with { type: "json" }; import c from "picocolors"; -import { formatNumber } from "bknd/utils"; +import { formatNumber } from "userbase/utils"; const deps = Object.keys(pkg.dependencies); -const external = ["jsonv-ts/*", "wrangler", "bknd", "bknd/*", ...deps]; +const external = ["jsonv-ts/*", "wrangler", "userbase", "userbase/*", ...deps]; const result = await Bun.build({ entrypoints: ["./src/cli/index.ts"], diff --git a/app/build.ts b/app/build.ts index 04cb3368..68e47da0 100644 --- a/app/build.ts +++ b/app/build.ts @@ -83,8 +83,8 @@ const external = [ "node:test", "node:assert/strict", "@libsql/client", - "bknd", - /^bknd\/.*/, + "userbase", + /^userbase\/.*/, "jsonv-ts", /^jsonv-ts\/.*/, ] as const; @@ -125,7 +125,7 @@ async function buildApi() { async function rewriteClient(path: string) { const bundle = await Bun.file(path).text(); - await Bun.write(path, '"use client";\n' + bundle.replaceAll("ui/client", "bknd/client")); + await Bun.write(path, '"use client";\n' + bundle.replaceAll("ui/client", "userbase/client")); } /** @@ -188,7 +188,7 @@ async function buildUi() { /** * Building UI Elements * - tailwind-merge is mocked, no exclude - * - ui/client is external, and after built replaced with "bknd/client" + * - ui/client is external, and after built replaced with "userbase/client" */ async function buildUiElements() { await tsup.build({ @@ -200,8 +200,8 @@ async function buildUiElements() { outDir: "dist/ui/elements", external: [ "ui/client", - "bknd", - /^bknd\/.*/, + "userbase", + /^userbase\/.*/, "wouter", "react", "react-dom", @@ -259,7 +259,7 @@ function baseConfig(adapter: string, overrides: Partial = {}): tsu external: [ /^cloudflare*/, /^@?hono.*?/, - /^(bknd|react|next|node).*?/, + /^(userbase|react|next|node).*?/, /.*\.(html)$/, ...external, ...(Array.isArray(overrides.external) ? overrides.external : []), @@ -305,7 +305,7 @@ async function buildAdapters() { entry: ["src/adapter/cloudflare/proxy.ts"], outDir: "dist/adapter/cloudflare", metafile: false, - external: [/bknd/, "wrangler", "node:process"], + external: [/userbase/, "wrangler", "node:process"], }), ), diff --git a/app/internal/docs.build-assets.ts b/app/internal/docs.build-assets.ts index 2bedbee0..eb575758 100644 --- a/app/internal/docs.build-assets.ts +++ b/app/internal/docs.build-assets.ts @@ -1,4 +1,4 @@ -import { createApp } from "bknd/adapter/bun"; +import { createApp } from "userbase/adapter/bun"; async function generate() { console.info("Generating MCP documentation..."); diff --git a/app/package.json b/app/package.json index aedc873a..b6200c1d 100644 --- a/app/package.json +++ b/app/package.json @@ -1,24 +1,24 @@ { - "name": "bknd", + "name": "userbase", "type": "module", "sideEffects": false, "bin": "./dist/cli/index.js", - "version": "0.21.0-rc.1", + "version": "0.0.1", "description": "Lightweight Firebase/Supabase alternative built to run anywhere — incl. Next.js, React Router, Astro, Cloudflare, Bun, Node, AWS Lambda & more.", - "homepage": "https://bknd.io", + "homepage": "https://gitea.bsws.in/shishantbiswas/userbase", "repository": { "type": "git", - "url": "https://github.com/bknd-io/bknd.git" + "url": "https://gitea.bsws.in/shishantbiswas/userbase.git" }, "bugs": { - "url": "https://github.com/bknd-io/bknd/issues" + "url": "https://gitea.bsws.in/shishantbiswas/userbase/issues" }, "packageManager": "bun@1.3.3", "engines": { "node": ">=22.13" }, "scripts": { - "dev": "BKND_CLI_LOG_LEVEL=debug vite", + "dev": "USERBASE_CLI_LOG_LEVEL=debug vite", "build": "NODE_ENV=production bun run build.ts --minify --types", "build:all": "rm -rf dist && bun run build:static && NODE_ENV=production bun run build.ts --minify --types --clean && bun run build:cli", "build:ci": "mkdir -p dist/static/.vite && echo '{}' > dist/static/.vite/manifest.json && NODE_ENV=production bun run build.ts", diff --git a/app/src/Api.ts b/app/src/Api.ts index 515d5ace..3c4791bd 100644 --- a/app/src/Api.ts +++ b/app/src/Api.ts @@ -1,10 +1,10 @@ -import type { SafeUser } from "bknd"; +import type { SafeUser } from "userbase"; import { AuthApi, type AuthApiOptions } from "auth/api/AuthApi"; import { DataApi, type DataApiOptions } from "data/api/DataApi"; import { decode } from "hono/jwt"; import { MediaApi, type MediaApiOptions } from "media/api/MediaApi"; import { SystemApi } from "modules/SystemApi"; -import { omitKeys } from "bknd/utils"; +import { omitKeys } from "userbase/utils"; import type { BaseModuleApiOptions } from "modules"; export type TApiUser = SafeUser; diff --git a/app/src/App.ts b/app/src/App.ts index 2a8d2035..76b7bc35 100644 --- a/app/src/App.ts +++ b/app/src/App.ts @@ -1,5 +1,5 @@ import type { CreateUserPayload } from "auth/AppAuth"; -import { $console, McpClient } from "bknd/utils"; +import { $console, McpClient } from "userbase/utils"; import { Event } from "core/events"; import type { em as prototypeEm } from "data/prototype"; import { Connection } from "data/connection/Connection"; @@ -346,7 +346,7 @@ export class App< try { // gracefully add the app id - c.res.headers.set("X-bknd-id", this._id); + c.res.headers.set("X-userbase-id", this._id); } catch (e) {} await this.emgr.emit( diff --git a/app/src/adapter/adapter-test-suite.ts b/app/src/adapter/adapter-test-suite.ts index 0a224eb6..09be4066 100644 --- a/app/src/adapter/adapter-test-suite.ts +++ b/app/src/adapter/adapter-test-suite.ts @@ -1,10 +1,10 @@ import type { TestRunner } from "core/test"; -import type { BkndConfig, DefaultArgs } from "./index"; +import type { UserbaseConfig, DefaultArgs } from "./index"; import type { App } from "App"; import { disableConsoleLog, enableConsoleLog } from "core/utils/test"; export function adapterTestSuite< - Config extends BkndConfig = BkndConfig, + Config extends UserbaseConfig = UserbaseConfig, Args extends DefaultArgs = DefaultArgs, >( testRunner: TestRunner, @@ -39,7 +39,7 @@ export function adapterTestSuite< }), beforeBuild, onBuilt, - } as const satisfies BkndConfig; + } as const satisfies UserbaseConfig; const app = await makeApp( config as any, diff --git a/app/src/adapter/astro/astro.adapter.ts b/app/src/adapter/astro/astro.adapter.ts index 92a86040..a22d26e2 100644 --- a/app/src/adapter/astro/astro.adapter.ts +++ b/app/src/adapter/astro/astro.adapter.ts @@ -1,20 +1,20 @@ -import { type FrameworkBkndConfig, createFrameworkApp } from "bknd/adapter"; +import { type FrameworkUserbaseConfig, createFrameworkApp } from "userbase/adapter"; type AstroEnv = NodeJS.ProcessEnv; type TAstro = { request: Request; }; -export type AstroBkndConfig = FrameworkBkndConfig; +export type AstroUserbaseConfig = FrameworkUserbaseConfig; export async function getApp( - config: AstroBkndConfig = {}, + config: AstroUserbaseConfig = {}, args: Env = import.meta.env as Env, ) { return await createFrameworkApp(config, args); } export function serve( - config: AstroBkndConfig = {}, + config: AstroUserbaseConfig = {}, args: Env = import.meta.env as Env, ) { return async (fnArgs: TAstro) => { diff --git a/app/src/adapter/aws/aws-lambda.adapter.ts b/app/src/adapter/aws/aws-lambda.adapter.ts index 8c43b3dd..d6b132ea 100644 --- a/app/src/adapter/aws/aws-lambda.adapter.ts +++ b/app/src/adapter/aws/aws-lambda.adapter.ts @@ -1,11 +1,11 @@ -import type { App } from "bknd"; +import type { App } from "userbase"; import { handle } from "hono/aws-lambda"; import { serveStatic } from "@hono/node-server/serve-static"; -import { type RuntimeBkndConfig, createRuntimeApp } from "bknd/adapter"; +import { type RuntimeUserbaseConfig, createRuntimeApp } from "userbase/adapter"; type AwsLambdaEnv = object; -export type AwsLambdaBkndConfig = - RuntimeBkndConfig & { +export type AwsLambdaUserbaseConfig = + RuntimeUserbaseConfig & { assets?: | { mode: "local"; @@ -18,10 +18,10 @@ export type AwsLambdaBkndConfig = }; export async function createApp( - { adminOptions = false, assets, ...config }: AwsLambdaBkndConfig = {}, + { adminOptions = false, assets, ...config }: AwsLambdaUserbaseConfig = {}, args: Env = {} as Env, ): Promise { - let additional: Partial = { + let additional: Partial = { adminOptions, }; @@ -60,7 +60,7 @@ export async function createApp( } export function serve( - config: AwsLambdaBkndConfig = {}, + config: AwsLambdaUserbaseConfig = {}, args: Env = {} as Env, ) { return async (event) => { diff --git a/app/src/adapter/browser/OpfsStorageAdapter.ts b/app/src/adapter/browser/OpfsStorageAdapter.ts index 693451a1..4a978eed 100644 --- a/app/src/adapter/browser/OpfsStorageAdapter.ts +++ b/app/src/adapter/browser/OpfsStorageAdapter.ts @@ -1,6 +1,6 @@ -import type { FileBody, FileListObject, FileMeta, FileUploadPayload } from "bknd"; -import { StorageAdapter, guessMimeType } from "bknd"; -import { parse, s, isFile, isBlob } from "bknd/utils"; +import type { FileBody, FileListObject, FileMeta, FileUploadPayload } from "userbase"; +import { StorageAdapter, guessMimeType } from "userbase"; +import { parse, s, isFile, isBlob } from "userbase/utils"; export const opfsAdapterConfig = s.object( { diff --git a/app/src/adapter/browser/BkndBrowserApp.tsx b/app/src/adapter/browser/UserbaseBrowserApp.tsx similarity index 77% rename from app/src/adapter/browser/BkndBrowserApp.tsx rename to app/src/adapter/browser/UserbaseBrowserApp.tsx index 3cf98755..a157a24c 100644 --- a/app/src/adapter/browser/BkndBrowserApp.tsx +++ b/app/src/adapter/browser/UserbaseBrowserApp.tsx @@ -7,20 +7,20 @@ import { useState, type ReactNode, } from "react"; -import { checksum } from "bknd/utils"; -import { App, registries, sqlocal, type BkndConfig } from "bknd"; +import { checksum } from "userbase/utils"; +import { App, registries, sqlocal, type UserbaseConfig } from "userbase"; import { Route, Router, Switch } from "wouter"; -import { ClientProvider } from "bknd/client"; +import { ClientProvider } from "userbase/client"; import { SQLocalKysely } from "sqlocal/kysely"; import type { ClientConfig, DatabasePath } from "sqlocal"; -import { OpfsStorageAdapter } from "bknd/adapter/browser"; -import type { BkndAdminConfig } from "bknd/ui"; +import { OpfsStorageAdapter } from "userbase/adapter/browser"; +import type { UserbaseAdminConfig } from "userbase/ui"; const Admin = lazy(() => Promise.all([ - import("bknd/ui"), + import("userbase/ui"), // @ts-ignore - import("bknd/dist/styles.css"), + import("userbase/dist/styles.css"), ]).then(([mod]) => ({ default: mod.Admin, })), @@ -34,34 +34,34 @@ function safeViewTransition(fn: () => void) { } } -export type BrowserBkndConfig = Omit< - BkndConfig, +export type BrowserUserbaseConfig = Omit< + UserbaseConfig, "connection" | "app" > & { - adminConfig?: BkndAdminConfig; + adminConfig?: UserbaseAdminConfig; connection?: ClientConfig | DatabasePath; }; -export type BkndBrowserAppProps = { +export type UserbaseBrowserAppProps = { children: ReactNode; header?: ReactNode; loading?: ReactNode; notFound?: ReactNode; -} & BrowserBkndConfig; +} & BrowserUserbaseConfig; -const BkndBrowserAppContext = createContext<{ +const UserbaseBrowserAppContext = createContext<{ app: App; hash: string; }>(undefined!); -export function BkndBrowserApp({ +export function UserbaseBrowserApp({ children, adminConfig, header, loading, notFound, ...config -}: BkndBrowserAppProps) { +}: UserbaseBrowserAppProps) { const [app, setApp] = useState(undefined); const [hash, setHash] = useState(""); const adminRoutePath = (adminConfig?.basepath ?? "") + "/*?"; @@ -90,7 +90,7 @@ export function BkndBrowserApp({ } return ( - + {header} @@ -110,12 +110,12 @@ export function BkndBrowserApp({ - + ); } export function useApp() { - return useContext(BkndBrowserAppContext); + return useContext(UserbaseBrowserAppContext); } const Center = (props: React.HTMLAttributes) => ( @@ -133,7 +133,7 @@ const Center = (props: React.HTMLAttributes) => ( ); let initialized = false; -async function setup(config: BrowserBkndConfig = {}) { +async function setup(config: BrowserUserbaseConfig = {}) { if (initialized) return; initialized = true; diff --git a/app/src/adapter/browser/index.ts b/app/src/adapter/browser/index.ts index 46607dcd..45f4ae93 100644 --- a/app/src/adapter/browser/index.ts +++ b/app/src/adapter/browser/index.ts @@ -1,2 +1,2 @@ export * from "./OpfsStorageAdapter"; -export * from "./BkndBrowserApp"; +export * from "./UserbaseBrowserApp"; diff --git a/app/src/adapter/bun/bun.adapter.ts b/app/src/adapter/bun/bun.adapter.ts index c5d640dc..53c15838 100644 --- a/app/src/adapter/bun/bun.adapter.ts +++ b/app/src/adapter/bun/bun.adapter.ts @@ -1,18 +1,18 @@ import path from "node:path"; -import { type RuntimeBkndConfig, createRuntimeApp } from "bknd/adapter"; +import { type RuntimeUserbaseConfig, createRuntimeApp } from "userbase/adapter"; import { registerLocalMediaAdapter } from "."; -import { config, type App } from "bknd"; +import { config, type App } from "userbase"; import { serveStatic } from "hono/bun"; type BunEnv = Bun.Env; -export type BunBkndConfig = RuntimeBkndConfig & +export type BunUserbaseConfig = RuntimeUserbaseConfig & Omit, "fetch">; export async function createApp( - { distPath, serveStatic: _serveStatic, ...config }: BunBkndConfig = {}, + { distPath, serveStatic: _serveStatic, ...config }: BunUserbaseConfig = {}, args: Env = Bun.env as Env, ) { - const root = path.resolve(distPath ?? "./node_modules/bknd/dist", "static"); + const root = path.resolve(distPath ?? "./node_modules/userbase/dist", "static"); registerLocalMediaAdapter(); return await createRuntimeApp( @@ -29,7 +29,7 @@ export async function createApp( } export function createHandler( - config: BunBkndConfig = {}, + config: BunUserbaseConfig = {}, args: Env = Bun.env as Env, ) { let app: App | undefined; @@ -55,7 +55,7 @@ export function serve( serveStatic, beforeBuild, ...serveOptions - }: BunBkndConfig = {}, + }: BunUserbaseConfig = {}, args: Env = Bun.env as Env, ) { Bun.serve({ diff --git a/app/src/adapter/bun/connection/BunSqliteConnection.ts b/app/src/adapter/bun/connection/BunSqliteConnection.ts index 39fff000..29152aea 100644 --- a/app/src/adapter/bun/connection/BunSqliteConnection.ts +++ b/app/src/adapter/bun/connection/BunSqliteConnection.ts @@ -3,8 +3,8 @@ import { genericSqlite, type GenericSqliteConnection, type GenericSqliteConnectionConfig, -} from "bknd"; -import { omitKeys } from "bknd/utils"; +} from "userbase"; +import { omitKeys } from "userbase/utils"; export type BunSqliteConnection = GenericSqliteConnection; export type BunSqliteConnectionConfig = Omit< diff --git a/app/src/adapter/cloudflare/cloudflare-workers.adapter.spec.ts b/app/src/adapter/cloudflare/cloudflare-workers.adapter.spec.ts index 6cb0f901..dd9651e2 100644 --- a/app/src/adapter/cloudflare/cloudflare-workers.adapter.spec.ts +++ b/app/src/adapter/cloudflare/cloudflare-workers.adapter.spec.ts @@ -3,7 +3,7 @@ import { makeConfig, type CloudflareContext } from "./config"; import { disableConsoleLog, enableConsoleLog } from "core/utils"; import { adapterTestSuite } from "adapter/adapter-test-suite"; import { bunTestRunner } from "adapter/bun/test"; -import { type CloudflareBkndConfig, createApp } from "./cloudflare-workers.adapter"; +import { type CloudflareUserbaseConfig, createApp } from "./cloudflare-workers.adapter"; beforeAll(disableConsoleLog); afterAll(enableConsoleLog); @@ -40,7 +40,7 @@ describe("cf adapter", () => { expect(dynamicConfig.connection).toBeDefined(); }); - adapterTestSuite>(bunTestRunner, { + adapterTestSuite>(bunTestRunner, { makeApp: async (c, a) => { return await createApp(c, { env: a } as any); }, diff --git a/app/src/adapter/cloudflare/cloudflare-workers.adapter.ts b/app/src/adapter/cloudflare/cloudflare-workers.adapter.ts index 98df2b06..87457720 100644 --- a/app/src/adapter/cloudflare/cloudflare-workers.adapter.ts +++ b/app/src/adapter/cloudflare/cloudflare-workers.adapter.ts @@ -1,11 +1,11 @@ /// -import type { RuntimeBkndConfig } from "bknd/adapter"; +import type { RuntimeUserbaseConfig } from "userbase/adapter"; import { Hono } from "hono"; import { serveStatic } from "hono/cloudflare-workers"; -import type { App, MaybePromise } from "bknd"; -import { $console } from "bknd/utils"; -import { createRuntimeApp } from "bknd/adapter"; +import type { App, MaybePromise } from "userbase"; +import { $console } from "userbase/utils"; +import { createRuntimeApp } from "userbase/adapter"; import { registerAsyncsExecutionContext, makeConfig, type CloudflareContext } from "./config"; declare global { @@ -15,7 +15,7 @@ declare global { } export type CloudflareEnv = Cloudflare.Env; -export type CloudflareBkndConfig = RuntimeBkndConfig & { +export type CloudflareUserbaseConfig = RuntimeUserbaseConfig & { bindings?: (args: Env) => MaybePromise<{ kv?: KVNamespace; db?: D1Database; @@ -34,7 +34,7 @@ export type CloudflareBkndConfig = RuntimeBkndConfig & }; export async function createApp( - config: CloudflareBkndConfig = {}, + config: CloudflareUserbaseConfig = {}, ctx: Partial> = {}, ) { const appConfig = await makeConfig(config, ctx); @@ -57,7 +57,7 @@ export const getFresh = createApp; let app: App | undefined; export function serve( - config: CloudflareBkndConfig = {}, + config: CloudflareUserbaseConfig = {}, serveOptions?: (args: Env) => { warm?: boolean; }, diff --git a/app/src/adapter/cloudflare/config.ts b/app/src/adapter/cloudflare/config.ts index 86a7722e..668377be 100644 --- a/app/src/adapter/cloudflare/config.ts +++ b/app/src/adapter/cloudflare/config.ts @@ -1,21 +1,22 @@ + /// -import { Connection } from "bknd"; -import { sqlite } from "bknd/adapter/sqlite"; -import { makeConfig as makeAdapterConfig } from "bknd/adapter"; +import { Connection } from "userbase"; +import { sqlite } from "userbase/adapter/sqlite"; +import { makeConfig as makeAdapterConfig } from "userbase/adapter"; import { registerMedia } from "./storage/StorageR2Adapter"; import { getBinding } from "./bindings"; import { d1Sqlite } from "./connection/D1Connection"; -import type { CloudflareBkndConfig, CloudflareEnv } from "."; -import { App } from "bknd"; +import type { CloudflareUserbaseConfig, CloudflareEnv } from "."; +import { App } from "userbase"; import type { Context as HonoContext, ExecutionContext } from "hono"; -import { $console } from "bknd/utils"; +import { $console } from "userbase/utils"; import { setCookie } from "hono/cookie"; export const constants = { exec_async_event_id: "cf_register_waituntil", - cache_endpoint: "/__bknd/cache", - do_endpoint: "/__bknd/do", + cache_endpoint: "/__userbase/cache", + do_endpoint: "/__userbase/do", d1_session: { cookie: "cf_d1_session", header: "x-cf-d1-session", @@ -40,7 +41,7 @@ function getCookieValue(cookies: string | null, name: string) { return null; } -export function d1SessionHelper(config: CloudflareBkndConfig) { +export function d1SessionHelper(config: CloudflareUserbaseConfig) { const headerKey = constants.d1_session.header; const cookieKey = constants.d1_session.cookie; const transport = config.d1?.transport; @@ -90,7 +91,7 @@ export function d1SessionHelper(config: CloudflareBkndConfig) { let media_registered: boolean = false; export async function makeConfig( - config: CloudflareBkndConfig, + config: CloudflareUserbaseConfig, args?: Partial>, ) { if (!media_registered && config.registerMedia !== false) { diff --git a/app/src/adapter/cloudflare/connection/D1Connection.ts b/app/src/adapter/cloudflare/connection/D1Connection.ts index f2c2b753..3a9d60b3 100644 --- a/app/src/adapter/cloudflare/connection/D1Connection.ts +++ b/app/src/adapter/cloudflare/connection/D1Connection.ts @@ -1,6 +1,6 @@ /// -import { genericSqlite, type GenericSqliteConnection } from "bknd"; +import { genericSqlite, type GenericSqliteConnection } from "userbase"; import type { QueryResult } from "kysely"; export type D1SqliteConnection = GenericSqliteConnection; diff --git a/app/src/adapter/cloudflare/connection/DoConnection.ts b/app/src/adapter/cloudflare/connection/DoConnection.ts index 5a13b912..ffd18433 100644 --- a/app/src/adapter/cloudflare/connection/DoConnection.ts +++ b/app/src/adapter/cloudflare/connection/DoConnection.ts @@ -1,6 +1,6 @@ /// -import { genericSqlite, type GenericSqliteConnection } from "bknd"; +import { genericSqlite, type GenericSqliteConnection } from "userbase"; import type { QueryResult } from "kysely"; export type DoSqliteConnection = GenericSqliteConnection; diff --git a/app/src/adapter/cloudflare/index.ts b/app/src/adapter/cloudflare/index.ts index abc0719e..5dd309fc 100644 --- a/app/src/adapter/cloudflare/index.ts +++ b/app/src/adapter/cloudflare/index.ts @@ -5,7 +5,7 @@ export { createApp, serve, type CloudflareEnv, - type CloudflareBkndConfig, + type CloudflareUserbaseConfig, } from "./cloudflare-workers.adapter"; export { d1Sqlite, type D1ConnectionConfig }; export { doSqlite, type DoConnectionConfig } from "./connection/DoConnection"; @@ -18,7 +18,7 @@ export { } from "./bindings"; export { constants, makeConfig, type CloudflareContext } from "./config"; export { StorageR2Adapter, registerMedia } from "./storage/StorageR2Adapter"; -export { registries } from "bknd"; +export { registries } from "userbase"; export { devFsVitePlugin, devFsWrite } from "./vite"; // for compatibility with old code diff --git a/app/src/adapter/cloudflare/proxy.ts b/app/src/adapter/cloudflare/proxy.ts index 34763153..1ad02f3d 100644 --- a/app/src/adapter/cloudflare/proxy.ts +++ b/app/src/adapter/cloudflare/proxy.ts @@ -2,12 +2,12 @@ import { d1Sqlite, getBinding, registerMedia, - type CloudflareBkndConfig, + type CloudflareUserbaseConfig, type CloudflareEnv, -} from "bknd/adapter/cloudflare"; +} from "userbase/adapter/cloudflare"; import type { GetPlatformProxyOptions, PlatformProxy } from "wrangler"; import process from "node:process"; -import { $console } from "bknd/utils"; +import { $console } from "userbase/utils"; export type WithPlatformProxyOptions = { /** @@ -42,7 +42,7 @@ async function getPlatformProxy(opts?: GetPlatformProxyOptions) { } export function withPlatformProxy( - config: CloudflareBkndConfig = {}, + config: CloudflareUserbaseConfig = {}, opts?: WithPlatformProxyOptions, ) { const use_proxy = @@ -91,5 +91,5 @@ export function withPlatformProxy( connection, }; }, - } satisfies CloudflareBkndConfig; + } satisfies CloudflareUserbaseConfig; } diff --git a/app/src/adapter/cloudflare/storage/StorageR2Adapter.ts b/app/src/adapter/cloudflare/storage/StorageR2Adapter.ts index 756e562d..2655010a 100644 --- a/app/src/adapter/cloudflare/storage/StorageR2Adapter.ts +++ b/app/src/adapter/cloudflare/storage/StorageR2Adapter.ts @@ -1,7 +1,7 @@ -import { registries as $registries, isDebug, guessMimeType } from "bknd"; +import { registries as $registries, isDebug, guessMimeType } from "userbase"; import { getBindings } from "../bindings"; -import { s } from "bknd/utils"; -import { StorageAdapter, type FileBody } from "bknd"; +import { s } from "userbase/utils"; +import { StorageAdapter, type FileBody } from "userbase"; export function makeSchema(bindings: string[] = []) { return s.object( diff --git a/app/src/adapter/cloudflare/vite.ts b/app/src/adapter/cloudflare/vite.ts index 1b7640bf..a2a904e6 100644 --- a/app/src/adapter/cloudflare/vite.ts +++ b/app/src/adapter/cloudflare/vite.ts @@ -8,7 +8,7 @@ import { resolve } from "node:path"; */ export function devFsVitePlugin({ verbose = false, - configFile = "bknd.config.ts", + configFile = "userbase.config.ts", }: { verbose?: boolean; configFile?: string; @@ -195,7 +195,7 @@ export function devFsVitePlugin({ return; } - // Check if this is the bknd config file + // Check if this is the userbase config file if (id.includes(configFile)) { if (verbose) { console.debug("[dev-fs-plugin] Transforming", configFile); diff --git a/app/src/adapter/index.ts b/app/src/adapter/index.ts index 6568d293..81d35890 100644 --- a/app/src/adapter/index.ts +++ b/app/src/adapter/index.ts @@ -7,27 +7,27 @@ import { type MaybePromise, registries as $registries, type Merge, -} from "bknd"; -import { $console } from "bknd/utils"; +} from "userbase"; +import { $console } from "userbase/utils"; import type { Context, MiddlewareHandler, Next } from "hono"; import type { AdminControllerOptions } from "modules/server/AdminController"; import type { Manifest } from "vite"; -export type BkndConfig = Merge< +export type UserbaseConfig = Merge< CreateAppConfig & Omit & { app?: - | Omit, "app"> - | ((args: Args) => MaybePromise, "app">>); + | Omit, "app"> + | ((args: Args) => MaybePromise, "app">>); onBuilt?: (app: App) => MaybePromise; beforeBuild?: (app?: App, registries?: typeof $registries) => MaybePromise; buildConfig?: Parameters[0]; } >; -export type FrameworkBkndConfig = BkndConfig; +export type FrameworkUserbaseConfig = UserbaseConfig; -export type RuntimeBkndConfig = BkndConfig & { +export type RuntimeUserbaseConfig = UserbaseConfig & { distPath?: string; serveStatic?: MiddlewareHandler | [string, MiddlewareHandler]; adminOptions?: AdminControllerOptions | false; @@ -38,9 +38,9 @@ export type DefaultArgs = { }; export async function makeConfig( - config: BkndConfig, + config: UserbaseConfig, args?: Args, -): Promise, "app">> { +): Promise, "app">> { let additionalConfig: CreateAppConfig = {}; const { app, ...rest } = config; if (app) { @@ -57,10 +57,10 @@ export async function makeConfig( return { ...rest, ...additionalConfig }; } -export async function createAdapterApp( +export async function createAdapterApp( config: Config = {} as Config, args?: Args, -): Promise<{ app: App; config: BkndConfig }> { +): Promise<{ app: App; config: UserbaseConfig }> { await config.beforeBuild?.(undefined, $registries); const appConfig = await makeConfig(config, args); @@ -69,7 +69,7 @@ export async function createAdapterApp( - config: FrameworkBkndConfig = {}, + config: FrameworkUserbaseConfig = {}, args?: Args, ): Promise { const { app, config: appConfig } = await createAdapterApp(config, args); @@ -108,7 +108,7 @@ export async function createFrameworkApp( } export async function createRuntimeApp( - { serveStatic, adminOptions, ...config }: RuntimeBkndConfig = {}, + { serveStatic, adminOptions, ...config }: RuntimeUserbaseConfig = {}, args?: Args, ): Promise { const { app, config: appConfig } = await createAdapterApp(config, args); @@ -148,7 +148,7 @@ export async function createRuntimeApp( * * @example * ```typescript - * import { serveStaticViaImport } from "bknd/adapter"; + * import { serveStaticViaImport } from "userbase/adapter"; * * serve({ * serveStatic: serveStaticViaImport(), @@ -161,7 +161,7 @@ export function serveStaticViaImport(opts?: { package?: string; }) { let files: string[] | undefined; - const pkg = opts?.package ?? "bknd"; + const pkg = opts?.package ?? "userbase"; // @ts-ignore return async (c: Context, next: Next) => { diff --git a/app/src/adapter/nextjs/nextjs.adapter.spec.ts b/app/src/adapter/nextjs/nextjs.adapter.spec.ts index 8e3f2e4a..139785b9 100644 --- a/app/src/adapter/nextjs/nextjs.adapter.spec.ts +++ b/app/src/adapter/nextjs/nextjs.adapter.spec.ts @@ -3,13 +3,13 @@ import * as nextjs from "./nextjs.adapter"; import { disableConsoleLog, enableConsoleLog } from "core/utils"; import { adapterTestSuite } from "adapter/adapter-test-suite"; import { bunTestRunner } from "adapter/bun/test"; -import type { NextjsBkndConfig } from "./nextjs.adapter"; +import type { NextjsUserbaseConfig } from "./nextjs.adapter"; beforeAll(disableConsoleLog); afterAll(enableConsoleLog); describe("nextjs adapter", () => { - adapterTestSuite(bunTestRunner, { + adapterTestSuite(bunTestRunner, { makeApp: nextjs.getApp, makeHandler: nextjs.serve, }); diff --git a/app/src/adapter/nextjs/nextjs.adapter.ts b/app/src/adapter/nextjs/nextjs.adapter.ts index c6de63fe..e8428b8a 100644 --- a/app/src/adapter/nextjs/nextjs.adapter.ts +++ b/app/src/adapter/nextjs/nextjs.adapter.ts @@ -1,21 +1,21 @@ -import { createFrameworkApp, type FrameworkBkndConfig } from "bknd/adapter"; -import { isNode } from "bknd/utils"; +import { createFrameworkApp, type FrameworkUserbaseConfig } from "userbase/adapter"; +import { isNode } from "userbase/utils"; // @ts-expect-error next is not installed import type { NextApiRequest } from "next"; type NextjsEnv = NextApiRequest["env"]; -export type NextjsBkndConfig = FrameworkBkndConfig & { +export type NextjsUserbaseConfig = FrameworkUserbaseConfig & { cleanRequest?: { searchParams?: string[] }; }; export async function getApp( - config: NextjsBkndConfig, + config: NextjsUserbaseConfig, args: Env = process.env as Env, ) { return await createFrameworkApp(config, args); } -function getCleanRequest(req: Request, cleanRequest: NextjsBkndConfig["cleanRequest"]) { +function getCleanRequest(req: Request, cleanRequest: NextjsUserbaseConfig["cleanRequest"]) { if (!cleanRequest) return req; const url = new URL(req.url); @@ -41,7 +41,7 @@ function getCleanRequest(req: Request, cleanRequest: NextjsBkndConfig["cleanRequ } export function serve( - { cleanRequest, ...config }: NextjsBkndConfig = {}, + { cleanRequest, ...config }: NextjsUserbaseConfig = {}, args: Env = process.env as Env, ) { return async (req: Request) => { diff --git a/app/src/adapter/node/connection/NodeSqliteConnection.ts b/app/src/adapter/node/connection/NodeSqliteConnection.ts index 915ab3d2..cc5d6893 100644 --- a/app/src/adapter/node/connection/NodeSqliteConnection.ts +++ b/app/src/adapter/node/connection/NodeSqliteConnection.ts @@ -2,9 +2,9 @@ import { genericSqlite, type GenericSqliteConnection, type GenericSqliteConnectionConfig, -} from "bknd"; +} from "userbase"; import { DatabaseSync } from "node:sqlite"; -import { omitKeys } from "bknd/utils"; +import { omitKeys } from "userbase/utils"; export type NodeSqliteConnection = GenericSqliteConnection; export type NodeSqliteConnectionConfig = Omit< diff --git a/app/src/adapter/node/node.adapter.ts b/app/src/adapter/node/node.adapter.ts index d85d1977..efcb5cc7 100644 --- a/app/src/adapter/node/node.adapter.ts +++ b/app/src/adapter/node/node.adapter.ts @@ -2,12 +2,12 @@ import path from "node:path"; import { serve as honoServe } from "@hono/node-server"; import { serveStatic } from "@hono/node-server/serve-static"; import { registerLocalMediaAdapter } from "adapter/node/storage"; -import { type RuntimeBkndConfig, createRuntimeApp } from "bknd/adapter"; -import { config as $config, type App } from "bknd"; -import { $console } from "bknd/utils"; +import { type RuntimeUserbaseConfig, createRuntimeApp } from "userbase/adapter"; +import { config as $config, type App } from "userbase"; +import { $console } from "userbase/utils"; type NodeEnv = NodeJS.ProcessEnv; -export type NodeBkndConfig = RuntimeBkndConfig & { +export type NodeUserbaseConfig = RuntimeUserbaseConfig & { port?: number; hostname?: string; listener?: Parameters[1]; @@ -16,12 +16,12 @@ export type NodeBkndConfig = RuntimeBkndConfig & { }; export async function createApp( - { distPath, relativeDistPath, ...config }: NodeBkndConfig = {}, + { distPath, relativeDistPath, ...config }: NodeUserbaseConfig = {}, args: Env = process.env as Env, ) { const root = path.relative( process.cwd(), - path.resolve(distPath ?? relativeDistPath ?? "./node_modules/bknd/dist", "static"), + path.resolve(distPath ?? relativeDistPath ?? "./node_modules/userbase/dist", "static"), ); if (relativeDistPath) { $console.warn("relativeDistPath is deprecated, please use distPath instead"); @@ -38,7 +38,7 @@ export async function createApp( } export function createHandler( - config: NodeBkndConfig = {}, + config: NodeUserbaseConfig = {}, args: Env = process.env as Env, ) { let app: App | undefined; @@ -51,7 +51,7 @@ export function createHandler( } export function serve( - { port = $config.server.default_port, hostname, listener, ...config }: NodeBkndConfig = {}, + { port = $config.server.default_port, hostname, listener, ...config }: NodeUserbaseConfig = {}, args: Env = process.env as Env, ) { honoServe( diff --git a/app/src/adapter/node/storage/StorageLocalAdapter.ts b/app/src/adapter/node/storage/StorageLocalAdapter.ts index 46db8fd0..d04595b3 100644 --- a/app/src/adapter/node/storage/StorageLocalAdapter.ts +++ b/app/src/adapter/node/storage/StorageLocalAdapter.ts @@ -1,7 +1,7 @@ import { readFile, readdir, stat, unlink, writeFile } from "node:fs/promises"; -import type { FileBody, FileListObject, FileMeta, FileUploadPayload } from "bknd"; -import { StorageAdapter, guessMimeType } from "bknd"; -import { parse, s, isFile } from "bknd/utils"; +import type { FileBody, FileListObject, FileMeta, FileUploadPayload } from "userbase"; +import { StorageAdapter, guessMimeType } from "userbase"; +import { parse, s, isFile } from "userbase/utils"; export const localAdapterConfig = s.object( { diff --git a/app/src/adapter/node/storage/index.ts b/app/src/adapter/node/storage/index.ts index 549bf702..af5388a5 100644 --- a/app/src/adapter/node/storage/index.ts +++ b/app/src/adapter/node/storage/index.ts @@ -1,4 +1,4 @@ -import { registries } from "bknd"; +import { registries } from "userbase"; import { type LocalAdapterConfig, StorageLocalAdapter } from "./StorageLocalAdapter"; export * from "./StorageLocalAdapter"; diff --git a/app/src/adapter/nuxt/nuxt.adapter.ts b/app/src/adapter/nuxt/nuxt.adapter.ts index fc6e03eb..1c9e7189 100644 --- a/app/src/adapter/nuxt/nuxt.adapter.ts +++ b/app/src/adapter/nuxt/nuxt.adapter.ts @@ -1,15 +1,15 @@ -import { createRuntimeApp, type RuntimeBkndConfig } from "bknd/adapter"; +import { createRuntimeApp, type RuntimeUserbaseConfig } from "userbase/adapter"; export type NuxtEnv = NodeJS.ProcessEnv; -export type NuxtBkndConfig = RuntimeBkndConfig; +export type NuxtUserbaseConfig = RuntimeUserbaseConfig; /** - * Get bknd app instance - * @param config - bknd configuration + * Get userbase app instance + * @param config - userbase configuration * @param args - environment variables */ export async function getApp( - config: NuxtBkndConfig = {} as NuxtBkndConfig, + config: NuxtUserbaseConfig = {} as NuxtUserbaseConfig, args: Env, ) { return await createRuntimeApp(config, args); @@ -17,10 +17,10 @@ export async function getApp( /** * Create middleware handler for Nuxt - * @param config - bknd configuration + * @param config - userbase configuration * @param args - environment variables */ -export function serve(config: NuxtBkndConfig = {} as NuxtBkndConfig, args: Env) { +export function serve(config: NuxtUserbaseConfig = {} as NuxtUserbaseConfig, args: Env) { return async (request: Request) => { return (await getApp(config, args)).fetch(request); }; diff --git a/app/src/adapter/react-router/react-router.adapter.ts b/app/src/adapter/react-router/react-router.adapter.ts index f624bdee..2e3cb5a7 100644 --- a/app/src/adapter/react-router/react-router.adapter.ts +++ b/app/src/adapter/react-router/react-router.adapter.ts @@ -1,20 +1,20 @@ -import { type FrameworkBkndConfig, createFrameworkApp } from "bknd/adapter"; +import { type FrameworkUserbaseConfig, createFrameworkApp } from "userbase/adapter"; type ReactRouterEnv = NodeJS.ProcessEnv; type ReactRouterFunctionArgs = { request: Request; }; -export type ReactRouterBkndConfig = FrameworkBkndConfig; +export type ReactRouterUserbaseConfig = FrameworkUserbaseConfig; export async function getApp( - config: ReactRouterBkndConfig, + config: ReactRouterUserbaseConfig, args: Env = process.env as Env, ) { return await createFrameworkApp(config, args); } export function serve( - config: ReactRouterBkndConfig = {}, + config: ReactRouterUserbaseConfig = {}, args: Env = process.env as Env, ) { return async (fnArgs: ReactRouterFunctionArgs) => { diff --git a/app/src/adapter/solid-start/solid-start.adapter.spec.ts b/app/src/adapter/solid-start/solid-start.adapter.spec.ts index 0149a258..8e838f3f 100644 --- a/app/src/adapter/solid-start/solid-start.adapter.spec.ts +++ b/app/src/adapter/solid-start/solid-start.adapter.spec.ts @@ -3,13 +3,13 @@ import * as solidStart from "./solid-start.adapter"; import { disableConsoleLog, enableConsoleLog } from "core/utils"; import { adapterTestSuite } from "adapter/adapter-test-suite"; import { bunTestRunner } from "adapter/bun/test"; -import type { SolidStartBkndConfig } from "./solid-start.adapter"; +import type { SolidStartUserbaseConfig } from "./solid-start.adapter"; beforeAll(disableConsoleLog); afterAll(enableConsoleLog); describe("solid-start adapter", () => { - adapterTestSuite(bunTestRunner, { + adapterTestSuite(bunTestRunner, { makeApp: solidStart.getApp, makeHandler: solidStart.serve, }); diff --git a/app/src/adapter/solid-start/solid-start.adapter.ts b/app/src/adapter/solid-start/solid-start.adapter.ts index 8ada7f62..d3108f9a 100644 --- a/app/src/adapter/solid-start/solid-start.adapter.ts +++ b/app/src/adapter/solid-start/solid-start.adapter.ts @@ -1,15 +1,15 @@ -import { createRuntimeApp, type RuntimeBkndConfig } from "bknd/adapter"; +import { createRuntimeApp, type RuntimeUserbaseConfig } from "userbase/adapter"; export type SolidStartEnv = NodeJS.ProcessEnv; -export type SolidStartBkndConfig = RuntimeBkndConfig; +export type SolidStartUserbaseConfig = RuntimeUserbaseConfig; /** - * Get bknd app instance - * @param config - bknd configuration + * Get userbase app instance + * @param config - userbase configuration * @param args - environment variables */ export async function getApp( - config: SolidStartBkndConfig, + config: SolidStartUserbaseConfig, args: Env = process.env as Env, ) { return await createRuntimeApp(config, args); @@ -17,11 +17,11 @@ export async function getApp( /** * Create middleware handler for Solid Start - * @param config - bknd configuration + * @param config - userbase configuration * @param args - environment variables */ export function serve( - config: SolidStartBkndConfig = {}, + config: SolidStartUserbaseConfig = {}, args: Env = process.env as Env, ) { return async (req: Request) => { diff --git a/app/src/adapter/sqlite/bun.ts b/app/src/adapter/sqlite/bun.ts index 46cd5993..ebfaed7d 100644 --- a/app/src/adapter/sqlite/bun.ts +++ b/app/src/adapter/sqlite/bun.ts @@ -1,4 +1,4 @@ -import type { Connection } from "bknd"; +import type { Connection } from "userbase"; import { bunSqlite } from "../bun/connection/BunSqliteConnection"; export function sqlite(config?: { url: string }): Connection { diff --git a/app/src/adapter/sqlite/edge.ts b/app/src/adapter/sqlite/edge.ts index 6c0f041b..acc2e900 100644 --- a/app/src/adapter/sqlite/edge.ts +++ b/app/src/adapter/sqlite/edge.ts @@ -1,4 +1,4 @@ -import { type Connection, libsql } from "bknd"; +import { type Connection, libsql } from "userbase"; export function sqlite(config: { url: string }): Connection { return libsql(config); diff --git a/app/src/adapter/sqlite/node.ts b/app/src/adapter/sqlite/node.ts index cf0982da..56578919 100644 --- a/app/src/adapter/sqlite/node.ts +++ b/app/src/adapter/sqlite/node.ts @@ -1,4 +1,4 @@ -import type { Connection } from "bknd"; +import type { Connection } from "userbase"; import { nodeSqlite } from "../node/connection/NodeSqliteConnection"; export function sqlite(config?: { url: string }): Connection { diff --git a/app/src/adapter/sveltekit/sveltekit.adapter.ts b/app/src/adapter/sveltekit/sveltekit.adapter.ts index 415fc338..17c9af84 100644 --- a/app/src/adapter/sveltekit/sveltekit.adapter.ts +++ b/app/src/adapter/sveltekit/sveltekit.adapter.ts @@ -1,18 +1,18 @@ -import { createRuntimeApp, type RuntimeBkndConfig } from "bknd/adapter"; +import { createRuntimeApp, type RuntimeUserbaseConfig } from "userbase/adapter"; type TSvelteKit = { request: Request; }; -export type SvelteKitBkndConfig = Pick, "adminOptions">; +export type SvelteKitUserbaseConfig = Pick, "adminOptions">; /** - * Get bknd app instance - * @param config - bknd configuration + * Get userbase app instance + * @param config - userbase configuration * @param args - environment variables (use $env/dynamic/private for universal runtime support) */ export async function getApp( - config: SvelteKitBkndConfig = {} as SvelteKitBkndConfig, + config: SvelteKitUserbaseConfig = {} as SvelteKitUserbaseConfig, args: Env, ) { return await createRuntimeApp(config, args); @@ -20,11 +20,11 @@ export async function getApp( /** * Create request handler for hooks.server.ts - * @param config - bknd configuration + * @param config - userbase configuration * @param args - environment variables (use $env/dynamic/private for universal runtime support) */ export function serve( - config: SvelteKitBkndConfig = {} as SvelteKitBkndConfig, + config: SvelteKitUserbaseConfig = {} as SvelteKitUserbaseConfig, args: Env, ) { return async (fnArgs: TSvelteKit) => { diff --git a/app/src/adapter/tanstack-start/tanstack-start.adapter.ts b/app/src/adapter/tanstack-start/tanstack-start.adapter.ts index 38ae0082..8a498d9c 100644 --- a/app/src/adapter/tanstack-start/tanstack-start.adapter.ts +++ b/app/src/adapter/tanstack-start/tanstack-start.adapter.ts @@ -1,12 +1,12 @@ -import { createFrameworkApp, type FrameworkBkndConfig } from "bknd/adapter"; +import { createFrameworkApp, type FrameworkUserbaseConfig } from "userbase/adapter"; export type TanstackStartEnv = NodeJS.ProcessEnv; -export type TanstackStartConfig = FrameworkBkndConfig; +export type TanstackStartConfig = FrameworkUserbaseConfig; /** - * Get bknd app instance - * @param config - bknd configuration + * Get userbase app instance + * @param config - userbase configuration * @param args - environment variables */ export async function getApp( @@ -18,7 +18,7 @@ export async function getApp( /** * Create request handler for src/routes/api.$.ts - * @param config - bknd configuration + * @param config - userbase configuration * @param args - environment variables */ export function serve( diff --git a/app/src/adapter/vite/vite.adapter.ts b/app/src/adapter/vite/vite.adapter.ts index a4cb3463..d4765a02 100644 --- a/app/src/adapter/vite/vite.adapter.ts +++ b/app/src/adapter/vite/vite.adapter.ts @@ -1,17 +1,17 @@ import { serveStatic } from "@hono/node-server/serve-static"; import { type DevServerOptions, default as honoViteDevServer } from "@hono/vite-dev-server"; -import type { App } from "bknd"; -import { type RuntimeBkndConfig, createRuntimeApp } from "bknd/adapter"; -import { registerLocalMediaAdapter } from "bknd/adapter/node"; +import type { App } from "userbase"; +import { type RuntimeUserbaseConfig, createRuntimeApp } from "userbase/adapter"; +import { registerLocalMediaAdapter } from "userbase/adapter/node"; import { devServerConfig } from "./dev-server-config"; import type { MiddlewareHandler } from "hono"; export type ViteEnv = NodeJS.ProcessEnv; -export type ViteBkndConfig = RuntimeBkndConfig & { +export type ViteUserbaseConfig = RuntimeUserbaseConfig & { serveStatic?: false | MiddlewareHandler; }; -export function addViteScript(html: string, addBkndContext: boolean = true) { +export function addViteScript(html: string, addUserbaseContext: boolean = true) { return html.replace( "", ` -${addBkndContext ? "" : ""} +${addUserbaseContext ? "" : ""} `, ); } async function createApp( - config: ViteBkndConfig = {}, + config: ViteUserbaseConfig = {}, env: ViteEnv = {} as ViteEnv, ): Promise { registerLocalMediaAdapter(); @@ -49,7 +49,7 @@ async function createApp( ); } -export function serve(config: ViteBkndConfig = {}, args?: ViteEnv) { +export function serve(config: ViteUserbaseConfig = {}, args?: ViteEnv) { return { async fetch(request: Request, env: any, ctx: ExecutionContext) { const app = await createApp(config, env); diff --git a/app/src/auth/AppAuth.ts b/app/src/auth/AppAuth.ts index 4d3b3198..9966d195 100644 --- a/app/src/auth/AppAuth.ts +++ b/app/src/auth/AppAuth.ts @@ -1,8 +1,8 @@ -import type { DB, PrimaryFieldType } from "bknd"; +import type { DB, PrimaryFieldType } from "userbase"; import * as AuthPermissions from "auth/auth-permissions"; import type { AuthStrategy } from "auth/authenticate/strategies/Strategy"; import type { PasswordStrategy } from "auth/authenticate/strategies/PasswordStrategy"; -import { $console, secureRandomString, transformObject, pickKeys } from "bknd/utils"; +import { $console, secureRandomString, transformObject, pickKeys } from "userbase/utils"; import type { Entity, EntityManager } from "data/entities"; import { em, entity, enumm, type FieldSchema } from "data/prototype"; import { Module } from "modules/Module"; @@ -16,7 +16,7 @@ import { Role } from "./authorize/Role"; export type UsersFields = typeof AppAuth.usersFields; export type UserFieldSchema = FieldSchema; -declare module "bknd" { +declare module "userbase" { interface Users extends AppEntity, UserFieldSchema {} interface DB { users: Users; diff --git a/app/src/auth/AppUserPool.ts b/app/src/auth/AppUserPool.ts index d5679b6a..dfa290ff 100644 --- a/app/src/auth/AppUserPool.ts +++ b/app/src/auth/AppUserPool.ts @@ -1,6 +1,6 @@ import { AppAuth } from "auth/AppAuth"; import type { CreateUser, SafeUser, User, UserPool } from "auth/authenticate/Authenticator"; -import { $console } from "bknd/utils"; +import { $console } from "userbase/utils"; import { pick } from "lodash-es"; import { InvalidConditionsException, diff --git a/app/src/auth/api/AuthApi.ts b/app/src/auth/api/AuthApi.ts index e3c0843f..90fae86c 100644 --- a/app/src/auth/api/AuthApi.ts +++ b/app/src/auth/api/AuthApi.ts @@ -1,6 +1,6 @@ import type { AuthActionResponse } from "auth/api/AuthController"; import type { AppAuthSchema } from "auth/auth-schema"; -import type { AuthResponse, SafeUser, AuthStrategy } from "bknd"; +import type { AuthResponse, SafeUser, AuthStrategy } from "userbase"; import { type BaseModuleApiOptions, ModuleApi } from "modules/ModuleApi"; export type AuthApiOptions = BaseModuleApiOptions & { @@ -69,7 +69,7 @@ export class AuthApi extends ModuleApi { async logout() { return this.get(["logout"], undefined, { headers: { - // this way bknd detects a json request and doesn't redirect back + // this way userbase detects a json request and doesn't redirect back Accept: "application/json", }, }).then(() => this.options.onTokenUpdate?.(undefined, true)); diff --git a/app/src/auth/api/AuthController.ts b/app/src/auth/api/AuthController.ts index 53450784..ae079360 100644 --- a/app/src/auth/api/AuthController.ts +++ b/app/src/auth/api/AuthController.ts @@ -1,4 +1,4 @@ -import type { DB, SafeUser } from "bknd"; +import type { DB, SafeUser } from "userbase"; import type { AuthStrategy } from "auth/authenticate/strategies/Strategy"; import type { AppAuth } from "auth/AppAuth"; import * as AuthPermissions from "auth/auth-permissions"; @@ -14,7 +14,7 @@ import { transformObject, mcpTool, $console, -} from "bknd/utils"; +} from "userbase/utils"; import type { PasswordStrategy } from "auth/authenticate/strategies"; export type AuthActionResponse = { diff --git a/app/src/auth/auth-schema.ts b/app/src/auth/auth-schema.ts index 405fe663..f637b59c 100644 --- a/app/src/auth/auth-schema.ts +++ b/app/src/auth/auth-schema.ts @@ -1,7 +1,7 @@ import { cookieConfig, jwtConfig } from "auth/authenticate/Authenticator"; import { CustomOAuthStrategy, OAuthStrategy, PasswordStrategy } from "auth/authenticate/strategies"; import { roleSchema } from "auth/authorize/Role"; -import { objectTransform, omitKeys, pick, s } from "bknd/utils"; +import { objectTransform, omitKeys, pick, s } from "userbase/utils"; import { $object, $record } from "modules/mcp"; export const Strategies = { diff --git a/app/src/auth/authenticate/Authenticator.ts b/app/src/auth/authenticate/Authenticator.ts index d0cb083f..17f5e911 100644 --- a/app/src/auth/authenticate/Authenticator.ts +++ b/app/src/auth/authenticate/Authenticator.ts @@ -1,4 +1,4 @@ -import type { DB } from "bknd"; +import type { DB } from "userbase"; import { Exception } from "core/errors"; import { addFlashMessage } from "core/server/flash"; import type { Context } from "hono"; @@ -7,7 +7,7 @@ import { sign, verify } from "hono/jwt"; import { type CookieOptions, serializeSigned } from "hono/utils/cookie"; import type { ServerEnv } from "modules/Controller"; import { InvalidConditionsException } from "auth/errors"; -import { s, parse, secret, runtimeSupports, truncate, $console, pickKeys } from "bknd/utils"; +import { s, parse, secret, runtimeSupports, truncate, $console, pickKeys } from "userbase/utils"; import type { AuthStrategy } from "./strategies/Strategy"; type Input = any; // workaround diff --git a/app/src/auth/authenticate/strategies/PasswordStrategy.ts b/app/src/auth/authenticate/strategies/PasswordStrategy.ts index b8a48b0a..47183f8d 100644 --- a/app/src/auth/authenticate/strategies/PasswordStrategy.ts +++ b/app/src/auth/authenticate/strategies/PasswordStrategy.ts @@ -1,7 +1,7 @@ -import type { User } from "bknd"; +import type { User } from "userbase"; import type { Authenticator } from "auth/authenticate/Authenticator"; import { InvalidCredentialsException } from "auth/errors"; -import { hash, $console, s, parse, jsc, describeRoute } from "bknd/utils"; +import { hash, $console, s, parse, jsc, describeRoute } from "userbase/utils"; import { Hono } from "hono"; import { compare as bcryptCompare, genSalt as bcryptGenSalt, hash as bcryptHash } from "bcryptjs"; import { AuthStrategy } from "./Strategy"; diff --git a/app/src/auth/authenticate/strategies/Strategy.ts b/app/src/auth/authenticate/strategies/Strategy.ts index 190ea619..a0853354 100644 --- a/app/src/auth/authenticate/strategies/Strategy.ts +++ b/app/src/auth/authenticate/strategies/Strategy.ts @@ -5,7 +5,7 @@ import type { StrategyActions, } from "../Authenticator"; import type { Hono } from "hono"; -import { type s, parse } from "bknd/utils"; +import { type s, parse } from "userbase/utils"; export type StrategyMode = "form" | "external"; diff --git a/app/src/auth/authenticate/strategies/oauth/CustomOAuthStrategy.ts b/app/src/auth/authenticate/strategies/oauth/CustomOAuthStrategy.ts index a9d6911e..09834be8 100644 --- a/app/src/auth/authenticate/strategies/oauth/CustomOAuthStrategy.ts +++ b/app/src/auth/authenticate/strategies/oauth/CustomOAuthStrategy.ts @@ -1,6 +1,6 @@ import type * as oauth from "oauth4webapi"; import { OAuthStrategy } from "./OAuthStrategy"; -import { s } from "bknd/utils"; +import { s } from "userbase/utils"; type SupportedTypes = "oauth2" | "oidc"; diff --git a/app/src/auth/authenticate/strategies/oauth/OAuthStrategy.ts b/app/src/auth/authenticate/strategies/oauth/OAuthStrategy.ts index 89fb60ac..8f03bcb4 100644 --- a/app/src/auth/authenticate/strategies/oauth/OAuthStrategy.ts +++ b/app/src/auth/authenticate/strategies/oauth/OAuthStrategy.ts @@ -3,7 +3,7 @@ import { type Context, Hono } from "hono"; import { getSignedCookie, setSignedCookie } from "hono/cookie"; import * as oauth from "oauth4webapi"; import * as issuers from "./issuers"; -import { s, filterKeys } from "bknd/utils"; +import { s, filterKeys } from "userbase/utils"; import { Exception } from "core/errors"; import { isDebug } from "core/env"; import { AuthStrategy } from "../Strategy"; diff --git a/app/src/auth/authenticate/strategies/oauth/issuers/github.ts b/app/src/auth/authenticate/strategies/oauth/issuers/github.ts index 2874761f..960976d4 100644 --- a/app/src/auth/authenticate/strategies/oauth/issuers/github.ts +++ b/app/src/auth/authenticate/strategies/oauth/issuers/github.ts @@ -37,7 +37,7 @@ export const github: IssuerConfig = { try { const res = await fetch("https://api.github.com/user/emails", { headers: { - "User-Agent": "bknd", // this is mandatory... *smh* + "User-Agent": "userbase", // this is mandatory... *smh* Accept: "application/json", Authorization: `Bearer ${tokenResponse.access_token}`, }, diff --git a/app/src/auth/authorize/Guard.ts b/app/src/auth/authorize/Guard.ts index a8f91e3f..90502ce4 100644 --- a/app/src/auth/authorize/Guard.ts +++ b/app/src/auth/authorize/Guard.ts @@ -1,10 +1,10 @@ import { Exception } from "core/errors"; -import { $console, mergeObject, type s } from "bknd/utils"; +import { $console, mergeObject, type s } from "userbase/utils"; import type { Permission, PermissionContext } from "auth/authorize/Permission"; import type { Context } from "hono"; import type { ServerEnv } from "modules/Controller"; import type { Role } from "./Role"; -import { HttpStatus } from "bknd/utils"; +import { HttpStatus } from "userbase/utils"; import type { Policy, PolicySchema } from "./Policy"; import { convert, type ObjectQuery } from "core/object/query/object-query"; diff --git a/app/src/auth/authorize/Permission.ts b/app/src/auth/authorize/Permission.ts index cfd59638..e79eddba 100644 --- a/app/src/auth/authorize/Permission.ts +++ b/app/src/auth/authorize/Permission.ts @@ -1,4 +1,4 @@ -import { s, type ParseOptions, parse, InvalidSchemaError, HttpStatus } from "bknd/utils"; +import { s, type ParseOptions, parse, InvalidSchemaError, HttpStatus } from "userbase/utils"; export const permissionOptionsSchema = s .strictObject({ diff --git a/app/src/auth/authorize/Policy.ts b/app/src/auth/authorize/Policy.ts index 06357f17..1efabc52 100644 --- a/app/src/auth/authorize/Policy.ts +++ b/app/src/auth/authorize/Policy.ts @@ -1,4 +1,4 @@ -import { s, parse, recursivelyReplacePlaceholders } from "bknd/utils"; +import { s, parse, recursivelyReplacePlaceholders } from "userbase/utils"; import * as query from "core/object/query/object-query"; export const policySchema = s diff --git a/app/src/auth/authorize/Role.ts b/app/src/auth/authorize/Role.ts index 7506fc78..51a827f0 100644 --- a/app/src/auth/authorize/Role.ts +++ b/app/src/auth/authorize/Role.ts @@ -1,4 +1,4 @@ -import { s } from "bknd/utils"; +import { s } from "userbase/utils"; import { Permission } from "./Permission"; import { Policy, policySchema } from "./Policy"; diff --git a/app/src/auth/errors.ts b/app/src/auth/errors.ts index 5333b6a7..1f77505f 100644 --- a/app/src/auth/errors.ts +++ b/app/src/auth/errors.ts @@ -1,6 +1,6 @@ import { Exception } from "core/errors"; import { isDebug } from "core/env"; -import { HttpStatus } from "bknd/utils"; +import { HttpStatus } from "userbase/utils"; export class AuthException extends Exception { getSafeErrorAndCode() { diff --git a/app/src/auth/middlewares/auth.middleware.ts b/app/src/auth/middlewares/auth.middleware.ts index d7373a7c..7c94a6a7 100644 --- a/app/src/auth/middlewares/auth.middleware.ts +++ b/app/src/auth/middlewares/auth.middleware.ts @@ -1,4 +1,4 @@ -import { $console, patternMatch } from "bknd/utils"; +import { $console, patternMatch } from "userbase/utils"; import type { Context } from "hono"; import { createMiddleware } from "hono/factory"; import type { ServerEnv } from "modules/Controller"; diff --git a/app/src/auth/middlewares/permission.middleware.ts b/app/src/auth/middlewares/permission.middleware.ts index c6e53f4e..6984a1b0 100644 --- a/app/src/auth/middlewares/permission.middleware.ts +++ b/app/src/auth/middlewares/permission.middleware.ts @@ -1,5 +1,5 @@ import type { Permission, PermissionContext } from "auth/authorize/Permission"; -import { $console, threw } from "bknd/utils"; +import { $console, threw } from "userbase/utils"; import type { Context, Hono } from "hono"; import type { RouterRoute } from "hono/types"; import { createMiddleware } from "hono/factory"; diff --git a/app/src/cli/commands/config.ts b/app/src/cli/commands/config.ts index ad9f4282..44507ec7 100644 --- a/app/src/cli/commands/config.ts +++ b/app/src/cli/commands/config.ts @@ -4,7 +4,7 @@ import { makeAppFromEnv } from "cli/commands/run"; import { writeFile } from "node:fs/promises"; import c from "picocolors"; import { withConfigOptions } from "cli/utils/options"; -import { $console } from "bknd/utils"; +import { $console } from "userbase/utils"; export const config: CliCommand = (program) => { withConfigOptions(program.command("config")) diff --git a/app/src/cli/commands/create/create.ts b/app/src/cli/commands/create/create.ts index 3fca3b2b..7b0fc7ad 100644 --- a/app/src/cli/commands/create/create.ts +++ b/app/src/cli/commands/create/create.ts @@ -5,9 +5,9 @@ import type { CliCommand } from "cli/types"; import { typewriter, wait } from "cli/utils/cli"; import { execAsync, getVersion } from "cli/utils/sys"; import { Option } from "commander"; -import { env } from "bknd"; +import { env } from "userbase"; import color from "picocolors"; -import { overridePackageJson, updateBkndPackages } from "./npm"; +import { overridePackageJson, updateUserbasePackages } from "./npm"; import { type Template, templates, type TemplateSetupCtx } from "./templates"; import { createScoped, flush } from "cli/utils/telemetry"; import path from "node:path"; @@ -48,7 +48,7 @@ function errorOutro() { // biome-ignore lint/suspicious/noConsoleLog: console.log( color.yellow("Sorry that this happened. If you think this is a bug, please report it at: ") + - color.cyan("https://github.com/bknd-io/bknd/issues"), + color.cyan("https://github.com/userbase-io/userbase/issues"), ); // biome-ignore lint/suspicious/noConsoleLog: console.log(""); @@ -80,12 +80,12 @@ async function action(options: { const version = await getVersion(); $p.intro( - `👋 Welcome to the ${color.bold(color.cyan("bknd"))} create cli ${color.bold(`v${version}`)}`, + `👋 Welcome to the ${color.bold(color.cyan("userbase"))} create cli ${color.bold(`v${version}`)}`, ); await $p.stream.message( (async function* () { - yield* typewriter("Thanks for choosing to create a new project with bknd!", color.dim); + yield* typewriter("Thanks for choosing to create a new project with userbase!", color.dim); await wait(); })(), ); @@ -127,7 +127,7 @@ async function action(options: { ? downloadOpts.dir.split("/").pop() : downloadOpts.dir.replace(/[./]/g, ""); - if (!name || name.length === 0) name = "bknd"; + if (!name || name.length === 0) name = "userbase"; let template: Template | undefined; @@ -254,7 +254,7 @@ async function action(options: { } s.stop("Template downloaded."); - await updateBkndPackages(ctx.dir); + await updateUserbasePackages(ctx.dir); if (template.preinstall) { await template.preinstall(ctx); @@ -335,7 +335,7 @@ async function action(options: { yield "\n\n"; yield* typewriter( `Enter your project's directory using ${color.cyan("cd " + ctx.dir)} -If you need help, check ${color.cyan("https://docs.bknd.io")} or join our Discord!`, +If you need help, check ${color.cyan("https://docs.userbase.io")} or join our Discord!`, ); await wait(2); })(), diff --git a/app/src/cli/commands/create/npm.ts b/app/src/cli/commands/create/npm.ts index 964ee47f..005214f5 100644 --- a/app/src/cli/commands/create/npm.ts +++ b/app/src/cli/commands/create/npm.ts @@ -92,10 +92,10 @@ export async function replacePackageJsonVersions( ); } -export async function updateBkndPackages(dir?: string, map?: Record) { +export async function updateUserbasePackages(dir?: string, map?: Record) { try { const versions = { - bknd: await sysGetVersion(), + userbase: await sysGetVersion(), ...(map ?? {}), }; await replacePackageJsonVersions( diff --git a/app/src/cli/commands/create/templates/aws.ts b/app/src/cli/commands/create/templates/aws.ts index e4a8b928..713e06ff 100644 --- a/app/src/cli/commands/create/templates/aws.ts +++ b/app/src/cli/commands/create/templates/aws.ts @@ -9,8 +9,8 @@ export const aws = { key: "aws", title: "AWS Lambda Basic", integration: "aws", - description: "A basic bknd AWS Lambda starter", - path: "gh:bknd-io/bknd/examples/aws-lambda", + description: "A basic userbase AWS Lambda starter", + path: "gh:userbase-io/userbase/examples/aws-lambda", ref: true, setup: async (ctx) => { await $p.stream.info( diff --git a/app/src/cli/commands/create/templates/cloudflare.ts b/app/src/cli/commands/create/templates/cloudflare.ts index 1cac8566..640942e0 100644 --- a/app/src/cli/commands/create/templates/cloudflare.ts +++ b/app/src/cli/commands/create/templates/cloudflare.ts @@ -11,8 +11,8 @@ export const cloudflare = { key: "cloudflare", title: "Cloudflare Basic", integration: "cloudflare", - description: "A basic bknd Cloudflare worker", - path: "gh:bknd-io/bknd/examples/cloudflare-worker", + description: "A basic userbase Cloudflare worker", + path: "gh:userbase-io/userbase/examples/cloudflare-worker", ref: true, setup: async (ctx) => { // overwrite assets directory & name @@ -22,7 +22,7 @@ export const cloudflare = { ...json, name: ctx.name, assets: { - directory: "node_modules/bknd/dist/static", + directory: "node_modules/userbase/dist/static", }, }), { dir: ctx.dir }, diff --git a/app/src/cli/commands/create/templates/deno.ts b/app/src/cli/commands/create/templates/deno.ts index eb17269a..6cb3aa34 100644 --- a/app/src/cli/commands/create/templates/deno.ts +++ b/app/src/cli/commands/create/templates/deno.ts @@ -6,15 +6,15 @@ export const deno = { key: "deno", title: "Deno Basic", integration: "deno", - description: "A basic bknd Deno server with static assets", - path: "gh:bknd-io/bknd/examples/deno", + description: "A basic userbase Deno server with static assets", + path: "gh:userbase-io/userbase/examples/deno", installDeps: false, ref: true, setup: async (ctx) => { const version = await getVersion(); await overrideJson( "deno.json", - (json) => ({ ...json, links: undefined, imports: { bknd: `npm:bknd@${version}` } }), + (json) => ({ ...json, links: undefined, imports: { userbase: `npm:userbase@${version}` } }), { dir: ctx.dir }, ); }, diff --git a/app/src/cli/commands/create/templates/index.ts b/app/src/cli/commands/create/templates/index.ts index 7aab8d51..e9132dcc 100644 --- a/app/src/cli/commands/create/templates/index.ts +++ b/app/src/cli/commands/create/templates/index.ts @@ -33,7 +33,7 @@ export type Template = { description?: string; path: string; /** - * adds a ref "#{ref}" to the path. If "true", adds the current version of bknd + * adds a ref "#{ref}" to the path. If "true", adds the current version of userbase */ ref?: true | string; /** @@ -53,48 +53,48 @@ export const templates: Template[] = [ key: "node", title: "Node.js Basic", integration: "node", - description: "A basic bknd Node.js server", - path: "gh:bknd-io/bknd/examples/node", + description: "A basic userbase Node.js server", + path: "gh:userbase-io/userbase/examples/node", ref: true, }, { key: "bun", title: "Bun Basic", integration: "bun", - description: "A basic bknd Bun server", - path: "gh:bknd-io/bknd/examples/bun", + description: "A basic userbase Bun server", + path: "gh:userbase-io/userbase/examples/bun", ref: true, }, { key: "nextjs", title: "Next.js Basic", integration: "nextjs", - description: "A basic bknd Next.js starter", - path: "gh:bknd-io/bknd/examples/nextjs", + description: "A basic userbase Next.js starter", + path: "gh:userbase-io/userbase/examples/nextjs", ref: true, }, { key: "astro", title: "Astro Basic", integration: "astro", - description: "A basic bknd Astro starter", - path: "gh:bknd-io/bknd/examples/astro", + description: "A basic userbase Astro starter", + path: "gh:userbase-io/userbase/examples/astro", ref: true, }, { key: "react-router", title: "React Router Basic", integration: "react-router", - description: "A basic bknd React Router starter", - path: "gh:bknd-io/bknd/examples/react-router", + description: "A basic userbase React Router starter", + path: "gh:userbase-io/userbase/examples/react-router", ref: true, }, { key: "aws", title: "AWS Lambda Basic", integration: "aws", - description: "A basic bknd AWS Lambda starter", - path: "gh:bknd-io/bknd/examples/aws-lambda", + description: "A basic userbase AWS Lambda starter", + path: "gh:userbase-io/userbase/examples/aws-lambda", ref: true, }, deno, diff --git a/app/src/cli/commands/debug.ts b/app/src/cli/commands/debug.ts index 412b4857..1703cda3 100644 --- a/app/src/cli/commands/debug.ts +++ b/app/src/cli/commands/debug.ts @@ -10,7 +10,7 @@ import type { CliCommand } from "../types"; export const debug: CliCommand = (program) => { program .command("debug") - .description("debug bknd") + .description("debug userbase") .addArgument(new Argument("", "subject to debug").choices(Object.keys(subjects))) .action(action); }; diff --git a/app/src/cli/commands/mcp/mcp.ts b/app/src/cli/commands/mcp/mcp.ts index 0ec05645..550a0a19 100644 --- a/app/src/cli/commands/mcp/mcp.ts +++ b/app/src/cli/commands/mcp/mcp.ts @@ -1,7 +1,7 @@ import type { CliCommand } from "cli/types"; import { makeAppFromEnv } from "../run"; import { getSystemMcp } from "modules/mcp/system-mcp"; -import { $console, stdioTransport } from "bknd/utils"; +import { $console, stdioTransport } from "userbase/utils"; import { withConfigOptions, type WithConfigOptions } from "cli/utils/options"; export const mcp: CliCommand = (program) => diff --git a/app/src/cli/commands/run/platform.ts b/app/src/cli/commands/run/platform.ts index b20822ae..6a338b55 100644 --- a/app/src/cli/commands/run/platform.ts +++ b/app/src/cli/commands/run/platform.ts @@ -1,5 +1,5 @@ import path from "node:path"; -import { $console } from "bknd/utils"; +import { $console } from "userbase/utils"; import type { MiddlewareHandler } from "hono"; import open from "open"; import { fileExists, getRelativeDistPath } from "../../utils/sys"; @@ -86,7 +86,7 @@ export async function getConfigPath(filePath?: string) { } const exts = ["", ".js", ".ts", ".mjs", ".cjs", ".json"]; - const paths = exts.map((e) => `bknd.config${e}`); + const paths = exts.map((e) => `userbase.config${e}`); for (const p of paths) { const _p = path.resolve(process.cwd(), p); if (await fileExists(_p)) { diff --git a/app/src/cli/commands/run/run.ts b/app/src/cli/commands/run/run.ts index dbae9f96..5a9937b8 100644 --- a/app/src/cli/commands/run/run.ts +++ b/app/src/cli/commands/run/run.ts @@ -1,8 +1,8 @@ import type { Config } from "@libsql/client/node"; import { StorageLocalAdapter } from "adapter/node/storage"; -import type { CliBkndConfig, CliCommand } from "cli/types"; +import type { CliUserbaseConfig, CliCommand } from "cli/types"; import { Option } from "commander"; -import { config, type App, type CreateAppConfig, type MaybePromise, registries } from "bknd"; +import { config, type App, type CreateAppConfig, type MaybePromise, registries } from "userbase"; import dotenv from "dotenv"; import c from "picocolors"; import path from "node:path"; @@ -14,8 +14,8 @@ import { serveStatic, startServer, } from "./platform"; -import { createRuntimeApp, makeConfig } from "bknd/adapter"; -import { colorizeConsole, isBun } from "bknd/utils"; +import { createRuntimeApp, makeConfig } from "userbase/adapter"; +import { colorizeConsole, isBun } from "userbase/utils"; import { withConfigOptions, type WithConfigOptions } from "cli/utils/options"; const env_files = [".env", ".dev.vars"]; @@ -69,7 +69,7 @@ async function makeApp(config: MakeAppConfig) { }); } -export async function makeConfigApp(_config: CliBkndConfig, platform?: Platform) { +export async function makeConfigApp(_config: CliUserbaseConfig, platform?: Platform) { const config = await makeConfig(_config, process.env); return makeApp({ ...config, @@ -100,7 +100,7 @@ export async function makeAppFromEnv(options: Partial = {}) { } else if (configFilePath) { console.info("Using config from", c.cyan(configFilePath)); try { - const config = (await import(configFilePath).then((m) => m.default)) as CliBkndConfig; + const config = (await import(configFilePath).then((m) => m.default)) as CliUserbaseConfig; app = await makeConfigApp(config, options.server); } catch (e) { console.error("Failed to load config:", e); diff --git a/app/src/cli/commands/secrets.ts b/app/src/cli/commands/secrets.ts index ceae59f7..06b0c987 100644 --- a/app/src/cli/commands/secrets.ts +++ b/app/src/cli/commands/secrets.ts @@ -3,7 +3,7 @@ import { makeAppFromEnv } from "cli/commands/run"; import { writeFile } from "node:fs/promises"; import c from "picocolors"; import { withConfigOptions, type WithConfigOptions } from "cli/utils/options"; -import { transformObject } from "bknd/utils"; +import { transformObject } from "userbase/utils"; import { Option } from "commander"; export const secrets: CliCommand = (program) => { diff --git a/app/src/cli/commands/types/types.ts b/app/src/cli/commands/types/types.ts index ebadf35c..ea3dfc7c 100644 --- a/app/src/cli/commands/types/types.ts +++ b/app/src/cli/commands/types/types.ts @@ -9,7 +9,7 @@ import { withConfigOptions, type WithConfigOptions } from "cli/utils/options"; export const types: CliCommand = (program) => { withConfigOptions(program.command("types")) .description("generate types") - .addOption(new Option("-o, --outfile ", "output file").default("bknd-types.d.ts")) + .addOption(new Option("-o, --outfile ", "output file").default("userbase-types.d.ts")) .addOption(new Option("--dump", "dump types to console instead of writing to file")) .action(action); }; diff --git a/app/src/cli/commands/user.ts b/app/src/cli/commands/user.ts index 726748ba..bcef5844 100644 --- a/app/src/cli/commands/user.ts +++ b/app/src/cli/commands/user.ts @@ -10,7 +10,7 @@ import type { PasswordStrategy } from "auth/authenticate/strategies"; import { makeAppFromEnv } from "cli/commands/run"; import type { CliCommand } from "cli/types"; import { Argument } from "commander"; -import { $console, isBun } from "bknd/utils"; +import { $console, isBun } from "userbase/utils"; import c from "picocolors"; import { withConfigOptions, type WithConfigOptions } from "cli/utils/options"; diff --git a/app/src/cli/index.ts b/app/src/cli/index.ts index 33857132..64eddeb0 100644 --- a/app/src/cli/index.ts +++ b/app/src/cli/index.ts @@ -13,8 +13,8 @@ async function main() { const version = await getVersion(); program - .name("bknd") - .description(color.yellowBright("⚡") + " bknd cli " + color.bold(color.cyan(`v${version}`))) + .name("userbase") + .description(color.yellowBright("⚡") + " userbase cli " + color.bold(color.cyan(`v${version}`))) .version(version) .hook("preAction", (thisCommand, actionCommand) => { capture(`cmd_${actionCommand.name()}`); diff --git a/app/src/cli/types.d.ts b/app/src/cli/types.d.ts index b1c20ea3..9841e6b9 100644 --- a/app/src/cli/types.d.ts +++ b/app/src/cli/types.d.ts @@ -1,9 +1,9 @@ -import type { BkndConfig } from "adapter"; +import type { UserbaseConfig } from "adapter"; import type { Command } from "commander"; export type CliCommand = (program: Command) => void; -export type CliBkndConfig = BkndConfig & { +export type CliUserbaseConfig = UserbaseConfig & { server?: { port?: number; platform?: "node" | "bun"; diff --git a/app/src/cli/utils/sys.ts b/app/src/cli/utils/sys.ts index e1fd3405..7a3bb0e1 100644 --- a/app/src/cli/utils/sys.ts +++ b/app/src/cli/utils/sys.ts @@ -1,4 +1,4 @@ -import { $console } from "bknd/utils"; +import { $console } from "userbase/utils"; import { execSync, exec as nodeExec } from "node:child_process"; import { readFile, writeFile as nodeWriteFile } from "node:fs/promises"; import path from "node:path"; diff --git a/app/src/cli/utils/telemetry.ts b/app/src/cli/utils/telemetry.ts index 9c9fec13..b524aa8d 100644 --- a/app/src/cli/utils/telemetry.ts +++ b/app/src/cli/utils/telemetry.ts @@ -1,7 +1,7 @@ import { PostHog } from "posthog-js-lite"; import { getVersion } from "cli/utils/sys"; -import { env, isDebug } from "bknd"; -import { $console } from "bknd/utils"; +import { env, isDebug } from "userbase"; +import { $console } from "userbase/utils"; type Properties = { [p: string]: any }; diff --git a/app/src/core/drivers/email/mailchannels.spec.ts b/app/src/core/drivers/email/mailchannels.spec.ts index 5281856b..66c5ed03 100644 --- a/app/src/core/drivers/email/mailchannels.spec.ts +++ b/app/src/core/drivers/email/mailchannels.spec.ts @@ -12,9 +12,9 @@ describe.skipIf(ALL_TESTS)("mailchannels", () => { it("should send an email", async () => { const driver = mailchannelsEmail({ apiKey: process.env.MAILCHANNELS_API_KEY!, - from: { email: "accounts@bknd.io", name: "Dennis Senn" }, + from: { email: "accounts@userbase.io", name: "Dennis Senn" }, }); - const response = await driver.send("ds@bknd.io", "Test", "Test"); + const response = await driver.send("ds@userbase.io", "Test", "Test"); expect(response).toBeDefined(); }); }); diff --git a/app/src/core/drivers/email/mailchannels.ts b/app/src/core/drivers/email/mailchannels.ts index 540355a5..93aee8de 100644 --- a/app/src/core/drivers/email/mailchannels.ts +++ b/app/src/core/drivers/email/mailchannels.ts @@ -1,4 +1,4 @@ -import { mergeObject, type RecursivePartial } from "bknd/utils"; +import { mergeObject, type RecursivePartial } from "userbase/utils"; import type { IEmailDriver } from "./index"; export type MailchannelsEmailOptions = { diff --git a/app/src/core/drivers/email/plunk.spec.ts b/app/src/core/drivers/email/plunk.spec.ts index 6d842c7c..7426c71b 100644 --- a/app/src/core/drivers/email/plunk.spec.ts +++ b/app/src/core/drivers/email/plunk.spec.ts @@ -15,7 +15,7 @@ describe.skipIf(ALL_TESTS)("plunk", () => { from: undefined, // Default to what Plunk sets }); const response = await driver.send( - "help@bknd.io", + "help@userbase.io", "Test Email from Plunk", "This is a test email", ); @@ -31,7 +31,7 @@ describe.skipIf(ALL_TESTS)("plunk", () => { from: undefined, }); const htmlBody = "

Test Email

This is a test email

"; - const response = await driver.send("help@bknd.io", "HTML Test", htmlBody); + const response = await driver.send("help@userbase.io", "HTML Test", htmlBody); expect(response).toBeDefined(); expect(response.success).toBe(true); }); @@ -42,7 +42,7 @@ describe.skipIf(ALL_TESTS)("plunk", () => { from: undefined, }); const response = await driver.send("test@example.com", "Test Email", { - text: "help@bknd.io", + text: "help@userbase.io", html: "

This is HTML

", }); expect(response).toBeDefined(); diff --git a/app/src/core/drivers/email/resend.spec.ts b/app/src/core/drivers/email/resend.spec.ts index 04d005a8..b9e4e6c5 100644 --- a/app/src/core/drivers/email/resend.spec.ts +++ b/app/src/core/drivers/email/resend.spec.ts @@ -1,3 +1,4 @@ + import { describe, it, expect } from "bun:test"; import { resendEmail } from "./resend"; @@ -12,9 +13,9 @@ describe.skipIf(ALL_TESTS)("resend", () => { it("should send an email", async () => { const driver = resendEmail({ apiKey: process.env.RESEND_API_KEY!, - from: "BKND ", + from: "BKND ", }); - const response = await driver.send("help@bknd.io", "Test", "Test"); + const response = await driver.send("help@userbase.io", "Test", "Test"); expect(response).toBeDefined(); expect(response.id).toBeDefined(); }); diff --git a/app/src/core/errors.ts b/app/src/core/errors.ts index 4b64c346..eb9a89b2 100644 --- a/app/src/core/errors.ts +++ b/app/src/core/errors.ts @@ -27,7 +27,7 @@ export class Exception extends Error { } } -export class BkndError extends Error { +export class UserbaseError extends Error { constructor( message: string, public details?: Record, @@ -37,7 +37,7 @@ export class BkndError extends Error { } static with(message: string, details?: Record, type?: string) { - throw new BkndError(message, details, type); + throw new UserbaseError(message, details, type); } toJSON() { diff --git a/app/src/core/events/EventListener.ts b/app/src/core/events/EventListener.ts index 7e8bc750..10310771 100644 --- a/app/src/core/events/EventListener.ts +++ b/app/src/core/events/EventListener.ts @@ -1,4 +1,4 @@ -import type { MaybePromise } from "bknd"; +import type { MaybePromise } from "userbase"; import type { Event } from "./Event"; import type { EventClass } from "./EventManager"; diff --git a/app/src/core/events/EventManager.ts b/app/src/core/events/EventManager.ts index 1ac8bc41..cf85188e 100644 --- a/app/src/core/events/EventManager.ts +++ b/app/src/core/events/EventManager.ts @@ -1,6 +1,6 @@ import { type Event, type EventClass, InvalidEventReturn } from "./Event"; import { EventListener, type ListenerHandler, type ListenerMode } from "./EventListener"; -import { $console } from "bknd/utils"; +import { $console } from "userbase/utils"; export type RegisterListenerConfig = | ListenerMode diff --git a/app/src/core/object/SchemaObject.ts b/app/src/core/object/SchemaObject.ts index cf40bcf5..2bc834e7 100644 --- a/app/src/core/object/SchemaObject.ts +++ b/app/src/core/object/SchemaObject.ts @@ -1,5 +1,5 @@ import { get, has, omit, set } from "lodash-es"; -import { type s, parse, stripMark, getFullPathKeys, mergeObjectWith, deepFreeze } from "bknd/utils"; +import { type s, parse, stripMark, getFullPathKeys, mergeObjectWith, deepFreeze } from "userbase/utils"; export type SchemaObjectOptions = { onUpdate?: (config: s.Static) => void | Promise; diff --git a/app/src/core/object/query/query.ts b/app/src/core/object/query/query.ts index 110cce6c..ebd243a9 100644 --- a/app/src/core/object/query/query.ts +++ b/app/src/core/object/query/query.ts @@ -1,5 +1,5 @@ import type { PrimaryFieldType } from "core/config"; -import { getPath, invariant, isPlainObject } from "bknd/utils"; +import { getPath, invariant, isPlainObject } from "userbase/utils"; export type Primitive = PrimaryFieldType | string | number | boolean; export function isPrimitive(value: any): value is Primitive { diff --git a/app/src/core/server/flash.ts b/app/src/core/server/flash.ts index 3c7712a6..27579414 100644 --- a/app/src/core/server/flash.ts +++ b/app/src/core/server/flash.ts @@ -1,7 +1,7 @@ import type { Context } from "hono"; import { setCookie } from "hono/cookie"; -const flash_key = "__bknd_flash"; +const flash_key = "__userbase_flash"; export type FlashMessageType = "error" | "warning" | "success" | "info"; export function addFlashMessage(c: Context, message: string, type: FlashMessageType = "info") { diff --git a/app/src/core/test/utils.ts b/app/src/core/test/utils.ts index c7971e2a..1aaac9ba 100644 --- a/app/src/core/test/utils.ts +++ b/app/src/core/test/utils.ts @@ -1,8 +1,8 @@ -import { Connection, createApp as createAppInternal, type CreateAppConfig } from "bknd"; -import { bunSqlite } from "bknd/adapter/bun"; -import type { McpServer } from "bknd/utils"; +import { Connection, createApp as createAppInternal, type CreateAppConfig } from "userbase"; +import { bunSqlite } from "userbase/adapter/bun"; +import type { McpServer } from "userbase/utils"; -export { App } from "bknd"; +export { App } from "userbase"; export function createApp({ connection, ...config }: CreateAppConfig = {}) { return createAppInternal({ diff --git a/app/src/core/utils/schema/index.ts b/app/src/core/utils/schema/index.ts index ff8190c0..6fef2e6e 100644 --- a/app/src/core/utils/schema/index.ts +++ b/app/src/core/utils/schema/index.ts @@ -1,5 +1,5 @@ import { Exception } from "core/errors"; -import { HttpStatus } from "bknd/utils"; +import { HttpStatus } from "userbase/utils"; import * as s from "jsonv-ts"; export { validator as jsc, type Options } from "jsonv-ts/hono"; @@ -24,7 +24,7 @@ export { secret, SecretSchema } from "./secret"; export { s }; -const symbol = Symbol("bknd-validation-mark"); +const symbol = Symbol("userbase-validation-mark"); export function stripMark(obj: O) { const newObj = structuredClone(obj); diff --git a/app/src/core/utils/schema/secret.ts b/app/src/core/utils/schema/secret.ts index 6fcdf14f..bd894674 100644 --- a/app/src/core/utils/schema/secret.ts +++ b/app/src/core/utils/schema/secret.ts @@ -1,4 +1,4 @@ -import type { s } from "bknd/utils"; +import type { s } from "userbase/utils"; import { StringSchema } from "jsonv-ts"; export class SecretSchema extends StringSchema {} diff --git a/app/src/data/AppData.ts b/app/src/data/AppData.ts index fbe75141..122be539 100644 --- a/app/src/data/AppData.ts +++ b/app/src/data/AppData.ts @@ -1,4 +1,4 @@ -import { transformObject } from "bknd/utils"; +import { transformObject } from "userbase/utils"; import { Module } from "modules/Module"; import { DataController } from "./api/DataController"; import { type AppDataConfig, dataConfigSchema } from "./data-schema"; diff --git a/app/src/data/api/DataApi.ts b/app/src/data/api/DataApi.ts index de888126..f1d63e26 100644 --- a/app/src/data/api/DataApi.ts +++ b/app/src/data/api/DataApi.ts @@ -1,4 +1,4 @@ -import type { DB, EntityData, RepoQueryIn } from "bknd"; +import type { DB, EntityData, RepoQueryIn } from "userbase"; import type { Insertable, Selectable, Updateable } from "kysely"; import { type BaseModuleApiOptions, ModuleApi, type PrimaryFieldType } from "modules"; diff --git a/app/src/data/api/DataController.ts b/app/src/data/api/DataController.ts index 531be0c7..e7836675 100644 --- a/app/src/data/api/DataController.ts +++ b/app/src/data/api/DataController.ts @@ -9,7 +9,7 @@ import { pickKeys, mcpTool, convertNumberedObjectToArray, -} from "bknd/utils"; +} from "userbase/utils"; import * as SystemPermissions from "modules/permissions"; import type { AppDataConfig } from "../data-schema"; import type { EntityManager, EntityData } from "data/entities"; @@ -689,7 +689,7 @@ export class DataController extends Controller { this.ctx.mcp .resource( "data_entities", - "bknd://data/entities", + "userbase://data/entities", (c) => c.json(c.context.ctx().em.toJSON().entities), { title: "Entities", @@ -698,7 +698,7 @@ export class DataController extends Controller { ) .resource( "data_relations", - "bknd://data/relations", + "userbase://data/relations", (c) => c.json(c.context.ctx().em.toJSON().relations), { title: "Relations", @@ -707,7 +707,7 @@ export class DataController extends Controller { ) .resource( "data_indices", - "bknd://data/indices", + "userbase://data/indices", (c) => c.json(c.context.ctx().em.toJSON().indices), { title: "Indices", diff --git a/app/src/data/connection/Connection.ts b/app/src/data/connection/Connection.ts index c9353aae..38d364cc 100644 --- a/app/src/data/connection/Connection.ts +++ b/app/src/data/connection/Connection.ts @@ -16,7 +16,7 @@ import { } from "kysely"; import type { jsonArrayFrom, jsonBuildObject, jsonObjectFrom } from "kysely/helpers/sqlite"; import type { BaseIntrospector, BaseIntrospectorConfig } from "./BaseIntrospector"; -import type { DB } from "bknd"; +import type { DB } from "userbase"; import type { Constructor } from "core/registry/Registry"; import { KyselyPluginRunner } from "data/plugins/KyselyPluginRunner"; import type { Field } from "data/fields/Field"; @@ -85,7 +85,7 @@ export type ConnQueryResults = { [K in keyof T]: ConnQueryResult; }; -const CONN_SYMBOL = Symbol.for("bknd:connection"); +const CONN_SYMBOL = Symbol.for("userbase:connection"); export type Features = { batching: boolean; diff --git a/app/src/data/connection/connection-test-suite.ts b/app/src/data/connection/connection-test-suite.ts index bf45e0e5..c8da673c 100644 --- a/app/src/data/connection/connection-test-suite.ts +++ b/app/src/data/connection/connection-test-suite.ts @@ -1,6 +1,6 @@ import type { TestRunner } from "core/test"; import { Connection, type FieldSpec } from "./Connection"; -import { getPath } from "bknd/utils"; +import { getPath } from "userbase/utils"; import * as proto from "data/prototype"; import { createApp } from "App"; import type { MaybePromise } from "core/types"; diff --git a/app/src/data/connection/sqlite/GenericSqliteConnection.ts b/app/src/data/connection/sqlite/GenericSqliteConnection.ts index 0ec52122..e91f761d 100644 --- a/app/src/data/connection/sqlite/GenericSqliteConnection.ts +++ b/app/src/data/connection/sqlite/GenericSqliteConnection.ts @@ -8,7 +8,7 @@ import { } from "kysely-generic-sqlite"; import { SqliteConnection } from "./SqliteConnection"; import type { ConnQuery, ConnQueryResults, Features } from "../Connection"; -import type { MaybePromise } from "bknd"; +import type { MaybePromise } from "userbase"; export type { IGenericSqlite }; export type TStatement = { sql: string; parameters?: any[] | readonly any[] }; diff --git a/app/src/data/connection/sqlite/sqlocal/SQLocalConnection.ts b/app/src/data/connection/sqlite/sqlocal/SQLocalConnection.ts index f9244e28..fbe2869d 100644 --- a/app/src/data/connection/sqlite/sqlocal/SQLocalConnection.ts +++ b/app/src/data/connection/sqlite/sqlocal/SQLocalConnection.ts @@ -1,7 +1,7 @@ import { Kysely, ParseJSONResultsPlugin } from "kysely"; import { SqliteConnection } from "../SqliteConnection"; import { SqliteIntrospector } from "../SqliteIntrospector"; -import type { DB } from "bknd"; +import type { DB } from "userbase"; import type { SQLocalKysely } from "sqlocal/kysely"; const plugins = [new ParseJSONResultsPlugin()]; diff --git a/app/src/data/data-schema.ts b/app/src/data/data-schema.ts index f416da6b..9464e982 100644 --- a/app/src/data/data-schema.ts +++ b/app/src/data/data-schema.ts @@ -1,10 +1,10 @@ -import { objectTransform } from "bknd/utils"; +import { objectTransform } from "userbase/utils"; import { MediaField, mediaFieldConfigSchema } from "../media/MediaField"; import { FieldClassMap } from "data/fields"; import { RelationClassMap, RelationFieldClassMap } from "data/relations"; import { entityConfigSchema, entityTypes } from "data/entities"; import { primaryFieldTypes, baseFieldConfigSchema } from "./fields"; -import { s } from "bknd/utils"; +import { s } from "userbase/utils"; import { $object, $record } from "modules/mcp"; export const FIELDS = { diff --git a/app/src/data/entities/Entity.ts b/app/src/data/entities/Entity.ts index 8fb0a884..99790945 100644 --- a/app/src/data/entities/Entity.ts +++ b/app/src/data/entities/Entity.ts @@ -1,5 +1,5 @@ import { config } from "core/config"; -import { snakeToPascalWithSpaces, transformObject, $console, s, parse } from "bknd/utils"; +import { snakeToPascalWithSpaces, transformObject, $console, s, parse } from "userbase/utils"; import { type Field, PrimaryField, @@ -36,7 +36,7 @@ export type EntityJSON = ReturnType; export const entityTypes = ["regular", "system", "generated"] as const; export type TEntityType = (typeof entityTypes)[number]; -const ENTITY_SYMBOL = Symbol.for("bknd:entity"); +const ENTITY_SYMBOL = Symbol.for("userbase:entity"); /** * @todo: add check for adding fields (primary and relation not allowed) diff --git a/app/src/data/entities/EntityManager.ts b/app/src/data/entities/EntityManager.ts index 804cbd8a..67968bef 100644 --- a/app/src/data/entities/EntityManager.ts +++ b/app/src/data/entities/EntityManager.ts @@ -1,5 +1,5 @@ -import type { DB as DefaultDB } from "bknd"; -import { $console } from "bknd/utils"; +import type { DB as DefaultDB } from "userbase"; +import { $console } from "userbase/utils"; import { EventManager } from "core/events"; import { sql } from "kysely"; import { Connection } from "../connection/Connection"; diff --git a/app/src/data/entities/EntityTypescript.ts b/app/src/data/entities/EntityTypescript.ts index 36d571ba..35c262da 100644 --- a/app/src/data/entities/EntityTypescript.ts +++ b/app/src/data/entities/EntityTypescript.ts @@ -1,6 +1,6 @@ import type { Entity, EntityManager, TEntityType } from "data/entities"; import type { EntityRelation } from "data/relations"; -import { autoFormatString } from "bknd/utils"; +import { autoFormatString } from "userbase/utils"; import { usersFields } from "auth/auth-entities"; import { mediaFields } from "media/media-entities"; @@ -170,15 +170,15 @@ export class EntityTypescript { const strings: string[] = []; const tables: Record = {}; const imports: Record = { - bknd: ["DB"], + userbase: ["DB"], kysely: ["Insertable", "Selectable", "Updateable", "Generated"], }; // add global types let g = "declare global {\n"; - g += `${this.getTab(1)}type BkndEntity = Selectable;\n`; - g += `${this.getTab(1)}type BkndEntityCreate = Insertable;\n`; - g += `${this.getTab(1)}type BkndEntityUpdate = Updateable;\n`; + g += `${this.getTab(1)}type UserbaseEntity = Selectable;\n`; + g += `${this.getTab(1)}type UserbaseEntityCreate = Insertable;\n`; + g += `${this.getTab(1)}type UserbaseEntityUpdate = Updateable;\n`; g += "}"; strings.push(g); @@ -207,7 +207,7 @@ export class EntityTypescript { strings.push(tables_string); // merge - let merge = `declare module "bknd" {\n`; + let merge = `declare module "userbase" {\n`; for (const systemEntity of system_entities) { const system_fields = Object.keys(systemEntities[systemEntity.name]); const additional_fields = systemEntity.fields diff --git a/app/src/data/entities/Result.ts b/app/src/data/entities/Result.ts index b637e1a4..80986251 100644 --- a/app/src/data/entities/Result.ts +++ b/app/src/data/entities/Result.ts @@ -1,5 +1,5 @@ import { isDebug } from "core/env"; -import { pick } from "bknd/utils"; +import { pick } from "userbase/utils"; import type { Connection } from "data/connection"; import type { Compilable, diff --git a/app/src/data/entities/mutation/Mutator.ts b/app/src/data/entities/mutation/Mutator.ts index e4bb6f0e..c4e7f90c 100644 --- a/app/src/data/entities/mutation/Mutator.ts +++ b/app/src/data/entities/mutation/Mutator.ts @@ -1,4 +1,4 @@ -import type { DB as DefaultDB, PrimaryFieldType } from "bknd"; +import type { DB as DefaultDB, PrimaryFieldType } from "userbase"; import { type EmitsEvents, EventManager } from "core/events"; import type { DeleteQueryBuilder, InsertQueryBuilder, UpdateQueryBuilder } from "kysely"; import type { TActionContext } from "data/fields"; diff --git a/app/src/data/entities/mutation/MutatorResult.ts b/app/src/data/entities/mutation/MutatorResult.ts index e9e876e8..f783ef41 100644 --- a/app/src/data/entities/mutation/MutatorResult.ts +++ b/app/src/data/entities/mutation/MutatorResult.ts @@ -1,4 +1,4 @@ -import { $console } from "bknd/utils"; +import { $console } from "userbase/utils"; import type { Entity, EntityData } from "../Entity"; import type { EntityManager } from "../EntityManager"; import { Result, type ResultJSON, type ResultOptions } from "../Result"; diff --git a/app/src/data/entities/query/Repository.ts b/app/src/data/entities/query/Repository.ts index 218f25ef..0a478fe5 100644 --- a/app/src/data/entities/query/Repository.ts +++ b/app/src/data/entities/query/Repository.ts @@ -1,5 +1,5 @@ -import type { DB as DefaultDB, EntityRelation, PrimaryFieldType } from "bknd"; -import { $console } from "bknd/utils"; +import type { DB as DefaultDB, EntityRelation, PrimaryFieldType } from "userbase"; +import { $console } from "userbase/utils"; import { type EmitsEvents, EventManager } from "core/events"; import { type SelectQueryBuilder, sql } from "kysely"; import { InvalidSearchParamsException } from "../../errors"; diff --git a/app/src/data/entities/query/RepositoryResult.ts b/app/src/data/entities/query/RepositoryResult.ts index 85dc2ebb..c1736cee 100644 --- a/app/src/data/entities/query/RepositoryResult.ts +++ b/app/src/data/entities/query/RepositoryResult.ts @@ -2,7 +2,7 @@ import type { Entity, EntityData } from "../Entity"; import type { EntityManager } from "../EntityManager"; import { Result, type ResultJSON, type ResultOptions } from "../Result"; import type { Compilable, SelectQueryBuilder } from "kysely"; -import { $console, ensureInt } from "bknd/utils"; +import { $console, ensureInt } from "userbase/utils"; export type RepositoryResultOptions = ResultOptions & { silent?: boolean; diff --git a/app/src/data/entities/query/WithBuilder.ts b/app/src/data/entities/query/WithBuilder.ts index 8c121a6a..3aee30d9 100644 --- a/app/src/data/entities/query/WithBuilder.ts +++ b/app/src/data/entities/query/WithBuilder.ts @@ -1,10 +1,10 @@ -import { isObject } from "bknd/utils"; +import { isObject } from "userbase/utils"; import type { KyselyJsonFrom } from "data/relations/EntityRelation"; import type { RepoQuery } from "data/server/query"; import { InvalidSearchParamsException } from "data/errors"; import type { Entity, EntityManager, RepositoryQB } from "data/entities"; -import { $console } from "bknd/utils"; +import { $console } from "userbase/utils"; export class WithBuilder { static addClause( diff --git a/app/src/data/errors.ts b/app/src/data/errors.ts index ca530c66..ad9603d3 100644 --- a/app/src/data/errors.ts +++ b/app/src/data/errors.ts @@ -1,5 +1,5 @@ import { Exception } from "core/errors"; -import { type InvalidSchemaError, HttpStatus } from "bknd/utils"; +import { type InvalidSchemaError, HttpStatus } from "userbase/utils"; import type { Entity } from "./entities"; import type { Field } from "./fields"; diff --git a/app/src/data/events/index.ts b/app/src/data/events/index.ts index beb44938..f76cf69a 100644 --- a/app/src/data/events/index.ts +++ b/app/src/data/events/index.ts @@ -1,5 +1,5 @@ -import type { PrimaryFieldType } from "bknd"; -import { $console } from "bknd/utils"; +import type { PrimaryFieldType } from "userbase"; +import { $console } from "userbase/utils"; import { Event, InvalidEventReturn } from "core/events"; import type { Entity, EntityData } from "../entities"; import type { RepoQuery } from "data/server/query"; diff --git a/app/src/data/fields/BooleanField.ts b/app/src/data/fields/BooleanField.ts index 860dbe4f..ee267b69 100644 --- a/app/src/data/fields/BooleanField.ts +++ b/app/src/data/fields/BooleanField.ts @@ -1,4 +1,4 @@ -import { omitKeys, s } from "bknd/utils"; +import { omitKeys, s } from "userbase/utils"; import type { EntityManager } from "data/entities"; import { TransformPersistFailedException } from "../errors"; import { Field, type TActionContext, type TRenderContext, baseFieldConfigSchema } from "./Field"; diff --git a/app/src/data/fields/DateField.ts b/app/src/data/fields/DateField.ts index 20d152ed..e87d7d8f 100644 --- a/app/src/data/fields/DateField.ts +++ b/app/src/data/fields/DateField.ts @@ -1,4 +1,4 @@ -import { dayjs, $console, s } from "bknd/utils"; +import { dayjs, $console, s } from "userbase/utils"; import type { EntityManager } from "../entities"; import { Field, type TActionContext, type TRenderContext, baseFieldConfigSchema } from "./Field"; import type { TFieldTSType } from "data/entities/EntityTypescript"; diff --git a/app/src/data/fields/EnumField.ts b/app/src/data/fields/EnumField.ts index 5b2e10fe..f7488a69 100644 --- a/app/src/data/fields/EnumField.ts +++ b/app/src/data/fields/EnumField.ts @@ -1,9 +1,9 @@ -import { omitKeys } from "bknd/utils"; +import { omitKeys } from "userbase/utils"; import type { EntityManager } from "data/entities"; import { TransformPersistFailedException } from "../errors"; import { baseFieldConfigSchema, Field, type TActionContext, type TRenderContext } from "./Field"; import type { TFieldTSType } from "data/entities/EntityTypescript"; -import { s } from "bknd/utils"; +import { s } from "userbase/utils"; export const enumFieldConfigSchema = s .strictObject({ diff --git a/app/src/data/fields/Field.ts b/app/src/data/fields/Field.ts index 8451d1df..3fe1f5d1 100644 --- a/app/src/data/fields/Field.ts +++ b/app/src/data/fields/Field.ts @@ -3,7 +3,7 @@ import type { EntityManager } from "../entities"; import { InvalidFieldConfigException, TransformPersistFailedException } from "../errors"; import type { FieldSpec } from "data/connection/Connection"; import type { TFieldTSType } from "data/entities/EntityTypescript"; -import { s, parse, InvalidSchemaError, snakeToPascalWithSpaces } from "bknd/utils"; +import { s, parse, InvalidSchemaError, snakeToPascalWithSpaces } from "userbase/utils"; // @todo: contexts need to be reworked // e.g. "table" is irrelevant, because if read is not given, it fails diff --git a/app/src/data/fields/JsonField.ts b/app/src/data/fields/JsonField.ts index 8ed4802d..16f3d2ea 100644 --- a/app/src/data/fields/JsonField.ts +++ b/app/src/data/fields/JsonField.ts @@ -1,9 +1,9 @@ -import { omitKeys } from "bknd/utils"; +import { omitKeys } from "userbase/utils"; import type { EntityManager } from "data/entities"; import { TransformPersistFailedException } from "../errors"; import { Field, type TActionContext, type TRenderContext, baseFieldConfigSchema } from "./Field"; import type { TFieldTSType } from "data/entities/EntityTypescript"; -import { s } from "bknd/utils"; +import { s } from "userbase/utils"; export const jsonFieldConfigSchema = s .strictObject({ diff --git a/app/src/data/fields/JsonSchemaField.ts b/app/src/data/fields/JsonSchemaField.ts index b182ac10..d9a123b8 100644 --- a/app/src/data/fields/JsonSchemaField.ts +++ b/app/src/data/fields/JsonSchemaField.ts @@ -1,10 +1,10 @@ import { type Schema as JsonSchema, Validator } from "@cfworker/json-schema"; -import { objectToJsLiteral } from "bknd/utils"; +import { objectToJsLiteral } from "userbase/utils"; import type { EntityManager } from "data/entities"; import { TransformPersistFailedException } from "../errors"; import { Field, type TActionContext, type TRenderContext, baseFieldConfigSchema } from "./Field"; import type { TFieldTSType } from "data/entities/EntityTypescript"; -import { s } from "bknd/utils"; +import { s } from "userbase/utils"; export const jsonSchemaFieldConfigSchema = s .strictObject({ diff --git a/app/src/data/fields/NumberField.ts b/app/src/data/fields/NumberField.ts index 0f7481f5..d71902b0 100644 --- a/app/src/data/fields/NumberField.ts +++ b/app/src/data/fields/NumberField.ts @@ -2,7 +2,7 @@ import type { EntityManager } from "data/entities"; import { TransformPersistFailedException } from "../errors"; import { Field, type TActionContext, type TRenderContext, baseFieldConfigSchema } from "./Field"; import type { TFieldTSType } from "data/entities/EntityTypescript"; -import { s, omitKeys } from "bknd/utils"; +import { s, omitKeys } from "userbase/utils"; export const numberFieldConfigSchema = s .strictObject({ diff --git a/app/src/data/fields/PrimaryField.ts b/app/src/data/fields/PrimaryField.ts index 3e1743e5..025da653 100644 --- a/app/src/data/fields/PrimaryField.ts +++ b/app/src/data/fields/PrimaryField.ts @@ -1,5 +1,5 @@ import { config } from "core/config"; -import { omitKeys, uuidv7, s } from "bknd/utils"; +import { omitKeys, uuidv7, s } from "userbase/utils"; import { Field, baseFieldConfigSchema } from "./Field"; import type { TFieldTSType } from "data/entities/EntityTypescript"; diff --git a/app/src/data/fields/TextField.ts b/app/src/data/fields/TextField.ts index 95678999..2d070d48 100644 --- a/app/src/data/fields/TextField.ts +++ b/app/src/data/fields/TextField.ts @@ -1,5 +1,5 @@ import type { EntityManager } from "data/entities"; -import { omitKeys, s } from "bknd/utils"; +import { omitKeys, s } from "userbase/utils"; import { TransformPersistFailedException } from "../errors"; import { Field, type TActionContext, baseFieldConfigSchema } from "./Field"; diff --git a/app/src/data/fields/VirtualField.ts b/app/src/data/fields/VirtualField.ts index 93dac52a..0a938183 100644 --- a/app/src/data/fields/VirtualField.ts +++ b/app/src/data/fields/VirtualField.ts @@ -1,5 +1,5 @@ import { Field, baseFieldConfigSchema } from "./Field"; -import { s } from "bknd/utils"; +import { s } from "userbase/utils"; export const virtualFieldConfigSchema = s .strictObject({ diff --git a/app/src/data/permissions/index.ts b/app/src/data/permissions/index.ts index f832716a..9ccf3c73 100644 --- a/app/src/data/permissions/index.ts +++ b/app/src/data/permissions/index.ts @@ -1,5 +1,5 @@ import { Permission } from "auth/authorize/Permission"; -import { s } from "bknd/utils"; +import { s } from "userbase/utils"; export const entityRead = new Permission( "data.entity.read", diff --git a/app/src/data/relations/EntityRelation.ts b/app/src/data/relations/EntityRelation.ts index 733b804f..02810619 100644 --- a/app/src/data/relations/EntityRelation.ts +++ b/app/src/data/relations/EntityRelation.ts @@ -1,5 +1,5 @@ -import type { PrimaryFieldType } from "bknd"; -import { s, parse } from "bknd/utils"; +import type { PrimaryFieldType } from "userbase"; +import { s, parse } from "userbase/utils"; import type { ExpressionBuilder, SelectQueryBuilder } from "kysely"; import type { Entity, EntityData, EntityManager } from "../entities"; import { diff --git a/app/src/data/relations/ManyToManyRelation.ts b/app/src/data/relations/ManyToManyRelation.ts index e7a12330..d8258b59 100644 --- a/app/src/data/relations/ManyToManyRelation.ts +++ b/app/src/data/relations/ManyToManyRelation.ts @@ -6,7 +6,7 @@ import { EntityRelation, type KyselyQueryBuilder } from "./EntityRelation"; import { EntityRelationAnchor } from "./EntityRelationAnchor"; import { RelationField } from "./RelationField"; import { type RelationType, RelationTypes } from "./relation-types"; -import { s } from "bknd/utils"; +import { s } from "userbase/utils"; export type ManyToManyRelationConfig = s.Static; diff --git a/app/src/data/relations/ManyToOneRelation.ts b/app/src/data/relations/ManyToOneRelation.ts index cd17423e..39d4d7e8 100644 --- a/app/src/data/relations/ManyToOneRelation.ts +++ b/app/src/data/relations/ManyToOneRelation.ts @@ -1,5 +1,5 @@ -import type { PrimaryFieldType } from "bknd"; -import { snakeToPascalWithSpaces, s } from "bknd/utils"; +import type { PrimaryFieldType } from "userbase"; +import { snakeToPascalWithSpaces, s } from "userbase/utils"; import type { ExpressionBuilder } from "kysely"; import type { Entity, EntityManager } from "../entities"; import type { RepoQuery } from "../server/query"; diff --git a/app/src/data/relations/PolymorphicRelation.ts b/app/src/data/relations/PolymorphicRelation.ts index 803c8c84..a97564d9 100644 --- a/app/src/data/relations/PolymorphicRelation.ts +++ b/app/src/data/relations/PolymorphicRelation.ts @@ -5,8 +5,8 @@ import type { RepoQuery } from "../server/query"; import { EntityRelation, type KyselyJsonFrom, type KyselyQueryBuilder } from "./EntityRelation"; import { EntityRelationAnchor } from "./EntityRelationAnchor"; import { type RelationType, RelationTypes } from "./relation-types"; -import { s } from "bknd/utils"; -import type { PrimaryFieldType } from "bknd"; +import { s } from "userbase/utils"; +import type { PrimaryFieldType } from "userbase"; export type PolymorphicRelationConfig = s.Static; diff --git a/app/src/data/relations/RelationField.ts b/app/src/data/relations/RelationField.ts index ee1359e5..7f9e9798 100644 --- a/app/src/data/relations/RelationField.ts +++ b/app/src/data/relations/RelationField.ts @@ -3,7 +3,7 @@ import { Field, baseFieldConfigSchema } from "../fields"; import type { EntityRelation } from "./EntityRelation"; import type { EntityRelationAnchor } from "./EntityRelationAnchor"; import type { TFieldTSType } from "data/entities/EntityTypescript"; -import { s } from "bknd/utils"; +import { s } from "userbase/utils"; import { DEFAULT_RELATION_CASCADE, RelationCascades, type RelationCascade } from "./relation-types"; export const relationFieldConfigSchema = s.strictObject({ diff --git a/app/src/data/relations/RelationMutator.ts b/app/src/data/relations/RelationMutator.ts index 48bfb538..fab52640 100644 --- a/app/src/data/relations/RelationMutator.ts +++ b/app/src/data/relations/RelationMutator.ts @@ -1,4 +1,4 @@ -import type { PrimaryFieldType } from "bknd"; +import type { PrimaryFieldType } from "userbase"; import type { Entity, EntityManager } from "../entities"; import { type EntityRelation, diff --git a/app/src/data/schema/SchemaManager.ts b/app/src/data/schema/SchemaManager.ts index e10bc7cd..033803fd 100644 --- a/app/src/data/schema/SchemaManager.ts +++ b/app/src/data/schema/SchemaManager.ts @@ -2,7 +2,7 @@ import type { CompiledQuery, TableMetadata } from "kysely"; import type { IndexMetadata, SchemaResponse } from "data/connection/Connection"; import type { Entity, EntityManager } from "data/entities"; import { PrimaryField } from "data/fields"; -import { $console } from "bknd/utils"; +import { $console } from "userbase/utils"; type IntrospectedTable = TableMetadata & { indices: IndexMetadata[]; @@ -41,7 +41,7 @@ type ColumnDiff = { * @todo: add modified fields * @todo: add drop tables * - * @todo: change exclude tables to startWith, then add "bknd_" tables + * @todo: change exclude tables to startWith, then add "userbase_" tables */ export class SchemaManager { @@ -116,7 +116,7 @@ export class SchemaManager { // @todo: add drop tables (beware, there a system tables!) introspection .filter((table) => { - if (/bknd/.test(table.name) || table.isView) { + if (/userbase/.test(table.name) || table.isView) { return false; } return !entityStates.map((e) => e.name).includes(table.name); diff --git a/app/src/data/schema/constructor.ts b/app/src/data/schema/constructor.ts index 98cc2fa5..b893acbb 100644 --- a/app/src/data/schema/constructor.ts +++ b/app/src/data/schema/constructor.ts @@ -1,4 +1,4 @@ -import { transformObject } from "bknd/utils"; +import { transformObject } from "userbase/utils"; import { Entity } from "data/entities"; import type { Field } from "data/fields"; import { FIELDS, RELATIONS, type TAppDataEntity, type TAppDataRelation } from "data/data-schema"; diff --git a/app/src/data/server/query.spec.ts b/app/src/data/server/query.spec.ts index 8a336b52..459679b9 100644 --- a/app/src/data/server/query.spec.ts +++ b/app/src/data/server/query.spec.ts @@ -1,6 +1,6 @@ import { test, describe, expect, beforeAll, afterAll } from "bun:test"; import * as q from "./query"; -import { parse as $parse, type ParseOptions } from "bknd/utils"; +import { parse as $parse, type ParseOptions } from "userbase/utils"; import type { PrimaryFieldType } from "modules"; import type { Generated } from "kysely"; import { disableConsoleLog, enableConsoleLog } from "core/utils/test"; diff --git a/app/src/data/server/query.ts b/app/src/data/server/query.ts index 9a01e2a8..26f13033 100644 --- a/app/src/data/server/query.ts +++ b/app/src/data/server/query.ts @@ -1,4 +1,4 @@ -import { s, isObject, $console } from "bknd/utils"; +import { s, isObject, $console } from "userbase/utils"; import { WhereBuilder, type WhereQuery } from "data/entities/query/WhereBuilder"; // ------- diff --git a/app/src/flows/AppFlows.ts b/app/src/flows/AppFlows.ts index eec33658..15fee83d 100644 --- a/app/src/flows/AppFlows.ts +++ b/app/src/flows/AppFlows.ts @@ -2,7 +2,7 @@ import { Flow, HttpTrigger } from "flows"; import { Hono } from "hono"; import { Module } from "modules/Module"; import { TASKS, flowsConfigSchema } from "./flows-schema"; -import { type s, transformObject } from "bknd/utils"; +import { type s, transformObject } from "userbase/utils"; export type AppFlowsSchema = s.Static; export type TAppFlowSchema = AppFlowsSchema["flows"][number]; diff --git a/app/src/flows/flows-schema.ts b/app/src/flows/flows-schema.ts index 5d897c8c..cded3016 100644 --- a/app/src/flows/flows-schema.ts +++ b/app/src/flows/flows-schema.ts @@ -1,4 +1,4 @@ -import { transformObject, s } from "bknd/utils"; +import { transformObject, s } from "userbase/utils"; import { TaskMap, TriggerMap } from "flows"; export const TASKS = { diff --git a/app/src/flows/flows/Execution.ts b/app/src/flows/flows/Execution.ts index 7c8ef86d..a760b423 100644 --- a/app/src/flows/flows/Execution.ts +++ b/app/src/flows/flows/Execution.ts @@ -2,7 +2,7 @@ import { Event, EventManager, type ListenerHandler } from "core/events"; import type { EmitsEvents } from "core/events"; import type { Task, TaskResult } from "../tasks/Task"; import type { Flow } from "./Flow"; -import { $console } from "bknd/utils"; +import { $console } from "userbase/utils"; export type TaskLog = TaskResult & { task: Task; diff --git a/app/src/flows/flows/Flow.ts b/app/src/flows/flows/Flow.ts index 2a1821a7..b2d90c2d 100644 --- a/app/src/flows/flows/Flow.ts +++ b/app/src/flows/flows/Flow.ts @@ -1,4 +1,4 @@ -import { $console, transformObject } from "bknd/utils"; +import { $console, transformObject } from "userbase/utils"; import { type TaskMapType, TriggerMap } from "../index"; import type { Task } from "../tasks/Task"; import { Condition, TaskConnection } from "../tasks/TaskConnection"; diff --git a/app/src/flows/flows/executors/RuntimeExecutor.ts b/app/src/flows/flows/executors/RuntimeExecutor.ts index 65888c77..85e43e8b 100644 --- a/app/src/flows/flows/executors/RuntimeExecutor.ts +++ b/app/src/flows/flows/executors/RuntimeExecutor.ts @@ -1,5 +1,5 @@ import type { Task } from "../../tasks/Task"; -import { $console } from "bknd/utils"; +import { $console } from "userbase/utils"; export class RuntimeExecutor { async run( diff --git a/app/src/flows/flows/triggers/EventTrigger.ts b/app/src/flows/flows/triggers/EventTrigger.ts index d1e5b828..36f1cb2d 100644 --- a/app/src/flows/flows/triggers/EventTrigger.ts +++ b/app/src/flows/flows/triggers/EventTrigger.ts @@ -1,7 +1,7 @@ import type { EventManager } from "core/events"; import type { Flow } from "../Flow"; import { Trigger } from "./Trigger"; -import { $console, s } from "bknd/utils"; +import { $console, s } from "userbase/utils"; export class EventTrigger extends Trigger { override type = "event"; diff --git a/app/src/flows/flows/triggers/HttpTrigger.ts b/app/src/flows/flows/triggers/HttpTrigger.ts index e263682d..8f4ab02d 100644 --- a/app/src/flows/flows/triggers/HttpTrigger.ts +++ b/app/src/flows/flows/triggers/HttpTrigger.ts @@ -1,7 +1,7 @@ import type { Context, Hono } from "hono"; import type { Flow } from "../Flow"; import { Trigger } from "./Trigger"; -import { s } from "bknd/utils"; +import { s } from "userbase/utils"; const httpMethods = ["GET", "POST", "PUT", "PATCH", "DELETE"] as const; diff --git a/app/src/flows/flows/triggers/Trigger.ts b/app/src/flows/flows/triggers/Trigger.ts index bd830321..52671e54 100644 --- a/app/src/flows/flows/triggers/Trigger.ts +++ b/app/src/flows/flows/triggers/Trigger.ts @@ -1,6 +1,6 @@ import type { Execution } from "../Execution"; import type { Flow } from "../Flow"; -import { s, parse } from "bknd/utils"; +import { s, parse } from "userbase/utils"; export class Trigger { // @todo: remove this diff --git a/app/src/flows/tasks/Task.tsx b/app/src/flows/tasks/Task.tsx index e72458b0..796ecbd6 100644 --- a/app/src/flows/tasks/Task.tsx +++ b/app/src/flows/tasks/Task.tsx @@ -1,7 +1,7 @@ -//import { BkndError, SimpleRenderer } from "core"; -import { BkndError } from "core/errors"; +//import { UserbaseError, SimpleRenderer } from "core"; +import { UserbaseError } from "core/errors"; -import { s, parse } from "bknd/utils"; +import { s, parse } from "userbase/utils"; import type { InputsMap } from "../flows/Execution"; import { SimpleRenderer } from "core/template/SimpleRenderer"; @@ -116,9 +116,9 @@ export abstract class Task try { newParams[key] = await renderer.render(value as string); } catch (e: any) { - // wrap in bknd error for better error display - if (!(e instanceof BkndError)) { - throw new BkndError( + // wrap in userbase error for better error display + if (!(e instanceof UserbaseError)) { + throw new UserbaseError( "Failed to resolve param", { key, @@ -176,7 +176,7 @@ export abstract class Task } catch (e: any) { success = false; - if (e instanceof BkndError) { + if (e instanceof UserbaseError) { error = e.toJSON(); } else { error = { @@ -190,7 +190,7 @@ export abstract class Task } protected error(message: string, details?: Record) { - return new BkndError(message, details, "runtime"); + return new UserbaseError(message, details, "runtime"); } abstract execute(inputs: Map): Promise; diff --git a/app/src/flows/tasks/TaskConnection.ts b/app/src/flows/tasks/TaskConnection.ts index d44b3f93..c61331ec 100644 --- a/app/src/flows/tasks/TaskConnection.ts +++ b/app/src/flows/tasks/TaskConnection.ts @@ -1,4 +1,4 @@ -import { objectCleanEmpty, uuid } from "bknd/utils"; +import { objectCleanEmpty, uuid } from "userbase/utils"; import { get } from "lodash-es"; import type { Task, TaskResult } from "./Task"; diff --git a/app/src/flows/tasks/presets/FetchTask.ts b/app/src/flows/tasks/presets/FetchTask.ts index 251d7d55..b187fc01 100644 --- a/app/src/flows/tasks/presets/FetchTask.ts +++ b/app/src/flows/tasks/presets/FetchTask.ts @@ -1,5 +1,5 @@ import { Task, dynamic } from "../Task"; -import { s } from "bknd/utils"; +import { s } from "userbase/utils"; const FetchMethods = ["GET", "POST", "PUT", "PATCH", "DELETE"]; diff --git a/app/src/flows/tasks/presets/LogTask.ts b/app/src/flows/tasks/presets/LogTask.ts index 05fc9f94..a7171091 100644 --- a/app/src/flows/tasks/presets/LogTask.ts +++ b/app/src/flows/tasks/presets/LogTask.ts @@ -1,5 +1,5 @@ import { Task } from "../Task"; -import { $console, s } from "bknd/utils"; +import { $console, s } from "userbase/utils"; export class LogTask extends Task { type = "log"; diff --git a/app/src/flows/tasks/presets/RenderTask.ts b/app/src/flows/tasks/presets/RenderTask.ts index fe2ed648..54891cf2 100644 --- a/app/src/flows/tasks/presets/RenderTask.ts +++ b/app/src/flows/tasks/presets/RenderTask.ts @@ -1,5 +1,5 @@ import { Task } from "../Task"; -import { s } from "bknd/utils"; +import { s } from "userbase/utils"; export class RenderTask> extends Task< typeof RenderTask.schema, diff --git a/app/src/flows/tasks/presets/SubFlowTask.ts b/app/src/flows/tasks/presets/SubFlowTask.ts index 1526d691..261d6199 100644 --- a/app/src/flows/tasks/presets/SubFlowTask.ts +++ b/app/src/flows/tasks/presets/SubFlowTask.ts @@ -1,6 +1,6 @@ import { Flow } from "../../flows/Flow"; import { Task, dynamic } from "../Task"; -import { s } from "bknd/utils"; +import { s } from "userbase/utils"; export class SubFlowTask> extends Task< typeof SubFlowTask.schema, diff --git a/app/src/index.ts b/app/src/index.ts index c158502e..6871493d 100644 --- a/app/src/index.ts +++ b/app/src/index.ts @@ -32,7 +32,7 @@ export { export type * from "modules/ModuleApi"; export type { ServerEnv } from "modules/Controller"; -export type { BkndConfig } from "bknd/adapter"; +export type { UserbaseConfig } from "userbase/adapter"; export * as middlewares from "modules/middlewares"; export { registries } from "modules/registries"; @@ -42,7 +42,7 @@ export { getSystemMcp } from "modules/mcp/system-mcp"; * Core */ export type { MaybePromise, Merge } from "core/types"; -export { Exception, BkndError } from "core/errors"; +export { Exception, UserbaseError } from "core/errors"; export { isDebug, env } from "core/env"; export { type PrimaryFieldType, config, type DB, type AppEntity } from "core/config"; export { Permission } from "auth/authorize/Permission"; diff --git a/app/src/media/AppMedia.ts b/app/src/media/AppMedia.ts index ff2caddb..0dbc17c3 100644 --- a/app/src/media/AppMedia.ts +++ b/app/src/media/AppMedia.ts @@ -1,5 +1,5 @@ -import type { AppEntity, FileUploadedEventData, StorageAdapter } from "bknd"; -import { $console } from "bknd/utils"; +import type { AppEntity, FileUploadedEventData, StorageAdapter } from "userbase"; +import { $console } from "userbase/utils"; import type { Entity, EntityManager } from "data/entities"; import { Storage } from "media/storage/Storage"; import { Module } from "modules/Module"; @@ -12,7 +12,7 @@ import * as DatabaseEvents from "data/events"; export type MediaFields = typeof AppMedia.mediaFields; export type MediaFieldSchema = FieldSchema; -declare module "bknd" { +declare module "userbase" { interface Media extends AppEntity, MediaFieldSchema {} interface DB { media: Media; diff --git a/app/src/media/MediaField.ts b/app/src/media/MediaField.ts index 6ff8cd39..18e4d935 100644 --- a/app/src/media/MediaField.ts +++ b/app/src/media/MediaField.ts @@ -1,5 +1,5 @@ import { Field, baseFieldConfigSchema } from "data/fields"; -import { s } from "bknd/utils"; +import { s } from "userbase/utils"; export const mediaFieldConfigSchema = s .strictObject({ diff --git a/app/src/media/api/MediaApi.ts b/app/src/media/api/MediaApi.ts index 5f537711..8aff6884 100644 --- a/app/src/media/api/MediaApi.ts +++ b/app/src/media/api/MediaApi.ts @@ -8,7 +8,7 @@ import { type TInput, } from "modules/ModuleApi"; import type { ApiFetcher } from "Api"; -import type { DB, FileUploadedEventData } from "bknd"; +import type { DB, FileUploadedEventData } from "userbase"; export type MediaApiOptions = BaseModuleApiOptions & { upload_fetcher: ApiFetcher; diff --git a/app/src/media/api/MediaController.ts b/app/src/media/api/MediaController.ts index 0523b6ac..0d04c4db 100644 --- a/app/src/media/api/MediaController.ts +++ b/app/src/media/api/MediaController.ts @@ -6,7 +6,7 @@ import type { AppMedia } from "../AppMedia"; import { MediaField } from "../MediaField"; import * as MediaPermissions from "media/media-permissions"; import * as StorageEvents from "media/storage/events"; -import { jsc, s, describeRoute, HttpStatus, getFileFromContext } from "bknd/utils"; +import { jsc, s, describeRoute, HttpStatus, getFileFromContext } from "userbase/utils"; import { getRandomizedFilename } from "media/utils"; export class MediaController extends Controller { diff --git a/app/src/media/media-registry.ts b/app/src/media/media-registry.ts index 483652d1..7be7668f 100644 --- a/app/src/media/media-registry.ts +++ b/app/src/media/media-registry.ts @@ -1,6 +1,6 @@ import { type Constructor, Registry } from "core/registry/Registry"; import type { StorageAdapter } from "./storage/StorageAdapter"; -import type { s } from "bknd/utils"; +import type { s } from "userbase/utils"; import { StorageS3Adapter } from "./storage/adapters/s3/StorageS3Adapter"; import { StorageCloudinaryAdapter } from "./storage/adapters/cloudinary/StorageCloudinaryAdapter"; diff --git a/app/src/media/media-schema.ts b/app/src/media/media-schema.ts index eaa2b8d5..0dd14859 100644 --- a/app/src/media/media-schema.ts +++ b/app/src/media/media-schema.ts @@ -1,6 +1,6 @@ import { MediaAdapters } from "media/media-registry"; import { registries } from "modules/registries"; -import { s, objectTransform } from "bknd/utils"; +import { s, objectTransform } from "userbase/utils"; import { $object, $record, $schema } from "modules/mcp"; export const ADAPTERS = { diff --git a/app/src/media/storage/Storage.ts b/app/src/media/storage/Storage.ts index 1d11b1d5..beb56303 100644 --- a/app/src/media/storage/Storage.ts +++ b/app/src/media/storage/Storage.ts @@ -1,5 +1,5 @@ import { type EmitsEvents, EventManager } from "core/events"; -import { $console, isFile, detectImageDimensions } from "bknd/utils"; +import { $console, isFile, detectImageDimensions } from "userbase/utils"; import { isMimeType } from "media/storage/mime-types-tiny"; import * as StorageEvents from "./events"; import type { FileUploadedEventData } from "./events"; diff --git a/app/src/media/storage/StorageAdapter.ts b/app/src/media/storage/StorageAdapter.ts index ee00c670..115afd52 100644 --- a/app/src/media/storage/StorageAdapter.ts +++ b/app/src/media/storage/StorageAdapter.ts @@ -1,7 +1,7 @@ import type { FileListObject, FileMeta, FileBody, FileUploadPayload } from "media/storage/Storage"; -import type { s } from "bknd/utils"; +import type { s } from "userbase/utils"; -const SYMBOL = Symbol.for("bknd:storage"); +const SYMBOL = Symbol.for("userbase:storage"); export abstract class StorageAdapter { constructor() { diff --git a/app/src/media/storage/adapters/adapter-test-suite.ts b/app/src/media/storage/adapters/adapter-test-suite.ts index 562367fe..2a720ae3 100644 --- a/app/src/media/storage/adapters/adapter-test-suite.ts +++ b/app/src/media/storage/adapters/adapter-test-suite.ts @@ -1,6 +1,6 @@ import { retry, type TestRunner } from "core/test"; import type { StorageAdapter } from "media/storage/StorageAdapter"; -import { randomString } from "bknd/utils"; +import { randomString } from "userbase/utils"; import type { BunFile } from "bun"; export async function adapterTestSuite( diff --git a/app/src/media/storage/adapters/cloudinary/StorageCloudinaryAdapter.ts b/app/src/media/storage/adapters/cloudinary/StorageCloudinaryAdapter.ts index 490047b7..fcb4ccea 100644 --- a/app/src/media/storage/adapters/cloudinary/StorageCloudinaryAdapter.ts +++ b/app/src/media/storage/adapters/cloudinary/StorageCloudinaryAdapter.ts @@ -1,4 +1,4 @@ -import { hash, pickHeaders, s, parse, secret } from "bknd/utils"; +import { hash, pickHeaders, s, parse, secret } from "userbase/utils"; import type { FileBody, FileListObject, FileMeta } from "../../Storage"; import { StorageAdapter } from "../../StorageAdapter"; diff --git a/app/src/media/storage/adapters/s3/StorageS3Adapter.ts b/app/src/media/storage/adapters/s3/StorageS3Adapter.ts index c36e0e3f..0f83547a 100644 --- a/app/src/media/storage/adapters/s3/StorageS3Adapter.ts +++ b/app/src/media/storage/adapters/s3/StorageS3Adapter.ts @@ -8,7 +8,7 @@ import type { } from "@aws-sdk/client-s3"; import { AwsClient } from "core/clients/aws/AwsClient"; import { isDebug } from "core/env"; -import { isFile, pickHeaders2, parse, s, secret } from "bknd/utils"; +import { isFile, pickHeaders2, parse, s, secret } from "userbase/utils"; import { transform } from "lodash-es"; import type { FileBody, FileListObject } from "../../Storage"; import { StorageAdapter } from "../../StorageAdapter"; diff --git a/app/src/media/utils/index.ts b/app/src/media/utils/index.ts index 61f48f21..7e416f90 100644 --- a/app/src/media/utils/index.ts +++ b/app/src/media/utils/index.ts @@ -1,4 +1,4 @@ -import { isFile, randomString } from "bknd/utils"; +import { isFile, randomString } from "userbase/utils"; import { extension } from "media/storage/mime-types-tiny"; export function getExtensionFromName(filename: string): string | undefined { diff --git a/app/src/modes/code.ts b/app/src/modes/code.ts index 6c147a3e..b6bb8454 100644 --- a/app/src/modes/code.ts +++ b/app/src/modes/code.ts @@ -1,19 +1,19 @@ -import type { BkndConfig } from "bknd/adapter"; -import { makeModeConfig, type BkndModeConfig } from "./shared"; -import { $console } from "bknd/utils"; +import type { UserbaseConfig } from "userbase/adapter"; +import { makeModeConfig, type UserbaseModeConfig } from "./shared"; +import { $console } from "userbase/utils"; -export type BkndCodeModeConfig = BkndModeConfig; +export type UserbaseCodeModeConfig = UserbaseModeConfig; -export type CodeMode = AdapterConfig extends BkndConfig< +export type CodeMode = AdapterConfig extends UserbaseConfig< infer Args > - ? BkndModeConfig + ? UserbaseModeConfig : never; export function code< - Config extends BkndConfig, - Args = Config extends BkndConfig ? A : unknown, ->(codeConfig: CodeMode): BkndConfig { + Config extends UserbaseConfig, + Args = Config extends UserbaseConfig ? A : unknown, +>(codeConfig: CodeMode): UserbaseConfig { return { ...codeConfig, app: async (args) => { diff --git a/app/src/modes/hybrid.ts b/app/src/modes/hybrid.ts index 40fca8c0..8248821c 100644 --- a/app/src/modes/hybrid.ts +++ b/app/src/modes/hybrid.ts @@ -1,10 +1,10 @@ -import type { BkndConfig } from "bknd/adapter"; -import { makeModeConfig, type BkndModeConfig } from "./shared"; -import { getDefaultConfig, type MaybePromise, type Merge } from "bknd"; +import type { UserbaseConfig } from "userbase/adapter"; +import { makeModeConfig, type UserbaseModeConfig } from "./shared"; +import { getDefaultConfig, type MaybePromise, type Merge } from "userbase"; import type { DbModuleManager } from "modules/db/DbModuleManager"; -import { invariant, $console } from "bknd/utils"; +import { invariant, $console } from "userbase/utils"; -export type BkndHybridModeOptions = { +export type UserbaseHybridModeOptions = { /** * Reader function to read the configuration from the file system. * This is required for hybrid mode to work. @@ -16,17 +16,17 @@ export type BkndHybridModeOptions = { secrets?: Record; }; -export type HybridBkndConfig = BkndModeConfig; -export type HybridMode = AdapterConfig extends BkndConfig< +export type HybridUserbaseConfig = UserbaseModeConfig; +export type HybridMode = AdapterConfig extends UserbaseConfig< infer Args > - ? BkndModeConfig> + ? UserbaseModeConfig> : never; export function hybrid< - Config extends BkndConfig, - Args = Config extends BkndConfig ? A : unknown, ->(hybridConfig: HybridMode): BkndConfig { + Config extends UserbaseConfig, + Args = Config extends UserbaseConfig ? A : unknown, +>(hybridConfig: HybridMode): UserbaseConfig { return { ...hybridConfig, app: async (args) => { @@ -37,7 +37,7 @@ export function hybrid< syncSchemaOptions, } = await makeModeConfig(hybridConfig, args); - const configFilePath = appConfig.configFilePath ?? "bknd-config.json"; + const configFilePath = appConfig.configFilePath ?? "userbase-config.json"; if (appConfig?.options?.mode && appConfig?.options?.mode !== "db") { $console.warn("You should not set a different mode than `db` when using hybrid mode"); diff --git a/app/src/modes/shared.ts b/app/src/modes/shared.ts index 6b226c2d..381b1873 100644 --- a/app/src/modes/shared.ts +++ b/app/src/modes/shared.ts @@ -1,9 +1,9 @@ -import type { AppPlugin, BkndConfig, MaybePromise, Merge } from "bknd"; -import { syncTypes, syncConfig } from "bknd/plugins"; +import type { AppPlugin, UserbaseConfig, MaybePromise, Merge } from "userbase"; +import { syncTypes, syncConfig } from "userbase/plugins"; import { syncSecrets } from "plugins/dev/sync-secrets.plugin"; -import { $console } from "bknd/utils"; +import { $console } from "userbase/utils"; -export type BkndModeOptions = { +export type UserbaseModeOptions = { /** * Whether the application is running in production. */ @@ -18,7 +18,7 @@ export type BkndModeOptions = { configFilePath?: string; /** * Types file path - * @default "bknd-types.d.ts" + * @default "userbase-types.d.ts" */ typesFilePath?: string; /** @@ -51,9 +51,9 @@ export type BkndModeOptions = { syncSchema?: boolean | { force?: boolean; drop?: boolean }; }; -export type BkndModeConfig = BkndConfig< +export type UserbaseModeConfig = UserbaseConfig< Args, - Merge + Merge >; function _isProd() { @@ -66,7 +66,7 @@ function _isProd() { export async function makeModeConfig< Args = any, - Config extends BkndModeConfig = BkndModeConfig, + Config extends UserbaseModeConfig = UserbaseModeConfig, >({ app, ..._config }: Config, args: Args) { const appConfig = typeof app === "function" ? await app(args) : app; @@ -99,7 +99,7 @@ export async function makeModeConfig< if (!isProd) { if (typesFilePath) { - if (plugins.some((p) => p.name === "bknd-sync-types")) { + if (plugins.some((p) => p.name === "userbase-sync-types")) { throw new Error("You have to unregister the `syncTypes` plugin"); } needsWriter = true; @@ -119,7 +119,7 @@ export async function makeModeConfig< } if (configFilePath) { - if (plugins.some((p) => p.name === "bknd-sync-config")) { + if (plugins.some((p) => p.name === "userbase-sync-config")) { throw new Error("You have to unregister the `syncConfig` plugin"); } needsWriter = true; @@ -139,7 +139,7 @@ export async function makeModeConfig< } if (syncSecretsOptions && syncSecretsOptions.enabled !== false) { - if (plugins.some((p) => p.name === "bknd-sync-secrets")) { + if (plugins.some((p) => p.name === "userbase-sync-secrets")) { throw new Error("You have to unregister the `syncSecrets` plugin"); } diff --git a/app/src/modules/Controller.ts b/app/src/modules/Controller.ts index fdda0958..f3601f0f 100644 --- a/app/src/modules/Controller.ts +++ b/app/src/modules/Controller.ts @@ -1,8 +1,8 @@ -import type { App, Permission, SafeUser } from "bknd"; +import type { App, Permission, SafeUser } from "userbase"; import { type Context, type Env, Hono } from "hono"; import * as middlewares from "modules/middlewares"; import type { EntityManager } from "data/entities"; -import { s } from "bknd/utils"; +import { s } from "userbase/utils"; export interface ServerEnv extends Env { Variables: { diff --git a/app/src/modules/Module.ts b/app/src/modules/Module.ts index f402e044..fef6199d 100644 --- a/app/src/modules/Module.ts +++ b/app/src/modules/Module.ts @@ -1,4 +1,4 @@ -import type { App } from "bknd"; +import type { App } from "userbase"; import type { EventManager } from "core/events"; import type { Connection } from "data/connection"; import type { EntityManager } from "data/entities"; @@ -7,7 +7,7 @@ import type { ServerEnv } from "modules/Controller"; import type { ModuleHelper } from "./ModuleHelper"; import { SchemaObject } from "core/object/SchemaObject"; import type { Guard } from "auth/authorize/Guard"; -import type { McpServer, DebugLogger } from "bknd/utils"; +import type { McpServer, DebugLogger } from "userbase/utils"; type PartialRec = { [P in keyof T]?: PartialRec }; diff --git a/app/src/modules/ModuleApi.ts b/app/src/modules/ModuleApi.ts index 9b9ebb7c..f6cc2664 100644 --- a/app/src/modules/ModuleApi.ts +++ b/app/src/modules/ModuleApi.ts @@ -1,5 +1,5 @@ -import type { PrimaryFieldType } from "bknd"; -import { $console, isPlainObject, encodeSearch } from "bknd/utils"; +import type { PrimaryFieldType } from "userbase"; +import { $console, isPlainObject, encodeSearch } from "userbase/utils"; import { isDebug } from "core/env"; import type { ApiFetcher } from "Api"; diff --git a/app/src/modules/ModuleHelper.ts b/app/src/modules/ModuleHelper.ts index c227ba1d..881fffd9 100644 --- a/app/src/modules/ModuleHelper.ts +++ b/app/src/modules/ModuleHelper.ts @@ -7,7 +7,7 @@ import type { ModuleBuildContext, ModuleBuildContextMcpContext } from "./Module" import type { EntityRelation } from "data/relations"; import type { Permission, PermissionContext } from "auth/authorize/Permission"; import { Exception } from "core/errors"; -import { invariant, isPlainObject } from "bknd/utils"; +import { invariant, isPlainObject } from "userbase/utils"; export class ModuleHelper { constructor(protected ctx: Omit) {} diff --git a/app/src/modules/ModuleManager.ts b/app/src/modules/ModuleManager.ts index f52b2a14..e7a6651d 100644 --- a/app/src/modules/ModuleManager.ts +++ b/app/src/modules/ModuleManager.ts @@ -7,7 +7,7 @@ import { setPath, mark, $console, -} from "bknd/utils"; +} from "userbase/utils"; import { DebugLogger } from "core/utils/DebugLogger"; import { Guard } from "auth/authorize/Guard"; import { env } from "core/env"; diff --git a/app/src/modules/db/DbModuleManager.ts b/app/src/modules/db/DbModuleManager.ts index 51e78ff2..53460b78 100644 --- a/app/src/modules/db/DbModuleManager.ts +++ b/app/src/modules/db/DbModuleManager.ts @@ -1,5 +1,5 @@ -import { mark, stripMark, $console, s, setPath } from "bknd/utils"; -import { BkndError } from "core/errors"; +import { mark, stripMark, $console, s, setPath } from "userbase/utils"; +import { UserbaseError } from "core/errors"; import * as $diff from "core/object/diff"; import type { Connection } from "data/connection"; import type { EntityManager } from "data/entities/EntityManager"; @@ -44,26 +44,26 @@ const configJsonSchema = s.anyOf([ }), ), ]); -export const __bknd = proto.entity(TABLE_NAME, { +export const __userbase = proto.entity(TABLE_NAME, { version: proto.number().required(), type: proto.enumm({ enum: ["config", "diff", "backup", "secrets"] }).required(), json: proto.jsonSchema({ schema: configJsonSchema.toJSON() }).required(), created_at: proto.datetime(), updated_at: proto.datetime(), }); -const __schema = proto.em({ __bknd }, ({ index }, { __bknd }) => { - index(__bknd).on(["version", "type"]); +const __schema = proto.em({ __userbase }, ({ index }, { __userbase }) => { + index(__userbase).on(["version", "type"]); }); -type ConfigTable2 = proto.Schema; +type ConfigTable2 = proto.Schema; interface T_INTERNAL_EM { - __bknd: ConfigTable2; + __userbase: ConfigTable2; } // @todo: cleanup old diffs on upgrade // @todo: cleanup multiple backups on upgrade export class DbModuleManager extends ModuleManager { - // internal em for __bknd config table + // internal em for __userbase config table __em!: EntityManager; private _version: number = 0; @@ -115,7 +115,7 @@ export class DbModuleManager extends ModuleManager { } private repo() { - return this.__em.repo(__bknd, { + return this.__em.repo(__userbase, { // to prevent exceptions when table doesn't exist silent: true, // disable counts for performance and compatibility @@ -124,7 +124,7 @@ export class DbModuleManager extends ModuleManager { } private mutator() { - return this.__em.mutator(__bknd); + return this.__em.mutator(__userbase); } private get db() { @@ -183,7 +183,7 @@ export class DbModuleManager extends ModuleManager { try { const state = await this.fetch(); - if (!state || !state.configs) throw new BkndError("no config found"); + if (!state || !state.configs) throw new UserbaseError("no config found"); this.logger.log("fetched version", state.configs.version); if (state.configs.version !== version) { @@ -271,7 +271,7 @@ export class DbModuleManager extends ModuleManager { } } } catch (e) { - if (e instanceof BkndError && e.message === "no config found") { + if (e instanceof UserbaseError && e.message === "no config found") { this.logger.log("no config, just save fresh"); // no config, just save await this.mutator().insertOne({ diff --git a/app/src/modules/db/migrations.ts b/app/src/modules/db/migrations.ts index e97071b4..80430a92 100644 --- a/app/src/modules/db/migrations.ts +++ b/app/src/modules/db/migrations.ts @@ -1,4 +1,4 @@ -import { transformObject } from "bknd/utils"; +import { transformObject } from "userbase/utils"; import type { Kysely } from "kysely"; import { set } from "lodash-es"; import type { InitialModuleConfigs } from "modules/ModuleManager"; @@ -134,7 +134,7 @@ export const migrations: Migration[] = [ ]; export const CURRENT_VERSION = migrations[migrations.length - 1]?.version ?? 0; -export const TABLE_NAME = "__bknd"; +export const TABLE_NAME = "__userbase"; export async function migrateTo( current: number, diff --git a/app/src/modules/mcp/$object.ts b/app/src/modules/mcp/$object.ts index f5fa6b4d..ed333889 100644 --- a/app/src/modules/mcp/$object.ts +++ b/app/src/modules/mcp/$object.ts @@ -1,4 +1,4 @@ -import { Tool, getPath, limitObjectDepth, s } from "bknd/utils"; +import { Tool, getPath, limitObjectDepth, s } from "userbase/utils"; import { McpSchemaHelper, mcpSchemaSymbol, diff --git a/app/src/modules/mcp/$record.ts b/app/src/modules/mcp/$record.ts index fc6dfaa3..7f74eacc 100644 --- a/app/src/modules/mcp/$record.ts +++ b/app/src/modules/mcp/$record.ts @@ -1,4 +1,4 @@ -import { getPath, s, Tool } from "bknd/utils"; +import { getPath, s, Tool } from "userbase/utils"; import { McpSchemaHelper, mcpSchemaSymbol, @@ -18,7 +18,7 @@ export interface RecordToolSchemaOptions extends s.IRecordOptions, SchemaWithMcpOptions {} -const opts = Symbol.for("bknd-mcp-record-opts"); +const opts = Symbol.for("userbase-mcp-record-opts"); export class RecordToolSchema< AP extends s.Schema, diff --git a/app/src/modules/mcp/$schema.ts b/app/src/modules/mcp/$schema.ts index c71424bd..6cf5612b 100644 --- a/app/src/modules/mcp/$schema.ts +++ b/app/src/modules/mcp/$schema.ts @@ -1,4 +1,4 @@ -import { Tool, getPath, s } from "bknd/utils"; +import { Tool, getPath, s } from "userbase/utils"; import { McpSchemaHelper, mcpSchemaSymbol, diff --git a/app/src/modules/mcp/McpSchemaHelper.ts b/app/src/modules/mcp/McpSchemaHelper.ts index ecb16e49..53ae543b 100644 --- a/app/src/modules/mcp/McpSchemaHelper.ts +++ b/app/src/modules/mcp/McpSchemaHelper.ts @@ -1,4 +1,4 @@ -import type { App } from "bknd"; +import type { App } from "userbase"; import { type Tool, type ToolAnnotation, @@ -7,12 +7,12 @@ import { s, isPlainObject, autoFormatString, -} from "bknd/utils"; +} from "userbase/utils"; import type { ModuleBuildContext } from "modules"; import { excludePropertyTypes, rescursiveClean } from "./utils"; import type { DbModuleManager } from "modules/db/DbModuleManager"; -export const mcpSchemaSymbol = Symbol.for("bknd-mcp-schema"); +export const mcpSchemaSymbol = Symbol.for("userbase-mcp-schema"); export interface McpToolOptions { title?: string; diff --git a/app/src/modules/mcp/system-mcp.ts b/app/src/modules/mcp/system-mcp.ts index deabb4d7..39fb30b2 100644 --- a/app/src/modules/mcp/system-mcp.ts +++ b/app/src/modules/mcp/system-mcp.ts @@ -1,6 +1,6 @@ import type { App } from "App"; import { mcpSchemaSymbol, type McpSchema } from "modules/mcp"; -import { getMcpServer, isObject, s, McpServer } from "bknd/utils"; +import { getMcpServer, isObject, s, McpServer } from "userbase/utils"; import { getVersion } from "core/env"; export function getSystemMcp(app: App) { @@ -29,7 +29,7 @@ export function getSystemMcp(app: App) { return new McpServer( { - name: "bknd", + name: "userbase", version: getVersion(), }, { app, ctx: () => app.modules.ctx() }, diff --git a/app/src/modules/mcp/utils.ts b/app/src/modules/mcp/utils.ts index 1307ea32..7f0d0352 100644 --- a/app/src/modules/mcp/utils.ts +++ b/app/src/modules/mcp/utils.ts @@ -1,4 +1,4 @@ -import { isPlainObject, transformObject, s } from "bknd/utils"; +import { isPlainObject, transformObject, s } from "userbase/utils"; export function rescursiveClean( input: s.Schema, diff --git a/app/src/modules/permissions/index.ts b/app/src/modules/permissions/index.ts index 0a581808..67f79325 100644 --- a/app/src/modules/permissions/index.ts +++ b/app/src/modules/permissions/index.ts @@ -1,5 +1,5 @@ import { Permission } from "auth/authorize/Permission"; -import { s } from "bknd/utils"; +import { s } from "userbase/utils"; export const accessAdmin = new Permission("system.access.admin"); export const accessApi = new Permission("system.access.api"); diff --git a/app/src/modules/server/AdminController.tsx b/app/src/modules/server/AdminController.tsx index 8c12d398..6601215d 100644 --- a/app/src/modules/server/AdminController.tsx +++ b/app/src/modules/server/AdminController.tsx @@ -3,7 +3,7 @@ import type { App } from "App"; import { isDebug } from "core/env"; import { config } from "core/config"; -import { $console } from "bknd/utils"; +import { $console } from "userbase/utils"; import { addFlashMessage } from "core/server/flash"; import { html } from "hono/html"; import { Fragment } from "hono/jsx"; @@ -14,9 +14,9 @@ import type { TApiUser } from "Api"; import type { AppTheme } from "ui/client/use-theme"; import type { Manifest } from "vite"; -const htmlBkndContextReplace = ""; +const htmlUserbaseContextReplace = ""; -export type AdminBkndWindowContext = { +export type AdminUserbaseWindowContext = { user?: TApiUser; logout_route: string; admin_basepath: string; @@ -120,7 +120,7 @@ export class AdminController extends Controller { context: (c) => ({}), }), async (c) => { - const obj: AdminBkndWindowContext = { + const obj: AdminUserbaseWindowContext = { user: c.get("auth")?.user, logout_route: authRoutes.logout, admin_basepath: this.options.adminBasepath.replace(/\/+$/, ""), @@ -171,19 +171,19 @@ export class AdminController extends Controller { return hono; } - private async getHtml(obj: AdminBkndWindowContext) { - const bknd_context = `window.__BKND__ = JSON.parse('${JSON.stringify(obj)}');`; + private async getHtml(obj: AdminUserbaseWindowContext) { + const userbase_context = `window.__BKND__ = JSON.parse('${JSON.stringify(obj)}');`; if (this.options.html) { - if (this.options.html.includes(htmlBkndContextReplace)) { + if (this.options.html.includes(htmlUserbaseContextReplace)) { return this.options.html.replace( - htmlBkndContextReplace, - "", + htmlUserbaseContextReplace, + "", ); } $console.warn( - `Custom HTML needs to include '${htmlBkndContextReplace}' to inject BKND context`, + `Custom HTML needs to include '${htmlUserbaseContextReplace}' to inject BKND context`, ); return this.options.html as string; } @@ -210,7 +210,7 @@ export class AdminController extends Controller { }, }).then((res) => res.json()); } else { - const manifestPath = "bknd/dist/manifest.json"; + const manifestPath = "userbase/dist/manifest.json"; // @ts-ignore manifest = await import(/* @vite-ignore */ manifestPath, { with: { type: "json" }, @@ -283,7 +283,7 @@ export class AdminController extends Controller { -

bknd + SvelteKit Example

+

userbase + SvelteKit Example

Todos