@mathrunet/masamune_cloudflare_turso 3.2.14 → 3.4.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 (148) hide show
  1. package/CHANGELOG.md +13 -1
  2. package/README.md +27 -19
  3. package/dist/functions/turso.js +2 -1
  4. package/dist/functions/turso.js.map +1 -1
  5. package/dist/index.d.ts +1 -0
  6. package/dist/index.js +1 -0
  7. package/dist/index.js.map +1 -1
  8. package/dist/lib/database_adapter.d.ts +105 -0
  9. package/dist/lib/database_adapter.js +356 -0
  10. package/dist/lib/database_adapter.js.map +1 -0
  11. package/dist/lib/rules.js +5 -3
  12. package/dist/lib/rules.js.map +1 -1
  13. package/package.json +3 -3
  14. package/dist/functions/test.d.ts +0 -1
  15. package/dist/functions/test.js +0 -71
  16. package/dist/functions/test.js.map +0 -1
  17. package/dist/lib/api.d.ts +0 -183
  18. package/dist/lib/api.js +0 -144
  19. package/dist/lib/api.js.map +0 -1
  20. package/dist/lib/exntensions/firestore.extension.d.ts +0 -247
  21. package/dist/lib/exntensions/firestore.extension.js +0 -386
  22. package/dist/lib/exntensions/firestore.extension.js.map +0 -1
  23. package/dist/lib/exntensions/string.extension.d.ts +0 -214
  24. package/dist/lib/exntensions/string.extension.js +0 -223
  25. package/dist/lib/exntensions/string.extension.js.map +0 -1
  26. package/dist/lib/model_field_value/converters/basic_converter.d.ts +0 -49
  27. package/dist/lib/model_field_value/converters/basic_converter.js +0 -51
  28. package/dist/lib/model_field_value/converters/basic_converter.js.map +0 -1
  29. package/dist/lib/model_field_value/converters/enum_converter.d.ts +0 -49
  30. package/dist/lib/model_field_value/converters/enum_converter.js +0 -51
  31. package/dist/lib/model_field_value/converters/enum_converter.js.map +0 -1
  32. package/dist/lib/model_field_value/converters/model_counter_converter.d.ts +0 -49
  33. package/dist/lib/model_field_value/converters/model_counter_converter.js +0 -216
  34. package/dist/lib/model_field_value/converters/model_counter_converter.js.map +0 -1
  35. package/dist/lib/model_field_value/converters/model_date_converter.d.ts +0 -49
  36. package/dist/lib/model_field_value/converters/model_date_converter.js +0 -271
  37. package/dist/lib/model_field_value/converters/model_date_converter.js.map +0 -1
  38. package/dist/lib/model_field_value/converters/model_date_range_converter.d.ts +0 -49
  39. package/dist/lib/model_field_value/converters/model_date_range_converter.js +0 -225
  40. package/dist/lib/model_field_value/converters/model_date_range_converter.js.map +0 -1
  41. package/dist/lib/model_field_value/converters/model_geo_value_converter.d.ts +0 -49
  42. package/dist/lib/model_field_value/converters/model_geo_value_converter.js +0 -216
  43. package/dist/lib/model_field_value/converters/model_geo_value_converter.js.map +0 -1
  44. package/dist/lib/model_field_value/converters/model_image_uri_converter.d.ts +0 -49
  45. package/dist/lib/model_field_value/converters/model_image_uri_converter.js +0 -184
  46. package/dist/lib/model_field_value/converters/model_image_uri_converter.js.map +0 -1
  47. package/dist/lib/model_field_value/converters/model_locale_converter.d.ts +0 -51
  48. package/dist/lib/model_field_value/converters/model_locale_converter.js +0 -228
  49. package/dist/lib/model_field_value/converters/model_locale_converter.js.map +0 -1
  50. package/dist/lib/model_field_value/converters/model_localized_value_converter.d.ts +0 -49
  51. package/dist/lib/model_field_value/converters/model_localized_value_converter.js +0 -145
  52. package/dist/lib/model_field_value/converters/model_localized_value_converter.js.map +0 -1
  53. package/dist/lib/model_field_value/converters/model_ref_base_converter.d.ts +0 -49
  54. package/dist/lib/model_field_value/converters/model_ref_base_converter.js +0 -159
  55. package/dist/lib/model_field_value/converters/model_ref_base_converter.js.map +0 -1
  56. package/dist/lib/model_field_value/converters/model_search_converter.d.ts +0 -49
  57. package/dist/lib/model_field_value/converters/model_search_converter.js +0 -138
  58. package/dist/lib/model_field_value/converters/model_search_converter.js.map +0 -1
  59. package/dist/lib/model_field_value/converters/model_server_command_base_converter.d.ts +0 -49
  60. package/dist/lib/model_field_value/converters/model_server_command_base_converter.js +0 -119
  61. package/dist/lib/model_field_value/converters/model_server_command_base_converter.js.map +0 -1
  62. package/dist/lib/model_field_value/converters/model_time_converter.d.ts +0 -49
  63. package/dist/lib/model_field_value/converters/model_time_converter.js +0 -271
  64. package/dist/lib/model_field_value/converters/model_time_converter.js.map +0 -1
  65. package/dist/lib/model_field_value/converters/model_time_range_converter.d.ts +0 -49
  66. package/dist/lib/model_field_value/converters/model_time_range_converter.js +0 -225
  67. package/dist/lib/model_field_value/converters/model_time_range_converter.js.map +0 -1
  68. package/dist/lib/model_field_value/converters/model_timestamp_converter.d.ts +0 -66
  69. package/dist/lib/model_field_value/converters/model_timestamp_converter.js +0 -297
  70. package/dist/lib/model_field_value/converters/model_timestamp_converter.js.map +0 -1
  71. package/dist/lib/model_field_value/converters/model_timestamp_range_converter.d.ts +0 -49
  72. package/dist/lib/model_field_value/converters/model_timestamp_range_converter.js +0 -225
  73. package/dist/lib/model_field_value/converters/model_timestamp_range_converter.js.map +0 -1
  74. package/dist/lib/model_field_value/converters/model_token_converter.d.ts +0 -48
  75. package/dist/lib/model_field_value/converters/model_token_converter.js +0 -137
  76. package/dist/lib/model_field_value/converters/model_token_converter.js.map +0 -1
  77. package/dist/lib/model_field_value/converters/model_uri_converter.d.ts +0 -49
  78. package/dist/lib/model_field_value/converters/model_uri_converter.js +0 -184
  79. package/dist/lib/model_field_value/converters/model_uri_converter.js.map +0 -1
  80. package/dist/lib/model_field_value/converters/model_vector_value_converter.d.ts +0 -49
  81. package/dist/lib/model_field_value/converters/model_vector_value_converter.js +0 -125
  82. package/dist/lib/model_field_value/converters/model_vector_value_converter.js.map +0 -1
  83. package/dist/lib/model_field_value/converters/model_video_uri_converter.d.ts +0 -49
  84. package/dist/lib/model_field_value/converters/model_video_uri_converter.js +0 -184
  85. package/dist/lib/model_field_value/converters/model_video_uri_converter.js.map +0 -1
  86. package/dist/lib/model_field_value/converters/null_converter.d.ts +0 -49
  87. package/dist/lib/model_field_value/converters/null_converter.js +0 -72
  88. package/dist/lib/model_field_value/converters/null_converter.js.map +0 -1
  89. package/dist/lib/model_field_value/default_model_field_value_converter.d.ts +0 -155
  90. package/dist/lib/model_field_value/default_model_field_value_converter.js +0 -303
  91. package/dist/lib/model_field_value/default_model_field_value_converter.js.map +0 -1
  92. package/dist/lib/model_field_value/model_field_value.d.ts +0 -467
  93. package/dist/lib/model_field_value/model_field_value.js +0 -665
  94. package/dist/lib/model_field_value/model_field_value.js.map +0 -1
  95. package/dist/lib/model_field_value/model_field_value_converter.d.ts +0 -117
  96. package/dist/lib/model_field_value/model_field_value_converter.js +0 -49
  97. package/dist/lib/model_field_value/model_field_value_converter.js.map +0 -1
  98. package/dist/lib/regions.d.ts +0 -6
  99. package/dist/lib/regions.js +0 -3
  100. package/dist/lib/regions.js.map +0 -1
  101. package/dist/lib/src/call_process_function_base.d.ts +0 -39
  102. package/dist/lib/src/call_process_function_base.js +0 -72
  103. package/dist/lib/src/call_process_function_base.js.map +0 -1
  104. package/dist/lib/src/firebase_loader.d.ts +0 -30
  105. package/dist/lib/src/firebase_loader.js +0 -96
  106. package/dist/lib/src/firebase_loader.js.map +0 -1
  107. package/dist/lib/src/firestore_base.d.ts +0 -114
  108. package/dist/lib/src/firestore_base.js +0 -363
  109. package/dist/lib/src/firestore_base.js.map +0 -1
  110. package/dist/lib/src/firestore_triggered_process_function_base.d.ts +0 -40
  111. package/dist/lib/src/firestore_triggered_process_function_base.js +0 -72
  112. package/dist/lib/src/firestore_triggered_process_function_base.js.map +0 -1
  113. package/dist/lib/src/functions_base.d.ts +0 -327
  114. package/dist/lib/src/functions_base.js +0 -63
  115. package/dist/lib/src/functions_base.js.map +0 -1
  116. package/dist/lib/src/functions_data.d.ts +0 -10
  117. package/dist/lib/src/functions_data.js +0 -19
  118. package/dist/lib/src/functions_data.js.map +0 -1
  119. package/dist/lib/src/request_process_function_base.d.ts +0 -39
  120. package/dist/lib/src/request_process_function_base.js +0 -70
  121. package/dist/lib/src/request_process_function_base.js.map +0 -1
  122. package/dist/lib/src/request_process_workders_base.d.ts +0 -37
  123. package/dist/lib/src/request_process_workders_base.js +0 -27
  124. package/dist/lib/src/request_process_workders_base.js.map +0 -1
  125. package/dist/lib/src/schedule_process_function_base.d.ts +0 -33
  126. package/dist/lib/src/schedule_process_function_base.js +0 -71
  127. package/dist/lib/src/schedule_process_function_base.js.map +0 -1
  128. package/dist/lib/src/sql_api_base.d.ts +0 -185
  129. package/dist/lib/src/sql_api_base.js +0 -83
  130. package/dist/lib/src/sql_api_base.js.map +0 -1
  131. package/dist/lib/src/workers_base.d.ts +0 -74
  132. package/dist/lib/src/workers_base.js +0 -57
  133. package/dist/lib/src/workers_base.js.map +0 -1
  134. package/dist/lib/src/workers_data.d.ts +0 -10
  135. package/dist/lib/src/workers_data.js +0 -21
  136. package/dist/lib/src/workers_data.js.map +0 -1
  137. package/dist/lib/utils.d.ts +0 -82
  138. package/dist/lib/utils.js +0 -141
  139. package/dist/lib/utils.js.map +0 -1
  140. package/dist/workers/test.d.ts +0 -1
  141. package/dist/workers/test.js +0 -14
  142. package/dist/workers/test.js.map +0 -1
  143. package/dist/workers/turso.d.ts +0 -1
  144. package/dist/workers/turso.js +0 -50
  145. package/dist/workers/turso.js.map +0 -1
  146. package/dist/workers/turso_token.d.ts +0 -1
  147. package/dist/workers/turso_token.js +0 -40
  148. package/dist/workers/turso_token.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,4 +1,4 @@
