@mathrunet/masamune_cloudflare_turso 3.2.1

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.
Files changed (172) hide show
  1. package/CHANGELOG.md +363 -0
  2. package/LICENSE +21 -0
  3. package/README.md +213 -0
  4. package/dist/functions/test.d.ts +1 -0
  5. package/dist/functions/test.js +71 -0
  6. package/dist/functions/test.js.map +1 -0
  7. package/dist/functions/turso.d.ts +1 -0
  8. package/dist/functions/turso.js +50 -0
  9. package/dist/functions/turso.js.map +1 -0
  10. package/dist/functions/turso_token.d.ts +1 -0
  11. package/dist/functions/turso_token.js +40 -0
  12. package/dist/functions/turso_token.js.map +1 -0
  13. package/dist/functions.d.ts +21 -0
  14. package/dist/functions.js +24 -0
  15. package/dist/functions.js.map +1 -0
  16. package/dist/index.d.ts +15 -0
  17. package/dist/index.js +31 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/lib/api.d.ts +183 -0
  20. package/dist/lib/api.js +144 -0
  21. package/dist/lib/api.js.map +1 -0
  22. package/dist/lib/crud.d.ts +10 -0
  23. package/dist/lib/crud.js +203 -0
  24. package/dist/lib/crud.js.map +1 -0
  25. package/dist/lib/exntensions/firestore.extension.d.ts +247 -0
  26. package/dist/lib/exntensions/firestore.extension.js +386 -0
  27. package/dist/lib/exntensions/firestore.extension.js.map +1 -0
  28. package/dist/lib/exntensions/string.extension.d.ts +214 -0
  29. package/dist/lib/exntensions/string.extension.js +223 -0
  30. package/dist/lib/exntensions/string.extension.js.map +1 -0
  31. package/dist/lib/model_field_value/converters/basic_converter.d.ts +49 -0
  32. package/dist/lib/model_field_value/converters/basic_converter.js +51 -0
  33. package/dist/lib/model_field_value/converters/basic_converter.js.map +1 -0
  34. package/dist/lib/model_field_value/converters/enum_converter.d.ts +49 -0
  35. package/dist/lib/model_field_value/converters/enum_converter.js +51 -0
  36. package/dist/lib/model_field_value/converters/enum_converter.js.map +1 -0
  37. package/dist/lib/model_field_value/converters/model_counter_converter.d.ts +49 -0
  38. package/dist/lib/model_field_value/converters/model_counter_converter.js +216 -0
  39. package/dist/lib/model_field_value/converters/model_counter_converter.js.map +1 -0
  40. package/dist/lib/model_field_value/converters/model_date_converter.d.ts +49 -0
  41. package/dist/lib/model_field_value/converters/model_date_converter.js +271 -0
  42. package/dist/lib/model_field_value/converters/model_date_converter.js.map +1 -0
  43. package/dist/lib/model_field_value/converters/model_date_range_converter.d.ts +49 -0
  44. package/dist/lib/model_field_value/converters/model_date_range_converter.js +225 -0
  45. package/dist/lib/model_field_value/converters/model_date_range_converter.js.map +1 -0
  46. package/dist/lib/model_field_value/converters/model_geo_value_converter.d.ts +49 -0
  47. package/dist/lib/model_field_value/converters/model_geo_value_converter.js +216 -0
  48. package/dist/lib/model_field_value/converters/model_geo_value_converter.js.map +1 -0
  49. package/dist/lib/model_field_value/converters/model_image_uri_converter.d.ts +49 -0
  50. package/dist/lib/model_field_value/converters/model_image_uri_converter.js +184 -0
  51. package/dist/lib/model_field_value/converters/model_image_uri_converter.js.map +1 -0
  52. package/dist/lib/model_field_value/converters/model_locale_converter.d.ts +51 -0
  53. package/dist/lib/model_field_value/converters/model_locale_converter.js +228 -0
  54. package/dist/lib/model_field_value/converters/model_locale_converter.js.map +1 -0
  55. package/dist/lib/model_field_value/converters/model_localized_value_converter.d.ts +49 -0
  56. package/dist/lib/model_field_value/converters/model_localized_value_converter.js +145 -0
  57. package/dist/lib/model_field_value/converters/model_localized_value_converter.js.map +1 -0
  58. package/dist/lib/model_field_value/converters/model_ref_base_converter.d.ts +49 -0
  59. package/dist/lib/model_field_value/converters/model_ref_base_converter.js +159 -0
  60. package/dist/lib/model_field_value/converters/model_ref_base_converter.js.map +1 -0
  61. package/dist/lib/model_field_value/converters/model_search_converter.d.ts +49 -0
  62. package/dist/lib/model_field_value/converters/model_search_converter.js +138 -0
  63. package/dist/lib/model_field_value/converters/model_search_converter.js.map +1 -0
  64. package/dist/lib/model_field_value/converters/model_server_command_base_converter.d.ts +49 -0
  65. package/dist/lib/model_field_value/converters/model_server_command_base_converter.js +119 -0
  66. package/dist/lib/model_field_value/converters/model_server_command_base_converter.js.map +1 -0
  67. package/dist/lib/model_field_value/converters/model_time_converter.d.ts +49 -0
  68. package/dist/lib/model_field_value/converters/model_time_converter.js +271 -0
  69. package/dist/lib/model_field_value/converters/model_time_converter.js.map +1 -0
  70. package/dist/lib/model_field_value/converters/model_time_range_converter.d.ts +49 -0
  71. package/dist/lib/model_field_value/converters/model_time_range_converter.js +225 -0
  72. package/dist/lib/model_field_value/converters/model_time_range_converter.js.map +1 -0
  73. package/dist/lib/model_field_value/converters/model_timestamp_converter.d.ts +66 -0
  74. package/dist/lib/model_field_value/converters/model_timestamp_converter.js +297 -0
  75. package/dist/lib/model_field_value/converters/model_timestamp_converter.js.map +1 -0
  76. package/dist/lib/model_field_value/converters/model_timestamp_range_converter.d.ts +49 -0
  77. package/dist/lib/model_field_value/converters/model_timestamp_range_converter.js +225 -0
  78. package/dist/lib/model_field_value/converters/model_timestamp_range_converter.js.map +1 -0
  79. package/dist/lib/model_field_value/converters/model_token_converter.d.ts +48 -0
  80. package/dist/lib/model_field_value/converters/model_token_converter.js +137 -0
  81. package/dist/lib/model_field_value/converters/model_token_converter.js.map +1 -0
  82. package/dist/lib/model_field_value/converters/model_uri_converter.d.ts +49 -0
  83. package/dist/lib/model_field_value/converters/model_uri_converter.js +184 -0
  84. package/dist/lib/model_field_value/converters/model_uri_converter.js.map +1 -0
  85. package/dist/lib/model_field_value/converters/model_vector_value_converter.d.ts +49 -0
  86. package/dist/lib/model_field_value/converters/model_vector_value_converter.js +125 -0
  87. package/dist/lib/model_field_value/converters/model_vector_value_converter.js.map +1 -0
  88. package/dist/lib/model_field_value/converters/model_video_uri_converter.d.ts +49 -0
  89. package/dist/lib/model_field_value/converters/model_video_uri_converter.js +184 -0
  90. package/dist/lib/model_field_value/converters/model_video_uri_converter.js.map +1 -0
  91. package/dist/lib/model_field_value/converters/null_converter.d.ts +49 -0
  92. package/dist/lib/model_field_value/converters/null_converter.js +72 -0
  93. package/dist/lib/model_field_value/converters/null_converter.js.map +1 -0
  94. package/dist/lib/model_field_value/default_model_field_value_converter.d.ts +155 -0
  95. package/dist/lib/model_field_value/default_model_field_value_converter.js +303 -0
  96. package/dist/lib/model_field_value/default_model_field_value_converter.js.map +1 -0
  97. package/dist/lib/model_field_value/model_field_value.d.ts +467 -0
  98. package/dist/lib/model_field_value/model_field_value.js +665 -0
  99. package/dist/lib/model_field_value/model_field_value.js.map +1 -0
  100. package/dist/lib/model_field_value/model_field_value_converter.d.ts +117 -0
  101. package/dist/lib/model_field_value/model_field_value_converter.js +49 -0
  102. package/dist/lib/model_field_value/model_field_value_converter.js.map +1 -0
  103. package/dist/lib/regions.d.ts +6 -0
  104. package/dist/lib/regions.js +3 -0
  105. package/dist/lib/regions.js.map +1 -0
  106. package/dist/lib/request.d.ts +12 -0
  107. package/dist/lib/request.js +213 -0
  108. package/dist/lib/request.js.map +1 -0
  109. package/dist/lib/rules.d.ts +32 -0
  110. package/dist/lib/rules.js +299 -0
  111. package/dist/lib/rules.js.map +1 -0
  112. package/dist/lib/schema.d.ts +15 -0
  113. package/dist/lib/schema.js +141 -0
  114. package/dist/lib/schema.js.map +1 -0
  115. package/dist/lib/src/call_process_function_base.d.ts +39 -0
  116. package/dist/lib/src/call_process_function_base.js +72 -0
  117. package/dist/lib/src/call_process_function_base.js.map +1 -0
  118. package/dist/lib/src/firebase_loader.d.ts +30 -0
  119. package/dist/lib/src/firebase_loader.js +96 -0
  120. package/dist/lib/src/firebase_loader.js.map +1 -0
  121. package/dist/lib/src/firestore_base.d.ts +114 -0
  122. package/dist/lib/src/firestore_base.js +363 -0
  123. package/dist/lib/src/firestore_base.js.map +1 -0
  124. package/dist/lib/src/firestore_triggered_process_function_base.d.ts +40 -0
  125. package/dist/lib/src/firestore_triggered_process_function_base.js +72 -0
  126. package/dist/lib/src/firestore_triggered_process_function_base.js.map +1 -0
  127. package/dist/lib/src/functions_base.d.ts +327 -0
  128. package/dist/lib/src/functions_base.js +63 -0
  129. package/dist/lib/src/functions_base.js.map +1 -0
  130. package/dist/lib/src/functions_data.d.ts +10 -0
  131. package/dist/lib/src/functions_data.js +19 -0
  132. package/dist/lib/src/functions_data.js.map +1 -0
  133. package/dist/lib/src/request_process_function_base.d.ts +39 -0
  134. package/dist/lib/src/request_process_function_base.js +70 -0
  135. package/dist/lib/src/request_process_function_base.js.map +1 -0
  136. package/dist/lib/src/request_process_workders_base.d.ts +37 -0
  137. package/dist/lib/src/request_process_workders_base.js +27 -0
  138. package/dist/lib/src/request_process_workders_base.js.map +1 -0
  139. package/dist/lib/src/schedule_process_function_base.d.ts +33 -0
  140. package/dist/lib/src/schedule_process_function_base.js +71 -0
  141. package/dist/lib/src/schedule_process_function_base.js.map +1 -0
  142. package/dist/lib/src/sql_api_base.d.ts +185 -0
  143. package/dist/lib/src/sql_api_base.js +83 -0
  144. package/dist/lib/src/sql_api_base.js.map +1 -0
  145. package/dist/lib/src/workers_base.d.ts +74 -0
  146. package/dist/lib/src/workers_base.js +57 -0
  147. package/dist/lib/src/workers_base.js.map +1 -0
  148. package/dist/lib/src/workers_data.d.ts +10 -0
  149. package/dist/lib/src/workers_data.js +21 -0
  150. package/dist/lib/src/workers_data.js.map +1 -0
  151. package/dist/lib/token.d.ts +12 -0
  152. package/dist/lib/token.js +123 -0
  153. package/dist/lib/token.js.map +1 -0
  154. package/dist/lib/turso_client.d.ts +14 -0
  155. package/dist/lib/turso_client.js +130 -0
  156. package/dist/lib/turso_client.js.map +1 -0
  157. package/dist/lib/types.d.ts +71 -0
  158. package/dist/lib/types.js +3 -0
  159. package/dist/lib/types.js.map +1 -0
  160. package/dist/lib/utils.d.ts +82 -0
  161. package/dist/lib/utils.js +141 -0
  162. package/dist/lib/utils.js.map +1 -0
  163. package/dist/workers/test.d.ts +1 -0
  164. package/dist/workers/test.js +14 -0
  165. package/dist/workers/test.js.map +1 -0
  166. package/dist/workers/turso.d.ts +1 -0
  167. package/dist/workers/turso.js +50 -0
  168. package/dist/workers/turso.js.map +1 -0
  169. package/dist/workers/turso_token.d.ts +1 -0
  170. package/dist/workers/turso_token.js +40 -0
  171. package/dist/workers/turso_token.js.map +1 -0
  172. package/package.json +55 -0
