@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.
@@ -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
+ CLI Building entry: src/index.ts
6
+ CLI Using tsconfig: tsconfig.json
7
+ CLI tsup v8.5.1
8
+ CLI Using tsup config: /home/runner/work/spec/spec/tsup.config.ts
9
+ CLI Target: es2020
10
+ CLI Cleaning output folder
11
+ ESM Build start
12
+ CJS Build start
13
+ ESM dist/index.mjs 3.41 KB
14
+ ESM dist/index.mjs.map 7.18 KB
15
+ ESM ⚡️ Build success in 40ms
16
+ CJS dist/index.js 4.50 KB
17
+ CJS dist/index.js.map 7.22 KB
18
+ CJS ⚡️ Build success in 40ms
19
+ DTS Build start
20
+ DTS ⚡️ Build success in 9408ms
21
+ DTS dist/index.d.mts 504.00 B
22
+ DTS dist/index.d.ts 504.00 B
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
@@ -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 { type ObjectKernel } from '@objectstack/runtime';
3
- export interface NextAdapterOptions {
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
- export declare function createRouteHandler(options: NextAdapterOptions): (req: NextRequest, { params }: {
12
+ declare function createRouteHandler(options: NextAdapterOptions): (req: NextRequest, { params }: {
12
13
  params: {
13
14
  objectstack: string[];
14
15
  };
15
16
  }) => Promise<any>;
16
- //# sourceMappingURL=index.d.ts.map
17
+
18
+ export { type NextAdapterOptions, createRouteHandler };
package/dist/index.js CHANGED
@@ -1,106 +1,116 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createRouteHandler = createRouteHandler;
4
- const server_1 = require("next/server");
5
- const runtime_1 = require("@objectstack/runtime");
6
- /**
7
- * Creates a route handler for Next.js App Router
8
- * Handles /api/[...objectstack] pattern
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
- const dispatcher = new runtime_1.HttpDispatcher(options.kernel);
12
- const error = (msg, code = 500) => server_1.NextResponse.json({ success: false, error: { message: msg, code } }, { status: code });
13
- // Helper to convert DispatchResult to NextResponse
14
- const toResponse = (result) => {
15
- if (result.handled) {
16
- if (result.response) {
17
- return server_1.NextResponse.json(result.response.body, {
18
- status: result.response.status,
19
- headers: result.response.headers
20
- });
21
- }
22
- if (result.result) {
23
- const res = result.result;
24
- // Redirect
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
- return error('Not Found', 404);
41
- };
42
- return async function handler(req, { params }) {
43
- const resolvedParams = await Promise.resolve(params);
44
- const segments = resolvedParams.objectstack || [];
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
- try {
51
- const rawRequest = req;
52
- // --- 1. Auth ---
53
- if (segments[0] === 'auth') {
54
- const subPath = segments.slice(1).join('/');
55
- const body = method === 'POST' ? await req.json().catch(() => ({})) : {};
56
- const result = await dispatcher.handleAuth(subPath, method, body, { request: req });
57
- return toResponse(result);
58
- }
59
- // --- 2. GraphQL ---
60
- if (segments[0] === 'graphql' && method === 'POST') {
61
- const body = await req.json();
62
- const result = await dispatcher.handleGraphQL(body, { request: rawRequest });
63
- return server_1.NextResponse.json(result);
64
- }
65
- // --- 3. Metadata ---
66
- if (segments[0] === 'metadata') {
67
- const subPath = segments.slice(1).join('/');
68
- let body = undefined;
69
- if (method === 'PUT' || method === 'POST') {
70
- body = await req.json().catch(() => ({}));
71
- }
72
- const result = await dispatcher.handleMetadata(subPath, { request: rawRequest }, method, body);
73
- return toResponse(result);
74
- }
75
- // --- 4. Data ---
76
- if (segments[0] === 'data') {
77
- const subPath = segments.slice(1).join('/');
78
- let body = {};
79
- if (method === 'POST' || method === 'PATCH') {
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
- catch (err) {
103
- return error(err.message || 'Internal Server Error', err.statusCode || 500);
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.4",
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": "^18.3.1",
9
+ "react": "^19.2.4",
10
10
  "react-dom": "^18.3.1",
11
- "@objectstack/runtime": "1.0.4"
11
+ "@objectstack/runtime": "1.0.6"
12
12
  },
13
13
  "devDependencies": {
14
14
  "next": "^14.0.0",
15
- "react": "^18.3.1",
15
+ "react": "^19.2.4",
16
16
  "react-dom": "^18.3.1",
17
17
  "typescript": "^5.0.0",
18
- "@objectstack/runtime": "1.0.4"
18
+ "@objectstack/runtime": "1.0.6"
19
19
  },
20
20
  "scripts": {
21
- "build": "tsc"
21
+ "build": "tsup --config ../../../tsup.config.ts"
22
22
  }
23
23
  }
@@ -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"}