1
- ## 3.2.14 (2026-07-01)
1
+ ## 3.4.1 (2026-07-04)
2
2
 
3
3
 
4
4
  ### chore
@@ -58,6 +58,7 @@
58
58
  * Remove comments ([eb83a5f](https://github.com/mathrunet/node_masamune/commit/eb83a5f6fdc1d8c6a03ce691cf11e8d3fbfdb85e))
59
59
  * Scrutinize log output ([5eaa4a2](https://github.com/mathrunet/node_masamune/commit/5eaa4a2042f8b714b3f48e44cc44c8f86549212e))
60
60
  * Update @mathrunet/katana to version 3.9.1 ([d8e32a1](https://github.com/mathrunet/node_masamune/commit/d8e32a1f238ed3b29003bd83799fde57a054c063))
61
+ * update @mathrunet/masamune dependency version to 3.10.4 across multiple packages ([f62e636](https://github.com/mathrunet/node_masamune/commit/f62e6367ddf48e513c523b8970b4fdc5b4e31152))
61
62
  * Update Masamune package to version 3.8.3 ([8e8155e](https://github.com/mathrunet/node_masamune/commit/8e8155e3380f05fb05abdb087c9bfff0b05c1795))
62
63
  * Update masamune package version ([f4998d6](https://github.com/mathrunet/node_masamune/commit/f4998d654dee28f2f12c5d2d8b9c861563825dbd))
63
64
  * Update Node.js engine to v22 and bump development dependencies across packages. ([d840a0f](https://github.com/mathrunet/node_masamune/commit/d840a0f503230f80edbdf01f9516841cff36798d))
@@ -106,6 +107,7 @@
106
107
  * Add PDF creation function. ([de349b3](https://github.com/mathrunet/node_masamune/commit/de349b382bacd325929b2c6fa8330dbe7fe12b98))
107
108
  * Add removeOnlyEmoji method to String prototype and update usage in ModelFieldValue class ([dccecf8](https://github.com/mathrunet/node_masamune/commit/dccecf844ad7602e5acedfb4653620ac80c017cb))
108
109
  * Add required type. ([d92208c](https://github.com/mathrunet/node_masamune/commit/d92208cdb1e7340d2b9258a6a090123f581bf5d9))
110
+ * add scheduled workers support and enhance deployment functionality ([70ab4d6](https://github.com/mathrunet/node_masamune/commit/70ab4d6856badb8d86420acf757fc75823493aef))
109
111
  * add scheduler notification tests and update general test utilities and Firestore tests. ([710e462](https://github.com/mathrunet/node_masamune/commit/710e46287e7eb7fea6dd461e0d5354ce2f1bbfd2))
110
112
  * Add short video generation function using Gemini 2.5 Flash and FFmpeg, including tests, documentation, and updated ignore rules for temporary files. ([7e6cde2](https://github.com/mathrunet/node_masamune/commit/7e6cde28f7760c54058cb1e2073c6e97f552d39e))
111
113
  * Add SqlApiBase. ([ff6c5b2](https://github.com/mathrunet/node_masamune/commit/ff6c5b28905402f326904eb4052e86db82be4778))
@@ -152,6 +154,7 @@
152
154
  * Gmail stopped working, so I deleted it. ([c415079](https://github.com/mathrunet/node_masamune/commit/c4150799abeb996b0a08e3d9b7dccb232a2404f2))
153
155
  * Google Play Console data acquisition function implementation ([28ad81f](https://github.com/mathrunet/node_masamune/commit/28ad81ff6451c922ff16c40e52646571d2d39d60))
154
156
  * implement broad/detailed research and asset creation functions, alongside new documentation and tests ([0c1c05d](https://github.com/mathrunet/node_masamune/commit/0c1c05da72d25219080ac98809322b13667b047c))
157
+ * implement Cloudflare KV integration with document-oriented model ([b9af783](https://github.com/mathrunet/node_masamune/commit/b9af7834275e36fdf48977f59dec22f41760bcb8))
155
158
  * implement Firebase function to generate short video metadata using Vertex AI, including tests and development documentation. ([2251993](https://github.com/mathrunet/node_masamune/commit/22519933c8b1f84fc7ae26a5754c6c02d96b5969))
156
159
  * Implement retry mechanism for Vertex AI API calls in ResearchMarket function and enhance error handling ([ac03efe](https://github.com/mathrunet/node_masamune/commit/ac03efe06d7958ad7ebc9a405cf31c351a3b4298))
157
160
  * Implementation of data retrieval API. ([df9ad88](https://github.com/mathrunet/node_masamune/commit/df9ad88da46ccb85cea4172ed8c0107ea2c431f7))
@@ -342,9 +345,17 @@
342
345
 
343
346
  ### refactor
344
347
 
348
+ * enhance Google token functionality for Cloudflare Workers ([bb4b4bc](https://github.com/mathrunet/node_masamune/commit/bb4b4bc7bceec4064c5bcd01066d93b1b636b69f))
349
+ * enhance media processing for Cloudflare Workers ([7d76e68](https://github.com/mathrunet/node_masamune/commit/7d76e68f93f89321492aa1716e778e5f4a869afc))
350
+ * enhance notification functionality for Cloudflare Workers ([04c14c6](https://github.com/mathrunet/node_masamune/commit/04c14c62f0195ab36ccb4df21efebbd410259e84))
351
+ * enhance SendGrid integration for Cloudflare Workers ([60f9976](https://github.com/mathrunet/node_masamune/commit/60f997643c223c74d9f2344d79e91d2337e4018f))
345
352
  * Remove debug log statements from FirestoreNullConverter ([b110a47](https://github.com/mathrunet/node_masamune/commit/b110a47faac178d79e4810221a0c89a943417f59))
346
353
  * Remove various cloud functions and tests, and add new tests for short video generation functionality. ([b5a2f34](https://github.com/mathrunet/node_masamune/commit/b5a2f34d474218c76cb25fdc1f6c0fe3b6c13413))
354
+ * restructure database rules for improved clarity and consistency ([b541875](https://github.com/mathrunet/node_masamune/commit/b5418755495ef5340657e532466659e5f3c8cf82))
347
355
  * Save the interface to a separate file. ([141f8bd](https://github.com/mathrunet/node_masamune/commit/141f8bdf6b06538de2512e52b7fedb58366c4e8b))
356
+ * update Android token functions for Cloudflare Workers integration ([f3d602e](https://github.com/mathrunet/node_masamune/commit/f3d602ec1ac846471217d150ffcf166771f8f247))
357
+ * update Cloudflare purchase functions for improved handling ([f4d1a20](https://github.com/mathrunet/node_masamune/commit/f4d1a2038a15f162d1df6b3558fe8300e09a3d78))
358
+ * update geocoding functionality for Cloudflare Workers ([1398cc6](https://github.com/mathrunet/node_masamune/commit/1398cc6fa73e0474a39c1bd7f1d718398b91367a))
348
359
 
349
360
  ### test
350
361
 
@@ -357,6 +368,7 @@
357
368
  * Creating tests. ([2a91c82](https://github.com/mathrunet/node_masamune/commit/2a91c824c4cf584fac10f9ac61d9bf4f103c5196))
358
369
  * Extend the timeout for the short video generation test. ([9e46c82](https://github.com/mathrunet/node_masamune/commit/9e46c828c791d933b32344842e63830782aa0fa5))
359
370
  * Fixes to pass tests. ([a656689](https://github.com/mathrunet/node_masamune/commit/a6566898613d76cd1027a319cda4f605044db151))
371
+ * refactor media tests for Cloudflare integration ([7b1e581](https://github.com/mathrunet/node_masamune/commit/7b1e5816b297d68ba5c28599b5cfb7fa935a70f4))
360
372
  * Test code implementation. ([7f40834](https://github.com/mathrunet/node_masamune/commit/7f40834936b13a1b54b792b1c47f7c1ae2319502))
361
373
 
362
374
 
package/README.md CHANGED
@@ -190,13 +190,15 @@ option.
190
190
  {
191
191
  "version": "1",
192
192
  "rules": {
193
- "database/main": {
194
- "read": "allow",
195
- "write": "server"
196
- },
197
- "database/main/users/*": {
198
- "read": "authenticated",
199
- "write": { "type": "field", "field": "ownerId", "server": true }
193
+ "database": {
194
+ "main": {
195
+ "read": "allow",
196
+ "write": "server"
197
+ },
198
+ "main/users/*": {
199
+ "read": "authenticated",
200
+ "write": { "type": "field", "field": "ownerId", "server": true }
201
+ }
200
202
  }
201
203
  }
202
204
  }
@@ -213,9 +215,11 @@ Token authorization is evaluated against the database path:
213
215
  {
214
216
  "version": "1",
215
217
  "rules": {
216
- "database/main": {
217
- "read": "authenticated",
218
- "write": "deny"
218
+ "database": {
219
+ "main": {
220
+ "read": "authenticated",
221
+ "write": "deny"
222
+ }
219
223
  }
220
224
  }
221
225
  }
@@ -231,9 +235,11 @@ Named path parameters can be compared with the authenticated user ID:
231
235
  {
232
236
  "version": "1",
233
237
  "rules": {
234
- "database/{uid}": {
235
- "read": { "type": "path", "param": "uid" },
236
- "write": { "type": "path", "param": "uid" }
238
+ "database": {
239
+ "{uid}": {
240
+ "read": { "type": "path", "param": "uid" },
241
+ "write": { "type": "path", "param": "uid" }
242
+ }
237
243
  }
238
244
  }
239
245
  }
@@ -249,12 +255,14 @@ issuing only the direct Turso token that is safe for the requested scope:
249
255
  {
250
256
  "version": "1",
251
257
  "rules": {
252
- "database/{uid}": {
253
- "read": { "type": "path", "param": "uid" },
254
- "write": {
255
- "type": "path",
256
- "param": "uid",
257
- "server": true
258
+ "database": {
259
+ "{uid}": {
260
+ "read": { "type": "path", "param": "uid" },
261
+ "write": {
262
+ "type": "path",
263
+ "param": "uid",
264
+ "server": true
265
+ }
258
266
  }
259
267
  }
260
268
  }
@@ -35,7 +35,8 @@ async function handleCrud(context, options, method) {
35
35
  const authentication = context.get("authentication");
36
36
  phase = "rules";
37
37
  const result = await engine.evaluate({
38
- path: (0, rules_1.buildRulesPath)({
38
+ target: "database",
39
+ path: (0, rules_1.buildDatabaseRulesPath)({
39
40
  database: crudRequest.database,
40
41
  table: crudRequest.table,
41
42
  indexKey: crudRequest.indexKey ?? "*",
@@ -1 +1 @@
1
- {"version":3,"file":"turso.js","sourceRoot":"","sources":["../../src/functions/turso.ts"],"names":[],"mappings":";;AAQA,sCAAiE;AACjE,4CAA6D;AAC7D,wCAIsB;AACtB,sDAO6B;AAC7B,oCAA+D;AAE/D,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,GAAG,CAAC,4BAA4B,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IAC/F,IAAI,CAAC,GAAG,CAAC,sCAAsC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IACzG,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,IAAI,CAAC,4BAA4B,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IACjG,IAAI,CAAC,IAAI,CAAC,sCAAsC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3G,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,GAAG,CAAC,4BAA4B,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IAC/F,IAAI,CAAC,GAAG,CAAC,sCAAsC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;IACzG,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC5E,IAAI,CAAC,MAAM,CAAC,4BAA4B,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IACrG,IAAI,CAAC,MAAM,CAAC,sCAAsC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC/G,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,KAAK,UAAU,UAAU,CACvB,OAAgB,EAChB,OAA4B,EAC5B,MAAuB;IAEvB,IAAI,OAGS,CAAC;IACd,IAAI,eAAgD,CAAC;IACrD,IAAI,KAAK,GAAG,OAAO,CAAC;IACpB,IAAI,CAAC;QACH,eAAe,GAAG,IAAA,uCAAiC,EAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACtE,OAAO,GAAG,MAAM,IAAA,0BAAgB,EAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,WAAW,GAAG,OAAO,CAAC;QAC5B,KAAK,GAAG,SAAS,CAAC;QAClB,MAAM,UAAU,GAAG,MAAM,IAAA,wCAAyB,EAAC,WAAW,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;QAC1F,MAAM,MAAM,GAAG,IAAA,gCAAiB,EAAC,UAAU,CAAC,CAAC;QAC7C,MAAM,MAAM,GAAG,IAAA,8BAAsB,EAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAC7D,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAsC,CAAC;QAC1F,KAAK,GAAG,OAAO,CAAC;QAChB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;YACnC,IAAI,EAAE,IAAA,sBAAc,EAAC;gBACnB,QAAQ,EAAE,WAAW,CAAC,QAAQ;gBAC9B,KAAK,EAAE,WAAW,CAAC,KAAK;gBACxB,QAAQ,EAAE,WAAW,CAAC,QAAQ,IAAI,GAAG;aACtC,CAAC;YACF,SAAS,EAAE,yBAAyB,CAAC,MAAM,EAAE,WAAW,CAAC;YACzD,cAAc;YACd,aAAa,EAAE,KAAK,IAAI,EAAE,CAAC,IAAA,4BAAqB,EAAC,MAAM,EAAE,WAAW,CAAC;YACrE,MAAM,EAAE,IAAI;SACb,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,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACvB,KAAK,GAAG,gBAAgB,CAAC;YACzB,MAAM,IAAA,mCAAoB,EAAC,MAAM,CAAC,CAAC;YACnC,IAAA,sCAAuB,EAAC,WAAW,CAAC,QAAQ,EAAE,eAAe,EAAE,UAAU,CAAC,CAAC;QAC7E,CAAC;QACD,KAAK,GAAG,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,SAAS,CAAC;QACjE,MAAM,QAAQ,GAAG,MAAM,IAAA,kBAAW,EAAC;YACjC,MAAM;YACN,MAAM;YACN,OAAO,EAAE,WAAW;YACpB,eAAe,EAAE,eAAe,CAAC,eAAe,KAAK,KAAK;YAC1D,qBAAqB,EAAE,eAAe,CAAC,qBAAqB,KAAK,KAAK;SACvE,CAAC,CAAC;QACH,OAAO,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,OAAO,IAAI,eAAe,IAAI,IAAA,oCAAqB,EAAC,KAAK,CAAC,EAAE,CAAC;YAC/D,IAAA,2CAA4B,EAAC,OAAO,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;YAChE,OAAO,OAAO,CAAC,IAAI,CAAC;gBAClB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC7D,KAAK;gBACL,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;aACrB,EAAE,GAAG,CAAC,CAAC;QACV,CAAC;QACD,OAAO,IAAA,mBAAS,EAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED,SAAS,yBAAyB,CAChC,MAAuB,EACvB,OAA0C;IAE1C,IAAI,MAAM,KAAK,MAAM,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC1C,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,IAAA,2CAAmC,EAAC,MAAM,CAAC,CAAC;AACrD,CAAC"}
1
+ {"version":3,"file":"turso.js","sourceRoot":"","sources":["../../src/functions/turso.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -11,5 +11,6 @@
11
11
  export * from "@mathrunet/masamune";
12
12
  export * from "@mathrunet/masamune_cloudflare";
13
13
  export * from "./functions";
14
+ export * from "./lib/database_adapter";
14
15
  export type { RulesAccessRule, RulesConfig, RulesEntry, RulesOperation, RulesOperationAlias, RulesOperationKey, } from "./lib/types";
15
16
  export * from "./lib/types";
package/dist/index.js CHANGED
@@ -27,5 +27,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
27
27
  __exportStar(require("@mathrunet/masamune"), exports);
28
28
  __exportStar(require("@mathrunet/masamune_cloudflare"), exports);
29
29
  __exportStar(require("./functions"), exports);
30
+ __exportStar(require("./lib/database_adapter"), exports);
30
31
  __exportStar(require("./lib/types"), exports);
31
32
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;;;;;;;;GASG;AACH,sDAAoC;AACpC,iEAA+C;AAC/C,8CAA4B;AAC5B,yDAAuC;AASvC,8CAA4B"}
@@ -0,0 +1,105 @@
1
+ import { DatabaseAdapterBase, DatabaseDocument, DatabaseQueryResult, DatabaseWhereCondition } from "@mathrunet/masamune_cloudflare";
2
+ import { TursoClient } from "./turso_client";
3
+ import { TursoWorkersOptions } from "./types";
4
+ /**
5
+ * [DatabaseAdapterBase] implementation for Turso.
6
+ *
7
+ * Maps Firestore-style document paths to SQL tables. Collection names in the path are joined with `__` to form the table name, and document IDs are stored in the `id` / `parent_id` columns.
8
+ *
9
+ * e.g. `user/{uid}` -> table `user` (id = uid), `user/{uid}/transaction/{tid}` -> table `user__transaction` (id = tid, parent_id = uid)
10
+ *
11
+ * Turso用の[DatabaseAdapterBase]の実装。
12
+ *
13
+ * FirestoreスタイルのドキュメントパスをSQLテーブルにマッピングします。パス内のコレクション名は`__`で連結されてテーブル名になり、ドキュメントIDは`id`/`parent_id`カラムに保存されます。
14
+ *
15
+ * 例: `user/{uid}` -> テーブル`user`(id = uid)、`user/{uid}/transaction/{tid}` -> テーブル`user__transaction`(id = tid、parent_id = uid)
16
+ */
17
+ export declare class TursoDatabaseAdapter extends DatabaseAdapterBase {
18
+ /**
19
+ * [DatabaseAdapterBase] implementation for Turso.
20
+ *
21
+ * Turso用の[DatabaseAdapterBase]の実装。
22
+ *
23
+ * @param config.options
24
+ * Turso connection options (organization, group, platformApiToken, etc.).
25
+ *
26
+ * Tursoの接続オプション(organization、group、platformApiTokenなど)。
27
+ *
28
+ * @param config.database
29
+ * Logical database name (default: `main`).
30
+ *
31
+ * 論理データベース名(デフォルト: `main`)。
32
+ *
33
+ * @param config.client
34
+ * Directly injected Turso client. Used for testing or when the connection has already been resolved.
35
+ *
36
+ * 直接注入するTursoクライアント。テスト用、または接続が既に解決されている場合に使用します。
37
+ */
38
+ constructor({ options, database, client, }: {
39
+ options?: TursoWorkersOptions | undefined;
40
+ database?: string | undefined;
41
+ client?: TursoClient | undefined;
42
+ });
43
+ /**
44
+ * Turso connection options.
45
+ *
46
+ * Tursoの接続オプション。
47
+ */
48
+ readonly options: TursoWorkersOptions;
49
+ /**
50
+ * Logical database name.
51
+ *
52
+ * 論理データベース名。
53
+ */
54
+ readonly database: string;
55
+ private _client;
56
+ private client;
57
+ private resolveOptions;
58
+ getDocument(path: string): Promise<DatabaseDocument | null>;
59
+ saveDocument(path: string, data: {
60
+ [key: string]: any;
61
+ }, options?: {
62
+ merge?: boolean | undefined;
63
+ }): Promise<void>;
64
+ query(collectionPath: string, options?: {
65
+ wheres?: DatabaseWhereCondition[] | undefined;
66
+ limit?: number | undefined;
67
+ cursor?: string | null | undefined;
68
+ }): Promise<DatabaseQueryResult>;
69
+ private loadExistingRow;
70
+ }
71
+ /**
72
+ * Parse a document path into a table name, document ID and parent document ID.
73
+ *
74
+ * ドキュメントパスをテーブル名、ドキュメントID、親ドキュメントIDにパースします。
75
+ */
76
+ export declare function parseDocumentPath(path: string): {
77
+ table: string;
78
+ id: string;
79
+ parentId: string;
80
+ };
81
+ /**
82
+ * Parse a collection path into a table name and parent document ID.
83
+ *
84
+ * コレクションパスをテーブル名と親ドキュメントIDにパースします。
85
+ */
86
+ export declare function parseCollectionPath(path: string): {
87
+ table: string;
88
+ parentId: string;
89
+ };
90
+ /**
91
+ * Encode a field key into a column name.
92
+ *
93
+ * Keys starting with `@` (e.g. `@time`, `@uid`) are prefixed with `mf_at_` because they cannot be used as SQL identifiers.
94
+ *
95
+ * フィールドキーをカラム名にエンコードします。
96
+ *
97
+ * `@`で始まるキー(例: `@time`、`@uid`)はSQL識別子として使用できないため、`mf_at_`のプレフィックスが付けられます。
98
+ */
99
+ export declare function encodeColumnName(key: string): string;
100
+ /**
101
+ * Decode a column name back into a field key.
102
+ *
103
+ * カラム名をフィールドキーにデコードします。
104
+ */
105
+ export declare function decodeColumnName(column: string): string;
@@ -0,0 +1,356 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TursoDatabaseAdapter = void 0;
4
+ exports.parseDocumentPath = parseDocumentPath;
5
+ exports.parseCollectionPath = parseCollectionPath;
6
+ exports.encodeColumnName = encodeColumnName;
7
+ exports.decodeColumnName = decodeColumnName;
8
+ const masamune_cloudflare_1 = require("@mathrunet/masamune_cloudflare");
9
+ const request_1 = require("./request");
10
+ const schema_1 = require("./schema");
11
+ const turso_client_1 = require("./turso_client");
12
+ const reservedColumns = new Set(["id", "parent_id", "created_at", "updated_at"]);
13
+ const atMarkColumnPrefix = "mf_at_";
14
+ /**
15
+ * [DatabaseAdapterBase] implementation for Turso.
16
+ *
17
+ * Maps Firestore-style document paths to SQL tables. Collection names in the path are joined with `__` to form the table name, and document IDs are stored in the `id` / `parent_id` columns.
18
+ *
19
+ * e.g. `user/{uid}` -> table `user` (id = uid), `user/{uid}/transaction/{tid}` -> table `user__transaction` (id = tid, parent_id = uid)
20
+ *
21
+ * Turso用の[DatabaseAdapterBase]の実装。
22
+ *
23
+ * FirestoreスタイルのドキュメントパスをSQLテーブルにマッピングします。パス内のコレクション名は`__`で連結されてテーブル名になり、ドキュメントIDは`id`/`parent_id`カラムに保存されます。
24
+ *
25
+ * 例: `user/{uid}` -> テーブル`user`(id = uid)、`user/{uid}/transaction/{tid}` -> テーブル`user__transaction`(id = tid、parent_id = uid)
26
+ */
27
+ class TursoDatabaseAdapter extends masamune_cloudflare_1.DatabaseAdapterBase {
28
+ /**
29
+ * [DatabaseAdapterBase] implementation for Turso.
30
+ *
31
+ * Turso用の[DatabaseAdapterBase]の実装。
32
+ *
33
+ * @param config.options
34
+ * Turso connection options (organization, group, platformApiToken, etc.).
35
+ *
36
+ * Tursoの接続オプション(organization、group、platformApiTokenなど)。
37
+ *
38
+ * @param config.database
39
+ * Logical database name (default: `main`).
40
+ *
41
+ * 論理データベース名(デフォルト: `main`)。
42
+ *
43
+ * @param config.client
44
+ * Directly injected Turso client. Used for testing or when the connection has already been resolved.
45
+ *
46
+ * 直接注入するTursoクライアント。テスト用、または接続が既に解決されている場合に使用します。
47
+ */
48
+ constructor({ options, database, client, }) {
49
+ super();
50
+ this.options = options ?? {};
51
+ this.database = database ?? "main";
52
+ this._client = client ?? null;
53
+ }
54
+ /**
55
+ * Turso connection options.
56
+ *
57
+ * Tursoの接続オプション。
58
+ */
59
+ options;
60
+ /**
61
+ * Logical database name.
62
+ *
63
+ * 論理データベース名。
64
+ */
65
+ database;
66
+ _client;
67
+ async client() {
68
+ if (this._client) {
69
+ return this._client;
70
+ }
71
+ const connection = await (0, turso_client_1.resolveDatabaseConnection)(this.database, this.resolveOptions());
72
+ this._client = (0, turso_client_1.createTursoClient)(connection);
73
+ return this._client;
74
+ }
75
+ // 接続時にオプションを解決します。オプションで指定されていない項目は
76
+ // `process.env`(nodejs_compatで注入されるWorkersシークレット)から補完します。
77
+ resolveOptions() {
78
+ const env = typeof process !== "undefined" ? process.env ?? {} : {};
79
+ return {
80
+ ...this.options,
81
+ organization: firstNonEmptyValue(this.options.organization, env["TURSO_ORGANIZATION"]),
82
+ group: firstNonEmptyValue(this.options.group, env["TURSO_GROUP"]),
83
+ platformApiToken: firstNonEmptyValue(this.options.platformApiToken, env["TURSO_PLATFORM_API_TOKEN"]),
84
+ };
85
+ }
86
+ async getDocument(path) {
87
+ const { table, id, parentId } = parseDocumentPath(path);
88
+ const client = await this.client();
89
+ let result;
90
+ try {
91
+ result = await client.execute({
92
+ sql: `SELECT * FROM ${(0, schema_1.quoteIdentifier)(table)} WHERE id = ? AND parent_id = ? LIMIT 1`,
93
+ args: [id, parentId],
94
+ });
95
+ }
96
+ catch (error) {
97
+ if (isMissingTableError(error)) {
98
+ return null;
99
+ }
100
+ throw error;
101
+ }
102
+ const row = result.rows[0];
103
+ if (row === undefined) {
104
+ return null;
105
+ }
106
+ return {
107
+ path: path,
108
+ data: decodeDocumentData((0, schema_1.decodeRow)(row, result.columns)),
109
+ };
110
+ }
111
+ async saveDocument(path, data, options) {
112
+ const { table, id, parentId } = parseDocumentPath(path);
113
+ const merge = options?.merge ?? false;
114
+ const client = await this.client();
115
+ const existing = await this.loadExistingRow(client, table, id, parentId);
116
+ const now = Date.now();
117
+ const row = merge && existing ? { ...existing } : {};
118
+ for (const [key, value] of Object.entries(data)) {
119
+ const column = encodeColumnName(key);
120
+ if (value instanceof masamune_cloudflare_1.DatabaseIncrement) {
121
+ const current = row[column] ?? existing?.[column];
122
+ const base = typeof current === "number" ? current : Number(current ?? 0);
123
+ row[column] = (Number.isFinite(base) ? base : 0) + value.value;
124
+ }
125
+ else {
126
+ row[column] = value;
127
+ }
128
+ }
129
+ delete row["id"];
130
+ delete row["parent_id"];
131
+ const createdAt = existing?.["created_at"];
132
+ row["id"] = id;
133
+ row["parent_id"] = parentId;
134
+ row["created_at"] = typeof createdAt === "number" ? createdAt : now;
135
+ row["updated_at"] = now;
136
+ await (0, schema_1.ensureTableSchema)({
137
+ client,
138
+ table,
139
+ value: row,
140
+ autoCreateTable: this.options.autoCreateTable ?? true,
141
+ autoMigrateAddColumns: this.options.autoMigrateAddColumns ?? true,
142
+ });
143
+ const keys = Object.keys(row);
144
+ const placeholders = keys.map(() => "?").join(", ");
145
+ await client.execute({
146
+ sql: `INSERT OR REPLACE INTO ${(0, schema_1.quoteIdentifier)(table)} ` +
147
+ `(${keys.map(schema_1.quoteIdentifier).join(", ")}) VALUES (${placeholders})`,
148
+ args: keys.map((key) => (0, schema_1.encodeSqlValue)(row[key])),
149
+ });
150
+ }
151
+ async query(collectionPath, options) {
152
+ const { table, parentId } = parseCollectionPath(collectionPath);
153
+ const client = await this.client();
154
+ const clauses = ["parent_id = ?"];
155
+ const args = [parentId];
156
+ for (const where of options?.wheres ?? []) {
157
+ const built = buildWhereCondition(where);
158
+ clauses.push(built.sql);
159
+ args.push(...built.args);
160
+ }
161
+ if (options?.cursor) {
162
+ clauses.push("id > ?");
163
+ args.push(options.cursor);
164
+ }
165
+ const limit = options?.limit && options.limit > 0 ? ` LIMIT ${options.limit}` : "";
166
+ let result;
167
+ try {
168
+ result = await client.execute({
169
+ sql: `SELECT * FROM ${(0, schema_1.quoteIdentifier)(table)} WHERE ${clauses.join(" AND ")} ORDER BY id ASC${limit}`,
170
+ args,
171
+ });
172
+ }
173
+ catch (error) {
174
+ if (isMissingTableError(error)) {
175
+ return { docs: [], cursor: null };
176
+ }
177
+ throw error;
178
+ }
179
+ const docs = result.rows.map((row) => {
180
+ const decoded = (0, schema_1.decodeRow)(row, result.columns);
181
+ const id = String(decoded["id"] ?? "");
182
+ return {
183
+ path: `${collectionPath}/${id}`,
184
+ data: decodeDocumentData(decoded),
185
+ };
186
+ });
187
+ const cursor = options?.limit && docs.length >= options.limit
188
+ ? String(docs[docs.length - 1].path.split("/").pop() ?? "")
189
+ : null;
190
+ return { docs, cursor };
191
+ }
192
+ async loadExistingRow(client, table, id, parentId) {
193
+ try {
194
+ const result = await client.execute({
195
+ sql: `SELECT * FROM ${(0, schema_1.quoteIdentifier)(table)} WHERE id = ? AND parent_id = ? LIMIT 1`,
196
+ args: [id, parentId],
197
+ });
198
+ const row = result.rows[0];
199
+ if (row === undefined) {
200
+ return null;
201
+ }
202
+ return (0, schema_1.decodeRow)(row, result.columns);
203
+ }
204
+ catch (error) {
205
+ if (isMissingTableError(error)) {
206
+ return null;
207
+ }
208
+ throw error;
209
+ }
210
+ }
211
+ }
212
+ exports.TursoDatabaseAdapter = TursoDatabaseAdapter;
213
+ /**
214
+ * Parse a document path into a table name, document ID and parent document ID.
215
+ *
216
+ * ドキュメントパスをテーブル名、ドキュメントID、親ドキュメントIDにパースします。
217
+ */
218
+ function parseDocumentPath(path) {
219
+ const segments = splitPath(path);
220
+ if (segments.length < 2 || segments.length % 2 !== 0) {
221
+ throw new request_1.HttpError(400, `Invalid document path: ${path}`);
222
+ }
223
+ const collections = [];
224
+ const documentIds = [];
225
+ for (let i = 0; i < segments.length; i += 2) {
226
+ collections.push(segments[i]);
227
+ documentIds.push(segments[i + 1]);
228
+ }
229
+ return {
230
+ table: collections.join("__"),
231
+ id: documentIds[documentIds.length - 1],
232
+ parentId: documentIds.length > 1 ? documentIds[documentIds.length - 2] : "",
233
+ };
234
+ }
235
+ /**
236
+ * Parse a collection path into a table name and parent document ID.
237
+ *
238
+ * コレクションパスをテーブル名と親ドキュメントIDにパースします。
239
+ */
240
+ function parseCollectionPath(path) {
241
+ const segments = splitPath(path);
242
+ if (segments.length < 1 || segments.length % 2 !== 1) {
243
+ throw new request_1.HttpError(400, `Invalid collection path: ${path}`);
244
+ }
245
+ const collections = [];
246
+ let parentId = "";
247
+ for (let i = 0; i < segments.length; i += 2) {
248
+ collections.push(segments[i]);
249
+ if (i > 0) {
250
+ parentId = segments[i - 1];
251
+ }
252
+ }
253
+ return {
254
+ table: collections.join("__"),
255
+ parentId,
256
+ };
257
+ }
258
+ /**
259
+ * Encode a field key into a column name.
260
+ *
261
+ * Keys starting with `@` (e.g. `@time`, `@uid`) are prefixed with `mf_at_` because they cannot be used as SQL identifiers.
262
+ *
263
+ * フィールドキーをカラム名にエンコードします。
264
+ *
265
+ * `@`で始まるキー(例: `@time`、`@uid`)はSQL識別子として使用できないため、`mf_at_`のプレフィックスが付けられます。
266
+ */
267
+ function encodeColumnName(key) {
268
+ if (key.startsWith("@")) {
269
+ return `${atMarkColumnPrefix}${key.substring(1)}`;
270
+ }
271
+ return key;
272
+ }
273
+ /**
274
+ * Decode a column name back into a field key.
275
+ *
276
+ * カラム名をフィールドキーにデコードします。
277
+ */
278
+ function decodeColumnName(column) {
279
+ if (column.startsWith(atMarkColumnPrefix)) {
280
+ return `@${column.substring(atMarkColumnPrefix.length)}`;
281
+ }
282
+ return column;
283
+ }
284
+ function firstNonEmptyValue(...values) {
285
+ return values.find((value) => typeof value === "string" && value.length > 0);
286
+ }
287
+ function splitPath(path) {
288
+ return path.split("/").map((segment) => segment.trim()).filter((segment) => segment.length > 0);
289
+ }
290
+ function decodeDocumentData(row) {
291
+ const data = {};
292
+ for (const [column, value] of Object.entries(row)) {
293
+ if (reservedColumns.has(column)) {
294
+ continue;
295
+ }
296
+ data[decodeColumnName(column)] = decodeStoredValue(value);
297
+ }
298
+ return data;
299
+ }
300
+ function decodeStoredValue(value) {
301
+ if (typeof value === "string") {
302
+ const trimmed = value.trim();
303
+ if ((trimmed.startsWith("{") && trimmed.endsWith("}")) ||
304
+ (trimmed.startsWith("[") && trimmed.endsWith("]"))) {
305
+ try {
306
+ return JSON.parse(trimmed);
307
+ }
308
+ catch {
309
+ return value;
310
+ }
311
+ }
312
+ }
313
+ return value;
314
+ }
315
+ function buildWhereCondition(condition) {
316
+ const column = (0, schema_1.quoteIdentifier)(encodeColumnName(condition.key));
317
+ switch (condition.type) {
318
+ case "equalTo":
319
+ return { sql: `${column} = ?`, args: [(0, schema_1.encodeSqlValue)(condition.value)] };
320
+ case "notEqualTo":
321
+ return { sql: `${column} != ?`, args: [(0, schema_1.encodeSqlValue)(condition.value)] };
322
+ case "lessThan":
323
+ return { sql: `${column} < ?`, args: [(0, schema_1.encodeSqlValue)(condition.value)] };
324
+ case "lessThanOrEqualTo":
325
+ return { sql: `${column} <= ?`, args: [(0, schema_1.encodeSqlValue)(condition.value)] };
326
+ case "greaterThan":
327
+ return { sql: `${column} > ?`, args: [(0, schema_1.encodeSqlValue)(condition.value)] };
328
+ case "greaterThanOrEqualTo":
329
+ return { sql: `${column} >= ?`, args: [(0, schema_1.encodeSqlValue)(condition.value)] };
330
+ case "whereIn":
331
+ case "whereNotIn": {
332
+ const values = condition.value;
333
+ if (!Array.isArray(values) || values.length === 0) {
334
+ throw new request_1.HttpError(400, `${condition.type} requires non-empty array.`);
335
+ }
336
+ return {
337
+ sql: `${column} ${condition.type === "whereNotIn" ? "NOT " : ""}IN (${values.map(() => "?").join(", ")})`,
338
+ args: values.map(schema_1.encodeSqlValue),
339
+ };
340
+ }
341
+ case "isNull":
342
+ return { sql: `${column} IS NULL`, args: [] };
343
+ case "isNotNull":
344
+ return { sql: `${column} IS NOT NULL`, args: [] };
345
+ case "arrayContains":
346
+ case "arrayContainsAny":
347
+ throw new request_1.HttpError(400, `${condition.type} is not supported by Turso SQL yet.`);
348
+ default:
349
+ throw new request_1.HttpError(400, `Unsupported where condition: ${condition.type}`);
350
+ }
351
+ }
352
+ function isMissingTableError(error) {
353
+ const message = error instanceof Error ? error.message : String(error);
354
+ return message.includes("no such table");
355
+ }
356
+ //# sourceMappingURL=database_adapter.js.map