@objectstack/nextjs 1.0.4 → 1.0.6
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/.turbo/turbo-build.log +22 -0
- package/CHANGELOG.md +19 -0
- package/dist/index.d.mts +18 -0
- package/dist/index.d.ts +6 -4
- package/dist/index.js +109 -99
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +91 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +6 -6
- package/dist/index.d.ts.map +0 -1
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
|
|
2
|
+
> @objectstack/nextjs@1.0.6 build /home/runner/work/spec/spec/packages/adapters/nextjs
|
|
3
|
+
> tsup --config ../../../tsup.config.ts
|
|
4
|
+
|
|
5
|
+
[34mCLI[39m Building entry: src/index.ts
|
|
6
|
+
[34mCLI[39m Using tsconfig: tsconfig.json
|
|
7
|
+
[34mCLI[39m tsup v8.5.1
|
|
8
|
+
[34mCLI[39m Using tsup config: /home/runner/work/spec/spec/tsup.config.ts
|
|
9
|
+
[34mCLI[39m Target: es2020
|
|
10
|
+
[34mCLI[39m Cleaning output folder
|
|
11
|
+
[34mESM[39m Build start
|
|
12
|
+
[34mCJS[39m Build start
|
|
13
|
+
[32mESM[39m [1mdist/index.mjs [22m[32m3.41 KB[39m
|
|
14
|
+
[32mESM[39m [1mdist/index.mjs.map [22m[32m7.18 KB[39m
|
|
15
|
+
[32mESM[39m ⚡️ Build success in 40ms
|
|
16
|
+
[32mCJS[39m [1mdist/index.js [22m[32m4.50 KB[39m
|
|
17
|
+
[32mCJS[39m [1mdist/index.js.map [22m[32m7.22 KB[39m
|
|
18
|
+
[32mCJS[39m ⚡️ Build success in 40ms
|
|
19
|
+
[34mDTS[39m Build start
|
|
20
|
+
[32mDTS[39m ⚡️ Build success in 9408ms
|
|
21
|
+
[32mDTS[39m [1mdist/index.d.mts [22m[32m504.00 B[39m
|
|
22
|
+
[32mDTS[39m [1mdist/index.d.ts [22m[32m504.00 B[39m
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# @objectstack/nextjs
|
|
2
2
|
|
|
3
|
+
## 1.0.6
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- @objectstack/runtime@1.0.6
|
|
8
|
+
|
|
9
|
+
## 1.0.5
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- b1d24bd: refactor: migrate build system from tsc to tsup for faster builds
|
|
14
|
+
- Replaced `tsc` with `tsup` (using esbuild) across all packages
|
|
15
|
+
- Added shared `tsup.config.ts` in workspace root
|
|
16
|
+
- Added `tsup` as workspace dev dependency
|
|
17
|
+
- significantly improved build performance
|
|
18
|
+
- Updated dependencies [b1d24bd]
|
|
19
|
+
- Updated dependencies [877b864]
|
|
20
|
+
- @objectstack/runtime@1.0.5
|
|
21
|
+
|
|
3
22
|
## 1.0.4
|
|
4
23
|
|
|
5
24
|
### Patch Changes
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { NextRequest } from 'next/server';
|
|
2
|
+
import { ObjectKernel } from '@objectstack/runtime';
|
|
3
|
+
|
|
4
|
+
interface NextAdapterOptions {
|
|
5
|
+
kernel: ObjectKernel;
|
|
6
|
+
prefix?: string;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Creates a route handler for Next.js App Router
|
|
10
|
+
* Handles /api/[...objectstack] pattern
|
|
11
|
+
*/
|
|
12
|
+
declare function createRouteHandler(options: NextAdapterOptions): (req: NextRequest, { params }: {
|
|
13
|
+
params: {
|
|
14
|
+
objectstack: string[];
|
|
15
|
+
};
|
|
16
|
+
}) => Promise<any>;
|
|
17
|
+
|
|
18
|
+
export { type NextAdapterOptions, createRouteHandler };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { NextRequest } from 'next/server';
|
|
2
|
-
import {
|
|
3
|
-
|
|
2
|
+
import { ObjectKernel } from '@objectstack/runtime';
|
|
3
|
+
|
|
4
|
+
interface NextAdapterOptions {
|
|
4
5
|
kernel: ObjectKernel;
|
|
5
6
|
prefix?: string;
|
|
6
7
|
}
|
|
@@ -8,9 +9,10 @@ export interface NextAdapterOptions {
|
|
|
8
9
|
* Creates a route handler for Next.js App Router
|
|
9
10
|
* Handles /api/[...objectstack] pattern
|
|
10
11
|
*/
|
|
11
|
-
|
|
12
|
+
declare function createRouteHandler(options: NextAdapterOptions): (req: NextRequest, { params }: {
|
|
12
13
|
params: {
|
|
13
14
|
objectstack: string[];
|
|
14
15
|
};
|
|
15
16
|
}) => Promise<any>;
|
|
16
|
-
|
|
17
|
+
|
|
18
|
+
export { type NextAdapterOptions, createRouteHandler };
|
package/dist/index.js
CHANGED
|
@@ -1,106 +1,116 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
|
+
createRouteHandler: () => createRouteHandler
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(index_exports);
|
|
26
|
+
var import_server = require("next/server");
|
|
27
|
+
var import_runtime = require("@objectstack/runtime");
|
|
10
28
|
function createRouteHandler(options) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
if (res.type === 'redirect' && res.url) {
|
|
26
|
-
return server_1.NextResponse.redirect(res.url);
|
|
27
|
-
}
|
|
28
|
-
// Stream
|
|
29
|
-
if (res.type === 'stream' && res.stream) {
|
|
30
|
-
return new server_1.NextResponse(res.stream, {
|
|
31
|
-
status: 200,
|
|
32
|
-
headers: res.headers
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
// If it's a standard response object (like from another fetch)
|
|
36
|
-
// Next.js might handle it, or we return it directly
|
|
37
|
-
return res;
|
|
38
|
-
}
|
|
29
|
+
const dispatcher = new import_runtime.HttpDispatcher(options.kernel);
|
|
30
|
+
const error = (msg, code = 500) => import_server.NextResponse.json({ success: false, error: { message: msg, code } }, { status: code });
|
|
31
|
+
const toResponse = (result) => {
|
|
32
|
+
if (result.handled) {
|
|
33
|
+
if (result.response) {
|
|
34
|
+
return import_server.NextResponse.json(result.response.body, {
|
|
35
|
+
status: result.response.status,
|
|
36
|
+
headers: result.response.headers
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
if (result.result) {
|
|
40
|
+
const res = result.result;
|
|
41
|
+
if (res.type === "redirect" && res.url) {
|
|
42
|
+
return import_server.NextResponse.redirect(res.url);
|
|
39
43
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
const method = req.method;
|
|
46
|
-
// --- 0. Discovery Endpoint ---
|
|
47
|
-
if (segments.length === 0 && method === 'GET') {
|
|
48
|
-
return server_1.NextResponse.json(dispatcher.getDiscoveryInfo(options.prefix || '/api'));
|
|
44
|
+
if (res.type === "stream" && res.stream) {
|
|
45
|
+
return new import_server.NextResponse(res.stream, {
|
|
46
|
+
status: 200,
|
|
47
|
+
headers: res.headers
|
|
48
|
+
});
|
|
49
49
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
body = await req.json().catch(() => ({}));
|
|
81
|
-
}
|
|
82
|
-
// Extract query params
|
|
83
|
-
const url = new URL(req.url);
|
|
84
|
-
const queryParams = {};
|
|
85
|
-
url.searchParams.forEach((val, key) => queryParams[key] = val);
|
|
86
|
-
const result = await dispatcher.handleData(subPath, method, body, queryParams, { request: rawRequest });
|
|
87
|
-
return toResponse(result);
|
|
88
|
-
}
|
|
89
|
-
// --- 5. Storage ---
|
|
90
|
-
if (segments[0] === 'storage') {
|
|
91
|
-
const subPath = segments.slice(1).join('/');
|
|
92
|
-
let file = undefined;
|
|
93
|
-
if (method === 'POST' && subPath === 'upload') {
|
|
94
|
-
const formData = await req.formData();
|
|
95
|
-
file = formData.get('file');
|
|
96
|
-
}
|
|
97
|
-
const result = await dispatcher.handleStorage(subPath, method, file, { request: rawRequest });
|
|
98
|
-
return toResponse(result);
|
|
99
|
-
}
|
|
100
|
-
return error('Not Found', 404);
|
|
50
|
+
return res;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return error("Not Found", 404);
|
|
54
|
+
};
|
|
55
|
+
return async function handler(req, { params }) {
|
|
56
|
+
const resolvedParams = await Promise.resolve(params);
|
|
57
|
+
const segments = resolvedParams.objectstack || [];
|
|
58
|
+
const method = req.method;
|
|
59
|
+
if (segments.length === 0 && method === "GET") {
|
|
60
|
+
return import_server.NextResponse.json(dispatcher.getDiscoveryInfo(options.prefix || "/api"));
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
const rawRequest = req;
|
|
64
|
+
if (segments[0] === "auth") {
|
|
65
|
+
const subPath = segments.slice(1).join("/");
|
|
66
|
+
const body = method === "POST" ? await req.json().catch(() => ({})) : {};
|
|
67
|
+
const result = await dispatcher.handleAuth(subPath, method, body, { request: req });
|
|
68
|
+
return toResponse(result);
|
|
69
|
+
}
|
|
70
|
+
if (segments[0] === "graphql" && method === "POST") {
|
|
71
|
+
const body = await req.json();
|
|
72
|
+
const result = await dispatcher.handleGraphQL(body, { request: rawRequest });
|
|
73
|
+
return import_server.NextResponse.json(result);
|
|
74
|
+
}
|
|
75
|
+
if (segments[0] === "metadata") {
|
|
76
|
+
const subPath = segments.slice(1).join("/");
|
|
77
|
+
let body = void 0;
|
|
78
|
+
if (method === "PUT" || method === "POST") {
|
|
79
|
+
body = await req.json().catch(() => ({}));
|
|
101
80
|
}
|
|
102
|
-
|
|
103
|
-
|
|
81
|
+
const result = await dispatcher.handleMetadata(subPath, { request: rawRequest }, method, body);
|
|
82
|
+
return toResponse(result);
|
|
83
|
+
}
|
|
84
|
+
if (segments[0] === "data") {
|
|
85
|
+
const subPath = segments.slice(1).join("/");
|
|
86
|
+
let body = {};
|
|
87
|
+
if (method === "POST" || method === "PATCH") {
|
|
88
|
+
body = await req.json().catch(() => ({}));
|
|
104
89
|
}
|
|
105
|
-
|
|
90
|
+
const url = new URL(req.url);
|
|
91
|
+
const queryParams = {};
|
|
92
|
+
url.searchParams.forEach((val, key) => queryParams[key] = val);
|
|
93
|
+
const result = await dispatcher.handleData(subPath, method, body, queryParams, { request: rawRequest });
|
|
94
|
+
return toResponse(result);
|
|
95
|
+
}
|
|
96
|
+
if (segments[0] === "storage") {
|
|
97
|
+
const subPath = segments.slice(1).join("/");
|
|
98
|
+
let file = void 0;
|
|
99
|
+
if (method === "POST" && subPath === "upload") {
|
|
100
|
+
const formData = await req.formData();
|
|
101
|
+
file = formData.get("file");
|
|
102
|
+
}
|
|
103
|
+
const result = await dispatcher.handleStorage(subPath, method, file, { request: rawRequest });
|
|
104
|
+
return toResponse(result);
|
|
105
|
+
}
|
|
106
|
+
return error("Not Found", 404);
|
|
107
|
+
} catch (err) {
|
|
108
|
+
return error(err.message || "Internal Server Error", err.statusCode || 500);
|
|
109
|
+
}
|
|
110
|
+
};
|
|
106
111
|
}
|
|
112
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
113
|
+
0 && (module.exports = {
|
|
114
|
+
createRouteHandler
|
|
115
|
+
});
|
|
116
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { NextRequest, NextResponse } from 'next/server';\nimport { type ObjectKernel, HttpDispatcher, HttpDispatcherResult } from '@objectstack/runtime';\n\nexport interface NextAdapterOptions {\n kernel: ObjectKernel;\n prefix?: string;\n}\n\n/**\n * Creates a route handler for Next.js App Router\n * Handles /api/[...objectstack] pattern\n */\nexport function createRouteHandler(options: NextAdapterOptions) {\n const dispatcher = new HttpDispatcher(options.kernel);\n const error = (msg: string, code: number = 500) => NextResponse.json({ success: false, error: { message: msg, code } }, { status: code });\n\n // Helper to convert DispatchResult to NextResponse\n const toResponse = (result: HttpDispatcherResult) => {\n if (result.handled) {\n if (result.response) {\n return NextResponse.json(result.response.body, { \n status: result.response.status, \n headers: result.response.headers \n });\n }\n if (result.result) {\n const res = result.result;\n // Redirect\n if (res.type === 'redirect' && res.url) {\n return NextResponse.redirect(res.url);\n }\n // Stream\n if (res.type === 'stream' && res.stream) {\n return new NextResponse(res.stream, {\n status: 200,\n headers: res.headers\n });\n }\n // If it's a standard response object (like from another fetch)\n // Next.js might handle it, or we return it directly\n return res; \n }\n }\n return error('Not Found', 404);\n }\n\n return async function handler(req: NextRequest, { params }: { params: { objectstack: string[] } }) {\n const resolvedParams = await Promise.resolve(params);\n const segments = resolvedParams.objectstack || [];\n const method = req.method;\n \n // --- 0. Discovery Endpoint ---\n if (segments.length === 0 && method === 'GET') {\n return NextResponse.json(dispatcher.getDiscoveryInfo(options.prefix || '/api'));\n }\n\n try {\n const rawRequest = req;\n\n // --- 1. Auth ---\n if (segments[0] === 'auth') {\n const subPath = segments.slice(1).join('/');\n const body = method === 'POST' ? await req.json().catch(() => ({})) : {};\n const result = await dispatcher.handleAuth(subPath, method, body, { request: req });\n return toResponse(result);\n }\n\n // --- 2. GraphQL ---\n if (segments[0] === 'graphql' && method === 'POST') {\n const body = await req.json();\n const result = await dispatcher.handleGraphQL(body as any, { request: rawRequest } as any);\n return NextResponse.json(result);\n }\n\n // --- 3. Metadata ---\n if (segments[0] === 'metadata') {\n const subPath = segments.slice(1).join('/');\n \n let body: any = undefined;\n if (method === 'PUT' || method === 'POST') {\n body = await req.json().catch(() => ({}));\n }\n\n const result = await dispatcher.handleMetadata(subPath, { request: rawRequest }, method, body);\n return toResponse(result);\n }\n\n // --- 4. Data ---\n if (segments[0] === 'data') {\n const subPath = segments.slice(1).join('/');\n let body: any = {};\n if (method === 'POST' || method === 'PATCH') {\n body = await req.json().catch(() => ({}));\n }\n \n // Extract query params\n const url = new URL(req.url);\n const queryParams: Record<string, any> = {};\n url.searchParams.forEach((val, key) => queryParams[key] = val);\n\n const result = await dispatcher.handleData(subPath, method, body, queryParams, { request: rawRequest } as any);\n return toResponse(result);\n }\n\n // --- 5. Storage ---\n if (segments[0] === 'storage') {\n const subPath = segments.slice(1).join('/');\n \n let file: any = undefined;\n if (method === 'POST' && subPath === 'upload') {\n const formData = await req.formData();\n file = formData.get('file');\n }\n\n const result = await dispatcher.handleStorage(subPath, method, file, { request: rawRequest });\n return toResponse(result);\n }\n \n return error('Not Found', 404);\n\n } catch (err: any) {\n return error(err.message || 'Internal Server Error', err.statusCode || 500);\n }\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
// src/index.ts
|
|
2
|
+
import { NextResponse } from "next/server";
|
|
3
|
+
import { HttpDispatcher } from "@objectstack/runtime";
|
|
4
|
+
function createRouteHandler(options) {
|
|
5
|
+
const dispatcher = new HttpDispatcher(options.kernel);
|
|
6
|
+
const error = (msg, code = 500) => NextResponse.json({ success: false, error: { message: msg, code } }, { status: code });
|
|
7
|
+
const toResponse = (result) => {
|
|
8
|
+
if (result.handled) {
|
|
9
|
+
if (result.response) {
|
|
10
|
+
return NextResponse.json(result.response.body, {
|
|
11
|
+
status: result.response.status,
|
|
12
|
+
headers: result.response.headers
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
if (result.result) {
|
|
16
|
+
const res = result.result;
|
|
17
|
+
if (res.type === "redirect" && res.url) {
|
|
18
|
+
return NextResponse.redirect(res.url);
|
|
19
|
+
}
|
|
20
|
+
if (res.type === "stream" && res.stream) {
|
|
21
|
+
return new NextResponse(res.stream, {
|
|
22
|
+
status: 200,
|
|
23
|
+
headers: res.headers
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
return res;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return error("Not Found", 404);
|
|
30
|
+
};
|
|
31
|
+
return async function handler(req, { params }) {
|
|
32
|
+
const resolvedParams = await Promise.resolve(params);
|
|
33
|
+
const segments = resolvedParams.objectstack || [];
|
|
34
|
+
const method = req.method;
|
|
35
|
+
if (segments.length === 0 && method === "GET") {
|
|
36
|
+
return NextResponse.json(dispatcher.getDiscoveryInfo(options.prefix || "/api"));
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
const rawRequest = req;
|
|
40
|
+
if (segments[0] === "auth") {
|
|
41
|
+
const subPath = segments.slice(1).join("/");
|
|
42
|
+
const body = method === "POST" ? await req.json().catch(() => ({})) : {};
|
|
43
|
+
const result = await dispatcher.handleAuth(subPath, method, body, { request: req });
|
|
44
|
+
return toResponse(result);
|
|
45
|
+
}
|
|
46
|
+
if (segments[0] === "graphql" && method === "POST") {
|
|
47
|
+
const body = await req.json();
|
|
48
|
+
const result = await dispatcher.handleGraphQL(body, { request: rawRequest });
|
|
49
|
+
return NextResponse.json(result);
|
|
50
|
+
}
|
|
51
|
+
if (segments[0] === "metadata") {
|
|
52
|
+
const subPath = segments.slice(1).join("/");
|
|
53
|
+
let body = void 0;
|
|
54
|
+
if (method === "PUT" || method === "POST") {
|
|
55
|
+
body = await req.json().catch(() => ({}));
|
|
56
|
+
}
|
|
57
|
+
const result = await dispatcher.handleMetadata(subPath, { request: rawRequest }, method, body);
|
|
58
|
+
return toResponse(result);
|
|
59
|
+
}
|
|
60
|
+
if (segments[0] === "data") {
|
|
61
|
+
const subPath = segments.slice(1).join("/");
|
|
62
|
+
let body = {};
|
|
63
|
+
if (method === "POST" || method === "PATCH") {
|
|
64
|
+
body = await req.json().catch(() => ({}));
|
|
65
|
+
}
|
|
66
|
+
const url = new URL(req.url);
|
|
67
|
+
const queryParams = {};
|
|
68
|
+
url.searchParams.forEach((val, key) => queryParams[key] = val);
|
|
69
|
+
const result = await dispatcher.handleData(subPath, method, body, queryParams, { request: rawRequest });
|
|
70
|
+
return toResponse(result);
|
|
71
|
+
}
|
|
72
|
+
if (segments[0] === "storage") {
|
|
73
|
+
const subPath = segments.slice(1).join("/");
|
|
74
|
+
let file = void 0;
|
|
75
|
+
if (method === "POST" && subPath === "upload") {
|
|
76
|
+
const formData = await req.formData();
|
|
77
|
+
file = formData.get("file");
|
|
78
|
+
}
|
|
79
|
+
const result = await dispatcher.handleStorage(subPath, method, file, { request: rawRequest });
|
|
80
|
+
return toResponse(result);
|
|
81
|
+
}
|
|
82
|
+
return error("Not Found", 404);
|
|
83
|
+
} catch (err) {
|
|
84
|
+
return error(err.message || "Internal Server Error", err.statusCode || 500);
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
export {
|
|
89
|
+
createRouteHandler
|
|
90
|
+
};
|
|
91
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { NextRequest, NextResponse } from 'next/server';\nimport { type ObjectKernel, HttpDispatcher, HttpDispatcherResult } from '@objectstack/runtime';\n\nexport interface NextAdapterOptions {\n kernel: ObjectKernel;\n prefix?: string;\n}\n\n/**\n * Creates a route handler for Next.js App Router\n * Handles /api/[...objectstack] pattern\n */\nexport function createRouteHandler(options: NextAdapterOptions) {\n const dispatcher = new HttpDispatcher(options.kernel);\n const error = (msg: string, code: number = 500) => NextResponse.json({ success: false, error: { message: msg, code } }, { status: code });\n\n // Helper to convert DispatchResult to NextResponse\n const toResponse = (result: HttpDispatcherResult) => {\n if (result.handled) {\n if (result.response) {\n return NextResponse.json(result.response.body, { \n status: result.response.status, \n headers: result.response.headers \n });\n }\n if (result.result) {\n const res = result.result;\n // Redirect\n if (res.type === 'redirect' && res.url) {\n return NextResponse.redirect(res.url);\n }\n // Stream\n if (res.type === 'stream' && res.stream) {\n return new NextResponse(res.stream, {\n status: 200,\n headers: res.headers\n });\n }\n // If it's a standard response object (like from another fetch)\n // Next.js might handle it, or we return it directly\n return res; \n }\n }\n return error('Not Found', 404);\n }\n\n return async function handler(req: NextRequest, { params }: { params: { objectstack: string[] } }) {\n const resolvedParams = await Promise.resolve(params);\n const segments = resolvedParams.objectstack || [];\n const method = req.method;\n \n // --- 0. Discovery Endpoint ---\n if (segments.length === 0 && method === 'GET') {\n return NextResponse.json(dispatcher.getDiscoveryInfo(options.prefix || '/api'));\n }\n\n try {\n const rawRequest = req;\n\n // --- 1. Auth ---\n if (segments[0] === 'auth') {\n const subPath = segments.slice(1).join('/');\n const body = method === 'POST' ? await req.json().catch(() => ({})) : {};\n const result = await dispatcher.handleAuth(subPath, method, body, { request: req });\n return toResponse(result);\n }\n\n // --- 2. GraphQL ---\n if (segments[0] === 'graphql' && method === 'POST') {\n const body = await req.json();\n const result = await dispatcher.handleGraphQL(body as any, { request: rawRequest } as any);\n return NextResponse.json(result);\n }\n\n // --- 3. Metadata ---\n if (segments[0] === 'metadata') {\n const subPath = segments.slice(1).join('/');\n \n let body: any = undefined;\n if (method === 'PUT' || method === 'POST') {\n body = await req.json().catch(() => ({}));\n }\n\n const result = await dispatcher.handleMetadata(subPath, { request: rawRequest }, method, body);\n return toResponse(result);\n }\n\n // --- 4. Data ---\n if (segments[0] === 'data') {\n const subPath = segments.slice(1).join('/');\n let body: any = {};\n if (method === 'POST' || method === 'PATCH') {\n body = await req.json().catch(() => ({}));\n }\n \n // Extract query params\n const url = new URL(req.url);\n const queryParams: Record<string, any> = {};\n url.searchParams.forEach((val, key) => queryParams[key] = val);\n\n const result = await dispatcher.handleData(subPath, method, body, queryParams, { request: rawRequest } as any);\n return toResponse(result);\n }\n\n // --- 5. Storage ---\n if (segments[0] === 'storage') {\n const subPath = segments.slice(1).join('/');\n \n let file: any = undefined;\n if (method === 'POST' && subPath === 'upload') {\n const formData = await req.formData();\n file = formData.get('file');\n }\n\n const result = await dispatcher.handleStorage(subPath, method, file, { request: rawRequest });\n return toResponse(result);\n }\n \n return error('Not Found', 404);\n\n } catch (err: any) {\n return error(err.message || 'Internal Server Error', err.statusCode || 500);\n }\n }\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@objectstack/nextjs",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.6",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"peerDependencies": {
|
|
8
8
|
"next": "^14.0.0",
|
|
9
|
-
"react": "^
|
|
9
|
+
"react": "^19.2.4",
|
|
10
10
|
"react-dom": "^18.3.1",
|
|
11
|
-
"@objectstack/runtime": "1.0.
|
|
11
|
+
"@objectstack/runtime": "1.0.6"
|
|
12
12
|
},
|
|
13
13
|
"devDependencies": {
|
|
14
14
|
"next": "^14.0.0",
|
|
15
|
-
"react": "^
|
|
15
|
+
"react": "^19.2.4",
|
|
16
16
|
"react-dom": "^18.3.1",
|
|
17
17
|
"typescript": "^5.0.0",
|
|
18
|
-
"@objectstack/runtime": "1.0.
|
|
18
|
+
"@objectstack/runtime": "1.0.6"
|
|
19
19
|
},
|
|
20
20
|
"scripts": {
|
|
21
|
-
"build": "
|
|
21
|
+
"build": "tsup --config ../../../tsup.config.ts"
|
|
22
22
|
}
|
|
23
23
|
}
|
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAgB,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,KAAK,YAAY,EAAwC,MAAM,sBAAsB,CAAC;AAE/F,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,kBAAkB,IAkC9B,KAAK,WAAW,EAAE,YAAY;IAAE,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,EAAE,CAAA;KAAE,CAAA;CAAE,kBA8ElG"}
|