@objectstack/hono 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 +19 -0
- package/dist/index.d.ts +8 -5
- package/dist/index.js +173 -177
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +153 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +4 -4
- package/dist/index.d.ts.map +0 -1
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
|
|
2
|
+
> @objectstack/hono@1.0.6 build /home/runner/work/spec/spec/packages/adapters/hono
|
|
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
|
+
[32mCJS[39m [1mdist/index.js [22m[32m6.82 KB[39m
|
|
14
|
+
[32mCJS[39m [1mdist/index.js.map [22m[32m11.94 KB[39m
|
|
15
|
+
[32mCJS[39m ⚡️ Build success in 50ms
|
|
16
|
+
[32mESM[39m [1mdist/index.mjs [22m[32m5.72 KB[39m
|
|
17
|
+
[32mESM[39m [1mdist/index.mjs.map [22m[32m11.90 KB[39m
|
|
18
|
+
[32mESM[39m ⚡️ Build success in 51ms
|
|
19
|
+
[34mDTS[39m Build start
|
|
20
|
+
[32mDTS[39m ⚡️ Build success in 9277ms
|
|
21
|
+
[32mDTS[39m [1mdist/index.d.mts [22m[32m664.00 B[39m
|
|
22
|
+
[32mDTS[39m [1mdist/index.d.ts [22m[32m664.00 B[39m
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# @objectstack/hono
|
|
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,19 @@
|
|
|
1
|
+
import * as hono_types from 'hono/types';
|
|
2
|
+
import { Hono } from 'hono';
|
|
3
|
+
import { ObjectKernel } from '@objectstack/runtime';
|
|
4
|
+
|
|
5
|
+
interface ObjectStackHonoOptions {
|
|
6
|
+
kernel: ObjectKernel;
|
|
7
|
+
prefix?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Creates a Hono application tailored for ObjectStack
|
|
11
|
+
* Fully compliant with @objectstack/spec
|
|
12
|
+
*/
|
|
13
|
+
declare function createHonoApp(options: ObjectStackHonoOptions): Hono<hono_types.BlankEnv, hono_types.BlankSchema, "/">;
|
|
14
|
+
/**
|
|
15
|
+
* Middleware mode for existing Hono apps
|
|
16
|
+
*/
|
|
17
|
+
declare function objectStackMiddleware(kernel: ObjectKernel): (c: any, next: any) => Promise<void>;
|
|
18
|
+
|
|
19
|
+
export { type ObjectStackHonoOptions, createHonoApp, objectStackMiddleware };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import * as hono_types from 'hono/types';
|
|
1
2
|
import { Hono } from 'hono';
|
|
2
|
-
import {
|
|
3
|
-
|
|
3
|
+
import { ObjectKernel } from '@objectstack/runtime';
|
|
4
|
+
|
|
5
|
+
interface ObjectStackHonoOptions {
|
|
4
6
|
kernel: ObjectKernel;
|
|
5
7
|
prefix?: string;
|
|
6
8
|
}
|
|
@@ -8,9 +10,10 @@ export interface ObjectStackHonoOptions {
|
|
|
8
10
|
* Creates a Hono application tailored for ObjectStack
|
|
9
11
|
* Fully compliant with @objectstack/spec
|
|
10
12
|
*/
|
|
11
|
-
|
|
13
|
+
declare function createHonoApp(options: ObjectStackHonoOptions): Hono<hono_types.BlankEnv, hono_types.BlankSchema, "/">;
|
|
12
14
|
/**
|
|
13
15
|
* Middleware mode for existing Hono apps
|
|
14
16
|
*/
|
|
15
|
-
|
|
16
|
-
|
|
17
|
+
declare function objectStackMiddleware(kernel: ObjectKernel): (c: any, next: any) => Promise<void>;
|
|
18
|
+
|
|
19
|
+
export { type ObjectStackHonoOptions, createHonoApp, objectStackMiddleware };
|
package/dist/index.js
CHANGED
|
@@ -1,183 +1,179 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
+
createHonoApp: () => createHonoApp,
|
|
24
|
+
objectStackMiddleware: () => objectStackMiddleware
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(index_exports);
|
|
27
|
+
var import_hono = require("hono");
|
|
28
|
+
var import_cors = require("hono/cors");
|
|
29
|
+
var import_runtime = require("@objectstack/runtime");
|
|
12
30
|
function createHonoApp(options) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
catch (err) {
|
|
64
|
-
return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);
|
|
65
|
-
}
|
|
66
|
-
});
|
|
67
|
-
// --- 3. Metadata Endpoints ---
|
|
68
|
-
app.all(`${prefix}/metadata*`, async (c) => {
|
|
69
|
-
try {
|
|
70
|
-
const path = c.req.path.substring(c.req.path.indexOf('/metadata') + 9);
|
|
71
|
-
const method = c.req.method;
|
|
72
|
-
let body = undefined;
|
|
73
|
-
if (method === 'PUT' || method === 'POST') {
|
|
74
|
-
// Attempt to parse JSON body
|
|
75
|
-
try {
|
|
76
|
-
body = await c.req.json();
|
|
77
|
-
}
|
|
78
|
-
catch (e) {
|
|
79
|
-
// Ignore parse errors, body remains undefined or empty
|
|
80
|
-
body = {};
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
const result = await dispatcher.handleMetadata(path, { request: c.req.raw }, method, body);
|
|
84
|
-
return normalizeResponse(c, result);
|
|
85
|
-
}
|
|
86
|
-
catch (err) {
|
|
87
|
-
return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);
|
|
88
|
-
}
|
|
89
|
-
});
|
|
90
|
-
// --- 4. Data Endpoints ---
|
|
91
|
-
app.all(`${prefix}/data*`, async (c) => {
|
|
92
|
-
try {
|
|
93
|
-
const path = c.req.path.substring(c.req.path.indexOf('/data') + 5);
|
|
94
|
-
const method = c.req.method;
|
|
95
|
-
let body = {};
|
|
96
|
-
if (method === 'POST' || method === 'PATCH') {
|
|
97
|
-
body = await c.req.json().catch(() => ({}));
|
|
98
|
-
}
|
|
99
|
-
const query = c.req.query();
|
|
100
|
-
const result = await dispatcher.handleData(path, method, body, query, { request: c.req.raw });
|
|
101
|
-
return normalizeResponse(c, result);
|
|
102
|
-
}
|
|
103
|
-
catch (err) {
|
|
104
|
-
return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);
|
|
105
|
-
}
|
|
106
|
-
});
|
|
107
|
-
// --- 5. Analytics Endpoints ---
|
|
108
|
-
app.all(`${prefix}/analytics*`, async (c) => {
|
|
109
|
-
try {
|
|
110
|
-
const path = c.req.path.substring(c.req.path.indexOf('/analytics') + 10);
|
|
111
|
-
const method = c.req.method;
|
|
112
|
-
let body = {};
|
|
113
|
-
if (method === 'POST') {
|
|
114
|
-
body = await c.req.json().catch(() => ({}));
|
|
115
|
-
}
|
|
116
|
-
const result = await dispatcher.handleAnalytics(path, method, body, { request: c.req.raw });
|
|
117
|
-
return normalizeResponse(c, result);
|
|
118
|
-
}
|
|
119
|
-
catch (err) {
|
|
120
|
-
return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
// --- 6. Hub Endpoints ---
|
|
124
|
-
app.all(`${prefix}/hub*`, async (c) => {
|
|
125
|
-
try {
|
|
126
|
-
const path = c.req.path.substring(c.req.path.indexOf('/hub') + 4);
|
|
127
|
-
const method = c.req.method;
|
|
128
|
-
let body = {};
|
|
129
|
-
if (method === 'POST' || method === 'PATCH' || method === 'PUT') {
|
|
130
|
-
body = await c.req.json().catch(() => ({}));
|
|
131
|
-
}
|
|
132
|
-
const query = c.req.query();
|
|
133
|
-
const result = await dispatcher.handleHub(path, method, body, query, { request: c.req.raw });
|
|
134
|
-
return normalizeResponse(c, result);
|
|
135
|
-
}
|
|
136
|
-
catch (err) {
|
|
137
|
-
return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);
|
|
138
|
-
}
|
|
139
|
-
});
|
|
140
|
-
// --- 7. Automation Endpoints ---
|
|
141
|
-
app.all(`${prefix}/automation*`, async (c) => {
|
|
142
|
-
try {
|
|
143
|
-
const path = c.req.path.substring(c.req.path.indexOf('/automation') + 11);
|
|
144
|
-
const method = c.req.method;
|
|
145
|
-
let body = {};
|
|
146
|
-
if (method === 'POST') {
|
|
147
|
-
body = await c.req.json().catch(() => ({}));
|
|
148
|
-
}
|
|
149
|
-
const result = await dispatcher.handleAutomation(path, method, body, { request: c.req.raw });
|
|
150
|
-
return normalizeResponse(c, result);
|
|
151
|
-
}
|
|
152
|
-
catch (err) {
|
|
153
|
-
return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);
|
|
154
|
-
}
|
|
155
|
-
});
|
|
156
|
-
// --- 8. Storage Endpoints ---
|
|
157
|
-
app.all(`${prefix}/storage*`, async (c) => {
|
|
31
|
+
const app = new import_hono.Hono();
|
|
32
|
+
const { prefix = "/api" } = options;
|
|
33
|
+
const dispatcher = new import_runtime.HttpDispatcher(options.kernel);
|
|
34
|
+
app.use("*", (0, import_cors.cors)());
|
|
35
|
+
const normalizeResponse = (c, result) => {
|
|
36
|
+
if (result.handled) {
|
|
37
|
+
if (result.response) {
|
|
38
|
+
return c.json(result.response.body, result.response.status, result.response.headers);
|
|
39
|
+
}
|
|
40
|
+
if (result.result) {
|
|
41
|
+
const res = result.result;
|
|
42
|
+
if (res.type === "redirect" && res.url) {
|
|
43
|
+
return c.redirect(res.url);
|
|
44
|
+
}
|
|
45
|
+
if (res.type === "stream" && res.stream) {
|
|
46
|
+
return c.body(res.stream, 200, res.headers);
|
|
47
|
+
}
|
|
48
|
+
return res;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return c.json({ success: false, error: { message: "Not Found", code: 404 } }, 404);
|
|
52
|
+
};
|
|
53
|
+
app.get(prefix, (c) => {
|
|
54
|
+
return c.json(dispatcher.getDiscoveryInfo(prefix));
|
|
55
|
+
});
|
|
56
|
+
app.all(`${prefix}/auth/*`, async (c) => {
|
|
57
|
+
try {
|
|
58
|
+
const path = c.req.path.substring(c.req.path.indexOf("/auth/") + 6);
|
|
59
|
+
const body = await c.req.parseBody().catch(() => ({}));
|
|
60
|
+
const result = await dispatcher.handleAuth(path, c.req.method, body, { request: c.req.raw });
|
|
61
|
+
return normalizeResponse(c, result);
|
|
62
|
+
} catch (err) {
|
|
63
|
+
return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
app.post(`${prefix}/graphql`, async (c) => {
|
|
67
|
+
try {
|
|
68
|
+
const body = await c.req.json();
|
|
69
|
+
const result = await dispatcher.handleGraphQL(body, { request: c.req.raw });
|
|
70
|
+
return c.json(result);
|
|
71
|
+
} catch (err) {
|
|
72
|
+
return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
app.all(`${prefix}/metadata*`, async (c) => {
|
|
76
|
+
try {
|
|
77
|
+
const path = c.req.path.substring(c.req.path.indexOf("/metadata") + 9);
|
|
78
|
+
const method = c.req.method;
|
|
79
|
+
let body = void 0;
|
|
80
|
+
if (method === "PUT" || method === "POST") {
|
|
158
81
|
try {
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
82
|
+
body = await c.req.json();
|
|
83
|
+
} catch (e) {
|
|
84
|
+
body = {};
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const result = await dispatcher.handleMetadata(path, { request: c.req.raw }, method, body);
|
|
88
|
+
return normalizeResponse(c, result);
|
|
89
|
+
} catch (err) {
|
|
90
|
+
return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
app.all(`${prefix}/data*`, async (c) => {
|
|
94
|
+
try {
|
|
95
|
+
const path = c.req.path.substring(c.req.path.indexOf("/data") + 5);
|
|
96
|
+
const method = c.req.method;
|
|
97
|
+
let body = {};
|
|
98
|
+
if (method === "POST" || method === "PATCH") {
|
|
99
|
+
body = await c.req.json().catch(() => ({}));
|
|
100
|
+
}
|
|
101
|
+
const query = c.req.query();
|
|
102
|
+
const result = await dispatcher.handleData(path, method, body, query, { request: c.req.raw });
|
|
103
|
+
return normalizeResponse(c, result);
|
|
104
|
+
} catch (err) {
|
|
105
|
+
return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
app.all(`${prefix}/analytics*`, async (c) => {
|
|
109
|
+
try {
|
|
110
|
+
const path = c.req.path.substring(c.req.path.indexOf("/analytics") + 10);
|
|
111
|
+
const method = c.req.method;
|
|
112
|
+
let body = {};
|
|
113
|
+
if (method === "POST") {
|
|
114
|
+
body = await c.req.json().catch(() => ({}));
|
|
115
|
+
}
|
|
116
|
+
const result = await dispatcher.handleAnalytics(path, method, body, { request: c.req.raw });
|
|
117
|
+
return normalizeResponse(c, result);
|
|
118
|
+
} catch (err) {
|
|
119
|
+
return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
app.all(`${prefix}/hub*`, async (c) => {
|
|
123
|
+
try {
|
|
124
|
+
const path = c.req.path.substring(c.req.path.indexOf("/hub") + 4);
|
|
125
|
+
const method = c.req.method;
|
|
126
|
+
let body = {};
|
|
127
|
+
if (method === "POST" || method === "PATCH" || method === "PUT") {
|
|
128
|
+
body = await c.req.json().catch(() => ({}));
|
|
129
|
+
}
|
|
130
|
+
const query = c.req.query();
|
|
131
|
+
const result = await dispatcher.handleHub(path, method, body, query, { request: c.req.raw });
|
|
132
|
+
return normalizeResponse(c, result);
|
|
133
|
+
} catch (err) {
|
|
134
|
+
return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
app.all(`${prefix}/automation*`, async (c) => {
|
|
138
|
+
try {
|
|
139
|
+
const path = c.req.path.substring(c.req.path.indexOf("/automation") + 11);
|
|
140
|
+
const method = c.req.method;
|
|
141
|
+
let body = {};
|
|
142
|
+
if (method === "POST") {
|
|
143
|
+
body = await c.req.json().catch(() => ({}));
|
|
144
|
+
}
|
|
145
|
+
const result = await dispatcher.handleAutomation(path, method, body, { request: c.req.raw });
|
|
146
|
+
return normalizeResponse(c, result);
|
|
147
|
+
} catch (err) {
|
|
148
|
+
return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
app.all(`${prefix}/storage*`, async (c) => {
|
|
152
|
+
try {
|
|
153
|
+
const path = c.req.path.substring(c.req.path.indexOf("/storage") + 8);
|
|
154
|
+
const method = c.req.method;
|
|
155
|
+
let file = void 0;
|
|
156
|
+
if (method === "POST" && path.includes("upload")) {
|
|
157
|
+
const body = await c.req.parseBody();
|
|
158
|
+
file = body["file"];
|
|
159
|
+
}
|
|
160
|
+
const result = await dispatcher.handleStorage(path, method, file, { request: c.req.raw });
|
|
161
|
+
return normalizeResponse(c, result);
|
|
162
|
+
} catch (err) {
|
|
163
|
+
return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
return app;
|
|
174
167
|
}
|
|
175
|
-
/**
|
|
176
|
-
* Middleware mode for existing Hono apps
|
|
177
|
-
*/
|
|
178
168
|
function objectStackMiddleware(kernel) {
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
169
|
+
return async (c, next) => {
|
|
170
|
+
c.set("objectStack", kernel);
|
|
171
|
+
await next();
|
|
172
|
+
};
|
|
183
173
|
}
|
|
174
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
175
|
+
0 && (module.exports = {
|
|
176
|
+
createHonoApp,
|
|
177
|
+
objectStackMiddleware
|
|
178
|
+
});
|
|
179
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport { type ObjectKernel, HttpDispatcher, HttpDispatcherResult } from '@objectstack/runtime';\n\nexport interface ObjectStackHonoOptions {\n kernel: ObjectKernel;\n prefix?: string;\n}\n\n/**\n * Creates a Hono application tailored for ObjectStack\n * Fully compliant with @objectstack/spec\n */\nexport function createHonoApp(options: ObjectStackHonoOptions) {\n const app = new Hono();\n const { prefix = '/api' } = options;\n const dispatcher = new HttpDispatcher(options.kernel);\n\n app.use('*', cors());\n\n // --- Helper for Response Normalization ---\n const normalizeResponse = (c: any, result: HttpDispatcherResult) => {\n if (result.handled) {\n if (result.response) {\n return c.json(result.response.body, result.response.status as any, result.response.headers);\n }\n if (result.result) {\n const res = result.result;\n // Redirect\n if (res.type === 'redirect' && res.url) {\n return c.redirect(res.url);\n }\n // Stream\n if (res.type === 'stream' && res.stream) {\n return c.body(res.stream, 200, res.headers);\n }\n \n // Hono handles standard Response objects\n return res;\n }\n }\n return c.json({ success: false, error: { message: 'Not Found', code: 404 } }, 404);\n }\n\n // --- 0. Discovery Endpoint ---\n app.get(prefix, (c) => {\n return c.json(dispatcher.getDiscoveryInfo(prefix));\n });\n\n // --- 1. Auth ---\n app.all(`${prefix}/auth/*`, async (c) => {\n try {\n // subpath from /api/auth/login -> login\n const path = c.req.path.substring(c.req.path.indexOf('/auth/') + 6);\n const body = await c.req.parseBody().catch(() => ({})); \n \n const result = await dispatcher.handleAuth(path, c.req.method, body, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 2. GraphQL ---\n app.post(`${prefix}/graphql`, async (c) => {\n try {\n const body = await c.req.json();\n const result = await dispatcher.handleGraphQL(body, { request: c.req.raw });\n return c.json(result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 3. Metadata Endpoints ---\n app.all(`${prefix}/metadata*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/metadata') + 9);\n const method = c.req.method;\n let body = undefined;\n \n if (method === 'PUT' || method === 'POST') {\n // Attempt to parse JSON body\n try {\n body = await c.req.json();\n } catch (e) {\n // Ignore parse errors, body remains undefined or empty\n body = {};\n }\n }\n\n const result = await dispatcher.handleMetadata(path, { request: c.req.raw }, method, body);\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 4. Data Endpoints ---\n app.all(`${prefix}/data*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/data') + 5);\n const method = c.req.method;\n \n let body = {};\n if (method === 'POST' || method === 'PATCH') {\n body = await c.req.json().catch(() => ({}));\n }\n const query = c.req.query();\n\n const result = await dispatcher.handleData(path, method, body, query, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 5. Analytics Endpoints ---\n app.all(`${prefix}/analytics*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/analytics') + 10);\n const method = c.req.method;\n \n let body = {};\n if (method === 'POST') {\n body = await c.req.json().catch(() => ({}));\n }\n\n const result = await dispatcher.handleAnalytics(path, method, body, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 6. Hub Endpoints ---\n app.all(`${prefix}/hub*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/hub') + 4);\n const method = c.req.method;\n \n let body = {};\n if (method === 'POST' || method === 'PATCH' || method === 'PUT') {\n body = await c.req.json().catch(() => ({}));\n }\n const query = c.req.query();\n\n const result = await dispatcher.handleHub(path, method, body, query, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 7. Automation Endpoints ---\n app.all(`${prefix}/automation*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/automation') + 11);\n const method = c.req.method;\n \n let body = {};\n if (method === 'POST') {\n body = await c.req.json().catch(() => ({}));\n }\n\n const result = await dispatcher.handleAutomation(path, method, body, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 8. Storage Endpoints ---\n app.all(`${prefix}/storage*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/storage') + 8);\n const method = c.req.method;\n \n let file: any = undefined;\n if (method === 'POST' && path.includes('upload')) {\n const body = await c.req.parseBody();\n file = body['file'];\n }\n\n const result = await dispatcher.handleStorage(path, method, file, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n return app;\n}\n\n/**\n * Middleware mode for existing Hono apps\n */\nexport function objectStackMiddleware(kernel: ObjectKernel) {\n return async (c: any, next: any) => {\n c.set('objectStack', kernel);\n await next();\n };\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
// src/index.ts
|
|
2
|
+
import { Hono } from "hono";
|
|
3
|
+
import { cors } from "hono/cors";
|
|
4
|
+
import { HttpDispatcher } from "@objectstack/runtime";
|
|
5
|
+
function createHonoApp(options) {
|
|
6
|
+
const app = new Hono();
|
|
7
|
+
const { prefix = "/api" } = options;
|
|
8
|
+
const dispatcher = new HttpDispatcher(options.kernel);
|
|
9
|
+
app.use("*", cors());
|
|
10
|
+
const normalizeResponse = (c, result) => {
|
|
11
|
+
if (result.handled) {
|
|
12
|
+
if (result.response) {
|
|
13
|
+
return c.json(result.response.body, result.response.status, result.response.headers);
|
|
14
|
+
}
|
|
15
|
+
if (result.result) {
|
|
16
|
+
const res = result.result;
|
|
17
|
+
if (res.type === "redirect" && res.url) {
|
|
18
|
+
return c.redirect(res.url);
|
|
19
|
+
}
|
|
20
|
+
if (res.type === "stream" && res.stream) {
|
|
21
|
+
return c.body(res.stream, 200, res.headers);
|
|
22
|
+
}
|
|
23
|
+
return res;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return c.json({ success: false, error: { message: "Not Found", code: 404 } }, 404);
|
|
27
|
+
};
|
|
28
|
+
app.get(prefix, (c) => {
|
|
29
|
+
return c.json(dispatcher.getDiscoveryInfo(prefix));
|
|
30
|
+
});
|
|
31
|
+
app.all(`${prefix}/auth/*`, async (c) => {
|
|
32
|
+
try {
|
|
33
|
+
const path = c.req.path.substring(c.req.path.indexOf("/auth/") + 6);
|
|
34
|
+
const body = await c.req.parseBody().catch(() => ({}));
|
|
35
|
+
const result = await dispatcher.handleAuth(path, c.req.method, body, { request: c.req.raw });
|
|
36
|
+
return normalizeResponse(c, result);
|
|
37
|
+
} catch (err) {
|
|
38
|
+
return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
app.post(`${prefix}/graphql`, async (c) => {
|
|
42
|
+
try {
|
|
43
|
+
const body = await c.req.json();
|
|
44
|
+
const result = await dispatcher.handleGraphQL(body, { request: c.req.raw });
|
|
45
|
+
return c.json(result);
|
|
46
|
+
} catch (err) {
|
|
47
|
+
return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
app.all(`${prefix}/metadata*`, async (c) => {
|
|
51
|
+
try {
|
|
52
|
+
const path = c.req.path.substring(c.req.path.indexOf("/metadata") + 9);
|
|
53
|
+
const method = c.req.method;
|
|
54
|
+
let body = void 0;
|
|
55
|
+
if (method === "PUT" || method === "POST") {
|
|
56
|
+
try {
|
|
57
|
+
body = await c.req.json();
|
|
58
|
+
} catch (e) {
|
|
59
|
+
body = {};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const result = await dispatcher.handleMetadata(path, { request: c.req.raw }, method, body);
|
|
63
|
+
return normalizeResponse(c, result);
|
|
64
|
+
} catch (err) {
|
|
65
|
+
return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
app.all(`${prefix}/data*`, async (c) => {
|
|
69
|
+
try {
|
|
70
|
+
const path = c.req.path.substring(c.req.path.indexOf("/data") + 5);
|
|
71
|
+
const method = c.req.method;
|
|
72
|
+
let body = {};
|
|
73
|
+
if (method === "POST" || method === "PATCH") {
|
|
74
|
+
body = await c.req.json().catch(() => ({}));
|
|
75
|
+
}
|
|
76
|
+
const query = c.req.query();
|
|
77
|
+
const result = await dispatcher.handleData(path, method, body, query, { request: c.req.raw });
|
|
78
|
+
return normalizeResponse(c, result);
|
|
79
|
+
} catch (err) {
|
|
80
|
+
return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
app.all(`${prefix}/analytics*`, async (c) => {
|
|
84
|
+
try {
|
|
85
|
+
const path = c.req.path.substring(c.req.path.indexOf("/analytics") + 10);
|
|
86
|
+
const method = c.req.method;
|
|
87
|
+
let body = {};
|
|
88
|
+
if (method === "POST") {
|
|
89
|
+
body = await c.req.json().catch(() => ({}));
|
|
90
|
+
}
|
|
91
|
+
const result = await dispatcher.handleAnalytics(path, method, body, { request: c.req.raw });
|
|
92
|
+
return normalizeResponse(c, result);
|
|
93
|
+
} catch (err) {
|
|
94
|
+
return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
app.all(`${prefix}/hub*`, async (c) => {
|
|
98
|
+
try {
|
|
99
|
+
const path = c.req.path.substring(c.req.path.indexOf("/hub") + 4);
|
|
100
|
+
const method = c.req.method;
|
|
101
|
+
let body = {};
|
|
102
|
+
if (method === "POST" || method === "PATCH" || method === "PUT") {
|
|
103
|
+
body = await c.req.json().catch(() => ({}));
|
|
104
|
+
}
|
|
105
|
+
const query = c.req.query();
|
|
106
|
+
const result = await dispatcher.handleHub(path, method, body, query, { request: c.req.raw });
|
|
107
|
+
return normalizeResponse(c, result);
|
|
108
|
+
} catch (err) {
|
|
109
|
+
return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
app.all(`${prefix}/automation*`, async (c) => {
|
|
113
|
+
try {
|
|
114
|
+
const path = c.req.path.substring(c.req.path.indexOf("/automation") + 11);
|
|
115
|
+
const method = c.req.method;
|
|
116
|
+
let body = {};
|
|
117
|
+
if (method === "POST") {
|
|
118
|
+
body = await c.req.json().catch(() => ({}));
|
|
119
|
+
}
|
|
120
|
+
const result = await dispatcher.handleAutomation(path, method, body, { request: c.req.raw });
|
|
121
|
+
return normalizeResponse(c, result);
|
|
122
|
+
} catch (err) {
|
|
123
|
+
return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
app.all(`${prefix}/storage*`, async (c) => {
|
|
127
|
+
try {
|
|
128
|
+
const path = c.req.path.substring(c.req.path.indexOf("/storage") + 8);
|
|
129
|
+
const method = c.req.method;
|
|
130
|
+
let file = void 0;
|
|
131
|
+
if (method === "POST" && path.includes("upload")) {
|
|
132
|
+
const body = await c.req.parseBody();
|
|
133
|
+
file = body["file"];
|
|
134
|
+
}
|
|
135
|
+
const result = await dispatcher.handleStorage(path, method, file, { request: c.req.raw });
|
|
136
|
+
return normalizeResponse(c, result);
|
|
137
|
+
} catch (err) {
|
|
138
|
+
return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
return app;
|
|
142
|
+
}
|
|
143
|
+
function objectStackMiddleware(kernel) {
|
|
144
|
+
return async (c, next) => {
|
|
145
|
+
c.set("objectStack", kernel);
|
|
146
|
+
await next();
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
export {
|
|
150
|
+
createHonoApp,
|
|
151
|
+
objectStackMiddleware
|
|
152
|
+
};
|
|
153
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { Hono } from 'hono';\nimport { cors } from 'hono/cors';\nimport { type ObjectKernel, HttpDispatcher, HttpDispatcherResult } from '@objectstack/runtime';\n\nexport interface ObjectStackHonoOptions {\n kernel: ObjectKernel;\n prefix?: string;\n}\n\n/**\n * Creates a Hono application tailored for ObjectStack\n * Fully compliant with @objectstack/spec\n */\nexport function createHonoApp(options: ObjectStackHonoOptions) {\n const app = new Hono();\n const { prefix = '/api' } = options;\n const dispatcher = new HttpDispatcher(options.kernel);\n\n app.use('*', cors());\n\n // --- Helper for Response Normalization ---\n const normalizeResponse = (c: any, result: HttpDispatcherResult) => {\n if (result.handled) {\n if (result.response) {\n return c.json(result.response.body, result.response.status as any, result.response.headers);\n }\n if (result.result) {\n const res = result.result;\n // Redirect\n if (res.type === 'redirect' && res.url) {\n return c.redirect(res.url);\n }\n // Stream\n if (res.type === 'stream' && res.stream) {\n return c.body(res.stream, 200, res.headers);\n }\n \n // Hono handles standard Response objects\n return res;\n }\n }\n return c.json({ success: false, error: { message: 'Not Found', code: 404 } }, 404);\n }\n\n // --- 0. Discovery Endpoint ---\n app.get(prefix, (c) => {\n return c.json(dispatcher.getDiscoveryInfo(prefix));\n });\n\n // --- 1. Auth ---\n app.all(`${prefix}/auth/*`, async (c) => {\n try {\n // subpath from /api/auth/login -> login\n const path = c.req.path.substring(c.req.path.indexOf('/auth/') + 6);\n const body = await c.req.parseBody().catch(() => ({})); \n \n const result = await dispatcher.handleAuth(path, c.req.method, body, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 2. GraphQL ---\n app.post(`${prefix}/graphql`, async (c) => {\n try {\n const body = await c.req.json();\n const result = await dispatcher.handleGraphQL(body, { request: c.req.raw });\n return c.json(result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 3. Metadata Endpoints ---\n app.all(`${prefix}/metadata*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/metadata') + 9);\n const method = c.req.method;\n let body = undefined;\n \n if (method === 'PUT' || method === 'POST') {\n // Attempt to parse JSON body\n try {\n body = await c.req.json();\n } catch (e) {\n // Ignore parse errors, body remains undefined or empty\n body = {};\n }\n }\n\n const result = await dispatcher.handleMetadata(path, { request: c.req.raw }, method, body);\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 4. Data Endpoints ---\n app.all(`${prefix}/data*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/data') + 5);\n const method = c.req.method;\n \n let body = {};\n if (method === 'POST' || method === 'PATCH') {\n body = await c.req.json().catch(() => ({}));\n }\n const query = c.req.query();\n\n const result = await dispatcher.handleData(path, method, body, query, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 5. Analytics Endpoints ---\n app.all(`${prefix}/analytics*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/analytics') + 10);\n const method = c.req.method;\n \n let body = {};\n if (method === 'POST') {\n body = await c.req.json().catch(() => ({}));\n }\n\n const result = await dispatcher.handleAnalytics(path, method, body, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 6. Hub Endpoints ---\n app.all(`${prefix}/hub*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/hub') + 4);\n const method = c.req.method;\n \n let body = {};\n if (method === 'POST' || method === 'PATCH' || method === 'PUT') {\n body = await c.req.json().catch(() => ({}));\n }\n const query = c.req.query();\n\n const result = await dispatcher.handleHub(path, method, body, query, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 7. Automation Endpoints ---\n app.all(`${prefix}/automation*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/automation') + 11);\n const method = c.req.method;\n \n let body = {};\n if (method === 'POST') {\n body = await c.req.json().catch(() => ({}));\n }\n\n const result = await dispatcher.handleAutomation(path, method, body, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n // --- 8. Storage Endpoints ---\n app.all(`${prefix}/storage*`, async (c) => {\n try {\n const path = c.req.path.substring(c.req.path.indexOf('/storage') + 8);\n const method = c.req.method;\n \n let file: any = undefined;\n if (method === 'POST' && path.includes('upload')) {\n const body = await c.req.parseBody();\n file = body['file'];\n }\n\n const result = await dispatcher.handleStorage(path, method, file, { request: c.req.raw });\n return normalizeResponse(c, result);\n } catch (err: any) {\n return c.json({ success: false, error: { message: err.message, code: err.statusCode || 500 } }, err.statusCode || 500);\n }\n });\n\n return app;\n}\n\n/**\n * Middleware mode for existing Hono apps\n */\nexport function objectStackMiddleware(kernel: ObjectKernel) {\n return async (c: any, next: any) => {\n c.set('objectStack', kernel);\n await next();\n };\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@objectstack/hono",
|
|
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",
|
|
@@ -13,14 +13,14 @@
|
|
|
13
13
|
},
|
|
14
14
|
"peerDependencies": {
|
|
15
15
|
"hono": "^4.0.0",
|
|
16
|
-
"@objectstack/runtime": "1.0.
|
|
16
|
+
"@objectstack/runtime": "1.0.6"
|
|
17
17
|
},
|
|
18
18
|
"devDependencies": {
|
|
19
19
|
"hono": "^4.0.0",
|
|
20
20
|
"typescript": "^5.0.0",
|
|
21
|
-
"@objectstack/runtime": "1.0.
|
|
21
|
+
"@objectstack/runtime": "1.0.6"
|
|
22
22
|
},
|
|
23
23
|
"scripts": {
|
|
24
|
-
"build": "
|
|
24
|
+
"build": "tsup --config ../../../tsup.config.ts"
|
|
25
25
|
}
|
|
26
26
|
}
|
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,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,KAAK,YAAY,EAAwC,MAAM,sBAAsB,CAAC;AAE/F,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,sBAAsB,8EAmL5D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,YAAY,IAC1C,GAAG,GAAG,EAAE,MAAM,GAAG,mBAIhC"}
|