@karbonjs/api 0.3.0 → 0.3.2
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/README.md +16 -1
- package/dist/client/client.d.ts.map +1 -1
- package/dist/client/client.js +11 -3
- package/dist/client/client.js.map +1 -1
- package/dist/server/proxy.d.ts.map +1 -1
- package/dist/server/proxy.js +24 -10
- package/dist/server/proxy.js.map +1 -1
- package/dist/server/server.js +1 -1
- package/dist/server/server.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -50,10 +50,25 @@ const api = createClientApi({
|
|
|
50
50
|
},
|
|
51
51
|
})
|
|
52
52
|
|
|
53
|
-
// Auto-refreshes token on 401
|
|
53
|
+
// Auto-refreshes token on 401 (max 3 retries, then calls onAuthFailure)
|
|
54
54
|
const articles = await api('/articles')
|
|
55
55
|
```
|
|
56
56
|
|
|
57
|
+
## API Proxy (SvelteKit)
|
|
58
|
+
|
|
59
|
+
```typescript
|
|
60
|
+
import { createProxy } from '@karbonjs/api/server'
|
|
61
|
+
|
|
62
|
+
export const { GET, POST, PUT, PATCH, DELETE } = createProxy({
|
|
63
|
+
backend: 'http://localhost:8080',
|
|
64
|
+
prefix: '/api',
|
|
65
|
+
csrf: true,
|
|
66
|
+
rateLimit: { '*': { max: 200, windowSec: 60 } },
|
|
67
|
+
})
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Security: path sanitization, CSRF strict origin check, X-Forwarded-For sanitization, rate limiting, body size limit.
|
|
71
|
+
|
|
57
72
|
## Options
|
|
58
73
|
|
|
59
74
|
```typescript
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAEhE,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,gCAAgC;IAChC,QAAQ,EAAE,MAAM,MAAM,GAAG,IAAI,CAAA;IAC7B,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IAC3C,4DAA4D;IAC5D,aAAa,CAAC,EAAE,MAAM,IAAI,CAAA;IAC1B,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,8CAA8C;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACxC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAEhE,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,gCAAgC;IAChC,QAAQ,EAAE,MAAM,MAAM,GAAG,IAAI,CAAA;IAC7B,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IAC3C,4DAA4D;IAC5D,aAAa,CAAC,EAAE,MAAM,IAAI,CAAA;IAC1B,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,8CAA8C;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACxC;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,IAI3B,CAAC,SAAS,SAAS,GAAG,SAAS,EACvD,UAAU,MAAM,EAChB,UAAS,cAAmB,KAC3B,OAAO,CAAC,CAAC,CAAC,CAoFd"}
|
package/dist/client/client.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export function createClientApi(config) {
|
|
5
5
|
let refreshPromise = null;
|
|
6
|
+
let refreshFailures = 0;
|
|
6
7
|
return async function api(endpoint, options = {}) {
|
|
7
8
|
const { method = 'GET', body, headers: extraHeaders, timeout } = options;
|
|
8
9
|
const token = options.token ?? config.getToken();
|
|
@@ -35,8 +36,8 @@ export function createClientApi(config) {
|
|
|
35
36
|
};
|
|
36
37
|
try {
|
|
37
38
|
let res = await doFetch(token);
|
|
38
|
-
// Auto-refresh on 401
|
|
39
|
-
if (res.status === 401 && config.refreshToken) {
|
|
39
|
+
// Auto-refresh on 401 (with loop guard)
|
|
40
|
+
if (res.status === 401 && config.refreshToken && refreshFailures < 3) {
|
|
40
41
|
if (!refreshPromise) {
|
|
41
42
|
refreshPromise = Promise.race([
|
|
42
43
|
config.refreshToken(),
|
|
@@ -46,8 +47,15 @@ export function createClientApi(config) {
|
|
|
46
47
|
const newToken = await refreshPromise;
|
|
47
48
|
if (newToken) {
|
|
48
49
|
res = await doFetch(newToken);
|
|
50
|
+
if (res.status === 401) {
|
|
51
|
+
refreshFailures++;
|
|
52
|
+
config.onAuthFailure?.();
|
|
53
|
+
return { ok: false, status: 401, message: 'Authentication failed' };
|
|
54
|
+
}
|
|
55
|
+
refreshFailures = 0;
|
|
49
56
|
}
|
|
50
57
|
else {
|
|
58
|
+
refreshFailures++;
|
|
51
59
|
config.onAuthFailure?.();
|
|
52
60
|
return { ok: false, status: 401, message: 'Authentication failed' };
|
|
53
61
|
}
|
|
@@ -70,7 +78,7 @@ export function createClientApi(config) {
|
|
|
70
78
|
return { ...data, ok: true };
|
|
71
79
|
}
|
|
72
80
|
catch (err) {
|
|
73
|
-
const message = err instanceof
|
|
81
|
+
const message = (err instanceof Error && err.name === 'AbortError')
|
|
74
82
|
? 'Request timeout'
|
|
75
83
|
: 'Network error';
|
|
76
84
|
return { ok: false, status: 0, message };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":"AAgBA;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAAuB;IACrD,IAAI,cAAc,GAAkC,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/server/proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAqB,KAAK,cAAc,EAAoB,MAAM,mBAAmB,CAAA;AAE5F,MAAM,WAAW,WAAW;IAC1B,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAA;IACf,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,qEAAqE;IACrE,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAC1B,+DAA+D;IAC/D,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,yFAAyF;IACzF,SAAS,CAAC,EAAE,cAAc,GAAG,KAAK,CAAA;CACnC;AAED,+EAA+E;AAC/E,UAAU,YAAY;IACpB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,GAAG,EAAE,GAAG,CAAA;IACR,gBAAgB,EAAE,MAAM,MAAM,CAAA;CAC/B;AAED,KAAK,OAAO,GAAG,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AASzD;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW;;;;;;
|
|
1
|
+
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/server/proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAqB,KAAK,cAAc,EAAoB,MAAM,mBAAmB,CAAA;AAE5F,MAAM,WAAW,WAAW;IAC1B,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAA;IACf,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,qEAAqE;IACrE,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;IAC1B,+DAA+D;IAC/D,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,yFAAyF;IACzF,SAAS,CAAC,EAAE,cAAc,GAAG,KAAK,CAAA;CACnC;AAED,+EAA+E;AAC/E,UAAU,YAAY;IACpB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,GAAG,EAAE,GAAG,CAAA;IACR,gBAAgB,EAAE,MAAM,MAAM,CAAA;CAC/B;AAED,KAAK,OAAO,GAAG,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAA;AASzD;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW;;;;;;EA8J9C"}
|
package/dist/server/proxy.js
CHANGED
|
@@ -60,8 +60,15 @@ export function createProxy(config) {
|
|
|
60
60
|
const { request, params, url } = event;
|
|
61
61
|
const rawPath = params.path ?? '';
|
|
62
62
|
// 1. Sanitize path
|
|
63
|
-
|
|
64
|
-
|
|
63
|
+
let decodedPath;
|
|
64
|
+
try {
|
|
65
|
+
decodedPath = decodeURIComponent(rawPath);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return new Response('Forbidden path', { status: 400 });
|
|
69
|
+
}
|
|
70
|
+
if (decodedPath.includes('..') || rawPath.includes('%2e') || rawPath.includes('%2E') || rawPath.includes('//')) {
|
|
71
|
+
return new Response('Forbidden path', { status: 403 });
|
|
65
72
|
}
|
|
66
73
|
// 2. Block forbidden prefixes
|
|
67
74
|
const firstSegment = rawPath.split('/')[0];
|
|
@@ -76,8 +83,9 @@ export function createProxy(config) {
|
|
|
76
83
|
}
|
|
77
84
|
catch { /* dev mode */ }
|
|
78
85
|
// 4. Rate limiting
|
|
86
|
+
let rl = null;
|
|
79
87
|
if (limiter) {
|
|
80
|
-
|
|
88
|
+
rl = limiter.check(clientIp, path);
|
|
81
89
|
if (!rl.allowed) {
|
|
82
90
|
return jsonResponse(429, 'Too many requests', {
|
|
83
91
|
'retry-after': String(rl.retryAfterSec ?? 60),
|
|
@@ -87,18 +95,21 @@ export function createProxy(config) {
|
|
|
87
95
|
}
|
|
88
96
|
}
|
|
89
97
|
// 5. CSRF — mutating requests must come from same origin
|
|
90
|
-
if (csrf &&
|
|
98
|
+
if (csrf && ['POST', 'PUT', 'PATCH', 'DELETE'].includes(request.method)) {
|
|
91
99
|
const origin = request.headers.get('origin');
|
|
92
100
|
const host = request.headers.get('host');
|
|
93
|
-
if (origin
|
|
101
|
+
if (!origin) {
|
|
102
|
+
return jsonResponse(403, 'CSRF: Origin header required');
|
|
103
|
+
}
|
|
104
|
+
if (host) {
|
|
94
105
|
try {
|
|
95
106
|
const originHost = new URL(origin).host;
|
|
96
107
|
if (originHost !== host) {
|
|
97
|
-
return jsonResponse(403, '
|
|
108
|
+
return jsonResponse(403, 'CSRF: Origin mismatch');
|
|
98
109
|
}
|
|
99
110
|
}
|
|
100
111
|
catch {
|
|
101
|
-
return jsonResponse(403, '
|
|
112
|
+
return jsonResponse(403, 'CSRF: Invalid origin');
|
|
102
113
|
}
|
|
103
114
|
}
|
|
104
115
|
}
|
|
@@ -111,6 +122,7 @@ export function createProxy(config) {
|
|
|
111
122
|
const cookies = request.headers.get('cookie');
|
|
112
123
|
if (cookies)
|
|
113
124
|
headers.set('cookie', cookies);
|
|
125
|
+
headers.delete('x-forwarded-for');
|
|
114
126
|
headers.set('x-forwarded-for', clientIp);
|
|
115
127
|
// 7. Stream body with size check
|
|
116
128
|
let body = null;
|
|
@@ -119,6 +131,9 @@ export function createProxy(config) {
|
|
|
119
131
|
if (contentLength && parseInt(contentLength) > maxBodySize) {
|
|
120
132
|
return jsonResponse(413, 'Request too large');
|
|
121
133
|
}
|
|
134
|
+
// NOTE: When no Content-Length header is present (e.g. chunked transfer encoding),
|
|
135
|
+
// the body size check above is bypassed. The backend server MUST enforce its own
|
|
136
|
+
// body size limits to prevent abuse via chunked requests.
|
|
122
137
|
body = request.body;
|
|
123
138
|
}
|
|
124
139
|
// 8. Proxy to backend
|
|
@@ -138,9 +153,8 @@ export function createProxy(config) {
|
|
|
138
153
|
// 9. Build response — stream back
|
|
139
154
|
const responseHeaders = new Headers();
|
|
140
155
|
responseHeaders.set('content-type', apiRes.headers.get('content-type') || 'application/json');
|
|
141
|
-
// Rate limit info
|
|
142
|
-
if (
|
|
143
|
-
const rl = limiter.check(clientIp, path);
|
|
156
|
+
// Rate limit info (reuse the already-counted check from above — no second call)
|
|
157
|
+
if (rl) {
|
|
144
158
|
responseHeaders.set('x-ratelimit-limit', String(rl.limit));
|
|
145
159
|
responseHeaders.set('x-ratelimit-remaining', String(rl.remaining));
|
|
146
160
|
}
|
package/dist/server/proxy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/server/proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAE,iBAAiB,EAAyC,MAAM,mBAAmB,CAAA;AA2B5F,SAAS,YAAY,CAAC,MAAc,EAAE,OAAe,EAAE,KAA8B;IACnF,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE;QAC/D,MAAM;QACN,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,KAAK,EAAE;KAC1D,CAAC,CAAA;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,MAAmB;IAC7C,MAAM,EACJ,OAAO,EACP,MAAM,GAAG,MAAM,EACf,WAAW,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,EAC9B,eAAe,GAAG,CAAC,UAAU,CAAC,EAC9B,IAAI,GAAG,IAAI,EACX,SAAS,EAAE,eAAe,GAC3B,GAAG,MAAM,CAAA;IAEV,uBAAuB;IACvB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAA;QAC5B,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAChD,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAA;QACvD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,wBAAwB,OAAO,EAAE,CAAC,CAAA;IACpD,CAAC;IAED,sCAAsC;IACtC,IAAI,OAAO,GAAuB,IAAI,CAAA;IACtC,IAAI,eAAe,KAAK,KAAK,EAAE,CAAC;QAC9B,OAAO,GAAG,iBAAiB,CAAC,eAAe,IAAI,SAAS,CAAC,CAAA;IAC3D,CAAC;IAED,MAAM,OAAO,GAAY,KAAK,EAAE,KAAK,EAAE,EAAE;QACvC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,CAAA;QACtC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAA;QAEjC,mBAAmB;QACnB,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/server/proxy.ts"],"names":[],"mappings":"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"}
|
package/dist/server/server.js
CHANGED
|
@@ -24,7 +24,7 @@ export function createServerApi(baseUrl, defaultTimeout = 15_000) {
|
|
|
24
24
|
});
|
|
25
25
|
}
|
|
26
26
|
catch (err) {
|
|
27
|
-
const message = err instanceof
|
|
27
|
+
const message = (err instanceof Error && err.name === 'AbortError')
|
|
28
28
|
? 'Request timeout'
|
|
29
29
|
: 'Service temporarily unavailable';
|
|
30
30
|
return { ok: false, status: 503, message };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,cAAc,GAAG,MAAM;IACtE,OAAO,KAAK,UAAU,OAAO,CAC3B,QAAgB,EAChB,UAA0B,EAAE;QAE5B,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;QAE/E,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,GAAG,YAAY;SAChB,CAAA;QAED,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,EAAE,CAAA;QAC9C,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;QACxC,MAAM,EAAE,GAAG,OAAO,IAAI,cAAc,CAAA;QACpC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAA;QAEtD,IAAI,GAAa,CAAA;QACjB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,GAAG,QAAQ,EAAE,EAAE;gBACzC,MAAM;gBACN,OAAO;gBACP,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;gBAC7C,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,cAAc,GAAG,MAAM;IACtE,OAAO,KAAK,UAAU,OAAO,CAC3B,QAAgB,EAChB,UAA0B,EAAE;QAE5B,MAAM,EAAE,MAAM,GAAG,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;QAE/E,MAAM,OAAO,GAA2B;YACtC,cAAc,EAAE,kBAAkB;YAClC,GAAG,YAAY;SAChB,CAAA;QAED,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,EAAE,CAAA;QAC9C,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;QACxC,MAAM,EAAE,GAAG,OAAO,IAAI,cAAc,CAAA;QACpC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,EAAE,CAAC,CAAA;QAEtD,IAAI,GAAa,CAAA;QACjB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,GAAG,QAAQ,EAAE,EAAE;gBACzC,MAAM;gBACN,OAAO;gBACP,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;gBAC7C,MAAM,EAAE,UAAU,CAAC,MAAM;aAC1B,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,CAAC,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC;gBACjE,CAAC,CAAC,iBAAiB;gBACnB,CAAC,CAAC,iCAAiC,CAAA;YACrC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAO,CAAA;QACjD,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAA;QACrB,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;YAC7B,IAAI,OAAe,CAAA;YACnB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;gBAC/B,OAAO,GAAG,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;YAClG,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;YAC9B,CAAC;YACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAO,CAAA;QACxD,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAO,CAAA;QAChD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;QAC7B,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,IAAI,EAAO,CAAA;IACnC,CAAC,CAAA;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@karbonjs/api",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.2",
|
|
4
4
|
"description": "Type-safe API client for Karbon backends with SSR and client support",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"dist"
|
|
20
20
|
],
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@karbonjs/types": "0.3.
|
|
22
|
+
"@karbonjs/types": "0.3.2"
|
|
23
23
|
},
|
|
24
24
|
"publishConfig": {
|
|
25
25
|
"access": "public"
|