package/README.md ADDED
@@ -0,0 +1,213 @@
1
+ <p align="center">
2
+ <a href="https://mathru.net">
3
+ <img width="240px" src="https://raw.githubusercontent.com/mathrunet/node_masamune/main/.github/images/icon.png" alt="Masamune logo" style="border-radius: 32px"s><br/>
4
+ </a>
5
+ <h1 align="center">Turso for Cloudflare Workers</h1>
6
+ </p>
7
+
8
+ <p align="center">
9
+ <a href="https://github.com/mathrunet">
10
+ <img src="https://img.shields.io/static/v1?label=GitHub&message=Follow&logo=GitHub&color=333333&link=https://github.com/mathrunet" alt="Follow on GitHub" />
11
+ </a>
12
+ <a href="https://x.com/mathru">
13
+ <img src="https://img.shields.io/static/v1?label=@mathru&message=Follow&logo=X&color=0F1419&link=https://x.com/mathru" alt="Follow on X" />
14
+ </a>
15
+ <a href="https://www.youtube.com/c/mathrunetchannel">
16
+ <img src="https://img.shields.io/static/v1?label=YouTube&message=Follow&logo=YouTube&color=FF0000&link=https://www.youtube.com/c/mathrunetchannel" alt="Follow on YouTube" />
17
+ </a>
18
+ <a href="https://github.com/invertase/melos">
19
+ <img src="https://img.shields.io/static/v1?label=maintained%20with&message=melos&color=FF1493&link=https://github.com/invertase/melos" alt="Maintained with Melos" />
20
+ </a>
21
+ </p>
22
+
23
+ <p align="center">
24
+ <a href="https://github.com/sponsors/mathrunet"><img src="https://img.shields.io/static/v1?label=Sponsor&message=%E2%9D%A4&logo=GitHub&color=ff69b4&link=https://github.com/sponsors/mathrunet" alt="GitHub Sponsor" /></a>
25
+ </p>
26
+
27
+ ---
28
+
29
+ [[GitHub]](https://github.com/mathrunet) | [[YouTube]](https://www.youtube.com/c/mathrunetchannel) | [[Packages]](https://pub.dev/publishers/mathru.net/packages) | [[X]](https://x.com/mathru) | [[LinkedIn]](https://www.linkedin.com/in/mathrunet/) | [[mathru.net]](https://mathru.net)
30
+
31
+ ---
32
+
33
+ Just load the package in index.ts and pass the predefined data to the methods to implement the server side.
34
+
35
+ Also, [katana_functions_firebase](https://pub.dev/packages/katana_functions_firebase/score) can be used to execute server-side functions from methods defined on the client side, allowing for safe implementation.
36
+
37
+ # Installation
38
+
39
+ Install the following packages
40
+
41
+ ```bash
42
+ npm install @mathrunet/masamune_cloudflare_turso
43
+ ```
44
+
45
+ # Implementation
46
+
47
+ Pass the return value of the `deploy` function to `export default`. It is defined by passing various Workers to the `deploy` function.
48
+
49
+ ```typescript
50
+ import * as m from "@mathrunet/masamune_cloudflare_turso";
51
+
52
+ export default m.deploy(
53
+ [
54
+ m.Functions.turso({
55
+ url: TURSO_DATABASE_URL,
56
+ authToken: TURSO_AUTH_TOKEN,
57
+ rules: {
58
+ version: "1",
59
+ rules: {
60
+ "database/*/table/*/*": {
61
+ read: "deny",
62
+ write: "deny",
63
+ },
64
+ "database/main/table/users/*": {
65
+ read: "authenticated",
66
+ write: "authenticated",
67
+ },
68
+ },
69
+ },
70
+ }),
71
+ m.Functions.tursoToken({
72
+ url: TURSO_DATABASE_URL,
73
+ authToken: TURSO_AUTH_TOKEN,
74
+ rules: {
75
+ version: "1",
76
+ rules: {
77
+ "database/main/table/users/*": {
78
+ read: "authenticated",
79
+ },
80
+ },
81
+ },
82
+ tokenIssuer: {
83
+ secret: TURSO_TOKEN_SECRET,
84
+ },
85
+ }),
86
+ ],
87
+ );
88
+ ```
89
+
90
+ # Endpoints
91
+
92
+ The package exposes Turso through a single provider path.
93
+
94
+ | Method | Path | Description |
95
+ |---|---|---|
96
+ | `GET` | `/turso` | Read rows or count rows. |
97
+ | `POST` | `/turso` | Create a row. |
98
+ | `PUT` | `/turso` | Update rows. |
99
+ | `DELETE` | `/turso` | Delete rows. |
100
+ | `POST` | `/turso/token` | Issue a scoped short-lived token. |
101
+
102
+ `GET /turso` uses query parameters.
103
+
104
+ ```text
105
+ /turso?database=main&table=users&indexKey=user_1
106
+ ```
107
+
108
+ Collection queries can pass `where`, `orderBy`, and `limit`.
109
+
110
+ ```text
111
+ /turso?database=main&table=users&where=[{"type":"equalTo","key":"name","value":"Alice"}]&orderBy=[{"key":"created_at","descending":true}]&limit=20
112
+ ```
113
+
114
+ Supported `where` types are `equalTo`, `notEqualTo`, `lessThan`,
115
+ `lessThanOrEqualTo`, `greaterThan`, `greaterThanOrEqualTo`, `whereIn`,
116
+ `whereNotIn`, `isNull`, `isNotNull`, and `like`.
117
+
118
+ `POST` / `PUT` / `DELETE` use JSON bodies.
119
+
120
+ ```json
121
+ {
122
+ "database": "main",
123
+ "table": "users",
124
+ "indexKey": "user_1",
125
+ "value": {
126
+ "name": "Alice"
127
+ }
128
+ }
129
+ ```
130
+
131
+ # Database and schema management
132
+
133
+ The worker can create Turso databases and tables automatically.
134
+
135
+ ```typescript
136
+ m.Functions.turso({
137
+ organizationName: TURSO_ORGANIZATION_NAME,
138
+ groupName: TURSO_GROUP_NAME,
139
+ platformApiToken: TURSO_PLATFORM_API_TOKEN,
140
+ defaultDatabase: "main",
141
+ autoCreateDatabase: true,
142
+ autoCreateTable: true,
143
+ autoMigrateAddColumns: true,
144
+ });
145
+ ```
146
+
147
+ `groupName` can also be omitted when the runtime environment provides
148
+ `TURSO_GROUP_NAME`, such as through a local `.env` file or Cloudflare Worker
149
+ environment variables. When neither `groupName` nor `TURSO_GROUP_NAME` is
150
+ configured, database access that needs automatic database creation returns an
151
+ error.
152
+
153
+ Automatic migration is intentionally limited to additive field changes.
154
+
155
+ - New fields in `value` are added with `ALTER TABLE ADD COLUMN`.
156
+ - Existing fields are not migrated when their inferred type changes.
157
+ - Field rename, field deletion, primary key changes, unique constraints, and foreign keys are not automatically migrated.
158
+ - `PUT` and `DELETE` require `indexKey` or `where` to avoid accidental full-table changes.
159
+
160
+ The default table shape is:
161
+
162
+ ```sql
163
+ CREATE TABLE IF NOT EXISTS table_name (
164
+ id TEXT PRIMARY KEY,
165
+ created_at INTEGER,
166
+ updated_at INTEGER,
167
+ ...
168
+ )
169
+ ```
170
+
171
+ Objects and arrays are stored as JSON strings.
172
+
173
+ # Scoped short-lived token
174
+
175
+ Use `/turso/token` to issue a token after filtering the requested scope through `rules`.
176
+
177
+ ```json
178
+ {
179
+ "database": "main",
180
+ "scope": [
181
+ {
182
+ "table": "users",
183
+ "operations": ["read"]
184
+ }
185
+ ],
186
+ "ttlSeconds": 600
187
+ }
188
+ ```
189
+
190
+ The response is:
191
+
192
+ ```json
193
+ {
194
+ "token": "<jwt>",
195
+ "expiresAt": 1760000000
196
+ }
197
+ ```
198
+
199
+ `ttlSeconds` defaults to 600 seconds and is capped by `maxTtlSeconds` (default: 3600 seconds).
200
+
201
+ When `organizationName` and `platformApiToken` are configured, tokens are generated with the Turso Platform API:
202
+
203
+ ```text
204
+ POST /v1/organizations/{organizationSlug}/databases/{databaseName}/auth/tokens
205
+ ```
206
+
207
+ If Platform API settings are not available, the worker falls back to a local HS256 JWT signed with `tokenIssuer.secret` or `authToken`.
208
+
209
+ # GitHub Sponsors
210
+
211
+ Sponsors are always welcome. Thank you for your support!
212
+
213
+ [https://github.com/sponsors/mathrunet](https://github.com/sponsors/mathrunet)
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const functions = __importStar(require("firebase-functions/v2"));
37
+ const firebase_loader_1 = require("../lib/src/firebase_loader");
38
+ /**
39
+ * Endpoints for testing.
40
+ *
41
+ * テストを行うためのエンドポイントです。
42
+ */
43
+ module.exports = (regions, options, data) => functions.https.onCall({
44
+ region: options.region ?? regions,
45
+ timeoutSeconds: options.timeoutSeconds,
46
+ memory: options.memory,
47
+ minInstances: options.minInstances,
48
+ concurrency: options.concurrency,
49
+ maxInstances: options.maxInstances,
50
+ serviceAccount: options?.serviceAccount ?? undefined,
51
+ enforceAppCheck: options.enforceAppCheck ?? undefined,
52
+ consumeAppCheckToken: options.consumeAppCheckToken ?? undefined,
53
+ }, async (query) => {
54
+ try {
55
+ const path = query.data.path;
56
+ if (!path) {
57
+ return {};
58
+ }
59
+ const firestoreDatabaseIds = options.firestoreDatabaseIds ?? [""];
60
+ for (const databaseId of firestoreDatabaseIds) {
61
+ const firestoreInstance = (0, firebase_loader_1.firestoreLoader)(databaseId);
62
+ const doc = await firestoreInstance.doc(path).load();
63
+ return { ...doc.data() };
64
+ }
65
+ }
66
+ catch (err) {
67
+ console.error(err);
68
+ throw err;
69
+ }
70
+ });
71
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/functions/test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iEAAmD;AAEnD,gEAA6D;AAE7D;;;;GAIG;AACH,MAAM,CAAC,OAAO,GAAG,CACf,OAAiB,EACjB,OAA6B,EAC7B,IAA4B,EAC5B,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CACzB;IACE,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,OAAO;IACjC,cAAc,EAAE,OAAO,CAAC,cAAc;IACtC,MAAM,EAAE,OAAO,CAAC,MAAM;IACtB,YAAY,EAAE,OAAO,CAAC,YAAY;IAClC,WAAW,EAAE,OAAO,CAAC,WAAW;IAChC,YAAY,EAAE,OAAO,CAAC,YAAY;IAClC,cAAc,EAAE,OAAO,EAAE,cAAc,IAAI,SAAS;IACpD,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,SAAS;IACrD,oBAAoB,EAAE,OAAO,CAAC,oBAAoB,IAAI,SAAS;CAChE,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;IACd,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,IAAI,CAAC,EAAE,CAAC,CAAC;QAClE,KAAK,MAAM,UAAU,IAAI,oBAAoB,EAAE,CAAC;YAC9C,MAAM,iBAAiB,GAAG,IAAA,iCAAe,EAAC,UAAU,CAAC,CAAC;YACtD,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;YACrD,OAAO,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;QAC3B,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC,CACF,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const crud_1 = require("../lib/crud");
4
+ const request_1 = require("../lib/request");
5
+ const rules_1 = require("../lib/rules");
6
+ const turso_client_1 = require("../lib/turso_client");
7
+ module.exports = (hono, options, data) => {
8
+ hono.get("/", async (context) => handleCrud(context, options, "GET"));
9
+ hono.post("/", async (context) => handleCrud(context, options, "POST"));
10
+ hono.put("/", async (context) => handleCrud(context, options, "PUT"));
11
+ hono.delete("/", async (context) => handleCrud(context, options, "DELETE"));
12
+ return hono;
13
+ };
14
+ async function handleCrud(context, options, method) {
15
+ try {
16
+ const request = await (0, request_1.parseCrudRequest)(context);
17
+ const connection = await (0, turso_client_1.resolveDatabaseConnection)(request.database, options);
18
+ const client = (0, turso_client_1.createTursoClient)(connection);
19
+ const engine = (0, rules_1.createTursoRulesEngine)(options.rules);
20
+ const authentication = context.get("authentication");
21
+ const result = await engine.evaluate({
22
+ path: (0, rules_1.buildRulesPath)({
23
+ database: request.database,
24
+ table: request.table,
25
+ indexKey: request.indexKey ?? "*",
26
+ }),
27
+ operation: (0, rules_1.normalizeHttpMethodToRulesOperation)(method),
28
+ authentication,
29
+ fetchDocument: async () => (0, crud_1.fetchDocumentForRules)(client, request),
30
+ });
31
+ if (!result.allowed) {
32
+ return context.json({
33
+ error: "denied",
34
+ rule: result.rulePath,
35
+ }, 403);
36
+ }
37
+ const response = await (0, crud_1.executeCrud)({
38
+ client,
39
+ method,
40
+ request,
41
+ autoCreateTable: options.autoCreateTable !== false,
42
+ autoMigrateAddColumns: options.autoMigrateAddColumns !== false,
43
+ });
44
+ return context.json({ data: response });
45
+ }
46
+ catch (error) {
47
+ return (0, request_1.jsonError)(context, error);
48
+ }
49
+ }
50
+ //# sourceMappingURL=turso.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turso.js","sourceRoot":"","sources":["../../src/functions/turso.ts"],"names":[],"mappings":";;AAMA,sCAAiE;AACjE,4CAA6D;AAC7D,wCAIsB;AACtB,sDAG6B;AAE7B,MAAM,CAAC,OAAO,GAAG,CACf,IAAU,EACV,OAA4B,EAC5B,IAAgC,EAChC,EAAE;IACF,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IACtE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IACxE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IACtE,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC5E,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,KAAK,UAAU,UAAU,CACvB,OAAgB,EAChB,OAA4B,EAC5B,MAAuB;IAEvB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,IAAA,0BAAgB,EAAC,OAAO,CAAC,CAAC;QAChD,MAAM,UAAU,GAAG,MAAM,IAAA,wCAAyB,EAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9E,MAAM,MAAM,GAAG,IAAA,gCAAiB,EAAC,UAAU,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAA,8BAAsB,EAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAsC,CAAC;QAC1F,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACnC,IAAI,EAAE,IAAA,sBAAc,EAAC;gBACnB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,GAAG;aAClC,CAAC;YACF,SAAS,EAAE,IAAA,2CAAmC,EAAC,MAAM,CAAC;YACtD,cAAc;YACd,aAAa,EAAE,KAAK,IAAI,EAAE,CAAC,IAAA,4BAAqB,EAAC,MAAM,EAAE,OAAO,CAAC;SAClE,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,OAAO,CAAC,IAAI,CAAC;gBAClB,KAAK,EAAE,QAAQ;gBACf,IAAI,EAAE,MAAM,CAAC,QAAQ;aACtB,EAAE,GAAG,CAAC,CAAC;QACV,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,IAAA,kBAAW,EAAC;YACjC,MAAM;YACN,MAAM;YACN,OAAO;YACP,eAAe,EAAE,OAAO,CAAC,eAAe,KAAK,KAAK;YAClD,qBAAqB,EAAE,OAAO,CAAC,qBAAqB,KAAK,KAAK;SAC/D,CAAC,CAAC;QACH,OAAO,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,IAAA,mBAAS,EAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;AACH,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const request_1 = require("../lib/request");
4
+ const rules_1 = require("../lib/rules");
5
+ const turso_client_1 = require("../lib/turso_client");
6
+ const token_1 = require("../lib/token");
7
+ module.exports = (hono, options, data) => {
8
+ hono.post("/", async (context) => handleToken(context, options));
9
+ return hono;
10
+ };
11
+ async function handleToken(context, options) {
12
+ try {
13
+ const request = await (0, request_1.parseTokenRequest)(context);
14
+ await (0, turso_client_1.resolveDatabaseConnection)(request.database, options);
15
+ const authentication = context.get("authentication");
16
+ const engine = (0, rules_1.createTursoRulesEngine)(options.rules);
17
+ const scope = await (0, rules_1.filterAllowedScope)({
18
+ engine,
19
+ database: request.database,
20
+ scope: request.scope,
21
+ authentication,
22
+ });
23
+ if (scope.length === 0) {
24
+ return context.json({
25
+ error: "denied",
26
+ }, 403);
27
+ }
28
+ const token = await (0, token_1.issueScopedToken)({
29
+ database: request.database,
30
+ scope,
31
+ ttlSeconds: request.ttlSeconds,
32
+ options,
33
+ });
34
+ return context.json(token);
35
+ }
36
+ catch (error) {
37
+ return (0, request_1.jsonError)(context, error);
38
+ }
39
+ }
40
+ //# sourceMappingURL=turso_token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"turso_token.js","sourceRoot":"","sources":["../../src/functions/turso_token.ts"],"names":[],"mappings":";;AAKA,4CAA8D;AAC9D,wCAGsB;AACtB,sDAAgE;AAChE,wCAAgD;AAEhD,MAAM,CAAC,OAAO,GAAG,CACf,IAAU,EACV,OAA4B,EAC5B,IAAgC,EAChC,EAAE;IACF,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACjE,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,KAAK,UAAU,WAAW,CACxB,OAAgB,EAChB,OAA4B;IAE5B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,IAAA,2BAAiB,EAAC,OAAO,CAAC,CAAC;QACjD,MAAM,IAAA,wCAAyB,EAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC3D,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAsC,CAAC;QAC1F,MAAM,MAAM,GAAG,IAAA,8BAAsB,EAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,MAAM,IAAA,0BAAkB,EAAC;YACrC,MAAM;YACN,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,cAAc;SACf,CAAC,CAAC;QACH,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,OAAO,CAAC,IAAI,CAAC;gBAClB,KAAK,EAAE,QAAQ;aAChB,EAAE,GAAG,CAAC,CAAC;QACV,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,IAAA,wBAAgB,EAAC;YACnC,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,KAAK;YACL,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,OAAO;SACR,CAAC,CAAC;QACH,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,IAAA,mBAAS,EAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;AACH,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { WorkersData } from "@mathrunet/masamune_cloudflare";
2
+ import { TursoWorkersOptions } from "./lib/types";
3
+ /**
4
+ * Define a list of applicable Functions for Cloudflare Workers.
5
+ *
6
+ * Cloudflare Workers用の適用可能なFunctionsの一覧を定義します。
7
+ */
8
+ export declare const Functions: {
9
+ /**
10
+ * Endpoints for Turso database CRUD.
11
+ *
12
+ * TursoデータベースCRUD用のエンドポイントです。
13
+ */
14
+ readonly turso: (options?: TursoWorkersOptions) => WorkersData;
15
+ /**
16
+ * Endpoint for issuing scoped short-lived Turso tokens.
17
+ *
18
+ * スコープされた短命Tursoトークン発行用のエンドポイントです。
19
+ */
20
+ readonly tursoToken: (options?: TursoWorkersOptions) => WorkersData;
21
+ };
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Functions = void 0;
4
+ const masamune_cloudflare_1 = require("@mathrunet/masamune_cloudflare");
5
+ /**
6
+ * Define a list of applicable Functions for Cloudflare Workers.
7
+ *
8
+ * Cloudflare Workers用の適用可能なFunctionsの一覧を定義します。
9
+ */
10
+ exports.Functions = {
11
+ /**
12
+ * Endpoints for Turso database CRUD.
13
+ *
14
+ * TursoデータベースCRUD用のエンドポイントです。
15
+ */
16
+ turso: (options = {}) => new masamune_cloudflare_1.WorkersData({ path: "/turso", func: require("./functions/turso"), options: options }),
17
+ /**
18
+ * Endpoint for issuing scoped short-lived Turso tokens.
19
+ *
20
+ * スコープされた短命Tursoトークン発行用のエンドポイントです。
21
+ */
22
+ tursoToken: (options = {}) => new masamune_cloudflare_1.WorkersData({ path: "/turso/token", func: require("./functions/turso_token"), options: options }),
23
+ };
24
+ //# sourceMappingURL=functions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"functions.js","sourceRoot":"","sources":["../src/functions.ts"],"names":[],"mappings":";;;AAAA,wEAA6E;AAG7E;;;;GAIG;AACU,QAAA,SAAS,GAAG;IACvB;;;;OAIG;IACH,KAAK,EAAE,CAAC,UAA+B,EAAE,EAAE,EAAE,CAAC,IAAI,iCAAW,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,mBAAmB,CAAC,EAAE,OAAO,EAAE,OAAoC,EAAE,CAAC;IAEpK;;;;OAIG;IACH,UAAU,EAAE,CAAC,UAA+B,EAAE,EAAE,EAAE,CAAC,IAAI,iCAAW,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,OAAO,CAAC,yBAAyB,CAAC,EAAE,OAAO,EAAE,OAAoC,EAAE,CAAC;CAC7K,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Copyright (c) 2025 mathru. All rights reserved.
3
+ *
4
+ * Server-side package of the Masamune framework for working with Turso via Cloudflare.
5
+ *
6
+ * To use, import * as m from "@mathrunet/masamune_cloudflare_turso";
7
+ *
8
+ * [mathru.net]: https://mathru.net
9
+ * [YouTube]: https://www.youtube.com/c/mathrunetchannel
10
+ */
11
+ export * from "@mathrunet/masamune";
12
+ export * from "@mathrunet/masamune_cloudflare";
13
+ export * from "./functions";
14
+ export type { RulesAccessRule, RulesConfig, RulesEntry, RulesOperation, RulesOperationAlias, RulesOperationKey, } from "./lib/types";
15
+ export * from "./lib/types";
package/dist/index.js ADDED
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ /**
18
+ * Copyright (c) 2025 mathru. All rights reserved.
19
+ *
20
+ * Server-side package of the Masamune framework for working with Turso via Cloudflare.
21
+ *
22
+ * To use, import * as m from "@mathrunet/masamune_cloudflare_turso";
23
+ *
24
+ * [mathru.net]: https://mathru.net
25
+ * [YouTube]: https://www.youtube.com/c/mathrunetchannel
26
+ */
27
+ __exportStar(require("@mathrunet/masamune"), exports);
28
+ __exportStar(require("@mathrunet/masamune_cloudflare"), exports);
29
+ __exportStar(require("./functions"), exports);
30
+ __exportStar(require("./lib/types"), exports);
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;;;;;;;;GASG;AACH,sDAAoC;AACpC,iEAA+C;AAC/C,8CAA4B;AAS5B,8CAA4B"}