@mathrunet/masamune_cloudflare_turso 3.2.6 → 3.2.7
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/CHANGELOG.md +1 -1
- package/README.md +51 -44
- package/dist/lib/rules.d.ts +5 -66
- package/dist/lib/rules.js +20 -586
- package/dist/lib/rules.js.map +1 -1
- package/dist/lib/types.d.ts +7 -35
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
package/README.md
CHANGED
|
@@ -48,42 +48,26 @@ Pass the return value of the `deploy` function to `export default`. It is define
|
|
|
48
48
|
|
|
49
49
|
```typescript
|
|
50
50
|
import * as m from "@mathrunet/masamune_cloudflare_turso";
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
},
|
|
72
|
-
}),
|
|
73
|
-
m.Functions.tursoToken({
|
|
74
|
-
organizationName: "xxxx",
|
|
75
|
-
groupName: "xxxx",
|
|
76
|
-
rules: {
|
|
77
|
-
version: "1",
|
|
78
|
-
rules: {
|
|
79
|
-
"database/main": {
|
|
80
|
-
read: "authenticated",
|
|
81
|
-
write: "deny",
|
|
82
|
-
},
|
|
83
|
-
},
|
|
84
|
-
},
|
|
85
|
-
}),
|
|
86
|
-
]);
|
|
51
|
+
import rulesJson from "../rules.json";
|
|
52
|
+
|
|
53
|
+
export default m.deploy(
|
|
54
|
+
[
|
|
55
|
+
m.Functions.turso({
|
|
56
|
+
organizationName: "xxxx",
|
|
57
|
+
groupName: "xxxx",
|
|
58
|
+
autoCreateDatabase: true,
|
|
59
|
+
autoCreateTable: true,
|
|
60
|
+
autoMigrateAddColumns: true,
|
|
61
|
+
}),
|
|
62
|
+
m.Functions.tursoToken({
|
|
63
|
+
organizationName: "xxxx",
|
|
64
|
+
groupName: "xxxx",
|
|
65
|
+
}),
|
|
66
|
+
],
|
|
67
|
+
{
|
|
68
|
+
rules: rulesJson,
|
|
69
|
+
},
|
|
70
|
+
);
|
|
87
71
|
```
|
|
88
72
|
|
|
89
73
|
Cloudflare bindings are also supported and take precedence over options:
|
|
@@ -195,6 +179,29 @@ CREATE TABLE IF NOT EXISTS table_name (
|
|
|
195
179
|
|
|
196
180
|
Objects and arrays are stored as JSON strings.
|
|
197
181
|
|
|
182
|
+
# Rules
|
|
183
|
+
|
|
184
|
+
Rules are provided by `@mathrunet/masamune_cloudflare` and are shared with
|
|
185
|
+
other Cloudflare database packages. Pass an imported `rules.json` to
|
|
186
|
+
`WorkersOptions.rules` on `deploy`, or pass the same config to each function
|
|
187
|
+
option.
|
|
188
|
+
|
|
189
|
+
```json
|
|
190
|
+
{
|
|
191
|
+
"version": "1",
|
|
192
|
+
"rules": {
|
|
193
|
+
"database/main": {
|
|
194
|
+
"read": "allow",
|
|
195
|
+
"write": "server"
|
|
196
|
+
},
|
|
197
|
+
"database/main/table/users/*": {
|
|
198
|
+
"read": "authenticated",
|
|
199
|
+
"write": { "type": "field", "field": "ownerId", "server": true }
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
```
|
|
204
|
+
|
|
198
205
|
# Database-scoped short-lived token
|
|
199
206
|
|
|
200
207
|
Use `/turso/token/database/{database}` to issue a Turso database token after
|
|
@@ -225,8 +232,8 @@ Named path parameters can be compared with the authenticated user ID:
|
|
|
225
232
|
"version": "1",
|
|
226
233
|
"rules": {
|
|
227
234
|
"database/{uid}": {
|
|
228
|
-
"read": { "type": "
|
|
229
|
-
"write": { "type": "
|
|
235
|
+
"read": { "type": "path", "param": "uid" },
|
|
236
|
+
"write": { "type": "path", "param": "uid" }
|
|
230
237
|
}
|
|
231
238
|
}
|
|
232
239
|
}
|
|
@@ -243,24 +250,24 @@ issuing only the direct Turso token that is safe for the requested scope:
|
|
|
243
250
|
"version": "1",
|
|
244
251
|
"rules": {
|
|
245
252
|
"database/{uid}": {
|
|
246
|
-
"read": { "type": "
|
|
253
|
+
"read": { "type": "path", "param": "uid" },
|
|
247
254
|
"write": {
|
|
248
|
-
"type": "
|
|
255
|
+
"type": "path",
|
|
249
256
|
"param": "uid",
|
|
250
|
-
"
|
|
257
|
+
"server": true
|
|
251
258
|
}
|
|
252
259
|
}
|
|
253
260
|
}
|
|
254
261
|
}
|
|
255
262
|
```
|
|
256
263
|
|
|
257
|
-
`
|
|
258
|
-
|
|
264
|
+
`server` can also be used with `read` and `field` rules. A server-side rule
|
|
265
|
+
does not grant direct token access for that operation.
|
|
259
266
|
|
|
260
267
|
Table/document rules below the database path are also treated as server-side
|
|
261
268
|
rules for token issuance when they restrict `read` or `write`. This is
|
|
262
269
|
intentional because Turso Platform tokens are database-scoped and cannot enforce
|
|
263
|
-
document-level `
|
|
270
|
+
document-level `field` or `path` checks on the client.
|
|
264
271
|
|
|
265
272
|
For a database-level Turso token, send `operations` without a table:
|
|
266
273
|
|
package/dist/lib/rules.d.ts
CHANGED
|
@@ -1,66 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
fetchDocument?: (() => Promise<Record<string, unknown> | null | undefined>) | undefined;
|
|
7
|
-
server?: boolean | undefined;
|
|
8
|
-
}
|
|
9
|
-
export interface RulesEvaluationResult {
|
|
10
|
-
allowed: boolean;
|
|
11
|
-
rulePath?: string | undefined;
|
|
12
|
-
access?: RulesAccessRule | undefined;
|
|
13
|
-
params?: Record<string, string> | undefined;
|
|
14
|
-
}
|
|
15
|
-
export type TursoDatabaseTokenAuthorization = "read-only" | "full-access";
|
|
16
|
-
export interface TursoDatabaseTokenAccess {
|
|
17
|
-
authorization?: TursoDatabaseTokenAuthorization | undefined;
|
|
18
|
-
readMode: TursoTokenAccessMode;
|
|
19
|
-
writeMode: TursoTokenAccessMode;
|
|
20
|
-
scopes: TursoTokenScopeOutput[];
|
|
21
|
-
}
|
|
22
|
-
export declare class RulesEngine {
|
|
23
|
-
constructor(config?: RulesConfig | undefined);
|
|
24
|
-
private readonly config;
|
|
25
|
-
evaluate(input: RulesEvaluationInput): Promise<RulesEvaluationResult>;
|
|
26
|
-
hasScopedRestriction({ database, table, operation, }: {
|
|
27
|
-
database: string;
|
|
28
|
-
table: string;
|
|
29
|
-
operation: RulesOperation | RulesOperationKey;
|
|
30
|
-
}): boolean;
|
|
31
|
-
hasScopedDeny({ database, table, operation, }: {
|
|
32
|
-
database: string;
|
|
33
|
-
table: string;
|
|
34
|
-
operation: RulesOperation | RulesOperationKey;
|
|
35
|
-
}): boolean;
|
|
36
|
-
}
|
|
37
|
-
export declare function createTursoRulesEngine(config?: RulesConfig | undefined): RulesEngine;
|
|
38
|
-
export declare function buildRulesPath({ database, table, indexKey, }: {
|
|
39
|
-
database: string;
|
|
40
|
-
table: string;
|
|
41
|
-
indexKey: string;
|
|
42
|
-
}): string;
|
|
43
|
-
export declare function buildDatabaseRulesPath({ database, }: {
|
|
44
|
-
database: string;
|
|
45
|
-
}): string;
|
|
46
|
-
export declare function normalizeHttpMethodToRulesOperation(method: string): RulesOperation;
|
|
47
|
-
export declare function normalizeRulesOperation(operation: RulesOperation | RulesOperationKey): RulesOperation;
|
|
48
|
-
export declare function expandRulesOperation(operation: RulesOperationKey): RulesOperation[];
|
|
49
|
-
export declare function filterAllowedScope({ engine, database, scope, authentication, }: {
|
|
50
|
-
engine: RulesEngine;
|
|
51
|
-
database: string;
|
|
52
|
-
scope: TursoTokenScopeInput[];
|
|
53
|
-
authentication?: AuthenticationContext | undefined;
|
|
54
|
-
}): Promise<TursoTokenScopeInput[]>;
|
|
55
|
-
export declare function resolveDatabaseTokenAccess({ engine, database, operations, scope, authentication, }: {
|
|
56
|
-
engine: RulesEngine;
|
|
57
|
-
database: string;
|
|
58
|
-
operations?: RulesOperationKey[] | undefined;
|
|
59
|
-
scope?: TursoTokenScopeInput[] | undefined;
|
|
60
|
-
authentication?: AuthenticationContext | undefined;
|
|
61
|
-
}): Promise<TursoDatabaseTokenAccess | undefined>;
|
|
62
|
-
export declare function resolveDatabaseTokenAuthorization({ engine, database, authentication, }: {
|
|
63
|
-
engine: RulesEngine;
|
|
64
|
-
database: string;
|
|
65
|
-
authentication?: AuthenticationContext | undefined;
|
|
66
|
-
}): Promise<TursoDatabaseTokenAuthorization | undefined>;
|
|
1
|
+
import { RulesEngine, type RulesConfig, type RulesDatabaseTokenAccess, type RulesDatabaseTokenAuthorization, type WorkersRulesOption } from "@mathrunet/masamune_cloudflare";
|
|
2
|
+
export { buildDatabaseRulesPath, buildRulesPath, expandRulesOperation, filterAllowedScope, normalizeHttpMethodToRulesOperation, normalizeRulesOperation, resolveDatabaseTokenAccess, resolveDatabaseTokenAuthorization, RulesEngine, } from "@mathrunet/masamune_cloudflare";
|
|
3
|
+
export type TursoDatabaseTokenAuthorization = RulesDatabaseTokenAuthorization;
|
|
4
|
+
export type TursoDatabaseTokenAccess = RulesDatabaseTokenAccess;
|
|
5
|
+
export declare function createTursoRulesEngine(config?: RulesConfig | WorkersRulesOption | null | undefined): RulesEngine;
|
package/dist/lib/rules.js
CHANGED
|
@@ -1,593 +1,27 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RulesEngine = void 0;
|
|
3
|
+
exports.RulesEngine = exports.resolveDatabaseTokenAuthorization = exports.resolveDatabaseTokenAccess = exports.normalizeRulesOperation = exports.normalizeHttpMethodToRulesOperation = exports.filterAllowedScope = exports.expandRulesOperation = exports.buildRulesPath = exports.buildDatabaseRulesPath = void 0;
|
|
4
4
|
exports.createTursoRulesEngine = createTursoRulesEngine;
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
exports.
|
|
8
|
-
exports.
|
|
9
|
-
exports
|
|
10
|
-
exports
|
|
11
|
-
exports.
|
|
12
|
-
exports.
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
}
|
|
17
|
-
config;
|
|
18
|
-
async evaluate(input) {
|
|
19
|
-
const operation = normalizeRulesOperation(input.operation);
|
|
20
|
-
const matches = Object.keys(this.config.rules)
|
|
21
|
-
.map((rulePath) => matchRulePath(rulePath, input.path))
|
|
22
|
-
.filter((match) => match.matched)
|
|
23
|
-
.sort(compareRulePathMatch);
|
|
24
|
-
if (matches.length === 0) {
|
|
25
|
-
return { allowed: false };
|
|
26
|
-
}
|
|
27
|
-
const resolved = resolveInheritedRule(matches.map((match) => ({
|
|
28
|
-
rulePath: match.rulePath,
|
|
29
|
-
entry: this.config.rules[match.rulePath],
|
|
30
|
-
params: match.params,
|
|
31
|
-
})));
|
|
32
|
-
const resolvedAccess = resolveAccessRule(resolved.entry, resolved.params, operation);
|
|
33
|
-
if (!resolvedAccess) {
|
|
34
|
-
return {
|
|
35
|
-
allowed: false,
|
|
36
|
-
rulePath: resolved.rulePath,
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
return {
|
|
40
|
-
allowed: await evaluateAccessRule(resolvedAccess.access, input.authentication, input.fetchDocument, resolvedAccess.params, input.server === true),
|
|
41
|
-
rulePath: resolved.rulePath,
|
|
42
|
-
access: resolvedAccess.access,
|
|
43
|
-
params: resolvedAccess.params,
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
|
-
hasScopedRestriction({ database, table, operation, }) {
|
|
47
|
-
const normalized = normalizeRulesOperation(operation);
|
|
48
|
-
for (const [rulePath, entry] of Object.entries(this.config.rules)) {
|
|
49
|
-
if (!isRulePathInTableScope(rulePath, database, table)) {
|
|
50
|
-
continue;
|
|
51
|
-
}
|
|
52
|
-
const access = resolveAccessRule(entry, {}, normalized)?.access;
|
|
53
|
-
if (!access || isDirectSafeScopeAccess(access)) {
|
|
54
|
-
continue;
|
|
55
|
-
}
|
|
56
|
-
return true;
|
|
57
|
-
}
|
|
58
|
-
return false;
|
|
59
|
-
}
|
|
60
|
-
hasScopedDeny({ database, table, operation, }) {
|
|
61
|
-
const normalized = normalizeRulesOperation(operation);
|
|
62
|
-
for (const [rulePath, entry] of Object.entries(this.config.rules)) {
|
|
63
|
-
if (!isRulePathInTableScope(rulePath, database, table)) {
|
|
64
|
-
continue;
|
|
65
|
-
}
|
|
66
|
-
const access = resolveAccessRule(entry, {}, normalized)?.access;
|
|
67
|
-
if (access === "deny") {
|
|
68
|
-
return true;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
return false;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
exports.RulesEngine = RulesEngine;
|
|
5
|
+
const masamune_cloudflare_1 = require("@mathrunet/masamune_cloudflare");
|
|
6
|
+
var masamune_cloudflare_2 = require("@mathrunet/masamune_cloudflare");
|
|
7
|
+
Object.defineProperty(exports, "buildDatabaseRulesPath", { enumerable: true, get: function () { return masamune_cloudflare_2.buildDatabaseRulesPath; } });
|
|
8
|
+
Object.defineProperty(exports, "buildRulesPath", { enumerable: true, get: function () { return masamune_cloudflare_2.buildRulesPath; } });
|
|
9
|
+
Object.defineProperty(exports, "expandRulesOperation", { enumerable: true, get: function () { return masamune_cloudflare_2.expandRulesOperation; } });
|
|
10
|
+
Object.defineProperty(exports, "filterAllowedScope", { enumerable: true, get: function () { return masamune_cloudflare_2.filterAllowedScope; } });
|
|
11
|
+
Object.defineProperty(exports, "normalizeHttpMethodToRulesOperation", { enumerable: true, get: function () { return masamune_cloudflare_2.normalizeHttpMethodToRulesOperation; } });
|
|
12
|
+
Object.defineProperty(exports, "normalizeRulesOperation", { enumerable: true, get: function () { return masamune_cloudflare_2.normalizeRulesOperation; } });
|
|
13
|
+
Object.defineProperty(exports, "resolveDatabaseTokenAccess", { enumerable: true, get: function () { return masamune_cloudflare_2.resolveDatabaseTokenAccess; } });
|
|
14
|
+
Object.defineProperty(exports, "resolveDatabaseTokenAuthorization", { enumerable: true, get: function () { return masamune_cloudflare_2.resolveDatabaseTokenAuthorization; } });
|
|
15
|
+
Object.defineProperty(exports, "RulesEngine", { enumerable: true, get: function () { return masamune_cloudflare_2.RulesEngine; } });
|
|
75
16
|
function createTursoRulesEngine(config) {
|
|
76
|
-
return new RulesEngine(config)
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
"table",
|
|
83
|
-
encodePathSegment(table),
|
|
84
|
-
encodePathSegment(indexKey),
|
|
85
|
-
].join("/");
|
|
86
|
-
}
|
|
87
|
-
function buildDatabaseRulesPath({ database, }) {
|
|
88
|
-
return [
|
|
89
|
-
"database",
|
|
90
|
-
encodePathSegment(database),
|
|
91
|
-
].join("/");
|
|
92
|
-
}
|
|
93
|
-
function normalizeHttpMethodToRulesOperation(method) {
|
|
94
|
-
switch (method.toUpperCase()) {
|
|
95
|
-
case "GET":
|
|
96
|
-
return "get";
|
|
97
|
-
case "POST":
|
|
98
|
-
return "create";
|
|
99
|
-
case "PUT":
|
|
100
|
-
return "update";
|
|
101
|
-
case "DELETE":
|
|
102
|
-
return "delete";
|
|
103
|
-
default:
|
|
104
|
-
throw new Error(`Unsupported HTTP method for rules: ${method}`);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
function normalizeRulesOperation(operation) {
|
|
108
|
-
switch (operation) {
|
|
109
|
-
case "read":
|
|
110
|
-
return "get";
|
|
111
|
-
case "write":
|
|
112
|
-
return "create";
|
|
113
|
-
case "get":
|
|
114
|
-
case "create":
|
|
115
|
-
case "update":
|
|
116
|
-
case "delete":
|
|
117
|
-
return operation;
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
function expandRulesOperation(operation) {
|
|
121
|
-
switch (operation) {
|
|
122
|
-
case "read":
|
|
123
|
-
return ["get"];
|
|
124
|
-
case "write":
|
|
125
|
-
return ["create", "update", "delete"];
|
|
126
|
-
case "get":
|
|
127
|
-
case "create":
|
|
128
|
-
case "update":
|
|
129
|
-
case "delete":
|
|
130
|
-
return [operation];
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
async function filterAllowedScope({ engine, database, scope, authentication, }) {
|
|
134
|
-
const allowed = [];
|
|
135
|
-
for (const item of scope) {
|
|
136
|
-
const operations = [];
|
|
137
|
-
for (const operationKey of item.operations) {
|
|
138
|
-
const expanded = expandRulesOperation(operationKey);
|
|
139
|
-
const results = await Promise.all(expanded.map((operation) => {
|
|
140
|
-
return engine.evaluate({
|
|
141
|
-
path: buildRulesPath({
|
|
142
|
-
database,
|
|
143
|
-
table: item.table,
|
|
144
|
-
indexKey: "*",
|
|
145
|
-
}),
|
|
146
|
-
operation,
|
|
147
|
-
authentication,
|
|
148
|
-
});
|
|
149
|
-
}));
|
|
150
|
-
if (results.every((result) => result.allowed)) {
|
|
151
|
-
operations.push(operationKey);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
if (operations.length > 0) {
|
|
155
|
-
allowed.push({
|
|
156
|
-
table: item.table,
|
|
157
|
-
operations,
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
return allowed;
|
|
162
|
-
}
|
|
163
|
-
async function resolveDatabaseTokenAccess({ engine, database, operations, scope = [], authentication, }) {
|
|
164
|
-
const path = buildDatabaseRulesPath({ database });
|
|
165
|
-
const directRead = await engine.evaluate({
|
|
166
|
-
path,
|
|
167
|
-
operation: "read",
|
|
168
|
-
authentication,
|
|
169
|
-
server: false,
|
|
170
|
-
});
|
|
171
|
-
const serverRead = directRead.allowed
|
|
172
|
-
? directRead
|
|
173
|
-
: await engine.evaluate({
|
|
174
|
-
path,
|
|
175
|
-
operation: "read",
|
|
176
|
-
authentication,
|
|
177
|
-
server: true,
|
|
178
|
-
});
|
|
179
|
-
if (!serverRead.allowed) {
|
|
180
|
-
return undefined;
|
|
181
|
-
}
|
|
182
|
-
const directDatabaseWrite = await evaluateDatabaseWrite({
|
|
183
|
-
engine,
|
|
184
|
-
path,
|
|
185
|
-
authentication,
|
|
186
|
-
server: false,
|
|
187
|
-
});
|
|
188
|
-
const serverDatabaseWrite = directDatabaseWrite
|
|
189
|
-
? true
|
|
190
|
-
: await evaluateDatabaseWrite({
|
|
191
|
-
engine,
|
|
192
|
-
path,
|
|
193
|
-
authentication,
|
|
194
|
-
server: true,
|
|
195
|
-
});
|
|
196
|
-
const scopes = await resolveScopeModes({
|
|
197
|
-
engine,
|
|
198
|
-
database,
|
|
199
|
-
scope,
|
|
200
|
-
authentication,
|
|
201
|
-
});
|
|
202
|
-
const readScopes = scopes.filter((item) => requiresRead(item.operations));
|
|
203
|
-
const writeScopes = scopes.filter((item) => requiresWrite(item.operations));
|
|
204
|
-
const requestedOperations = operations ?? [];
|
|
205
|
-
const requestsDatabaseRead = requiresRead(requestedOperations);
|
|
206
|
-
const requestsDatabaseWrite = requiresWrite(requestedOperations);
|
|
207
|
-
const hasTargets = scope.length > 0;
|
|
208
|
-
const readMode = resolveOverallMode(readScopes.map((item) => item.readMode ?? "none"), !hasTargets && (requestedOperations.length === 0 || requestsDatabaseRead)
|
|
209
|
-
? directRead.allowed ? "direct" : "functions"
|
|
210
|
-
: "none");
|
|
211
|
-
let writeMode = resolveOverallMode(writeScopes.map((item) => item.writeMode ?? "none"), !hasTargets && (requestedOperations.length === 0 || requestsDatabaseWrite)
|
|
212
|
-
? directDatabaseWrite ? "direct" : serverDatabaseWrite ? "functions" : "none"
|
|
213
|
-
: "none");
|
|
214
|
-
if (readMode === "functions" && writeMode === "direct") {
|
|
215
|
-
writeMode = serverDatabaseWrite ? "functions" : "none";
|
|
216
|
-
}
|
|
217
|
-
const authorization = resolveTokenAuthorization(readMode, writeMode);
|
|
218
|
-
return {
|
|
219
|
-
authorization,
|
|
220
|
-
readMode,
|
|
221
|
-
writeMode,
|
|
222
|
-
scopes,
|
|
223
|
-
};
|
|
224
|
-
}
|
|
225
|
-
async function resolveScopeModes({ engine, database, scope, authentication, }) {
|
|
226
|
-
const resolved = [];
|
|
227
|
-
for (const item of scope) {
|
|
228
|
-
const readMode = requiresRead(item.operations)
|
|
229
|
-
? await resolveScopedOperationMode({
|
|
230
|
-
engine,
|
|
231
|
-
database,
|
|
232
|
-
table: item.table,
|
|
233
|
-
operation: "read",
|
|
234
|
-
authentication,
|
|
235
|
-
})
|
|
236
|
-
: undefined;
|
|
237
|
-
const writeMode = requiresWrite(item.operations)
|
|
238
|
-
? await resolveScopedOperationMode({
|
|
239
|
-
engine,
|
|
240
|
-
database,
|
|
241
|
-
table: item.table,
|
|
242
|
-
operation: "write",
|
|
243
|
-
authentication,
|
|
244
|
-
})
|
|
245
|
-
: undefined;
|
|
246
|
-
resolved.push({
|
|
247
|
-
table: item.table,
|
|
248
|
-
operations: item.operations,
|
|
249
|
-
...(readMode ? { readMode } : {}),
|
|
250
|
-
...(writeMode ? { writeMode } : {}),
|
|
251
|
-
});
|
|
252
|
-
}
|
|
253
|
-
return resolved;
|
|
254
|
-
}
|
|
255
|
-
async function resolveScopedOperationMode({ engine, database, table, operation, authentication, }) {
|
|
256
|
-
const path = buildRulesPath({
|
|
257
|
-
database,
|
|
258
|
-
table,
|
|
259
|
-
indexKey: "*",
|
|
260
|
-
});
|
|
261
|
-
const expanded = expandRulesOperation(operation);
|
|
262
|
-
const direct = await Promise.all(expanded.map((item) => engine.evaluate({
|
|
263
|
-
path,
|
|
264
|
-
operation: item,
|
|
265
|
-
authentication,
|
|
266
|
-
server: false,
|
|
267
|
-
})));
|
|
268
|
-
const directAllowed = direct.every((result) => result.allowed);
|
|
269
|
-
const restricted = expanded.some((item) => engine.hasScopedRestriction({
|
|
270
|
-
database,
|
|
271
|
-
table,
|
|
272
|
-
operation: item,
|
|
273
|
-
}));
|
|
274
|
-
if (directAllowed && !restricted) {
|
|
275
|
-
return "direct";
|
|
276
|
-
}
|
|
277
|
-
const denied = expanded.some((item) => engine.hasScopedDeny({
|
|
278
|
-
database,
|
|
279
|
-
table,
|
|
280
|
-
operation: item,
|
|
281
|
-
}));
|
|
282
|
-
if (restricted && !denied) {
|
|
283
|
-
return "functions";
|
|
284
|
-
}
|
|
285
|
-
const server = await Promise.all(expanded.map((item) => engine.evaluate({
|
|
286
|
-
path,
|
|
287
|
-
operation: item,
|
|
288
|
-
authentication,
|
|
289
|
-
server: true,
|
|
290
|
-
})));
|
|
291
|
-
return server.every((result) => result.allowed) ? "functions" : "none";
|
|
292
|
-
}
|
|
293
|
-
function resolveOverallMode(scopedModes, fallback) {
|
|
294
|
-
if (scopedModes.length === 0) {
|
|
295
|
-
return fallback;
|
|
296
|
-
}
|
|
297
|
-
if (scopedModes.every((mode) => mode === "direct")) {
|
|
298
|
-
return "direct";
|
|
299
|
-
}
|
|
300
|
-
if (scopedModes.some((mode) => mode === "none")) {
|
|
301
|
-
return "none";
|
|
302
|
-
}
|
|
303
|
-
return "functions";
|
|
304
|
-
}
|
|
305
|
-
function resolveTokenAuthorization(readMode, writeMode) {
|
|
306
|
-
if (writeMode === "direct") {
|
|
307
|
-
return "full-access";
|
|
308
|
-
}
|
|
309
|
-
if (readMode === "direct") {
|
|
310
|
-
return "read-only";
|
|
311
|
-
}
|
|
312
|
-
return undefined;
|
|
313
|
-
}
|
|
314
|
-
function requiresRead(operations) {
|
|
315
|
-
return operations.some((operation) => expandRulesOperation(operation).includes("get"));
|
|
316
|
-
}
|
|
317
|
-
function requiresWrite(operations) {
|
|
318
|
-
return operations.some((operation) => {
|
|
319
|
-
const expanded = expandRulesOperation(operation);
|
|
320
|
-
return expanded.includes("create") || expanded.includes("update") || expanded.includes("delete");
|
|
321
|
-
});
|
|
322
|
-
}
|
|
323
|
-
async function evaluateDatabaseWrite({ engine, path, authentication, server, }) {
|
|
324
|
-
const results = await Promise.all(expandRulesOperation("write").map((operation) => {
|
|
325
|
-
return engine.evaluate({
|
|
326
|
-
path,
|
|
327
|
-
operation,
|
|
328
|
-
authentication,
|
|
329
|
-
server,
|
|
330
|
-
});
|
|
331
|
-
}));
|
|
332
|
-
return results.every((result) => result.allowed);
|
|
333
|
-
}
|
|
334
|
-
async function resolveDatabaseTokenAuthorization({ engine, database, authentication, }) {
|
|
335
|
-
const access = await resolveDatabaseTokenAccess({
|
|
336
|
-
engine,
|
|
337
|
-
database,
|
|
338
|
-
authentication,
|
|
339
|
-
});
|
|
340
|
-
return access?.authorization;
|
|
341
|
-
}
|
|
342
|
-
function normalizeRulesConfig(config) {
|
|
343
|
-
if (!config) {
|
|
344
|
-
return {
|
|
345
|
-
version: "1",
|
|
346
|
-
rules: {
|
|
347
|
-
"database/**": {
|
|
348
|
-
read: "deny",
|
|
349
|
-
write: "deny",
|
|
350
|
-
},
|
|
17
|
+
return new masamune_cloudflare_1.RulesEngine((0, masamune_cloudflare_1.isRulesConfig)(config) ? config : {
|
|
18
|
+
version: "1",
|
|
19
|
+
rules: {
|
|
20
|
+
"database/**": {
|
|
21
|
+
read: "deny",
|
|
22
|
+
write: "deny",
|
|
351
23
|
},
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
if (typeof config.version !== "string" || !isRecord(config.rules)) {
|
|
355
|
-
throw new Error("Invalid rules config.");
|
|
356
|
-
}
|
|
357
|
-
for (const path of Object.keys(config.rules)) {
|
|
358
|
-
validateRulePath(path);
|
|
359
|
-
}
|
|
360
|
-
return config;
|
|
361
|
-
}
|
|
362
|
-
function matchRulePath(rulePath, requestPath) {
|
|
363
|
-
validateRulePath(rulePath);
|
|
364
|
-
const ruleSegments = splitPath(rulePath);
|
|
365
|
-
const requestSegments = splitPath(requestPath);
|
|
366
|
-
const params = {};
|
|
367
|
-
let literalSegments = 0;
|
|
368
|
-
let namedWildcardSegments = 0;
|
|
369
|
-
let wildcardSegments = 0;
|
|
370
|
-
let deepWildcardSegments = 0;
|
|
371
|
-
for (let i = 0; i < ruleSegments.length; i++) {
|
|
372
|
-
const ruleSegment = ruleSegments[i];
|
|
373
|
-
if (ruleSegment === "**") {
|
|
374
|
-
deepWildcardSegments = 1;
|
|
375
|
-
return {
|
|
376
|
-
matched: true,
|
|
377
|
-
rulePath,
|
|
378
|
-
params,
|
|
379
|
-
literalSegments,
|
|
380
|
-
namedWildcardSegments,
|
|
381
|
-
wildcardSegments,
|
|
382
|
-
deepWildcardSegments,
|
|
383
|
-
matchedSegments: requestSegments.length,
|
|
384
|
-
};
|
|
385
|
-
}
|
|
386
|
-
const requestSegment = requestSegments[i];
|
|
387
|
-
if (requestSegment === undefined) {
|
|
388
|
-
return createUnmatched(rulePath);
|
|
389
|
-
}
|
|
390
|
-
if (ruleSegment === "*") {
|
|
391
|
-
wildcardSegments++;
|
|
392
|
-
continue;
|
|
393
|
-
}
|
|
394
|
-
const paramName = parseNamedPathParam(ruleSegment);
|
|
395
|
-
if (paramName) {
|
|
396
|
-
params[paramName] = requestSegment;
|
|
397
|
-
namedWildcardSegments++;
|
|
398
|
-
wildcardSegments++;
|
|
399
|
-
continue;
|
|
400
|
-
}
|
|
401
|
-
if (ruleSegment !== requestSegment) {
|
|
402
|
-
return createUnmatched(rulePath);
|
|
403
|
-
}
|
|
404
|
-
literalSegments++;
|
|
405
|
-
}
|
|
406
|
-
if (ruleSegments.length !== requestSegments.length) {
|
|
407
|
-
return createUnmatched(rulePath);
|
|
408
|
-
}
|
|
409
|
-
return {
|
|
410
|
-
matched: true,
|
|
411
|
-
rulePath,
|
|
412
|
-
params,
|
|
413
|
-
literalSegments,
|
|
414
|
-
namedWildcardSegments,
|
|
415
|
-
wildcardSegments,
|
|
416
|
-
deepWildcardSegments,
|
|
417
|
-
matchedSegments: requestSegments.length,
|
|
418
|
-
};
|
|
419
|
-
}
|
|
420
|
-
function compareRulePathMatch(a, b) {
|
|
421
|
-
if (a.literalSegments !== b.literalSegments) {
|
|
422
|
-
return b.literalSegments - a.literalSegments;
|
|
423
|
-
}
|
|
424
|
-
if (a.deepWildcardSegments !== b.deepWildcardSegments) {
|
|
425
|
-
return a.deepWildcardSegments - b.deepWildcardSegments;
|
|
426
|
-
}
|
|
427
|
-
if (a.namedWildcardSegments !== b.namedWildcardSegments) {
|
|
428
|
-
return b.namedWildcardSegments - a.namedWildcardSegments;
|
|
429
|
-
}
|
|
430
|
-
if (a.wildcardSegments !== b.wildcardSegments) {
|
|
431
|
-
return a.wildcardSegments - b.wildcardSegments;
|
|
432
|
-
}
|
|
433
|
-
if (a.matchedSegments !== b.matchedSegments) {
|
|
434
|
-
return b.matchedSegments - a.matchedSegments;
|
|
435
|
-
}
|
|
436
|
-
return a.rulePath.localeCompare(b.rulePath);
|
|
437
|
-
}
|
|
438
|
-
function resolveInheritedRule(matches) {
|
|
439
|
-
const inherited = {};
|
|
440
|
-
const inheritedParams = {};
|
|
441
|
-
let rulePath = matches[0]?.rulePath ?? "";
|
|
442
|
-
for (const match of [...matches].reverse()) {
|
|
443
|
-
if (!match.entry) {
|
|
444
|
-
continue;
|
|
445
|
-
}
|
|
446
|
-
rulePath = match.rulePath;
|
|
447
|
-
for (const [operation, access] of Object.entries(match.entry)) {
|
|
448
|
-
inherited[operation] = access;
|
|
449
|
-
inheritedParams[operation] = match.params;
|
|
450
|
-
}
|
|
451
|
-
}
|
|
452
|
-
return {
|
|
453
|
-
rulePath,
|
|
454
|
-
entry: inherited,
|
|
455
|
-
params: inheritedParams,
|
|
456
|
-
};
|
|
457
|
-
}
|
|
458
|
-
function resolveAccessRule(entry, params, operation) {
|
|
459
|
-
for (const operationKey of resolveRulesOperation(operation)) {
|
|
460
|
-
const access = entry[operationKey];
|
|
461
|
-
if (access) {
|
|
462
|
-
return {
|
|
463
|
-
access,
|
|
464
|
-
params: params[operationKey] ?? {},
|
|
465
|
-
};
|
|
466
|
-
}
|
|
467
|
-
}
|
|
468
|
-
return undefined;
|
|
469
|
-
}
|
|
470
|
-
function resolveRulesOperation(operation) {
|
|
471
|
-
switch (operation) {
|
|
472
|
-
case "get":
|
|
473
|
-
return ["get", "read"];
|
|
474
|
-
case "create":
|
|
475
|
-
return ["create", "write"];
|
|
476
|
-
case "update":
|
|
477
|
-
return ["update", "write"];
|
|
478
|
-
case "delete":
|
|
479
|
-
return ["delete", "write"];
|
|
480
|
-
}
|
|
481
|
-
}
|
|
482
|
-
async function evaluateAccessRule(access, authentication, fetchDocument, params = {}, server = false) {
|
|
483
|
-
switch (access) {
|
|
484
|
-
case "deny":
|
|
485
|
-
return false;
|
|
486
|
-
case "allow":
|
|
487
|
-
return true;
|
|
488
|
-
case "authenticated":
|
|
489
|
-
return !!authentication?.uid;
|
|
490
|
-
default:
|
|
491
|
-
break;
|
|
492
|
-
}
|
|
493
|
-
if ("serverOnly" in access && access.serverOnly === true && !server) {
|
|
494
|
-
return false;
|
|
495
|
-
}
|
|
496
|
-
switch (access.type) {
|
|
497
|
-
case "serverOnly":
|
|
498
|
-
return server;
|
|
499
|
-
case "fieldMatch": {
|
|
500
|
-
const uid = authentication?.uid;
|
|
501
|
-
if (!uid || !fetchDocument) {
|
|
502
|
-
return false;
|
|
503
|
-
}
|
|
504
|
-
const document = await fetchDocument();
|
|
505
|
-
return document?.[access.field] === uid;
|
|
506
|
-
}
|
|
507
|
-
case "pathParamMatch": {
|
|
508
|
-
const uid = authentication?.uid;
|
|
509
|
-
return !!uid && params[access.param] === uid;
|
|
510
|
-
}
|
|
511
|
-
}
|
|
512
|
-
}
|
|
513
|
-
function validateRulePath(path) {
|
|
514
|
-
if (path.length === 0 || path.startsWith("/") || path.endsWith("/")) {
|
|
515
|
-
throw new Error(`Invalid rule path: ${path}`);
|
|
516
|
-
}
|
|
517
|
-
const segments = path.split("/");
|
|
518
|
-
if (segments.some((segment) => segment.length === 0)) {
|
|
519
|
-
throw new Error(`Invalid rule path: ${path}`);
|
|
520
|
-
}
|
|
521
|
-
const paramNames = new Set();
|
|
522
|
-
for (const segment of segments) {
|
|
523
|
-
if ((segment.startsWith("{") || segment.endsWith("}")) && !parseNamedPathParam(segment)) {
|
|
524
|
-
throw new Error(`Invalid path parameter segment '${segment}' in rule path: ${path}`);
|
|
525
|
-
}
|
|
526
|
-
const paramName = parseNamedPathParam(segment);
|
|
527
|
-
if (!paramName) {
|
|
528
|
-
continue;
|
|
529
|
-
}
|
|
530
|
-
if (paramNames.has(paramName)) {
|
|
531
|
-
throw new Error(`Duplicate path parameter '${paramName}' in rule path: ${path}`);
|
|
532
|
-
}
|
|
533
|
-
paramNames.add(paramName);
|
|
534
|
-
}
|
|
535
|
-
const deepWildcardIndex = segments.indexOf("**");
|
|
536
|
-
if (deepWildcardIndex >= 0 && deepWildcardIndex !== segments.length - 1) {
|
|
537
|
-
throw new Error(`'**' must be the last segment in rule path: ${path}`);
|
|
538
|
-
}
|
|
539
|
-
}
|
|
540
|
-
function isRulePathInTableScope(rulePath, database, table) {
|
|
541
|
-
const segments = splitPath(rulePath);
|
|
542
|
-
if (segments.length <= 4) {
|
|
543
|
-
return false;
|
|
544
|
-
}
|
|
545
|
-
return segmentMatches(segments[0], "database") &&
|
|
546
|
-
segmentMatches(segments[1], database) &&
|
|
547
|
-
segmentMatches(segments[2], "table") &&
|
|
548
|
-
segmentMatches(segments[3], table);
|
|
549
|
-
}
|
|
550
|
-
function segmentMatches(ruleSegment, value) {
|
|
551
|
-
if (!ruleSegment) {
|
|
552
|
-
return false;
|
|
553
|
-
}
|
|
554
|
-
if (ruleSegment === "**") {
|
|
555
|
-
return true;
|
|
556
|
-
}
|
|
557
|
-
return ruleSegment === "*" || !!parseNamedPathParam(ruleSegment) || ruleSegment === value;
|
|
558
|
-
}
|
|
559
|
-
function isDirectSafeScopeAccess(access) {
|
|
560
|
-
return access === "allow";
|
|
561
|
-
}
|
|
562
|
-
function splitPath(path) {
|
|
563
|
-
if (path.length === 0 || path.startsWith("/") || path.endsWith("/")) {
|
|
564
|
-
return [];
|
|
565
|
-
}
|
|
566
|
-
return path.split("/");
|
|
567
|
-
}
|
|
568
|
-
function createUnmatched(rulePath) {
|
|
569
|
-
return {
|
|
570
|
-
matched: false,
|
|
571
|
-
rulePath,
|
|
572
|
-
params: {},
|
|
573
|
-
literalSegments: 0,
|
|
574
|
-
namedWildcardSegments: 0,
|
|
575
|
-
wildcardSegments: 0,
|
|
576
|
-
deepWildcardSegments: 0,
|
|
577
|
-
matchedSegments: 0,
|
|
578
|
-
};
|
|
579
|
-
}
|
|
580
|
-
function parseNamedPathParam(segment) {
|
|
581
|
-
const match = /^\{([A-Za-z_][A-Za-z0-9_]*)\}$/.exec(segment);
|
|
582
|
-
return match?.[1];
|
|
583
|
-
}
|
|
584
|
-
function encodePathSegment(segment) {
|
|
585
|
-
if (segment.length === 0 || segment.includes("/")) {
|
|
586
|
-
throw new Error(`Invalid path segment: ${segment}`);
|
|
587
|
-
}
|
|
588
|
-
return segment;
|
|
589
|
-
}
|
|
590
|
-
function isRecord(value) {
|
|
591
|
-
return typeof value === "object" && value !== null;
|
|
24
|
+
},
|
|
25
|
+
});
|
|
592
26
|
}
|
|
593
27
|
//# sourceMappingURL=rules.js.map
|
package/dist/lib/rules.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/lib/rules.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/lib/rules.ts"],"names":[],"mappings":";;;AAwBA,wDAYC;AApCD,wEAOwC;AAExC,sEAUwC;AATtC,6HAAA,sBAAsB,OAAA;AACtB,qHAAA,cAAc,OAAA;AACd,2HAAA,oBAAoB,OAAA;AACpB,yHAAA,kBAAkB,OAAA;AAClB,0IAAA,mCAAmC,OAAA;AACnC,8HAAA,uBAAuB,OAAA;AACvB,iIAAA,0BAA0B,OAAA;AAC1B,wIAAA,iCAAiC,OAAA;AACjC,kHAAA,WAAW,OAAA;AAMb,SAAgB,sBAAsB,CACpC,MAA4D;IAE5D,OAAO,IAAI,iCAAW,CAAC,IAAA,mCAAa,EAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACtD,OAAO,EAAE,GAAG;QACZ,KAAK,EAAE;YACL,aAAa,EAAE;gBACb,IAAI,EAAE,MAAM;gBACZ,KAAK,EAAE,MAAM;aACd;SACF;KACF,CAAC,CAAC;AACL,CAAC"}
|
package/dist/lib/types.d.ts
CHANGED
|
@@ -1,29 +1,11 @@
|
|
|
1
|
-
import { WorkersOptions } from "@mathrunet/masamune_cloudflare";
|
|
1
|
+
import { RulesAccessMode, RulesAccessRule, RulesConfig, RulesEntry, RulesOperation, RulesOperationAlias, RulesOperationKey, RulesTokenTargetInput, RulesTokenTargetOutput, WorkersAuthContext, WorkersOptions } from "@mathrunet/masamune_cloudflare";
|
|
2
2
|
export type TursoCrudMethod = "GET" | "POST" | "PUT" | "DELETE";
|
|
3
|
-
export type
|
|
4
|
-
export type RulesOperationAlias = "read" | "write";
|
|
5
|
-
export type RulesOperationKey = RulesOperation | RulesOperationAlias;
|
|
6
|
-
export type RulesAccessRule = "deny" | "allow" | "authenticated" | {
|
|
7
|
-
type: "serverOnly";
|
|
8
|
-
} | {
|
|
9
|
-
type: "fieldMatch";
|
|
10
|
-
field: string;
|
|
11
|
-
serverOnly?: boolean | undefined;
|
|
12
|
-
} | {
|
|
13
|
-
type: "pathParamMatch";
|
|
14
|
-
param: string;
|
|
15
|
-
serverOnly?: boolean | undefined;
|
|
16
|
-
};
|
|
17
|
-
export type RulesEntry = Partial<Record<RulesOperationKey, RulesAccessRule>>;
|
|
18
|
-
export interface RulesConfig {
|
|
19
|
-
version: string;
|
|
20
|
-
rules: Record<string, RulesEntry>;
|
|
21
|
-
}
|
|
3
|
+
export type { RulesAccessRule, RulesConfig, RulesEntry, RulesOperation, RulesOperationAlias, RulesOperationKey, };
|
|
22
4
|
export interface TursoDatabaseConnection {
|
|
23
5
|
url: string;
|
|
24
6
|
authToken?: string | undefined;
|
|
25
7
|
}
|
|
26
|
-
export interface TursoWorkersOptions extends
|
|
8
|
+
export interface TursoWorkersOptions extends WorkersOptions {
|
|
27
9
|
databaseNamePrefix?: string | undefined;
|
|
28
10
|
organizationName?: string | undefined;
|
|
29
11
|
groupName?: string | undefined;
|
|
@@ -32,7 +14,6 @@ export interface TursoWorkersOptions extends Omit<WorkersOptions, "rules"> {
|
|
|
32
14
|
autoCreateTable?: boolean | undefined;
|
|
33
15
|
autoMigrateAddColumns?: boolean | undefined;
|
|
34
16
|
maxTtlSeconds?: number | undefined;
|
|
35
|
-
rules?: RulesConfig | undefined;
|
|
36
17
|
}
|
|
37
18
|
export interface TursoRequestBody {
|
|
38
19
|
database?: string | undefined;
|
|
@@ -53,15 +34,9 @@ export interface TursoOrderCondition {
|
|
|
53
34
|
key?: string | undefined;
|
|
54
35
|
descending?: boolean | undefined;
|
|
55
36
|
}
|
|
56
|
-
export
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
}
|
|
60
|
-
export type TursoTokenAccessMode = "none" | "functions" | "direct";
|
|
61
|
-
export interface TursoTokenScopeOutput extends TursoTokenScopeInput {
|
|
62
|
-
readMode?: TursoTokenAccessMode | undefined;
|
|
63
|
-
writeMode?: TursoTokenAccessMode | undefined;
|
|
64
|
-
}
|
|
37
|
+
export type TursoTokenAccessMode = RulesAccessMode;
|
|
38
|
+
export type TursoTokenScopeInput = RulesTokenTargetInput;
|
|
39
|
+
export type TursoTokenScopeOutput = RulesTokenTargetOutput;
|
|
65
40
|
export interface TursoTokenRequestBody {
|
|
66
41
|
database?: string | undefined;
|
|
67
42
|
operations?: RulesOperationKey[] | undefined;
|
|
@@ -69,7 +44,4 @@ export interface TursoTokenRequestBody {
|
|
|
69
44
|
scope?: TursoTokenScopeInput[] | undefined;
|
|
70
45
|
ttlSeconds?: number | undefined;
|
|
71
46
|
}
|
|
72
|
-
export
|
|
73
|
-
uid?: string | undefined;
|
|
74
|
-
token?: unknown;
|
|
75
|
-
}
|
|
47
|
+
export type AuthenticationContext = WorkersAuthContext;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mathrunet/masamune_cloudflare_turso",
|
|
3
|
-
"version": "3.2.
|
|
3
|
+
"version": "3.2.7",
|
|
4
4
|
"description": "Server-side package of the Masamune framework for working with Turso via Cloudflare.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"homepage": "https://github.com/mathrunet/node_masamune#readme",
|
|
42
42
|
"dependencies": {
|
|
43
43
|
"@mathrunet/masamune": "^3.10.2",
|
|
44
|
-
"@mathrunet/masamune_cloudflare": "^3.1.
|
|
44
|
+
"@mathrunet/masamune_cloudflare": "^3.1.8",
|
|
45
45
|
"@tursodatabase/serverless": "^1.2.3",
|
|
46
46
|
"hono": "^4.12.27",
|
|
47
47
|
"typescript": "^5.9.2"
|