insforge 1.2.10 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +20 -20
- package/.dockerignore +60 -60
- package/.env.example +83 -77
- package/.github/ISSUE_TEMPLATE/bug_report.yml +36 -36
- package/.github/ISSUE_TEMPLATE/config.yml +11 -11
- package/.github/ISSUE_TEMPLATE/feature_request.yml +26 -26
- package/.github/PULL_REQUEST_TEMPLATE.md +7 -7
- package/.github/copilot-instructions.md +146 -146
- package/.github/workflows/build-image.yml +65 -65
- package/.github/workflows/ci-premerge-check.yml +23 -23
- package/.github/workflows/e2e.yml +63 -63
- package/.github/workflows/lint-and-format.yml +32 -32
- package/.prettierignore +64 -64
- package/CHANGELOG.md +44 -44
- package/CLAUDE_PLUGIN.md +104 -104
- package/CODE_OF_CONDUCT.md +128 -128
- package/CONTRIBUTING.md +125 -125
- package/Dockerfile +30 -30
- package/GITHUB_OAUTH_SETUP.md +49 -49
- package/GOOGLE_OAUTH_SETUP.md +148 -148
- package/LICENSE +201 -201
- package/README.md +182 -182
- package/assets/Dark.svg +23 -23
- package/auth/package.json +28 -28
- package/auth/src/lib/broadcastService.ts +117 -115
- package/auth/src/pages/SignInPage.tsx +60 -57
- package/auth/src/pages/SignUpPage.tsx +60 -57
- package/auth/tsconfig.json +32 -32
- package/auth/tsconfig.node.json +11 -11
- package/backend/package.json +78 -75
- package/backend/src/api/routes/ai/index.routes.ts +3 -3
- package/backend/src/api/routes/auth/index.routes.ts +667 -570
- package/backend/src/api/routes/auth/oauth.routes.ts +473 -448
- package/backend/src/api/routes/database/advance.routes.ts +37 -16
- package/backend/src/api/routes/database/index.routes.ts +78 -1
- package/backend/src/api/routes/database/records.routes.ts +10 -10
- package/backend/src/api/routes/database/tables.routes.ts +0 -14
- package/backend/src/api/routes/docs/index.routes.ts +75 -76
- package/backend/src/api/routes/email/index.routes.ts +35 -0
- package/backend/src/api/routes/functions/index.routes.ts +18 -12
- package/backend/src/api/routes/metadata/index.routes.ts +12 -0
- package/backend/src/api/routes/realtime/channels.routes.ts +81 -0
- package/backend/src/api/routes/realtime/index.routes.ts +12 -0
- package/backend/src/api/routes/realtime/messages.routes.ts +48 -0
- package/backend/src/api/routes/realtime/permissions.routes.ts +19 -0
- package/backend/src/api/routes/storage/index.routes.ts +18 -12
- package/backend/src/api/routes/usage/index.routes.ts +6 -4
- package/backend/src/infra/database/database.manager.ts +14 -1
- package/backend/src/infra/database/migrations/000_create-base-tables.sql +141 -141
- package/backend/src/infra/database/migrations/001_create-helper-functions.sql +40 -40
- package/backend/src/infra/database/migrations/002_rename-auth-tables.sql +29 -29
- package/backend/src/infra/database/migrations/003_create-users-table.sql +55 -55
- package/backend/src/infra/database/migrations/004_add-reload-postgrest-func.sql +23 -23
- package/backend/src/infra/database/migrations/005_enable-project-admin-modify-users.sql +29 -29
- package/backend/src/infra/database/migrations/006_modify-ai-usage-table.sql +24 -24
- package/backend/src/infra/database/migrations/007_drop-metadata-table.sql +1 -1
- package/backend/src/infra/database/migrations/008_add-system-tables.sql +76 -76
- package/backend/src/infra/database/migrations/009_add-function-secrets.sql +23 -23
- package/backend/src/infra/database/migrations/010_modify-ai-config-modalities.sql +93 -93
- package/backend/src/infra/database/migrations/011_refactor-secrets-table.sql +15 -15
- package/backend/src/infra/database/migrations/012_add-storage-uploaded-by.sql +7 -7
- package/backend/src/infra/database/migrations/013_create-auth-schema-functions.sql +44 -44
- package/backend/src/infra/database/migrations/014_add-updated-at-trigger-user-table.sql +7 -7
- package/backend/src/infra/database/migrations/015_create-auth-config-and-email-otp-tables.sql +59 -59
- package/backend/src/infra/database/migrations/016_update-auth-config-and-email-otp.sql +24 -24
- package/backend/src/infra/database/migrations/017_create-realtime-schema.sql +233 -0
- package/backend/src/infra/realtime/realtime.manager.ts +246 -0
- package/backend/src/infra/realtime/webhook-sender.ts +82 -0
- package/backend/src/infra/security/token.manager.ts +219 -125
- package/backend/src/infra/socket/socket.manager.ts +198 -64
- package/backend/src/providers/ai/openrouter.provider.ts +12 -9
- package/backend/src/providers/email/base.provider.ts +4 -7
- package/backend/src/providers/email/cloud.provider.ts +84 -0
- package/backend/src/providers/oauth/apple.provider.ts +266 -0
- package/backend/src/providers/oauth/index.ts +1 -0
- package/backend/src/server.ts +317 -284
- package/backend/src/services/ai/ai-model.service.ts +5 -5
- package/backend/src/services/ai/chat-completion.service.ts +4 -4
- package/backend/src/services/ai/image-generation.service.ts +3 -3
- package/backend/src/services/auth/auth.service.ts +14 -0
- package/backend/src/services/database/database-table.service.ts +0 -9
- package/backend/src/services/database/database.service.ts +127 -0
- package/backend/src/services/email/email.service.ts +5 -7
- package/backend/src/services/realtime/index.ts +3 -0
- package/backend/src/services/realtime/realtime-auth.service.ts +104 -0
- package/backend/src/services/realtime/realtime-channel.service.ts +237 -0
- package/backend/src/services/realtime/realtime-message.service.ts +260 -0
- package/backend/src/types/auth.ts +11 -0
- package/backend/src/types/realtime.ts +18 -0
- package/backend/src/types/socket.ts +7 -31
- package/backend/src/utils/cookies.ts +35 -0
- package/backend/src/utils/s3-config-loader.ts +64 -0
- package/backend/src/utils/seed.ts +301 -298
- package/backend/src/utils/sql-parser.ts +90 -0
- package/backend/tests/README.md +133 -133
- package/backend/tests/cleanup-all-test-data.sh +230 -230
- package/backend/tests/cloud/test-s3-multitenant.sh +131 -131
- package/backend/tests/local/comprehensive-curl-tests.sh +155 -155
- package/backend/tests/local/test-ai-config.sh +129 -129
- package/backend/tests/local/test-ai-usage.sh +80 -80
- package/backend/tests/local/test-auth-router.sh +143 -143
- package/backend/tests/local/test-database-router.sh +222 -222
- package/backend/tests/local/test-e2e.sh +240 -240
- package/backend/tests/local/test-fk-errors.sh +96 -96
- package/backend/tests/local/test-functions.sh +123 -123
- package/backend/tests/local/test-id-field.sh +200 -200
- package/backend/tests/local/test-logs.sh +132 -132
- package/backend/tests/local/test-public-bucket.sh +264 -264
- package/backend/tests/local/test-secrets.sh +249 -249
- package/backend/tests/local/test-serverless-functions.sh.disabled +325 -325
- package/backend/tests/local/test-traditional-rest.sh +208 -208
- package/backend/tests/manual/README.md +50 -50
- package/backend/tests/manual/create-large-table-simple.sql +10 -10
- package/backend/tests/manual/seed-large-table.sql +100 -100
- package/backend/tests/manual/setup-large-table-extras.sql +33 -33
- package/backend/tests/manual/test-bulk-upsert.sh +409 -409
- package/backend/tests/manual/test-database-advance.sh +296 -296
- package/backend/tests/manual/test-postgrest-stability.sh +191 -191
- package/backend/tests/manual/test-rawsql-export-import.sh +411 -411
- package/backend/tests/manual/test-rawsql-modes.sh +244 -244
- package/backend/tests/manual/test-universal-storage.sh +263 -263
- package/backend/tests/manual/test-users.sql +17 -17
- package/backend/tests/run-all-tests.sh +139 -139
- package/backend/tests/setup.ts +0 -0
- package/backend/tests/test-config.sh +338 -338
- package/backend/tests/unit/analyze-query.test.ts +697 -0
- package/backend/tsconfig.json +22 -22
- package/claude-plugin/.claude-plugin/plugin.json +24 -24
- package/claude-plugin/README.md +133 -133
- package/claude-plugin/skills/insforge-schema-patterns/SKILL.md +270 -270
- package/docker-compose.prod.yml +204 -200
- package/docker-compose.yml +232 -228
- package/docker-init/db/db-init.sql +97 -97
- package/docker-init/db/jwt.sql +5 -5
- package/docker-init/db/postgresql.conf +16 -16
- package/docker-init/logs/vector.yml +236 -236
- package/docs/README.md +44 -44
- package/docs/agent-docs/real-time.md +269 -0
- package/docs/changelog.mdx +119 -67
- package/docs/core-concepts/ai/architecture.mdx +372 -372
- package/docs/core-concepts/ai/sdk.mdx +213 -213
- package/docs/core-concepts/authentication/architecture.mdx +278 -278
- package/docs/core-concepts/authentication/sdk.mdx +414 -414
- package/docs/core-concepts/authentication/ui-components/customization.mdx +529 -529
- package/docs/core-concepts/authentication/ui-components/nextjs.mdx +221 -221
- package/docs/core-concepts/authentication/ui-components/react-router.mdx +184 -184
- package/docs/core-concepts/authentication/ui-components/react.mdx +129 -129
- package/docs/core-concepts/database/architecture.mdx +255 -255
- package/docs/core-concepts/database/sdk.mdx +382 -382
- package/docs/core-concepts/email/architecture.mdx +101 -0
- package/docs/core-concepts/email/sdk.mdx +53 -0
- package/docs/core-concepts/functions/architecture.mdx +105 -105
- package/docs/core-concepts/functions/sdk.mdx +184 -184
- package/docs/core-concepts/realtime/architecture.mdx +446 -0
- package/docs/core-concepts/realtime/sdk.mdx +409 -0
- package/docs/core-concepts/storage/architecture.mdx +243 -243
- package/docs/core-concepts/storage/sdk.mdx +253 -253
- package/docs/deployment/README.md +94 -94
- package/docs/deployment/deploy-to-aws-ec2.md +564 -564
- package/docs/deployment/deploy-to-azure-virtual-machines.md +312 -312
- package/docs/deployment/deploy-to-google-cloud-compute-engine.md +613 -613
- package/docs/deployment/deploy-to-render.md +441 -441
- package/docs/deprecated/insforge-auth-api.md +214 -214
- package/docs/deprecated/insforge-auth-sdk.md +99 -99
- package/docs/deprecated/insforge-db-api.md +358 -358
- package/docs/deprecated/insforge-db-sdk.md +139 -139
- package/docs/deprecated/insforge-debug-sdk.md +156 -156
- package/docs/deprecated/insforge-debug.md +64 -64
- package/docs/deprecated/insforge-instructions.md +123 -123
- package/docs/deprecated/insforge-project.md +117 -117
- package/docs/deprecated/insforge-storage-api.md +278 -278
- package/docs/deprecated/insforge-storage-sdk.md +158 -158
- package/docs/docs.json +232 -210
- package/docs/examples/framework-guides/nextjs.mdx +131 -131
- package/docs/examples/framework-guides/nuxt.mdx +165 -165
- package/docs/examples/framework-guides/react.mdx +165 -165
- package/docs/examples/framework-guides/svelte.mdx +153 -153
- package/docs/examples/framework-guides/vue.mdx +159 -159
- package/docs/examples/overview.mdx +67 -67
- package/docs/favicon.svg +19 -19
- package/docs/images/changelog/dec-2025/ai-integration.png +0 -0
- package/docs/images/changelog/dec-2025/ai-models.webp +0 -0
- package/docs/images/changelog/dec-2025/alipay-payment.webp +0 -0
- package/docs/images/changelog/dec-2025/apple-login.jpg +0 -0
- package/docs/images/changelog/dec-2025/mcp-installer.png +0 -0
- package/docs/images/changelog/dec-2025/realtime-module.jpg +0 -0
- package/docs/images/icons/ai.svg +4 -4
- package/docs/images/logos/nextjs.svg +4 -4
- package/docs/images/logos/nuxt.svg +4 -4
- package/docs/images/logos/react.svg +5 -5
- package/docs/images/logos/svelte.svg +4 -4
- package/docs/images/logos/vue.svg +5 -5
- package/docs/insforge-instructions-sdk.md +89 -88
- package/docs/introduction.mdx +45 -45
- package/docs/logo/dark.svg +22 -22
- package/docs/logo/light.svg +20 -20
- package/docs/partnership.mdx +651 -646
- package/docs/quickstart.mdx +82 -82
- package/docs/showcase.mdx +52 -52
- package/docs/snippets/sdk-installation.mdx +21 -21
- package/docs/snippets/service-icons.mdx +27 -27
- package/examples/oauth/frontend-oauth-example.html +250 -250
- package/examples/response-examples.md +443 -443
- package/frontend/components.json +17 -17
- package/frontend/package.json +69 -69
- package/frontend/src/assets/icons/checkbox_checked.svg +6 -6
- package/frontend/src/assets/icons/checkbox_undetermined.svg +6 -6
- package/frontend/src/assets/icons/checked.svg +3 -3
- package/frontend/src/assets/icons/connected.svg +3 -3
- package/frontend/src/assets/icons/error.svg +3 -3
- package/frontend/src/assets/icons/loader.svg +9 -9
- package/frontend/src/assets/icons/pencil.svg +4 -4
- package/frontend/src/assets/icons/refresh.svg +4 -4
- package/frontend/src/assets/icons/step_active.svg +3 -3
- package/frontend/src/assets/icons/step_inactive.svg +11 -11
- package/frontend/src/assets/icons/warning.svg +3 -3
- package/frontend/src/assets/logos/apple.svg +3 -3
- package/frontend/src/assets/logos/claude_code.svg +3 -3
- package/frontend/src/assets/logos/cline.svg +6 -6
- package/frontend/src/assets/logos/cursor.svg +20 -20
- package/frontend/src/assets/logos/discord.svg +8 -8
- package/frontend/src/assets/logos/facebook.svg +3 -3
- package/frontend/src/assets/logos/gemini.svg +19 -19
- package/frontend/src/assets/logos/github.svg +5 -5
- package/frontend/src/assets/logos/google.svg +13 -13
- package/frontend/src/assets/logos/grok.svg +10 -10
- package/frontend/src/assets/logos/insforge_dark.svg +15 -15
- package/frontend/src/assets/logos/insforge_light.svg +15 -15
- package/frontend/src/assets/logos/instagram.svg +1 -1
- package/frontend/src/assets/logos/linkedin.svg +3 -3
- package/frontend/src/assets/logos/openai.svg +10 -10
- package/frontend/src/assets/logos/roo_code.svg +9 -9
- package/frontend/src/assets/logos/spotify.svg +16 -16
- package/frontend/src/assets/logos/tiktok.svg +5 -5
- package/frontend/src/assets/logos/trae.svg +3 -3
- package/frontend/src/assets/logos/windsurf.svg +10 -10
- package/frontend/src/assets/logos/x.svg +3 -3
- package/frontend/src/components/layout/AppHeader.tsx +9 -10
- package/frontend/src/features/auth/components/OAuthConfigDialog.tsx +1 -0
- package/frontend/src/features/auth/components/UsersDataGrid.tsx +6 -0
- package/frontend/src/features/auth/helpers.tsx +8 -0
- package/frontend/src/features/auth/{page → pages}/UsersPage.tsx +0 -28
- package/frontend/src/features/database/components/SQLModal.tsx +75 -0
- package/frontend/src/features/database/components/TableForm.tsx +0 -4
- package/frontend/src/features/database/hooks/useDatabase.ts +66 -0
- package/frontend/src/features/database/hooks/useTables.ts +32 -28
- package/frontend/src/features/database/index.ts +1 -0
- package/frontend/src/features/database/{page → pages}/FunctionsPage.tsx +29 -37
- package/frontend/src/features/database/{page → pages}/IndexesPage.tsx +35 -47
- package/frontend/src/features/database/{page → pages}/PoliciesPage.tsx +43 -54
- package/frontend/src/features/database/{page → pages}/TablesPage.tsx +0 -42
- package/frontend/src/features/database/{page → pages}/TriggersPage.tsx +35 -47
- package/frontend/src/features/database/services/advance.service.ts +0 -26
- package/frontend/src/features/database/services/database.service.ts +55 -0
- package/frontend/src/features/database/services/table.service.ts +0 -6
- package/frontend/src/features/functions/{page → pages}/FunctionsPage.tsx +21 -44
- package/frontend/src/features/functions/{page → pages}/SecretsPage.tsx +11 -9
- package/frontend/src/features/logs/hooks/useMcpUsage.ts +13 -66
- package/frontend/src/features/realtime/components/ChannelRow.tsx +83 -0
- package/frontend/src/features/realtime/components/EditChannelModal.tsx +246 -0
- package/frontend/src/features/realtime/components/MessageRow.tsx +85 -0
- package/frontend/src/features/realtime/components/RealtimeEmptyState.tsx +30 -0
- package/frontend/src/features/realtime/hooks/useRealtime.ts +218 -0
- package/frontend/src/features/realtime/index.ts +11 -0
- package/frontend/src/features/realtime/pages/RealtimeChannelsPage.tsx +172 -0
- package/frontend/src/features/realtime/pages/RealtimeMessagesPage.tsx +211 -0
- package/frontend/src/features/realtime/pages/RealtimePermissionsPage.tsx +191 -0
- package/frontend/src/features/realtime/services/realtime.service.ts +107 -0
- package/frontend/src/features/storage/{page → pages}/StoragePage.tsx +1 -29
- package/frontend/src/features/visualizer/components/SchemaVisualizer.tsx +3 -3
- package/frontend/src/features/visualizer/{page → pages}/VisualizerPage.tsx +1 -35
- package/frontend/src/lib/contexts/SocketContext.tsx +119 -75
- package/frontend/src/lib/routing/AppRoutes.tsx +35 -20
- package/frontend/src/lib/utils/cloudMessaging.ts +1 -1
- package/frontend/src/lib/utils/menuItems.ts +24 -0
- package/frontend/src/lib/utils/utils.ts +14 -1
- package/frontend/tsconfig.json +25 -25
- package/frontend/tsconfig.node.json +9 -9
- package/functions/deno.json +24 -24
- package/functions/server.ts +315 -315
- package/i18n/README.ar.md +130 -130
- package/i18n/README.de.md +130 -130
- package/i18n/README.es.md +154 -154
- package/i18n/README.fr.md +134 -134
- package/i18n/README.hi.md +129 -129
- package/i18n/README.ja.md +174 -174
- package/i18n/README.ko.md +136 -136
- package/i18n/README.pt-BR.md +131 -131
- package/i18n/README.ru.md +129 -129
- package/i18n/README.zh-CN.md +133 -133
- package/openapi/ai.yaml +715 -715
- package/openapi/auth.yaml +1244 -1244
- package/openapi/email.yaml +158 -0
- package/openapi/functions.yaml +475 -475
- package/openapi/health.yaml +29 -29
- package/openapi/logs.yaml +223 -223
- package/openapi/metadata.yaml +177 -177
- package/openapi/realtime.yaml +699 -0
- package/openapi/records.yaml +381 -381
- package/openapi/secrets.yaml +370 -370
- package/openapi/storage.yaml +875 -875
- package/openapi/tables.yaml +463 -463
- package/package.json +97 -97
- package/shared-schemas/package.json +31 -31
- package/shared-schemas/src/ai.schema.ts +63 -59
- package/shared-schemas/src/auth-api.schema.ts +352 -339
- package/shared-schemas/src/auth.schema.ts +1 -1
- package/shared-schemas/src/database-api.schema.ts +32 -1
- package/shared-schemas/src/database.schema.ts +39 -0
- package/shared-schemas/src/docs.schema.ts +26 -0
- package/shared-schemas/src/email-api.schema.ts +30 -0
- package/shared-schemas/src/index.ts +4 -0
- package/shared-schemas/src/metadata.schema.ts +9 -0
- package/shared-schemas/src/realtime-api.schema.ts +111 -0
- package/shared-schemas/src/realtime.schema.ts +143 -0
- package/shared-schemas/tsconfig.json +21 -21
- package/tsconfig.json +7 -7
- package/zeabur/README.md +13 -13
- package/zeabur/template.yml +1032 -1032
- package/.cursor/rules/cursor-rules.mdc +0 -94
- package/frontend/src/features/database/hooks/useFullMetadata.ts +0 -18
- package/test-gemini.sh +0 -35
- package/test-usage-admin.sh +0 -57
- package/test-usage.sh +0 -50
- /package/frontend/src/features/ai/{page → pages}/AIPage.tsx +0 -0
- /package/frontend/src/features/auth/{page → pages}/AuthMethodsPage.tsx +0 -0
- /package/frontend/src/features/auth/{page → pages}/ConfigurationPage.tsx +0 -0
- /package/frontend/src/features/dashboard/{page → pages}/DashboardPage.tsx +0 -0
- /package/frontend/src/features/database/{page → pages}/SQLEditorPage.tsx +0 -0
- /package/frontend/src/features/database/{page → pages}/TemplatesPage.tsx +0 -0
- /package/frontend/src/features/login/{page → pages}/CloudLoginPage.tsx +0 -0
- /package/frontend/src/features/login/{page → pages}/LoginPage.tsx +0 -0
- /package/frontend/src/features/logs/{page → pages}/AuditsPage.tsx +0 -0
- /package/frontend/src/features/logs/{page → pages}/LogsPage.tsx +0 -0
- /package/frontend/src/features/logs/{page → pages}/MCPLogsPage.tsx +0 -0
|
@@ -1,221 +1,221 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Next.js
|
|
3
|
-
description: Zero-configuration authentication for Next.js with built-in UI components
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
The `@insforge/nextjs` package provides **zero-configuration authentication** for Next.js applications. Authentication pages are hosted on your backend by default—no UI code needed.
|
|
7
|
-
|
|
8
|
-
## Quick Start
|
|
9
|
-
|
|
10
|
-
### Step 1: Install Package and Set Environment Variables
|
|
11
|
-
|
|
12
|
-
```bash
|
|
13
|
-
npm install @insforge/nextjs@latest
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
```bash .env.local
|
|
17
|
-
NEXT_PUBLIC_INSFORGE_BASE_URL=https://your-app.region.insforge.app
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
### Step 2: Add Middleware
|
|
21
|
-
|
|
22
|
-
Create middleware to protect routes:
|
|
23
|
-
|
|
24
|
-
```ts middleware.ts
|
|
25
|
-
import { InsforgeMiddleware } from '@insforge/nextjs/middleware';
|
|
26
|
-
|
|
27
|
-
export default InsforgeMiddleware({
|
|
28
|
-
baseUrl: process.env.NEXT_PUBLIC_INSFORGE_BASE_URL || 'https://your-app.region.insforge.app', // Replace with your InsForge backend URL
|
|
29
|
-
publicRoutes: ['/'],
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
export const config = {
|
|
33
|
-
matcher: [
|
|
34
|
-
'/((?!api|_next/static|_next/image|favicon.ico|.*\\.(?:svg|png|jpg|jpeg|gif|webp)$).*)',
|
|
35
|
-
],
|
|
36
|
-
};
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
### Step 3: Create API Route
|
|
40
|
-
|
|
41
|
-
Create an API route to enable server-side rendering (SSR) and cookie-based authentication:
|
|
42
|
-
|
|
43
|
-
```tsx app/api/auth/route.ts
|
|
44
|
-
import { createAuthRouteHandlers } from '@insforge/nextjs/api';
|
|
45
|
-
|
|
46
|
-
const handlers = createAuthRouteHandlers({
|
|
47
|
-
baseUrl: process.env.NEXT_PUBLIC_INSFORGE_BASE_URL || 'https://your-app.region.insforge.app', // Replace with your InsForge backend URL
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
export const POST = handlers.POST;
|
|
51
|
-
export const GET = handlers.GET;
|
|
52
|
-
export const DELETE = handlers.DELETE;
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
<Info>**Why?** This route syncs auth tokens to HTTP-only cookies for server-side middleware.</Info>
|
|
56
|
-
|
|
57
|
-
### Step 4: Add InsforgeProvider
|
|
58
|
-
|
|
59
|
-
Wrap your application with the `InsforgeProvider` in your root layout:
|
|
60
|
-
|
|
61
|
-
```tsx app/layout.tsx
|
|
62
|
-
import {
|
|
63
|
-
InsforgeProvider,
|
|
64
|
-
SignedIn,
|
|
65
|
-
SignedOut,
|
|
66
|
-
SignInButton,
|
|
67
|
-
SignUpButton,
|
|
68
|
-
UserButton,
|
|
69
|
-
} from '@insforge/nextjs';
|
|
70
|
-
|
|
71
|
-
export const metadata: Metadata = {
|
|
72
|
-
title: 'InsForge Next.js Quickstart',
|
|
73
|
-
description: 'Generated by create next app',
|
|
74
|
-
};
|
|
75
|
-
|
|
76
|
-
export default function RootLayout({ children }: { children: React.ReactNode }) {
|
|
77
|
-
return (
|
|
78
|
-
<html lang="en">
|
|
79
|
-
<body>
|
|
80
|
-
<InsforgeProvider
|
|
81
|
-
baseUrl={
|
|
82
|
-
process.env.NEXT_PUBLIC_INSFORGE_BASE_URL || 'https://your-app.region.insforge.app' // Replace with your InsForge backend URL
|
|
83
|
-
}
|
|
84
|
-
>
|
|
85
|
-
<nav>
|
|
86
|
-
<SignedOut>
|
|
87
|
-
<SignInButton />
|
|
88
|
-
<SignUpButton />
|
|
89
|
-
</SignedOut>
|
|
90
|
-
|
|
91
|
-
<SignedIn>
|
|
92
|
-
<UserButton />
|
|
93
|
-
</SignedIn>
|
|
94
|
-
</nav>
|
|
95
|
-
{children}
|
|
96
|
-
</InsforgeProvider>
|
|
97
|
-
</body>
|
|
98
|
-
</html>
|
|
99
|
-
);
|
|
100
|
-
}
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
<Info>
|
|
104
|
-
**Preventing FOUC**: The CSS import in your root layout ensures styles are loaded during
|
|
105
|
-
server-side rendering, preventing flash of unstyled content (FOUC). Without this import,
|
|
106
|
-
components may briefly appear unstyled when the page first loads.
|
|
107
|
-
</Info>
|
|
108
|
-
|
|
109
|
-
**That's it!** When users click "Sign In", they'll be redirected to your backend's auth page automatically.
|
|
110
|
-
|
|
111
|
-
## Next Steps
|
|
112
|
-
|
|
113
|
-
### Client-side Hooks
|
|
114
|
-
|
|
115
|
-
#### `useAuth()`
|
|
116
|
-
|
|
117
|
-
Access authentication state in client side:
|
|
118
|
-
|
|
119
|
-
```tsx
|
|
120
|
-
'use client';
|
|
121
|
-
import { useAuth } from '@insforge/nextjs';
|
|
122
|
-
|
|
123
|
-
function LoginButton() {
|
|
124
|
-
const { isSignedIn, isLoaded } = useAuth();
|
|
125
|
-
|
|
126
|
-
if (!isLoaded) return <div>Loading...</div>;
|
|
127
|
-
|
|
128
|
-
return <div>{isSignedIn ? 'Welcome!' : 'Sign In'}</div>;
|
|
129
|
-
}
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
**Returns:**
|
|
133
|
-
|
|
134
|
-
- `isSignedIn` - Boolean auth state
|
|
135
|
-
- `isLoaded` - Boolean loading state
|
|
136
|
-
|
|
137
|
-
#### `useUser()`
|
|
138
|
-
|
|
139
|
-
Access current user data in client side:
|
|
140
|
-
|
|
141
|
-
```tsx
|
|
142
|
-
'use client';
|
|
143
|
-
import { useUser } from '@insforge/nextjs';
|
|
144
|
-
|
|
145
|
-
function UserProfile() {
|
|
146
|
-
const { user, isLoaded } = useUser();
|
|
147
|
-
|
|
148
|
-
if (!isLoaded) return <div>Loading...</div>;
|
|
149
|
-
if (!user) return <div>Not signed in</div>;
|
|
150
|
-
|
|
151
|
-
return (
|
|
152
|
-
<div>
|
|
153
|
-
<p>Id: {user.id}</p>
|
|
154
|
-
<p>Email: {user.email}</p>
|
|
155
|
-
<p>Name: {user.name}</p>
|
|
156
|
-
<img src={user.avatarUrl} alt="Avatar" />
|
|
157
|
-
</div>
|
|
158
|
-
);
|
|
159
|
-
}
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
**Returns:**
|
|
163
|
-
|
|
164
|
-
- `user` - User object with id, email, name, avatarUrl
|
|
165
|
-
- `isLoaded` - Boolean loading state
|
|
166
|
-
|
|
167
|
-
### Server side functions
|
|
168
|
-
|
|
169
|
-
#### `auth`
|
|
170
|
-
|
|
171
|
-
Access current user data and access token in server side:
|
|
172
|
-
|
|
173
|
-
```tsx
|
|
174
|
-
import { auth } from '@insforge/nextjs/server';
|
|
175
|
-
import { createClient } from '@insforge/sdk';
|
|
176
|
-
|
|
177
|
-
export async function POST(request: NextRequest) {
|
|
178
|
-
try {
|
|
179
|
-
// Authenticate the request and get user info
|
|
180
|
-
const { user, userId, token } = await auth();
|
|
181
|
-
|
|
182
|
-
// Parse request body to get the prompt
|
|
183
|
-
const { prompt } = await request.json();
|
|
184
|
-
|
|
185
|
-
// Create InsForge SDK
|
|
186
|
-
const insforge = createClient({
|
|
187
|
-
baseUrl: process.env.NEXT_PUBLIC_INSFORGE_BASE_URL || "https://your-app.region.insforge.app",
|
|
188
|
-
anonKey: token
|
|
189
|
-
});
|
|
190
|
-
|
|
191
|
-
// Request for AI response
|
|
192
|
-
const completion = await insforge.ai.chat.completions.create({
|
|
193
|
-
model: 'anthropic/claude-3.5-haiku',
|
|
194
|
-
messages: [
|
|
195
|
-
{
|
|
196
|
-
role: 'user',
|
|
197
|
-
content: prompt,
|
|
198
|
-
},
|
|
199
|
-
],
|
|
200
|
-
});
|
|
201
|
-
|
|
202
|
-
const generatedResponse = completion.choices[0].message.content.trim();
|
|
203
|
-
|
|
204
|
-
// Return success response
|
|
205
|
-
return NextResponse.json(
|
|
206
|
-
{
|
|
207
|
-
success: true,
|
|
208
|
-
data: generatedResponse,
|
|
209
|
-
},
|
|
210
|
-
{ status: 201 }
|
|
211
|
-
);
|
|
212
|
-
|
|
213
|
-
} catch (error) {
|
|
214
|
-
console.error(error);
|
|
215
|
-
return NextResponse.json(
|
|
216
|
-
{ error: 'Internal server error' },
|
|
217
|
-
{ status: 500 }
|
|
218
|
-
);
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
```
|
|
1
|
+
---
|
|
2
|
+
title: Next.js
|
|
3
|
+
description: Zero-configuration authentication for Next.js with built-in UI components
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
The `@insforge/nextjs` package provides **zero-configuration authentication** for Next.js applications. Authentication pages are hosted on your backend by default—no UI code needed.
|
|
7
|
+
|
|
8
|
+
## Quick Start
|
|
9
|
+
|
|
10
|
+
### Step 1: Install Package and Set Environment Variables
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npm install @insforge/nextjs@latest
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
```bash .env.local
|
|
17
|
+
NEXT_PUBLIC_INSFORGE_BASE_URL=https://your-app.region.insforge.app
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
### Step 2: Add Middleware
|
|
21
|
+
|
|
22
|
+
Create middleware to protect routes:
|
|
23
|
+
|
|
24
|
+
```ts middleware.ts
|
|
25
|
+
import { InsforgeMiddleware } from '@insforge/nextjs/middleware';
|
|
26
|
+
|
|
27
|
+
export default InsforgeMiddleware({
|
|
28
|
+
baseUrl: process.env.NEXT_PUBLIC_INSFORGE_BASE_URL || 'https://your-app.region.insforge.app', // Replace with your InsForge backend URL
|
|
29
|
+
publicRoutes: ['/'],
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
export const config = {
|
|
33
|
+
matcher: [
|
|
34
|
+
'/((?!api|_next/static|_next/image|favicon.ico|.*\\.(?:svg|png|jpg|jpeg|gif|webp)$).*)',
|
|
35
|
+
],
|
|
36
|
+
};
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Step 3: Create API Route
|
|
40
|
+
|
|
41
|
+
Create an API route to enable server-side rendering (SSR) and cookie-based authentication:
|
|
42
|
+
|
|
43
|
+
```tsx app/api/auth/route.ts
|
|
44
|
+
import { createAuthRouteHandlers } from '@insforge/nextjs/api';
|
|
45
|
+
|
|
46
|
+
const handlers = createAuthRouteHandlers({
|
|
47
|
+
baseUrl: process.env.NEXT_PUBLIC_INSFORGE_BASE_URL || 'https://your-app.region.insforge.app', // Replace with your InsForge backend URL
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
export const POST = handlers.POST;
|
|
51
|
+
export const GET = handlers.GET;
|
|
52
|
+
export const DELETE = handlers.DELETE;
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
<Info>**Why?** This route syncs auth tokens to HTTP-only cookies for server-side middleware.</Info>
|
|
56
|
+
|
|
57
|
+
### Step 4: Add InsforgeProvider
|
|
58
|
+
|
|
59
|
+
Wrap your application with the `InsforgeProvider` in your root layout:
|
|
60
|
+
|
|
61
|
+
```tsx app/layout.tsx
|
|
62
|
+
import {
|
|
63
|
+
InsforgeProvider,
|
|
64
|
+
SignedIn,
|
|
65
|
+
SignedOut,
|
|
66
|
+
SignInButton,
|
|
67
|
+
SignUpButton,
|
|
68
|
+
UserButton,
|
|
69
|
+
} from '@insforge/nextjs';
|
|
70
|
+
|
|
71
|
+
export const metadata: Metadata = {
|
|
72
|
+
title: 'InsForge Next.js Quickstart',
|
|
73
|
+
description: 'Generated by create next app',
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
export default function RootLayout({ children }: { children: React.ReactNode }) {
|
|
77
|
+
return (
|
|
78
|
+
<html lang="en">
|
|
79
|
+
<body>
|
|
80
|
+
<InsforgeProvider
|
|
81
|
+
baseUrl={
|
|
82
|
+
process.env.NEXT_PUBLIC_INSFORGE_BASE_URL || 'https://your-app.region.insforge.app' // Replace with your InsForge backend URL
|
|
83
|
+
}
|
|
84
|
+
>
|
|
85
|
+
<nav>
|
|
86
|
+
<SignedOut>
|
|
87
|
+
<SignInButton />
|
|
88
|
+
<SignUpButton />
|
|
89
|
+
</SignedOut>
|
|
90
|
+
|
|
91
|
+
<SignedIn>
|
|
92
|
+
<UserButton />
|
|
93
|
+
</SignedIn>
|
|
94
|
+
</nav>
|
|
95
|
+
{children}
|
|
96
|
+
</InsforgeProvider>
|
|
97
|
+
</body>
|
|
98
|
+
</html>
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
<Info>
|
|
104
|
+
**Preventing FOUC**: The CSS import in your root layout ensures styles are loaded during
|
|
105
|
+
server-side rendering, preventing flash of unstyled content (FOUC). Without this import,
|
|
106
|
+
components may briefly appear unstyled when the page first loads.
|
|
107
|
+
</Info>
|
|
108
|
+
|
|
109
|
+
**That's it!** When users click "Sign In", they'll be redirected to your backend's auth page automatically.
|
|
110
|
+
|
|
111
|
+
## Next Steps
|
|
112
|
+
|
|
113
|
+
### Client-side Hooks
|
|
114
|
+
|
|
115
|
+
#### `useAuth()`
|
|
116
|
+
|
|
117
|
+
Access authentication state in client side:
|
|
118
|
+
|
|
119
|
+
```tsx
|
|
120
|
+
'use client';
|
|
121
|
+
import { useAuth } from '@insforge/nextjs';
|
|
122
|
+
|
|
123
|
+
function LoginButton() {
|
|
124
|
+
const { isSignedIn, isLoaded } = useAuth();
|
|
125
|
+
|
|
126
|
+
if (!isLoaded) return <div>Loading...</div>;
|
|
127
|
+
|
|
128
|
+
return <div>{isSignedIn ? 'Welcome!' : 'Sign In'}</div>;
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
**Returns:**
|
|
133
|
+
|
|
134
|
+
- `isSignedIn` - Boolean auth state
|
|
135
|
+
- `isLoaded` - Boolean loading state
|
|
136
|
+
|
|
137
|
+
#### `useUser()`
|
|
138
|
+
|
|
139
|
+
Access current user data in client side:
|
|
140
|
+
|
|
141
|
+
```tsx
|
|
142
|
+
'use client';
|
|
143
|
+
import { useUser } from '@insforge/nextjs';
|
|
144
|
+
|
|
145
|
+
function UserProfile() {
|
|
146
|
+
const { user, isLoaded } = useUser();
|
|
147
|
+
|
|
148
|
+
if (!isLoaded) return <div>Loading...</div>;
|
|
149
|
+
if (!user) return <div>Not signed in</div>;
|
|
150
|
+
|
|
151
|
+
return (
|
|
152
|
+
<div>
|
|
153
|
+
<p>Id: {user.id}</p>
|
|
154
|
+
<p>Email: {user.email}</p>
|
|
155
|
+
<p>Name: {user.name}</p>
|
|
156
|
+
<img src={user.avatarUrl} alt="Avatar" />
|
|
157
|
+
</div>
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
**Returns:**
|
|
163
|
+
|
|
164
|
+
- `user` - User object with id, email, name, avatarUrl
|
|
165
|
+
- `isLoaded` - Boolean loading state
|
|
166
|
+
|
|
167
|
+
### Server side functions
|
|
168
|
+
|
|
169
|
+
#### `auth`
|
|
170
|
+
|
|
171
|
+
Access current user data and access token in server side:
|
|
172
|
+
|
|
173
|
+
```tsx
|
|
174
|
+
import { auth } from '@insforge/nextjs/server';
|
|
175
|
+
import { createClient } from '@insforge/sdk';
|
|
176
|
+
|
|
177
|
+
export async function POST(request: NextRequest) {
|
|
178
|
+
try {
|
|
179
|
+
// Authenticate the request and get user info
|
|
180
|
+
const { user, userId, token } = await auth();
|
|
181
|
+
|
|
182
|
+
// Parse request body to get the prompt
|
|
183
|
+
const { prompt } = await request.json();
|
|
184
|
+
|
|
185
|
+
// Create InsForge SDK
|
|
186
|
+
const insforge = createClient({
|
|
187
|
+
baseUrl: process.env.NEXT_PUBLIC_INSFORGE_BASE_URL || "https://your-app.region.insforge.app",
|
|
188
|
+
anonKey: token
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
// Request for AI response
|
|
192
|
+
const completion = await insforge.ai.chat.completions.create({
|
|
193
|
+
model: 'anthropic/claude-3.5-haiku',
|
|
194
|
+
messages: [
|
|
195
|
+
{
|
|
196
|
+
role: 'user',
|
|
197
|
+
content: prompt,
|
|
198
|
+
},
|
|
199
|
+
],
|
|
200
|
+
});
|
|
201
|
+
|
|
202
|
+
const generatedResponse = completion.choices[0].message.content.trim();
|
|
203
|
+
|
|
204
|
+
// Return success response
|
|
205
|
+
return NextResponse.json(
|
|
206
|
+
{
|
|
207
|
+
success: true,
|
|
208
|
+
data: generatedResponse,
|
|
209
|
+
},
|
|
210
|
+
{ status: 201 }
|
|
211
|
+
);
|
|
212
|
+
|
|
213
|
+
} catch (error) {
|
|
214
|
+
console.error(error);
|
|
215
|
+
return NextResponse.json(
|
|
216
|
+
{ error: 'Internal server error' },
|
|
217
|
+
{ status: 500 }
|
|
218
|
+
);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
```
|