@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 CHANGED
@@ -1,4 +1,4 @@
1
- ## 3.2.6 (2026-07-01)
1
+ ## 3.2.7 (2026-07-01)
2
2
 
3
3
 
4
4
  ### chore
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
- export default m.deploy([
53
- m.Functions.turso({
54
- organizationName: "xxxx",
55
- groupName: "xxxx",
56
- autoCreateDatabase: true,
57
- autoCreateTable: true,
58
- autoMigrateAddColumns: true,
59
- rules: {
60
- version: "1",
61
- rules: {
62
- "database/*/table/*/*": {
63
- read: "deny",
64
- write: "deny",
65
- },
66
- "database/main/table/users/*": {
67
- read: "authenticated",
68
- write: "authenticated",
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": "pathParamMatch", "param": "uid" },
229
- "write": { "type": "pathParamMatch", "param": "uid" }
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": "pathParamMatch", "param": "uid" },
253
+ "read": { "type": "path", "param": "uid" },
247
254
  "write": {
248
- "type": "pathParamMatch",
255
+ "type": "path",
249
256
  "param": "uid",
250
- "serverOnly": true
257
+ "server": true
251
258
  }
252
259
  }
253
260
  }
254
261
  }
255
262
  ```
256
263
 
257
- `serverOnly` can also be used with `read` and `fieldMatch` rules. A
258
- server-only rule does not grant direct token access for that operation.
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 `fieldMatch` or `pathParamMatch` checks on the client.
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
 
@@ -1,66 +1,5 @@
1
- import { AuthenticationContext, RulesAccessRule, RulesConfig, RulesOperation, RulesOperationKey, TursoTokenAccessMode, TursoTokenScopeInput, TursoTokenScopeOutput } from "./types";
2
- export interface RulesEvaluationInput {
3
- path: string;
4
- operation: RulesOperation | RulesOperationKey;
5
- authentication?: AuthenticationContext | undefined;
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
- exports.buildRulesPath = buildRulesPath;
6
- exports.buildDatabaseRulesPath = buildDatabaseRulesPath;
7
- exports.normalizeHttpMethodToRulesOperation = normalizeHttpMethodToRulesOperation;
8
- exports.normalizeRulesOperation = normalizeRulesOperation;
9
- exports.expandRulesOperation = expandRulesOperation;
10
- exports.filterAllowedScope = filterAllowedScope;
11
- exports.resolveDatabaseTokenAccess = resolveDatabaseTokenAccess;
12
- exports.resolveDatabaseTokenAuthorization = resolveDatabaseTokenAuthorization;
13
- class RulesEngine {
14
- constructor(config) {
15
- this.config = normalizeRulesConfig(config);
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
- function buildRulesPath({ database, table, indexKey, }) {
79
- return [
80
- "database",
81
- encodePathSegment(database),
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
@@ -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"}
@@ -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 RulesOperation = "get" | "create" | "update" | "delete";
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 Omit<WorkersOptions, "rules"> {
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 interface TursoTokenScopeInput {
57
- table: string;
58
- operations: RulesOperationKey[];
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 interface AuthenticationContext {
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.6",
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.7",
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"