velocious 1.0.429 → 1.0.431

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 (812) hide show
  1. package/bin/velocious.js +48 -0
  2. package/build/bin/velocious.js +39 -34
  3. package/build/index.js +1 -2
  4. package/build/src/application.js +214 -187
  5. package/build/src/authorization/ability.d.ts +24 -23
  6. package/build/src/authorization/ability.d.ts.map +1 -1
  7. package/build/src/authorization/ability.js +300 -252
  8. package/build/src/authorization/base-resource.d.ts +20 -26
  9. package/build/src/authorization/base-resource.d.ts.map +1 -1
  10. package/build/src/authorization/base-resource.js +136 -118
  11. package/build/src/background-jobs/client.js +47 -43
  12. package/build/src/background-jobs/cron-expression.js +166 -127
  13. package/build/src/background-jobs/forked-runner-child.js +47 -37
  14. package/build/src/background-jobs/job-record.js +10 -8
  15. package/build/src/background-jobs/job-registry.js +84 -72
  16. package/build/src/background-jobs/job-runner.js +81 -74
  17. package/build/src/background-jobs/job.js +72 -62
  18. package/build/src/background-jobs/json-socket.js +70 -65
  19. package/build/src/background-jobs/main.js +900 -841
  20. package/build/src/background-jobs/normalize-error.js +11 -12
  21. package/build/src/background-jobs/scheduler.js +247 -205
  22. package/build/src/background-jobs/socket-request.js +65 -60
  23. package/build/src/background-jobs/status-reporter.js +96 -86
  24. package/build/src/background-jobs/store.js +980 -862
  25. package/build/src/background-jobs/types.js +3 -2
  26. package/build/src/background-jobs/web/authorization.js +50 -38
  27. package/build/src/background-jobs/web/controller.js +268 -232
  28. package/build/src/background-jobs/web/index.js +40 -36
  29. package/build/src/background-jobs/web/path-matcher.js +48 -45
  30. package/build/src/background-jobs/web/registry.js +14 -9
  31. package/build/src/background-jobs/worker.js +639 -585
  32. package/build/src/beacon/client.js +293 -264
  33. package/build/src/beacon/in-process-broker.js +25 -20
  34. package/build/src/beacon/in-process-client.js +116 -104
  35. package/build/src/beacon/server.js +126 -110
  36. package/build/src/beacon/types.js +8 -2
  37. package/build/src/cli/base-command.js +57 -49
  38. package/build/src/cli/browser-cli.js +42 -37
  39. package/build/src/cli/commands/background-jobs-main.js +5 -5
  40. package/build/src/cli/commands/background-jobs-runner.js +5 -5
  41. package/build/src/cli/commands/background-jobs-worker.js +5 -5
  42. package/build/src/cli/commands/beacon.js +5 -5
  43. package/build/src/cli/commands/console.js +10 -10
  44. package/build/src/cli/commands/db/base-command.js +76 -71
  45. package/build/src/cli/commands/db/create.js +61 -53
  46. package/build/src/cli/commands/db/drop.js +71 -62
  47. package/build/src/cli/commands/db/migrate.js +15 -13
  48. package/build/src/cli/commands/db/reset.js +19 -16
  49. package/build/src/cli/commands/db/rollback.js +13 -12
  50. package/build/src/cli/commands/db/schema/dump.js +9 -9
  51. package/build/src/cli/commands/db/schema/load.js +9 -9
  52. package/build/src/cli/commands/db/seed.js +9 -9
  53. package/build/src/cli/commands/db/tenants/check.js +35 -32
  54. package/build/src/cli/commands/db/tenants/create.js +29 -26
  55. package/build/src/cli/commands/db/tenants/migrate.js +44 -40
  56. package/build/src/cli/commands/destroy/migration.js +5 -5
  57. package/build/src/cli/commands/generate/base-models.js +5 -5
  58. package/build/src/cli/commands/generate/frontend-models.js +9 -9
  59. package/build/src/cli/commands/generate/migration.js +5 -5
  60. package/build/src/cli/commands/generate/model.js +5 -5
  61. package/build/src/cli/commands/init.js +9 -7
  62. package/build/src/cli/commands/routes.js +6 -6
  63. package/build/src/cli/commands/run-script.js +9 -9
  64. package/build/src/cli/commands/runner.js +9 -9
  65. package/build/src/cli/commands/server.js +6 -6
  66. package/build/src/cli/commands/test.js +7 -6
  67. package/build/src/cli/index.js +141 -127
  68. package/build/src/cli/tenant-database-command-helper.js +185 -154
  69. package/build/src/cli/use-browser-cli.js +20 -15
  70. package/build/src/configuration-resolver.js +54 -47
  71. package/build/src/configuration-types.d.ts +21 -2
  72. package/build/src/configuration-types.d.ts.map +1 -1
  73. package/build/src/configuration-types.js +60 -3
  74. package/build/src/configuration.js +2547 -2240
  75. package/build/src/controller.js +407 -363
  76. package/build/src/current-configuration.js +12 -9
  77. package/build/src/current.js +75 -70
  78. package/build/src/database/annotations-async-hooks.js +22 -16
  79. package/build/src/database/annotations.js +18 -12
  80. package/build/src/database/drivers/base-column.js +179 -155
  81. package/build/src/database/drivers/base-columns-index.js +78 -69
  82. package/build/src/database/drivers/base-foreign-key.js +101 -89
  83. package/build/src/database/drivers/base-table.js +149 -124
  84. package/build/src/database/drivers/base.js +1489 -1306
  85. package/build/src/database/drivers/mssql/column.js +50 -39
  86. package/build/src/database/drivers/mssql/columns-index.js +3 -2
  87. package/build/src/database/drivers/mssql/connect-connection.js +9 -11
  88. package/build/src/database/drivers/mssql/foreign-key.js +9 -8
  89. package/build/src/database/drivers/mssql/index.js +587 -507
  90. package/build/src/database/drivers/mssql/options.js +75 -68
  91. package/build/src/database/drivers/mssql/query-parser.js +3 -2
  92. package/build/src/database/drivers/mssql/sql/alter-table.js +2 -2
  93. package/build/src/database/drivers/mssql/sql/create-database.js +31 -24
  94. package/build/src/database/drivers/mssql/sql/create-index.js +2 -2
  95. package/build/src/database/drivers/mssql/sql/create-table.js +2 -2
  96. package/build/src/database/drivers/mssql/sql/delete.js +16 -14
  97. package/build/src/database/drivers/mssql/sql/drop-database.js +31 -24
  98. package/build/src/database/drivers/mssql/sql/drop-table.js +2 -2
  99. package/build/src/database/drivers/mssql/sql/insert.js +2 -2
  100. package/build/src/database/drivers/mssql/sql/update.js +28 -24
  101. package/build/src/database/drivers/mssql/sql/upsert.js +20 -18
  102. package/build/src/database/drivers/mssql/structure-sql.js +114 -102
  103. package/build/src/database/drivers/mssql/table.js +96 -81
  104. package/build/src/database/drivers/mysql/column.js +92 -75
  105. package/build/src/database/drivers/mysql/columns-index.js +19 -16
  106. package/build/src/database/drivers/mysql/foreign-key.js +9 -8
  107. package/build/src/database/drivers/mysql/index.js +457 -396
  108. package/build/src/database/drivers/mysql/options.js +30 -26
  109. package/build/src/database/drivers/mysql/query-parser.js +3 -2
  110. package/build/src/database/drivers/mysql/query.js +29 -26
  111. package/build/src/database/drivers/mysql/sql/alter-table.js +3 -2
  112. package/build/src/database/drivers/mysql/sql/create-database.js +28 -23
  113. package/build/src/database/drivers/mysql/sql/create-index.js +3 -2
  114. package/build/src/database/drivers/mysql/sql/create-table.js +3 -2
  115. package/build/src/database/drivers/mysql/sql/delete.js +17 -14
  116. package/build/src/database/drivers/mysql/sql/drop-database.js +3 -2
  117. package/build/src/database/drivers/mysql/sql/drop-table.js +3 -2
  118. package/build/src/database/drivers/mysql/sql/insert.js +3 -2
  119. package/build/src/database/drivers/mysql/sql/update.js +29 -24
  120. package/build/src/database/drivers/mysql/sql/upsert.js +10 -8
  121. package/build/src/database/drivers/mysql/structure-sql.js +88 -79
  122. package/build/src/database/drivers/mysql/table.js +98 -83
  123. package/build/src/database/drivers/pgsql/column.js +72 -56
  124. package/build/src/database/drivers/pgsql/columns-index.js +3 -2
  125. package/build/src/database/drivers/pgsql/foreign-key.js +9 -8
  126. package/build/src/database/drivers/pgsql/index.js +438 -377
  127. package/build/src/database/drivers/pgsql/options.js +28 -25
  128. package/build/src/database/drivers/pgsql/query-parser.js +3 -2
  129. package/build/src/database/drivers/pgsql/sql/alter-table.js +3 -2
  130. package/build/src/database/drivers/pgsql/sql/create-database.js +23 -19
  131. package/build/src/database/drivers/pgsql/sql/create-index.js +3 -2
  132. package/build/src/database/drivers/pgsql/sql/create-table.js +3 -2
  133. package/build/src/database/drivers/pgsql/sql/delete.js +17 -14
  134. package/build/src/database/drivers/pgsql/sql/drop-database.js +3 -2
  135. package/build/src/database/drivers/pgsql/sql/drop-table.js +3 -2
  136. package/build/src/database/drivers/pgsql/sql/insert.js +3 -2
  137. package/build/src/database/drivers/pgsql/sql/update.js +29 -24
  138. package/build/src/database/drivers/pgsql/sql/upsert.js +11 -9
  139. package/build/src/database/drivers/pgsql/structure-sql.js +120 -108
  140. package/build/src/database/drivers/pgsql/table.js +77 -60
  141. package/build/src/database/drivers/sqlite/base.js +478 -405
  142. package/build/src/database/drivers/sqlite/column.js +69 -54
  143. package/build/src/database/drivers/sqlite/columns-index.js +27 -22
  144. package/build/src/database/drivers/sqlite/connection-sql-js.js +42 -35
  145. package/build/src/database/drivers/sqlite/foreign-key.js +21 -18
  146. package/build/src/database/drivers/sqlite/index.js +373 -330
  147. package/build/src/database/drivers/sqlite/index.native.js +64 -55
  148. package/build/src/database/drivers/sqlite/index.web.js +87 -69
  149. package/build/src/database/drivers/sqlite/options.js +28 -25
  150. package/build/src/database/drivers/sqlite/query-parser.js +3 -2
  151. package/build/src/database/drivers/sqlite/query.js +24 -21
  152. package/build/src/database/drivers/sqlite/query.native.js +25 -20
  153. package/build/src/database/drivers/sqlite/query.web.js +37 -30
  154. package/build/src/database/drivers/sqlite/sql/alter-table.js +179 -159
  155. package/build/src/database/drivers/sqlite/sql/create-index.js +3 -2
  156. package/build/src/database/drivers/sqlite/sql/create-table.js +3 -2
  157. package/build/src/database/drivers/sqlite/sql/delete.js +22 -17
  158. package/build/src/database/drivers/sqlite/sql/drop-table.js +3 -2
  159. package/build/src/database/drivers/sqlite/sql/insert.js +3 -2
  160. package/build/src/database/drivers/sqlite/sql/update.js +29 -24
  161. package/build/src/database/drivers/sqlite/sql/upsert.js +11 -9
  162. package/build/src/database/drivers/sqlite/structure-sql.js +52 -49
  163. package/build/src/database/drivers/sqlite/table-rebuilder.js +75 -62
  164. package/build/src/database/drivers/sqlite/table.js +125 -102
  165. package/build/src/database/drivers/structure-sql/utils.js +17 -14
  166. package/build/src/database/handler.js +10 -9
  167. package/build/src/database/initializer-from-require-context.js +87 -76
  168. package/build/src/database/migration/index.js +395 -332
  169. package/build/src/database/migrator/files-finder.js +50 -40
  170. package/build/src/database/migrator/types.js +30 -2
  171. package/build/src/database/migrator.js +526 -454
  172. package/build/src/database/pool/async-tracked-multi-connection.js +1147 -997
  173. package/build/src/database/pool/base-methods-forward.js +43 -40
  174. package/build/src/database/pool/base.js +343 -298
  175. package/build/src/database/pool/single-multi-use.js +110 -93
  176. package/build/src/database/query/alter-table-base.js +99 -84
  177. package/build/src/database/query/base.js +46 -39
  178. package/build/src/database/query/create-database-base.js +30 -25
  179. package/build/src/database/query/create-index-base.js +94 -75
  180. package/build/src/database/query/create-table-base.js +193 -151
  181. package/build/src/database/query/delete-base.js +16 -14
  182. package/build/src/database/query/drop-database-base.js +28 -23
  183. package/build/src/database/query/drop-table-base.js +53 -42
  184. package/build/src/database/query/from-base.js +33 -30
  185. package/build/src/database/query/from-plain.js +13 -11
  186. package/build/src/database/query/from-table.js +15 -13
  187. package/build/src/database/query/index.js +472 -410
  188. package/build/src/database/query/insert-base.js +164 -143
  189. package/build/src/database/query/join-base.js +40 -35
  190. package/build/src/database/query/join-object.js +153 -128
  191. package/build/src/database/query/join-plain.js +15 -13
  192. package/build/src/database/query/join-tracker.js +90 -76
  193. package/build/src/database/query/model-class-query.js +1370 -1134
  194. package/build/src/database/query/order-base.js +30 -27
  195. package/build/src/database/query/order-column.js +53 -44
  196. package/build/src/database/query/order-plain.js +24 -20
  197. package/build/src/database/query/preloader/belongs-to.js +258 -210
  198. package/build/src/database/query/preloader/ensure-model-class-initialized.js +9 -8
  199. package/build/src/database/query/preloader/has-many.js +301 -240
  200. package/build/src/database/query/preloader/has-one.js +117 -91
  201. package/build/src/database/query/preloader/selection.js +129 -117
  202. package/build/src/database/query/preloader.js +185 -160
  203. package/build/src/database/query/query-data.js +201 -157
  204. package/build/src/database/query/select-base.js +27 -25
  205. package/build/src/database/query/select-plain.js +15 -13
  206. package/build/src/database/query/select-table-and-column.js +25 -21
  207. package/build/src/database/query/update-base.js +38 -35
  208. package/build/src/database/query/upsert-base.js +100 -93
  209. package/build/src/database/query/where-base.js +35 -32
  210. package/build/src/database/query/where-combinator.d.ts.map +1 -1
  211. package/build/src/database/query/where-combinator.js +28 -26
  212. package/build/src/database/query/where-hash.js +68 -61
  213. package/build/src/database/query/where-model-class-hash.js +469 -414
  214. package/build/src/database/query/where-not.js +20 -18
  215. package/build/src/database/query/where-plain.js +17 -15
  216. package/build/src/database/query/with-count.js +159 -125
  217. package/build/src/database/query-parser/base-query-parser.js +37 -32
  218. package/build/src/database/query-parser/from-parser.js +45 -36
  219. package/build/src/database/query-parser/group-parser.js +50 -42
  220. package/build/src/database/query-parser/joins-parser.js +33 -28
  221. package/build/src/database/query-parser/limit-parser.js +70 -67
  222. package/build/src/database/query-parser/options.js +82 -75
  223. package/build/src/database/query-parser/order-parser.js +40 -36
  224. package/build/src/database/query-parser/select-parser.js +60 -49
  225. package/build/src/database/query-parser/where-parser.js +41 -36
  226. package/build/src/database/record/acts-as-list.d.ts.map +1 -1
  227. package/build/src/database/record/acts-as-list.js +273 -229
  228. package/build/src/database/record/attachments/download.js +45 -44
  229. package/build/src/database/record/attachments/handle.js +161 -141
  230. package/build/src/database/record/attachments/normalize-input.js +138 -128
  231. package/build/src/database/record/attachments/storage-drivers/filesystem.js +91 -77
  232. package/build/src/database/record/attachments/storage-drivers/native.js +121 -112
  233. package/build/src/database/record/attachments/storage-drivers/s3.js +208 -177
  234. package/build/src/database/record/attachments/store.d.ts +1 -1
  235. package/build/src/database/record/attachments/store.d.ts.map +1 -1
  236. package/build/src/database/record/attachments/store.js +540 -468
  237. package/build/src/database/record/index.d.ts +23 -15
  238. package/build/src/database/record/index.d.ts.map +1 -1
  239. package/build/src/database/record/index.js +3894 -3350
  240. package/build/src/database/record/instance-relationships/base.js +268 -234
  241. package/build/src/database/record/instance-relationships/belongs-to.js +73 -58
  242. package/build/src/database/record/instance-relationships/has-many.js +264 -225
  243. package/build/src/database/record/instance-relationships/has-one.js +105 -85
  244. package/build/src/database/record/record-not-found-error.js +2 -3
  245. package/build/src/database/record/relationships/base.d.ts +2 -2
  246. package/build/src/database/record/relationships/base.d.ts.map +1 -1
  247. package/build/src/database/record/relationships/base.js +167 -145
  248. package/build/src/database/record/relationships/belongs-to.js +51 -44
  249. package/build/src/database/record/relationships/has-many.js +40 -32
  250. package/build/src/database/record/relationships/has-one.js +40 -32
  251. package/build/src/database/record/state-machine.js +208 -156
  252. package/build/src/database/record/user-module.js +38 -32
  253. package/build/src/database/record/validators/base.js +24 -22
  254. package/build/src/database/record/validators/format.js +46 -36
  255. package/build/src/database/record/validators/presence.js +20 -18
  256. package/build/src/database/record/validators/uniqueness.js +117 -99
  257. package/build/src/database/table-data/index.js +231 -199
  258. package/build/src/database/table-data/table-column.js +382 -338
  259. package/build/src/database/table-data/table-foreign-key.js +66 -57
  260. package/build/src/database/table-data/table-index.js +36 -29
  261. package/build/src/database/table-data/table-reference.js +10 -10
  262. package/build/src/database/use-database.js +40 -32
  263. package/build/src/environment-handlers/base.js +544 -484
  264. package/build/src/environment-handlers/browser.js +294 -241
  265. package/build/src/environment-handlers/node/cli/commands/background-jobs-main.js +19 -16
  266. package/build/src/environment-handlers/node/cli/commands/background-jobs-runner.js +21 -18
  267. package/build/src/environment-handlers/node/cli/commands/background-jobs-worker.js +29 -22
  268. package/build/src/environment-handlers/node/cli/commands/beacon.js +19 -16
  269. package/build/src/environment-handlers/node/cli/commands/cli-command-context.js +15 -14
  270. package/build/src/environment-handlers/node/cli/commands/console.js +120 -99
  271. package/build/src/environment-handlers/node/cli/commands/db/schema/dump.js +39 -34
  272. package/build/src/environment-handlers/node/cli/commands/db/schema/load.js +63 -57
  273. package/build/src/environment-handlers/node/cli/commands/db/seed.js +63 -51
  274. package/build/src/environment-handlers/node/cli/commands/destroy/migration.js +40 -32
  275. package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts.map +1 -1
  276. package/build/src/environment-handlers/node/cli/commands/generate/base-models.js +353 -298
  277. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +844 -729
  278. package/build/src/environment-handlers/node/cli/commands/generate/migration.js +38 -34
  279. package/build/src/environment-handlers/node/cli/commands/generate/model.js +38 -34
  280. package/build/src/environment-handlers/node/cli/commands/init.js +61 -56
  281. package/build/src/environment-handlers/node/cli/commands/routes.js +59 -51
  282. package/build/src/environment-handlers/node/cli/commands/run-script.js +68 -54
  283. package/build/src/environment-handlers/node/cli/commands/runner.js +74 -56
  284. package/build/src/environment-handlers/node/cli/commands/server.js +106 -93
  285. package/build/src/environment-handlers/node/cli/commands/test.js +113 -97
  286. package/build/src/environment-handlers/node.js +874 -753
  287. package/build/src/error-logger.js +21 -22
  288. package/build/src/frontend-model-controller.d.ts +6 -6
  289. package/build/src/frontend-model-controller.d.ts.map +1 -1
  290. package/build/src/frontend-model-controller.js +3288 -2788
  291. package/build/src/frontend-model-resource/base-resource.d.ts +18 -17
  292. package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
  293. package/build/src/frontend-model-resource/base-resource.js +869 -759
  294. package/build/src/frontend-models/base.d.ts +19 -12
  295. package/build/src/frontend-models/base.d.ts.map +1 -1
  296. package/build/src/frontend-models/base.js +3602 -3114
  297. package/build/src/frontend-models/clear-pending-debounced-callback.js +8 -7
  298. package/build/src/frontend-models/event-hook-models.js +21 -16
  299. package/build/src/frontend-models/model-registry.js +11 -9
  300. package/build/src/frontend-models/outgoing-event-buffer.js +17 -10
  301. package/build/src/frontend-models/preloader.d.ts +6 -6
  302. package/build/src/frontend-models/preloader.d.ts.map +1 -1
  303. package/build/src/frontend-models/preloader.js +149 -131
  304. package/build/src/frontend-models/query.d.ts.map +1 -1
  305. package/build/src/frontend-models/query.js +1855 -1560
  306. package/build/src/frontend-models/resource-config-validation.js +37 -27
  307. package/build/src/frontend-models/resource-definition.js +288 -234
  308. package/build/src/frontend-models/transport-serialization.js +266 -203
  309. package/build/src/frontend-models/use-created-event.js +7 -5
  310. package/build/src/frontend-models/use-destroyed-event.js +93 -80
  311. package/build/src/frontend-models/use-model-class-event.js +91 -79
  312. package/build/src/frontend-models/use-updated-event.js +97 -84
  313. package/build/src/frontend-models/websocket-channel.js +441 -381
  314. package/build/src/frontend-models/websocket-publishers.js +173 -140
  315. package/build/src/http-client/header.js +14 -13
  316. package/build/src/http-client/index.js +132 -116
  317. package/build/src/http-client/request.js +87 -71
  318. package/build/src/http-client/response.js +140 -122
  319. package/build/src/http-client/websocket-client.js +17 -15
  320. package/build/src/http-server/client/index.js +465 -409
  321. package/build/src/http-server/client/params-to-object.js +135 -124
  322. package/build/src/http-server/client/request-buffer/form-data-part.js +132 -111
  323. package/build/src/http-server/client/request-buffer/header.js +16 -15
  324. package/build/src/http-server/client/request-buffer/index.js +506 -446
  325. package/build/src/http-server/client/request-parser.js +186 -163
  326. package/build/src/http-server/client/request-runner.js +259 -226
  327. package/build/src/http-server/client/request-timing.js +151 -132
  328. package/build/src/http-server/client/request.js +108 -96
  329. package/build/src/http-server/client/response.js +235 -213
  330. package/build/src/http-server/client/uploaded-file/memory-uploaded-file.js +29 -25
  331. package/build/src/http-server/client/uploaded-file/temporary-uploaded-file.js +29 -25
  332. package/build/src/http-server/client/uploaded-file/uploaded-file.js +33 -33
  333. package/build/src/http-server/client/websocket-request.js +137 -114
  334. package/build/src/http-server/client/websocket-session.js +1657 -1452
  335. package/build/src/http-server/cookie.js +236 -216
  336. package/build/src/http-server/development-reloader.js +221 -190
  337. package/build/src/http-server/index.js +525 -451
  338. package/build/src/http-server/remote-address.js +50 -38
  339. package/build/src/http-server/server-client.js +208 -181
  340. package/build/src/http-server/server-lock.js +167 -153
  341. package/build/src/http-server/websocket-channel-subscribers.js +93 -81
  342. package/build/src/http-server/websocket-channel.js +117 -104
  343. package/build/src/http-server/websocket-connection.js +104 -96
  344. package/build/src/http-server/websocket-event-log-store.js +404 -350
  345. package/build/src/http-server/websocket-events-host.js +164 -145
  346. package/build/src/http-server/websocket-events.js +47 -47
  347. package/build/src/http-server/worker-handler/channel-subscriber-dispatch.js +14 -13
  348. package/build/src/http-server/worker-handler/in-process.js +141 -123
  349. package/build/src/http-server/worker-handler/index.js +349 -313
  350. package/build/src/http-server/worker-handler/worker-script.js +5 -4
  351. package/build/src/http-server/worker-handler/worker-thread.js +269 -240
  352. package/build/src/initializer.js +36 -31
  353. package/build/src/jobs/mail-delivery.js +15 -13
  354. package/build/src/logger/base-logger.js +26 -24
  355. package/build/src/logger/console-logger.js +23 -21
  356. package/build/src/logger/file-logger.js +31 -29
  357. package/build/src/logger/outputs/array-output.js +42 -37
  358. package/build/src/logger/outputs/console-output.js +24 -20
  359. package/build/src/logger/outputs/file-output.js +48 -43
  360. package/build/src/logger/outputs/stdout-output.js +48 -39
  361. package/build/src/logger.js +394 -338
  362. package/build/src/mailer/backends/smtp.js +163 -134
  363. package/build/src/mailer/base.js +251 -211
  364. package/build/src/mailer/delivery.js +64 -56
  365. package/build/src/mailer/index.js +22 -4
  366. package/build/src/mailer.js +13 -4
  367. package/build/src/plugins/sqljs-wasm-route-controller.js +52 -42
  368. package/build/src/plugins/sqljs-wasm-route.js +38 -28
  369. package/build/src/record-payload-values.js +28 -25
  370. package/build/src/routes/app-routes.js +14 -12
  371. package/build/src/routes/base-route.js +130 -112
  372. package/build/src/routes/basic-route.js +102 -83
  373. package/build/src/routes/built-in/debug/controller.js +10 -10
  374. package/build/src/routes/built-in/errors/controller.js +5 -5
  375. package/build/src/routes/get-route.js +63 -50
  376. package/build/src/routes/hooks/frontend-model-command-route-hook.js +80 -66
  377. package/build/src/routes/index.js +43 -36
  378. package/build/src/routes/namespace-route.js +47 -38
  379. package/build/src/routes/plugin-routes.js +124 -107
  380. package/build/src/routes/post-route.js +62 -51
  381. package/build/src/routes/resolver.js +494 -422
  382. package/build/src/routes/resource-route.js +143 -124
  383. package/build/src/routes/root-route.js +8 -7
  384. package/build/src/testing/base-expect.js +14 -13
  385. package/build/src/testing/browser-frontend-model-event-hook-scenarios.js +405 -329
  386. package/build/src/testing/browser-test-app.js +29 -23
  387. package/build/src/testing/expect-to-change.js +50 -41
  388. package/build/src/testing/expect-utils.js +184 -139
  389. package/build/src/testing/expect.js +731 -638
  390. package/build/src/testing/request-client.js +85 -70
  391. package/build/src/testing/test-files-finder.js +339 -285
  392. package/build/src/testing/test-filter-parser.js +155 -124
  393. package/build/src/testing/test-runner.js +1020 -883
  394. package/build/src/testing/test-suite-splitter.js +142 -114
  395. package/build/src/testing/test.js +256 -216
  396. package/build/src/utils/backtrace-cleaner-node.js +69 -62
  397. package/build/src/utils/backtrace-cleaner.js +216 -188
  398. package/build/src/utils/ensure-error.js +7 -7
  399. package/build/src/utils/event-emitter.js +6 -4
  400. package/build/src/utils/file-exists.js +10 -9
  401. package/build/src/utils/format-value.js +76 -67
  402. package/build/src/utils/model-scope.js +31 -27
  403. package/build/src/utils/nest-callbacks.js +13 -10
  404. package/build/src/utils/plain-object.js +6 -5
  405. package/build/src/utils/ransack.d.ts.map +1 -1
  406. package/build/src/utils/ransack.js +563 -449
  407. package/build/src/utils/rest-args-error.js +6 -5
  408. package/build/src/utils/singularize-model-name.js +11 -9
  409. package/build/src/utils/split-sql-statements.js +79 -68
  410. package/build/src/utils/to-import-specifier.js +30 -24
  411. package/build/src/utils/with-tracked-stack-async-hooks.js +74 -60
  412. package/build/src/utils/with-tracked-stack.js +18 -14
  413. package/build/src/velocious-error.js +30 -27
  414. package/index.js +1 -0
  415. package/package.json +10 -4
  416. package/scripts/clean-build.js +8 -0
  417. package/scripts/ensure-bin-executable.js +13 -0
  418. package/scripts/run-tests.js +37 -0
  419. package/scripts/test-browser.js +486 -0
  420. package/src/application.js +229 -0
  421. package/src/authorization/ability.js +329 -0
  422. package/src/authorization/base-resource.js +143 -0
  423. package/src/background-jobs/client.js +50 -0
  424. package/src/background-jobs/cron-expression.js +277 -0
  425. package/src/background-jobs/forked-runner-child.js +86 -0
  426. package/src/background-jobs/job-record.js +13 -0
  427. package/src/background-jobs/job-registry.js +92 -0
  428. package/src/background-jobs/job-runner.js +107 -0
  429. package/src/background-jobs/job.js +77 -0
  430. package/src/background-jobs/json-socket.js +78 -0
  431. package/src/background-jobs/main.js +926 -0
  432. package/src/background-jobs/normalize-error.js +26 -0
  433. package/src/background-jobs/scheduler.js +274 -0
  434. package/src/background-jobs/socket-request.js +68 -0
  435. package/src/background-jobs/status-reporter.js +101 -0
  436. package/src/background-jobs/store.js +994 -0
  437. package/src/background-jobs/types.js +70 -0
  438. package/src/background-jobs/web/authorization.js +89 -0
  439. package/src/background-jobs/web/controller.js +280 -0
  440. package/src/background-jobs/web/index.js +57 -0
  441. package/src/background-jobs/web/path-matcher.js +74 -0
  442. package/src/background-jobs/web/registry.js +49 -0
  443. package/src/background-jobs/worker.js +683 -0
  444. package/src/beacon/client.js +330 -0
  445. package/src/beacon/in-process-broker.js +71 -0
  446. package/src/beacon/in-process-client.js +139 -0
  447. package/src/beacon/server.js +148 -0
  448. package/src/beacon/types.js +55 -0
  449. package/src/cli/base-command.js +67 -0
  450. package/src/cli/browser-cli.js +45 -0
  451. package/src/cli/commands/background-jobs-main.js +7 -0
  452. package/src/cli/commands/background-jobs-runner.js +7 -0
  453. package/src/cli/commands/background-jobs-worker.js +7 -0
  454. package/src/cli/commands/beacon.js +7 -0
  455. package/src/cli/commands/console.js +12 -0
  456. package/src/cli/commands/db/base-command.js +82 -0
  457. package/src/cli/commands/db/create.js +64 -0
  458. package/src/cli/commands/db/drop.js +75 -0
  459. package/src/cli/commands/db/migrate.js +17 -0
  460. package/src/cli/commands/db/reset.js +22 -0
  461. package/src/cli/commands/db/rollback.js +15 -0
  462. package/src/cli/commands/db/schema/dump.js +12 -0
  463. package/src/cli/commands/db/schema/load.js +12 -0
  464. package/src/cli/commands/db/seed.js +12 -0
  465. package/src/cli/commands/db/tenants/check.js +38 -0
  466. package/src/cli/commands/db/tenants/create.js +33 -0
  467. package/src/cli/commands/db/tenants/migrate.js +49 -0
  468. package/src/cli/commands/destroy/migration.js +7 -0
  469. package/src/cli/commands/generate/base-models.js +7 -0
  470. package/src/cli/commands/generate/frontend-models.js +12 -0
  471. package/src/cli/commands/generate/migration.js +7 -0
  472. package/src/cli/commands/generate/model.js +7 -0
  473. package/src/cli/commands/init.js +11 -0
  474. package/src/cli/commands/routes.js +7 -0
  475. package/src/cli/commands/run-script.js +12 -0
  476. package/src/cli/commands/runner.js +12 -0
  477. package/src/cli/commands/server.js +7 -0
  478. package/src/cli/commands/test.js +9 -0
  479. package/src/cli/index.js +152 -0
  480. package/src/cli/tenant-database-command-helper.js +198 -0
  481. package/src/cli/use-browser-cli.js +30 -0
  482. package/src/configuration-resolver.js +65 -0
  483. package/src/configuration-types.js +429 -0
  484. package/src/configuration.js +2590 -0
  485. package/src/controller.js +421 -0
  486. package/src/current-configuration.js +31 -0
  487. package/src/current.js +80 -0
  488. package/src/database/annotations-async-hooks.js +47 -0
  489. package/src/database/annotations.js +40 -0
  490. package/src/database/drivers/base-column.js +182 -0
  491. package/src/database/drivers/base-columns-index.js +81 -0
  492. package/src/database/drivers/base-foreign-key.js +104 -0
  493. package/src/database/drivers/base-table.js +156 -0
  494. package/src/database/drivers/base.js +1609 -0
  495. package/src/database/drivers/mssql/column.js +74 -0
  496. package/src/database/drivers/mssql/columns-index.js +6 -0
  497. package/src/database/drivers/mssql/connect-connection.js +16 -0
  498. package/src/database/drivers/mssql/foreign-key.js +12 -0
  499. package/src/database/drivers/mssql/index.js +590 -0
  500. package/src/database/drivers/mssql/options.js +79 -0
  501. package/src/database/drivers/mssql/query-parser.js +6 -0
  502. package/src/database/drivers/mssql/sql/alter-table.js +4 -0
  503. package/src/database/drivers/mssql/sql/create-database.js +36 -0
  504. package/src/database/drivers/mssql/sql/create-index.js +4 -0
  505. package/src/database/drivers/mssql/sql/create-table.js +4 -0
  506. package/src/database/drivers/mssql/sql/delete.js +19 -0
  507. package/src/database/drivers/mssql/sql/drop-database.js +36 -0
  508. package/src/database/drivers/mssql/sql/drop-table.js +4 -0
  509. package/src/database/drivers/mssql/sql/insert.js +4 -0
  510. package/src/database/drivers/mssql/sql/update.js +31 -0
  511. package/src/database/drivers/mssql/sql/upsert.js +23 -0
  512. package/src/database/drivers/mssql/structure-sql.js +120 -0
  513. package/src/database/drivers/mssql/table.js +145 -0
  514. package/src/database/drivers/mysql/column.js +112 -0
  515. package/src/database/drivers/mysql/columns-index.js +22 -0
  516. package/src/database/drivers/mysql/foreign-key.js +12 -0
  517. package/src/database/drivers/mysql/index.js +473 -0
  518. package/src/database/drivers/mysql/options.js +34 -0
  519. package/src/database/drivers/mysql/query-parser.js +6 -0
  520. package/src/database/drivers/mysql/query.js +37 -0
  521. package/src/database/drivers/mysql/sql/alter-table.js +6 -0
  522. package/src/database/drivers/mysql/sql/create-database.js +39 -0
  523. package/src/database/drivers/mysql/sql/create-index.js +6 -0
  524. package/src/database/drivers/mysql/sql/create-table.js +6 -0
  525. package/src/database/drivers/mysql/sql/delete.js +21 -0
  526. package/src/database/drivers/mysql/sql/drop-database.js +6 -0
  527. package/src/database/drivers/mysql/sql/drop-table.js +6 -0
  528. package/src/database/drivers/mysql/sql/insert.js +6 -0
  529. package/src/database/drivers/mysql/sql/update.js +33 -0
  530. package/src/database/drivers/mysql/sql/upsert.js +13 -0
  531. package/src/database/drivers/mysql/structure-sql.js +93 -0
  532. package/src/database/drivers/mysql/table.js +121 -0
  533. package/src/database/drivers/pgsql/column.js +90 -0
  534. package/src/database/drivers/pgsql/columns-index.js +6 -0
  535. package/src/database/drivers/pgsql/foreign-key.js +12 -0
  536. package/src/database/drivers/pgsql/index.js +441 -0
  537. package/src/database/drivers/pgsql/options.js +32 -0
  538. package/src/database/drivers/pgsql/query-parser.js +6 -0
  539. package/src/database/drivers/pgsql/sql/alter-table.js +6 -0
  540. package/src/database/drivers/pgsql/sql/create-database.js +38 -0
  541. package/src/database/drivers/pgsql/sql/create-index.js +6 -0
  542. package/src/database/drivers/pgsql/sql/create-table.js +6 -0
  543. package/src/database/drivers/pgsql/sql/delete.js +21 -0
  544. package/src/database/drivers/pgsql/sql/drop-database.js +6 -0
  545. package/src/database/drivers/pgsql/sql/drop-table.js +6 -0
  546. package/src/database/drivers/pgsql/sql/insert.js +6 -0
  547. package/src/database/drivers/pgsql/sql/update.js +33 -0
  548. package/src/database/drivers/pgsql/sql/upsert.js +14 -0
  549. package/src/database/drivers/pgsql/structure-sql.js +126 -0
  550. package/src/database/drivers/pgsql/table.js +135 -0
  551. package/src/database/drivers/sqlite/base.js +509 -0
  552. package/src/database/drivers/sqlite/column.js +75 -0
  553. package/src/database/drivers/sqlite/columns-index.js +30 -0
  554. package/src/database/drivers/sqlite/connection-sql-js.js +46 -0
  555. package/src/database/drivers/sqlite/foreign-key.js +24 -0
  556. package/src/database/drivers/sqlite/index.js +394 -0
  557. package/src/database/drivers/sqlite/index.native.js +72 -0
  558. package/src/database/drivers/sqlite/index.web.js +99 -0
  559. package/src/database/drivers/sqlite/options.js +32 -0
  560. package/src/database/drivers/sqlite/query-parser.js +6 -0
  561. package/src/database/drivers/sqlite/query.js +35 -0
  562. package/src/database/drivers/sqlite/query.native.js +35 -0
  563. package/src/database/drivers/sqlite/query.web.js +49 -0
  564. package/src/database/drivers/sqlite/sql/alter-table.js +187 -0
  565. package/src/database/drivers/sqlite/sql/create-index.js +6 -0
  566. package/src/database/drivers/sqlite/sql/create-table.js +6 -0
  567. package/src/database/drivers/sqlite/sql/delete.js +26 -0
  568. package/src/database/drivers/sqlite/sql/drop-table.js +6 -0
  569. package/src/database/drivers/sqlite/sql/insert.js +6 -0
  570. package/src/database/drivers/sqlite/sql/update.js +33 -0
  571. package/src/database/drivers/sqlite/sql/upsert.js +14 -0
  572. package/src/database/drivers/sqlite/structure-sql.js +56 -0
  573. package/src/database/drivers/sqlite/table-rebuilder.js +96 -0
  574. package/src/database/drivers/sqlite/table.js +131 -0
  575. package/src/database/drivers/structure-sql/utils.js +35 -0
  576. package/src/database/handler.js +13 -0
  577. package/src/database/initializer-from-require-context.js +101 -0
  578. package/src/database/migration/index.js +438 -0
  579. package/src/database/migrator/files-finder.js +55 -0
  580. package/src/database/migrator/types.js +31 -0
  581. package/src/database/migrator.js +557 -0
  582. package/src/database/pool/async-tracked-multi-connection.js +1164 -0
  583. package/src/database/pool/base-methods-forward.js +52 -0
  584. package/src/database/pool/base.js +380 -0
  585. package/src/database/pool/single-multi-use.js +118 -0
  586. package/src/database/query/alter-table-base.js +104 -0
  587. package/src/database/query/base.js +49 -0
  588. package/src/database/query/create-database-base.js +42 -0
  589. package/src/database/query/create-index-base.js +117 -0
  590. package/src/database/query/create-table-base.js +205 -0
  591. package/src/database/query/delete-base.js +19 -0
  592. package/src/database/query/drop-database-base.js +38 -0
  593. package/src/database/query/drop-table-base.js +58 -0
  594. package/src/database/query/from-base.js +36 -0
  595. package/src/database/query/from-plain.js +16 -0
  596. package/src/database/query/from-table.js +18 -0
  597. package/src/database/query/index.js +533 -0
  598. package/src/database/query/insert-base.js +172 -0
  599. package/src/database/query/join-base.js +43 -0
  600. package/src/database/query/join-object.js +167 -0
  601. package/src/database/query/join-plain.js +18 -0
  602. package/src/database/query/join-tracker.js +93 -0
  603. package/src/database/query/model-class-query.js +1577 -0
  604. package/src/database/query/order-base.js +33 -0
  605. package/src/database/query/order-column.js +77 -0
  606. package/src/database/query/order-plain.js +28 -0
  607. package/src/database/query/preloader/belongs-to.js +267 -0
  608. package/src/database/query/preloader/ensure-model-class-initialized.js +18 -0
  609. package/src/database/query/preloader/has-many.js +316 -0
  610. package/src/database/query/preloader/has-one.js +123 -0
  611. package/src/database/query/preloader/selection.js +152 -0
  612. package/src/database/query/preloader.js +201 -0
  613. package/src/database/query/query-data.js +305 -0
  614. package/src/database/query/select-base.js +30 -0
  615. package/src/database/query/select-plain.js +18 -0
  616. package/src/database/query/select-table-and-column.js +28 -0
  617. package/src/database/query/update-base.js +41 -0
  618. package/src/database/query/upsert-base.js +103 -0
  619. package/src/database/query/where-base.js +38 -0
  620. package/src/database/query/where-combinator.js +31 -0
  621. package/src/database/query/where-hash.js +77 -0
  622. package/src/database/query/where-model-class-hash.js +505 -0
  623. package/src/database/query/where-not.js +23 -0
  624. package/src/database/query/where-plain.js +20 -0
  625. package/src/database/query/with-count.js +219 -0
  626. package/src/database/query-parser/base-query-parser.js +40 -0
  627. package/src/database/query-parser/from-parser.js +49 -0
  628. package/src/database/query-parser/group-parser.js +55 -0
  629. package/src/database/query-parser/joins-parser.js +37 -0
  630. package/src/database/query-parser/limit-parser.js +77 -0
  631. package/src/database/query-parser/options.js +94 -0
  632. package/src/database/query-parser/order-parser.js +45 -0
  633. package/src/database/query-parser/select-parser.js +67 -0
  634. package/src/database/query-parser/where-parser.js +46 -0
  635. package/src/database/record/acts-as-list.js +374 -0
  636. package/src/database/record/attachments/download.js +49 -0
  637. package/src/database/record/attachments/handle.js +188 -0
  638. package/src/database/record/attachments/normalize-input.js +213 -0
  639. package/src/database/record/attachments/storage-drivers/filesystem.js +114 -0
  640. package/src/database/record/attachments/storage-drivers/native.js +146 -0
  641. package/src/database/record/attachments/storage-drivers/s3.js +245 -0
  642. package/src/database/record/attachments/store.js +591 -0
  643. package/src/database/record/index.js +3970 -0
  644. package/src/database/record/instance-relationships/base.js +289 -0
  645. package/src/database/record/instance-relationships/belongs-to.js +84 -0
  646. package/src/database/record/instance-relationships/has-many.js +284 -0
  647. package/src/database/record/instance-relationships/has-one.js +117 -0
  648. package/src/database/record/record-not-found-error.js +3 -0
  649. package/src/database/record/relationships/base.js +195 -0
  650. package/src/database/record/relationships/belongs-to.js +57 -0
  651. package/src/database/record/relationships/has-many.js +46 -0
  652. package/src/database/record/relationships/has-one.js +46 -0
  653. package/src/database/record/state-machine.js +278 -0
  654. package/src/database/record/user-module.js +43 -0
  655. package/src/database/record/validators/base.js +27 -0
  656. package/src/database/record/validators/format.js +50 -0
  657. package/src/database/record/validators/presence.js +24 -0
  658. package/src/database/record/validators/uniqueness.js +124 -0
  659. package/src/database/table-data/index.js +241 -0
  660. package/src/database/table-data/table-column.js +416 -0
  661. package/src/database/table-data/table-foreign-key.js +69 -0
  662. package/src/database/table-data/table-index.js +46 -0
  663. package/src/database/table-data/table-reference.js +13 -0
  664. package/src/database/use-database.js +48 -0
  665. package/src/environment-handlers/base.js +561 -0
  666. package/src/environment-handlers/browser.js +338 -0
  667. package/src/environment-handlers/node/cli/commands/background-jobs-main.js +21 -0
  668. package/src/environment-handlers/node/cli/commands/background-jobs-runner.js +24 -0
  669. package/src/environment-handlers/node/cli/commands/background-jobs-worker.js +47 -0
  670. package/src/environment-handlers/node/cli/commands/beacon.js +21 -0
  671. package/src/environment-handlers/node/cli/commands/cli-command-context.js +31 -0
  672. package/src/environment-handlers/node/cli/commands/console.js +149 -0
  673. package/src/environment-handlers/node/cli/commands/db/schema/dump.js +43 -0
  674. package/src/environment-handlers/node/cli/commands/db/schema/load.js +69 -0
  675. package/src/environment-handlers/node/cli/commands/db/seed.js +79 -0
  676. package/src/environment-handlers/node/cli/commands/destroy/migration.js +47 -0
  677. package/src/environment-handlers/node/cli/commands/generate/base-models.js +367 -0
  678. package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +872 -0
  679. package/src/environment-handlers/node/cli/commands/generate/migration.js +45 -0
  680. package/src/environment-handlers/node/cli/commands/generate/model.js +45 -0
  681. package/src/environment-handlers/node/cli/commands/init.js +68 -0
  682. package/src/environment-handlers/node/cli/commands/routes.js +63 -0
  683. package/src/environment-handlers/node/cli/commands/run-script.js +85 -0
  684. package/src/environment-handlers/node/cli/commands/runner.js +84 -0
  685. package/src/environment-handlers/node/cli/commands/server.js +151 -0
  686. package/src/environment-handlers/node/cli/commands/test.js +118 -0
  687. package/src/environment-handlers/node.js +887 -0
  688. package/src/error-logger.js +30 -0
  689. package/src/frontend-model-controller.js +3491 -0
  690. package/src/frontend-model-resource/base-resource.js +935 -0
  691. package/src/frontend-models/base.js +4004 -0
  692. package/src/frontend-models/clear-pending-debounced-callback.js +16 -0
  693. package/src/frontend-models/event-hook-models.js +49 -0
  694. package/src/frontend-models/model-registry.js +28 -0
  695. package/src/frontend-models/outgoing-event-buffer.js +51 -0
  696. package/src/frontend-models/preloader.js +169 -0
  697. package/src/frontend-models/query.js +2245 -0
  698. package/src/frontend-models/resource-config-validation.js +56 -0
  699. package/src/frontend-models/resource-definition.js +399 -0
  700. package/src/frontend-models/transport-serialization.js +369 -0
  701. package/src/frontend-models/use-created-event.js +21 -0
  702. package/src/frontend-models/use-destroyed-event.js +148 -0
  703. package/src/frontend-models/use-model-class-event.js +164 -0
  704. package/src/frontend-models/use-updated-event.js +152 -0
  705. package/src/frontend-models/websocket-channel.js +494 -0
  706. package/src/frontend-models/websocket-publishers.js +224 -0
  707. package/src/http-client/header.js +17 -0
  708. package/src/http-client/index.js +139 -0
  709. package/src/http-client/request.js +94 -0
  710. package/src/http-client/response.js +151 -0
  711. package/src/http-client/websocket-client.js +27 -0
  712. package/src/http-server/client/index.js +507 -0
  713. package/src/http-server/client/params-to-object.js +152 -0
  714. package/src/http-server/client/request-buffer/form-data-part.js +139 -0
  715. package/src/http-server/client/request-buffer/header.js +19 -0
  716. package/src/http-server/client/request-buffer/index.js +535 -0
  717. package/src/http-server/client/request-parser.js +195 -0
  718. package/src/http-server/client/request-runner.js +321 -0
  719. package/src/http-server/client/request-timing.js +171 -0
  720. package/src/http-server/client/request.js +114 -0
  721. package/src/http-server/client/response.js +251 -0
  722. package/src/http-server/client/uploaded-file/memory-uploaded-file.js +32 -0
  723. package/src/http-server/client/uploaded-file/temporary-uploaded-file.js +32 -0
  724. package/src/http-server/client/uploaded-file/uploaded-file.js +36 -0
  725. package/src/http-server/client/websocket-request.js +147 -0
  726. package/src/http-server/client/websocket-session.js +1755 -0
  727. package/src/http-server/cookie.js +245 -0
  728. package/src/http-server/development-reloader.js +240 -0
  729. package/src/http-server/index.js +561 -0
  730. package/src/http-server/remote-address.js +77 -0
  731. package/src/http-server/server-client.js +222 -0
  732. package/src/http-server/server-lock.js +178 -0
  733. package/src/http-server/websocket-channel-subscribers.js +110 -0
  734. package/src/http-server/websocket-channel.js +137 -0
  735. package/src/http-server/websocket-connection.js +118 -0
  736. package/src/http-server/websocket-event-log-store.js +433 -0
  737. package/src/http-server/websocket-events-host.js +170 -0
  738. package/src/http-server/websocket-events.js +50 -0
  739. package/src/http-server/worker-handler/channel-subscriber-dispatch.js +28 -0
  740. package/src/http-server/worker-handler/in-process.js +155 -0
  741. package/src/http-server/worker-handler/index.js +370 -0
  742. package/src/http-server/worker-handler/worker-script.js +6 -0
  743. package/src/http-server/worker-handler/worker-thread.js +286 -0
  744. package/src/initializer.js +39 -0
  745. package/src/jobs/.gitkeep +1 -0
  746. package/src/jobs/mail-delivery.js +22 -0
  747. package/src/logger/base-logger.js +34 -0
  748. package/src/logger/console-logger.js +28 -0
  749. package/src/logger/file-logger.js +36 -0
  750. package/src/logger/outputs/array-output.js +50 -0
  751. package/src/logger/outputs/console-output.js +32 -0
  752. package/src/logger/outputs/file-output.js +55 -0
  753. package/src/logger/outputs/stdout-output.js +64 -0
  754. package/src/logger.js +507 -0
  755. package/src/mailer/backends/smtp.js +197 -0
  756. package/src/mailer/base.js +337 -0
  757. package/src/mailer/delivery.js +70 -0
  758. package/src/mailer/index.js +24 -0
  759. package/src/mailer.js +15 -0
  760. package/src/plugins/sqljs-wasm-route-controller.js +70 -0
  761. package/src/plugins/sqljs-wasm-route.js +71 -0
  762. package/src/record-payload-values.js +83 -0
  763. package/src/routes/app-routes.js +17 -0
  764. package/src/routes/base-route.js +133 -0
  765. package/src/routes/basic-route.js +109 -0
  766. package/src/routes/built-in/debug/controller.js +12 -0
  767. package/src/routes/built-in/errors/controller.js +7 -0
  768. package/src/routes/built-in/errors/not-found.ejs +1 -0
  769. package/src/routes/get-route.js +75 -0
  770. package/src/routes/hooks/frontend-model-command-route-hook.js +100 -0
  771. package/src/routes/index.js +50 -0
  772. package/src/routes/namespace-route.js +51 -0
  773. package/src/routes/plugin-routes.js +141 -0
  774. package/src/routes/post-route.js +74 -0
  775. package/src/routes/resolver.js +535 -0
  776. package/src/routes/resource-route.js +154 -0
  777. package/src/routes/root-route.js +11 -0
  778. package/src/templates/configuration.js +61 -0
  779. package/src/templates/generate-migration.js +11 -0
  780. package/src/templates/generate-model.js +6 -0
  781. package/src/templates/routes.js +11 -0
  782. package/src/testing/base-expect.js +17 -0
  783. package/src/testing/browser-frontend-model-event-hook-scenarios.js +520 -0
  784. package/src/testing/browser-test-app.js +32 -0
  785. package/src/testing/expect-to-change.js +55 -0
  786. package/src/testing/expect-utils.js +269 -0
  787. package/src/testing/expect.js +763 -0
  788. package/src/testing/request-client.js +90 -0
  789. package/src/testing/test-files-finder.js +364 -0
  790. package/src/testing/test-filter-parser.js +198 -0
  791. package/src/testing/test-runner.js +1168 -0
  792. package/src/testing/test-suite-splitter.js +177 -0
  793. package/src/testing/test.js +370 -0
  794. package/src/types/external-modules.d.ts +57 -0
  795. package/src/utils/backtrace-cleaner-node.js +87 -0
  796. package/src/utils/backtrace-cleaner.js +266 -0
  797. package/src/utils/ensure-error.js +15 -0
  798. package/src/utils/event-emitter.js +8 -0
  799. package/src/utils/file-exists.js +18 -0
  800. package/src/utils/format-value.js +101 -0
  801. package/src/utils/model-scope.js +56 -0
  802. package/src/utils/nest-callbacks.js +22 -0
  803. package/src/utils/plain-object.js +14 -0
  804. package/src/utils/ransack.js +859 -0
  805. package/src/utils/rest-args-error.js +14 -0
  806. package/src/utils/singularize-model-name.js +18 -0
  807. package/src/utils/split-sql-statements.js +88 -0
  808. package/src/utils/to-import-specifier.js +53 -0
  809. package/src/utils/with-tracked-stack-async-hooks.js +103 -0
  810. package/src/utils/with-tracked-stack.js +38 -0
  811. package/src/velocious-error.js +34 -0
  812. package/tsconfig.json +16 -0
@@ -1,424 +1,498 @@
1
1
  // @ts-check
2
- import { digg } from "diggerize";
3
- import AlterTable from "./sql/alter-table.js";
4
- import Base from "../base.js";
5
- import CreateIndex from "./sql/create-index.js";
6
- import CreateTable from "./sql/create-table.js";
7
- import Delete from "./sql/delete.js";
8
- import DropTable from "./sql/drop-table.js";
9
- import escapeString from "sql-escape-string";
10
- import Insert from "./sql/insert.js";
11
- import Options from "./options.js";
12
- import QueryParser from "./query-parser.js";
13
- import Table from "./table.js";
14
- import StructureSql from "./structure-sql.js";
15
- import Upsert from "./sql/upsert.js";
16
- import Update from "./sql/update.js";
2
+
3
+ import {digg} from "diggerize"
4
+
5
+ import AlterTable from "./sql/alter-table.js"
6
+ import Base from "../base.js"
7
+ import CreateIndex from "./sql/create-index.js"
8
+ import CreateTable from "./sql/create-table.js"
9
+ import Delete from "./sql/delete.js"
10
+ import DropTable from "./sql/drop-table.js"
11
+ import escapeString from "sql-escape-string"
12
+ import Insert from "./sql/insert.js"
13
+ import Options from "./options.js"
14
+ import QueryParser from "./query-parser.js"
15
+ import Table from "./table.js"
16
+ import StructureSql from "./structure-sql.js"
17
+ import Upsert from "./sql/upsert.js"
18
+ import Update from "./sql/update.js"
19
+
17
20
  export default class VelociousDatabaseDriversSqliteBase extends Base {
21
+ /**
22
+ * Version major.
23
+ @type {number | undefined} */
24
+ versionMajor = undefined
25
+ /**
26
+ * Version minor.
27
+ @type {number | undefined} */
28
+ versionMinor = undefined
29
+ /**
30
+ * Version patch.
31
+ @type {number | undefined} */
32
+ versionPatch = undefined
33
+
34
+ /**
35
+ * Runs alter table sqls.
36
+ * @param {import("../../table-data/index.js").default} tableData - Table data.
37
+ * @returns {Promise<string[]>} - Resolves with SQL statements.
38
+ */
39
+ async alterTableSQLs(tableData) {
40
+ const alterArgs = {driver: this, tableData}
41
+ const alterTable = new AlterTable(alterArgs)
42
+
43
+ return await alterTable.toSQLs()
44
+ }
45
+
46
+ /**
47
+ * Runs create index sqls.
48
+ * @param {import("../base.js").CreateIndexSqlArgs} indexData - Index data.
49
+ * @returns {Promise<string[]>} - Resolves with SQL statements.
50
+ */
51
+ async createIndexSQLs(indexData) {
52
+ const createArgs = Object.assign({driver: this}, indexData)
53
+ const createIndex = new CreateIndex(createArgs)
54
+
55
+ return await createIndex.toSQLs()
56
+ }
57
+
58
+ /**
59
+ * Runs create table sql.
60
+ * @abstract
61
+ * @param {import("../../table-data/index.js").default} tableData - Table data.
62
+ * @returns {Promise<string[]>} - Resolves with SQL statements.
63
+ */
64
+ async createTableSql(tableData) {
65
+ const createArgs = {tableData, driver: this, indexInCreateTable: false}
66
+ const createTable = new CreateTable(createArgs)
67
+
68
+ return await createTable.toSql()
69
+ }
70
+
71
+ currentDatabase() {
72
+ return null
73
+ }
74
+
75
+ async disableForeignKeys() {
76
+ await this.query("PRAGMA foreign_keys = 0")
77
+ }
78
+
79
+ async enableForeignKeys() {
80
+ await this.query("PRAGMA foreign_keys = 1")
81
+ }
82
+
83
+ /**
84
+ * Runs drop table sqls.
85
+ * @param {string} tableName - Table name.
86
+ * @param {import("../base.js").DropTableSqlArgsType} [args] - Options object.
87
+ * @returns {Promise<string[]>} - Resolves with SQL statements.
88
+ */
89
+ async dropTableSQLs(tableName, args = {}) {
90
+ const driver = /**
91
+ * Narrows the runtime value to the documented type.
92
+ @type {import("../base.js").default} */ (this)
93
+ const dropArgs = Object.assign({tableName, driver}, args)
94
+ const dropTable = new DropTable(dropArgs)
95
+
96
+ return await dropTable.toSQLs()
97
+ }
98
+
99
+ /**
100
+ * Runs delete sql.
101
+ * @param {import("../base.js").DeleteSqlArgsType} args - Options object.
102
+ * @returns {string} - SQL string.
103
+ */
104
+ deleteSql(args) { return new Delete(Object.assign({driver: this}, args)).toSql() }
105
+
106
+ /**
107
+ * Runs get type.
108
+ * @returns {string} - The type.
109
+ */
110
+ getType() { return "sqlite" }
111
+
112
+ /**
113
+ * Runs insert sql.
114
+ * @param {import("../base.js").InsertSqlArgsType} args - Options object.
115
+ * @returns {string} - SQL string.
116
+ */
117
+ insertSql(args) { return new Insert(Object.assign({driver: this}, args)).toSql() }
118
+
119
+ /**
120
+ * Runs get tables.
121
+ * @returns {Promise<Array<import("../base-table.js").default>>} - Resolves with the tables.
122
+ */
123
+ async getTables() {
124
+ return await this._cachedSchemaMetadata("tables", async () => {
125
+ const result = await this.query("SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name")
126
+ const tables = []
127
+
128
+ for (const row of result) {
129
+ const table = new Table({driver: this, row: /**
130
+ * Narrows the runtime value to the documented type.
131
+ @type {Record<string, string | number | null>} */ (row)})
132
+
133
+ tables.push(table)
134
+ }
135
+
136
+ return tables
137
+ })
138
+ }
139
+
140
+ /**
141
+ * Runs insert multiple.
142
+ * @param {string} tableName - Table name.
143
+ * @param {Array<string>} columns - Column names.
144
+ * @param {Array<Array<?>>} rows - Rows to insert.
145
+ * @returns {Promise<void>} - Resolves when complete.
146
+ */
147
+ async insertMultiple(tableName, columns, rows) {
148
+ this._assertNotReadOnly()
149
+ await this.registerVersion()
150
+
151
+ if (this.supportsMultipleInsertValues()) {
152
+ await this.insertMultipleWithSingleInsert(tableName, columns, rows)
153
+ } else {
154
+ await this.insertMultipleWithTransaction(tableName, columns, rows)
155
+ }
156
+ }
157
+
158
+ /**
159
+ * Runs supports multiple insert values.
160
+ * @returns {boolean} - Whether supports multiple insert values.
161
+ */
162
+ supportsMultipleInsertValues() {
18
163
  /**
19
164
  * Version major.
20
- @type {number | undefined} */
21
- versionMajor = undefined;
165
+ @type {number} */
166
+ const versionMajor = this.versionMajor || 0
22
167
  /**
23
168
  * Version minor.
24
- @type {number | undefined} */
25
- versionMinor = undefined;
169
+ @type {number} */
170
+ const versionMinor = this.versionMinor || 0
26
171
  /**
27
172
  * Version patch.
28
- @type {number | undefined} */
29
- versionPatch = undefined;
30
- /**
31
- * Runs alter table sqls.
32
- * @param {import("../../table-data/index.js").default} tableData - Table data.
33
- * @returns {Promise<string[]>} - Resolves with SQL statements.
34
- */
35
- async alterTableSQLs(tableData) {
36
- const alterArgs = { driver: this, tableData };
37
- const alterTable = new AlterTable(alterArgs);
38
- return await alterTable.toSQLs();
39
- }
40
- /**
41
- * Runs create index sqls.
42
- * @param {import("../base.js").CreateIndexSqlArgs} indexData - Index data.
43
- * @returns {Promise<string[]>} - Resolves with SQL statements.
44
- */
45
- async createIndexSQLs(indexData) {
46
- const createArgs = Object.assign({ driver: this }, indexData);
47
- const createIndex = new CreateIndex(createArgs);
48
- return await createIndex.toSQLs();
49
- }
50
- /**
51
- * Runs create table sql.
52
- * @abstract
53
- * @param {import("../../table-data/index.js").default} tableData - Table data.
54
- * @returns {Promise<string[]>} - Resolves with SQL statements.
55
- */
56
- async createTableSql(tableData) {
57
- const createArgs = { tableData, driver: this, indexInCreateTable: false };
58
- const createTable = new CreateTable(createArgs);
59
- return await createTable.toSql();
60
- }
61
- currentDatabase() {
62
- return null;
63
- }
64
- async disableForeignKeys() {
65
- await this.query("PRAGMA foreign_keys = 0");
66
- }
67
- async enableForeignKeys() {
68
- await this.query("PRAGMA foreign_keys = 1");
69
- }
70
- /**
71
- * Runs drop table sqls.
72
- * @param {string} tableName - Table name.
73
- * @param {import("../base.js").DropTableSqlArgsType} [args] - Options object.
74
- * @returns {Promise<string[]>} - Resolves with SQL statements.
75
- */
76
- async dropTableSQLs(tableName, args = {}) {
77
- const driver = /**
78
- * Narrows the runtime value to the documented type.
79
- @type {import("../base.js").default} */ (this);
80
- const dropArgs = Object.assign({ tableName, driver }, args);
81
- const dropTable = new DropTable(dropArgs);
82
- return await dropTable.toSQLs();
83
- }
84
- /**
85
- * Runs delete sql.
86
- * @param {import("../base.js").DeleteSqlArgsType} args - Options object.
87
- * @returns {string} - SQL string.
88
- */
89
- deleteSql(args) { return new Delete(Object.assign({ driver: this }, args)).toSql(); }
90
- /**
91
- * Runs get type.
92
- * @returns {string} - The type.
93
- */
94
- getType() { return "sqlite"; }
173
+ @type {number} */
174
+ const versionPatch = this.versionPatch || 0
175
+
176
+ if (versionMajor >= 4) return true
177
+ if (versionMajor == 3 && versionMinor >= 8) return true
178
+ if (versionMajor == 3 && versionMinor == 7 && versionPatch >= 11) return true
179
+
180
+ return false
181
+ }
182
+
183
+ /**
184
+ * Runs supports insert into returning.
185
+ * @returns {boolean} - Whether supports insert into returning.
186
+ */
187
+ supportsInsertIntoReturning() {
95
188
  /**
96
- * Runs insert sql.
97
- * @param {import("../base.js").InsertSqlArgsType} args - Options object.
98
- * @returns {string} - SQL string.
99
- */
100
- insertSql(args) { return new Insert(Object.assign({ driver: this }, args)).toSql(); }
189
+ * Version major.
190
+ @type {number} */
191
+ const versionMajor = this.versionMajor || 0
101
192
  /**
102
- * Runs get tables.
103
- * @returns {Promise<Array<import("../base-table.js").default>>} - Resolves with the tables.
104
- */
105
- async getTables() {
106
- return await this._cachedSchemaMetadata("tables", async () => {
107
- const result = await this.query("SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name");
108
- const tables = [];
109
- for (const row of result) {
110
- const table = new Table({ driver: this, row: /**
111
- * Narrows the runtime value to the documented type.
112
- @type {Record<string, string | number | null>} */ (row) });
113
- tables.push(table);
114
- }
115
- return tables;
116
- });
117
- }
193
+ * Version minor.
194
+ @type {number} */
195
+ const versionMinor = this.versionMinor || 0
196
+
197
+ if (versionMajor >= 4) return true
198
+ if (versionMajor == 3 && versionMinor >= 35) return true
199
+
200
+ return false
201
+ }
202
+
203
+ /**
204
+ * Runs insert multiple with single insert.
205
+ * @param {string} tableName - Table name.
206
+ * @param {Array<string>} columns - Column names.
207
+ * @param {Array<Array<?>>} rows - Rows to insert.
208
+ * @returns {Promise<void>} - Resolves when complete.
209
+ */
210
+ async insertMultipleWithSingleInsert(tableName, columns, rows) {
211
+ this._assertNotReadOnly()
212
+ const sql = new Insert({columns, driver: this, rows, tableName}).toSql()
213
+
214
+ await this.query(sql)
215
+ }
216
+
217
+ /**
218
+ * Runs insert multiple with transaction.
219
+ * @param {string} tableName - Table name.
220
+ * @param {Array<string>} columns - Column names.
221
+ * @param {Array<Array<?>>} rows - Rows to insert.
222
+ * @returns {Promise<void>} - Resolves when complete.
223
+ */
224
+ async insertMultipleWithTransaction(tableName, columns, rows) {
225
+ this._assertNotReadOnly()
118
226
  /**
119
- * Runs insert multiple.
120
- * @param {string} tableName - Table name.
121
- * @param {Array<string>} columns - Column names.
122
- * @param {Array<Array<?>>} rows - Rows to insert.
123
- * @returns {Promise<void>} - Resolves when complete.
124
- */
125
- async insertMultiple(tableName, columns, rows) {
126
- this._assertNotReadOnly();
127
- await this.registerVersion();
128
- if (this.supportsMultipleInsertValues()) {
129
- await this.insertMultipleWithSingleInsert(tableName, columns, rows);
130
- }
131
- else {
132
- await this.insertMultipleWithTransaction(tableName, columns, rows);
133
- }
227
+ * Sqls.
228
+ @type {string[]} */
229
+ const sqls = []
230
+
231
+ for (const row of rows) {
232
+ /**
233
+ * Data.
234
+ @type {Record<string, ?>} */
235
+ const data = {}
236
+
237
+ for (const columnIndex in columns) {
238
+ const columnName = columns[columnIndex]
239
+ const value = row[columnIndex]
240
+
241
+ data[columnName] = value
242
+ }
243
+
244
+ const insertSql = this.insertSql({tableName, data})
245
+
246
+ sqls.push(insertSql)
134
247
  }
135
- /**
136
- * Runs supports multiple insert values.
137
- * @returns {boolean} - Whether supports multiple insert values.
138
- */
139
- supportsMultipleInsertValues() {
140
- /**
141
- * Version major.
142
- @type {number} */
143
- const versionMajor = this.versionMajor || 0;
144
- /**
145
- * Version minor.
146
- @type {number} */
147
- const versionMinor = this.versionMinor || 0;
148
- /**
149
- * Version patch.
150
- @type {number} */
151
- const versionPatch = this.versionPatch || 0;
152
- if (versionMajor >= 4)
153
- return true;
154
- if (versionMajor == 3 && versionMinor >= 8)
155
- return true;
156
- if (versionMajor == 3 && versionMinor == 7 && versionPatch >= 11)
157
- return true;
158
- return false;
248
+
249
+ await this.transaction(async () => {
250
+ for (const sql of sqls) {
251
+ await this.query(sql)
252
+ }
253
+ })
254
+ }
255
+
256
+ async lastInsertID() {
257
+ const result = await this.query("SELECT LAST_INSERT_ROWID() AS last_insert_id")
258
+
259
+ return digg(result, 0, "last_insert_id")
260
+ }
261
+
262
+ options() {
263
+ if (!this._options) this._options = new Options(this)
264
+
265
+ return this._options
266
+ }
267
+
268
+ /**
269
+ * Runs primary key type.
270
+ * @returns {string} - The type of the primary key for this driver.
271
+ */
272
+ primaryKeyType() { return "integer" } // Because bigint on SQLite doesn't support auto increment
273
+
274
+ /**
275
+ * Runs query to sql.
276
+ * @param {import("../../query/index.js").default} query - Query instance.
277
+ * @returns {string} - SQL string.
278
+ */
279
+ queryToSql(query) { return new QueryParser({query}).toSql() }
280
+
281
+ async registerVersion() {
282
+ if (this.versionMajor || this.versionMinor) {
283
+ return
159
284
  }
160
- /**
161
- * Runs supports insert into returning.
162
- * @returns {boolean} - Whether supports insert into returning.
163
- */
164
- supportsInsertIntoReturning() {
285
+
286
+ const versionResult = await this.query("SELECT sqlite_version() AS version")
287
+
288
+ this.version = String(versionResult[0].version)
289
+
290
+ const versionParts = this.version.split(".")
291
+
292
+ this.versionMajor = Number(versionParts[0])
293
+ this.versionMinor = Number(versionParts[1])
294
+ this.versionPatch = Number(versionParts[2])
295
+ }
296
+
297
+ shouldSetAutoIncrementWhenPrimaryKey() { return false }
298
+ supportsDefaultPrimaryKeyUUID() { return false }
299
+
300
+ /**
301
+ * Runs escape.
302
+ * @param {?} value - Value to use.
303
+ * @returns {?} - The escape.
304
+ */
305
+ escape(value) {
306
+ value = this._convertValue(value)
307
+
308
+ const type = typeof value
309
+
310
+ if (type != "string") value = `${value}`
311
+
312
+ const resultWithQuotes = escapeString(value, null)
313
+ const result = resultWithQuotes.substring(1, resultWithQuotes.length - 1)
314
+
315
+ return result
316
+ }
317
+
318
+ /**
319
+ * Runs retryable database error.
320
+ * @param {Error} error - Error instance.
321
+ * @returns {import("../base.js").RetryableDatabaseErrorResult} - Retry info.
322
+ */
323
+ retryableDatabaseError(error) {
324
+ const shouldRetry = (
325
+ error.message?.startsWith("attempt to write a readonly database") ||
326
+ error.message?.startsWith("database is locked") ||
327
+ error.message?.includes("→ Caused by: Error code : database is locked")
328
+ )
329
+
330
+ return {retry: shouldRetry, reconnect: false}
331
+ }
332
+
333
+ /**
334
+ * Runs quote.
335
+ * @param {?} value - Value to use.
336
+ * @returns {string | number} - The quoted value.
337
+ */
338
+ quote(value) {
339
+ value = this._convertValue(value)
340
+
341
+ const type = typeof value
342
+
343
+ if (type == "number") return /** Narrows the runtime value to the documented type. @type {number} */ (value)
344
+ if (type != "string") value = String(value)
345
+
346
+ return escapeString(value, null)
347
+ }
348
+
349
+ /**
350
+ * Runs update sql.
351
+ * @param {import("../base.js").UpdateSqlArgsType} args - Options object.
352
+ * @returns {string} - SQL string.
353
+ */
354
+ updateSql({conditions, data, tableName}) { return new Update({conditions, data, driver: this, tableName}).toSql() }
355
+
356
+ /**
357
+ * Runs upsert sql.
358
+ * @param {import("../base.js").UpsertSqlArgsType} args - Options object.
359
+ * @returns {string} - SQL string.
360
+ */
361
+ upsertSql(args) { return new Upsert({...args, driver: this}).toSql() }
362
+
363
+ /**
364
+ * Runs structure sql.
365
+ * @returns {Promise<string | null>} - Resolves with SQL string.
366
+ */
367
+ async structureSql() {
368
+ return await this._cachedSchemaMetadata("structureSql", async () => await new StructureSql({driver: this}).toSql())
369
+ }
370
+
371
+ /**
372
+ * Blocks until an in-process advisory lock with the given name is
373
+ * acquired. SQLite has no built-in advisory lock primitive, so this is
374
+ * implemented as a process-local waiter queue. Typical SQLite deployments
375
+ * run inside a single Node process, which is exactly the scope this
376
+ * emulation covers; multi-process SQLite setups should not rely on this
377
+ * for cross-process mutual exclusion.
378
+ *
379
+ * The owning driver instance is recorded so that `releaseAdvisoryLock`
380
+ * can refuse to release a lock that was acquired by someone else.
381
+ * @param {string} name - Lock name.
382
+ * @param {{timeoutMs?: number | null}} [args] - Optional timeout in milliseconds; `null`, `undefined`, or negative blocks forever.
383
+ * @returns {Promise<boolean>} - True if the lock was acquired, false if the timeout elapsed.
384
+ */
385
+ async acquireAdvisoryLock(name, {timeoutMs} = {}) {
386
+ const state = VelociousDatabaseDriversSqliteBase._advisoryLockState
387
+
388
+ while (state.ownersByName.has(name)) {
389
+ let remainingMs = null
390
+
391
+ if (typeof timeoutMs === "number" && timeoutMs >= 0) {
392
+ remainingMs = timeoutMs
393
+
394
+ if (remainingMs <= 0) return false
395
+ }
396
+
397
+ await new Promise((resolve) => {
398
+ const waiters = state.waitersByName.get(name) || []
165
399
  /**
166
- * Version major.
167
- @type {number} */
168
- const versionMajor = this.versionMajor || 0;
169
- /**
170
- * Version minor.
171
- @type {number} */
172
- const versionMinor = this.versionMinor || 0;
173
- if (versionMajor >= 4)
174
- return true;
175
- if (versionMajor == 3 && versionMinor >= 35)
176
- return true;
177
- return false;
178
- }
179
- /**
180
- * Runs insert multiple with single insert.
181
- * @param {string} tableName - Table name.
182
- * @param {Array<string>} columns - Column names.
183
- * @param {Array<Array<?>>} rows - Rows to insert.
184
- * @returns {Promise<void>} - Resolves when complete.
185
- */
186
- async insertMultipleWithSingleInsert(tableName, columns, rows) {
187
- this._assertNotReadOnly();
188
- const sql = new Insert({ columns, driver: this, rows, tableName }).toSql();
189
- await this.query(sql);
190
- }
191
- /**
192
- * Runs insert multiple with transaction.
193
- * @param {string} tableName - Table name.
194
- * @param {Array<string>} columns - Column names.
195
- * @param {Array<Array<?>>} rows - Rows to insert.
196
- * @returns {Promise<void>} - Resolves when complete.
197
- */
198
- async insertMultipleWithTransaction(tableName, columns, rows) {
199
- this._assertNotReadOnly();
400
+ * Timeout handle.
401
+ @type {NodeJS.Timeout | null} */
402
+ let timeoutHandle = null
200
403
  /**
201
- * Sqls.
202
- @type {string[]} */
203
- const sqls = [];
204
- for (const row of rows) {
205
- /**
206
- * Data.
207
- @type {Record<string, ?>} */
208
- const data = {};
209
- for (const columnIndex in columns) {
210
- const columnName = columns[columnIndex];
211
- const value = row[columnIndex];
212
- data[columnName] = value;
213
- }
214
- const insertSql = this.insertSql({ tableName, data });
215
- sqls.push(insertSql);
404
+ * Remove and resolve.
405
+ @type {(() => void) | null} */
406
+ let removeAndResolve = null
407
+
408
+ removeAndResolve = () => {
409
+ if (timeoutHandle) clearTimeout(timeoutHandle)
410
+
411
+ const current = state.waitersByName.get(name) || []
412
+ const index = current.indexOf(/**
413
+ * Narrows the runtime value to the documented type.
414
+ @type {() => void} */ (removeAndResolve))
415
+
416
+ if (index >= 0) current.splice(index, 1)
417
+ if (current.length === 0) state.waitersByName.delete(name)
418
+
419
+ resolve(undefined)
216
420
  }
217
- await this.transaction(async () => {
218
- for (const sql of sqls) {
219
- await this.query(sql);
220
- }
221
- });
222
- }
223
- async lastInsertID() {
224
- const result = await this.query("SELECT LAST_INSERT_ROWID() AS last_insert_id");
225
- return digg(result, 0, "last_insert_id");
226
- }
227
- options() {
228
- if (!this._options)
229
- this._options = new Options(this);
230
- return this._options;
231
- }
232
- /**
233
- * Runs primary key type.
234
- * @returns {string} - The type of the primary key for this driver.
235
- */
236
- primaryKeyType() { return "integer"; } // Because bigint on SQLite doesn't support auto increment
237
- /**
238
- * Runs query to sql.
239
- * @param {import("../../query/index.js").default} query - Query instance.
240
- * @returns {string} - SQL string.
241
- */
242
- queryToSql(query) { return new QueryParser({ query }).toSql(); }
243
- async registerVersion() {
244
- if (this.versionMajor || this.versionMinor) {
245
- return;
421
+
422
+ waiters.push(removeAndResolve)
423
+ state.waitersByName.set(name, waiters)
424
+
425
+ if (remainingMs !== null) {
426
+ timeoutHandle = setTimeout(() => {
427
+ if (removeAndResolve) removeAndResolve()
428
+ }, remainingMs)
246
429
  }
247
- const versionResult = await this.query("SELECT sqlite_version() AS version");
248
- this.version = String(versionResult[0].version);
249
- const versionParts = this.version.split(".");
250
- this.versionMajor = Number(versionParts[0]);
251
- this.versionMinor = Number(versionParts[1]);
252
- this.versionPatch = Number(versionParts[2]);
430
+ })
431
+
432
+ if (typeof timeoutMs === "number" && timeoutMs >= 0 && state.ownersByName.has(name)) {
433
+ return false
434
+ }
253
435
  }
254
- shouldSetAutoIncrementWhenPrimaryKey() { return false; }
255
- supportsDefaultPrimaryKeyUUID() { return false; }
256
- /**
257
- * Runs escape.
258
- * @param {?} value - Value to use.
259
- * @returns {?} - The escape.
260
- */
261
- escape(value) {
262
- value = this._convertValue(value);
263
- const type = typeof value;
264
- if (type != "string")
265
- value = `${value}`;
266
- const resultWithQuotes = escapeString(value, null);
267
- const result = resultWithQuotes.substring(1, resultWithQuotes.length - 1);
268
- return result;
269
- }
270
- /**
271
- * Runs retryable database error.
272
- * @param {Error} error - Error instance.
273
- * @returns {import("../base.js").RetryableDatabaseErrorResult} - Retry info.
274
- */
275
- retryableDatabaseError(error) {
276
- const shouldRetry = (error.message?.startsWith("attempt to write a readonly database") ||
277
- error.message?.startsWith("database is locked") ||
278
- error.message?.includes("→ Caused by: Error code : database is locked"));
279
- return { retry: shouldRetry, reconnect: false };
280
- }
281
- /**
282
- * Runs quote.
283
- * @param {?} value - Value to use.
284
- * @returns {string | number} - The quoted value.
285
- */
286
- quote(value) {
287
- value = this._convertValue(value);
288
- const type = typeof value;
289
- if (type == "number")
290
- return /** Narrows the runtime value to the documented type. @type {number} */ (value);
291
- if (type != "string")
292
- value = String(value);
293
- return escapeString(value, null);
294
- }
295
- /**
296
- * Runs update sql.
297
- * @param {import("../base.js").UpdateSqlArgsType} args - Options object.
298
- * @returns {string} - SQL string.
299
- */
300
- updateSql({ conditions, data, tableName }) { return new Update({ conditions, data, driver: this, tableName }).toSql(); }
301
- /**
302
- * Runs upsert sql.
303
- * @param {import("../base.js").UpsertSqlArgsType} args - Options object.
304
- * @returns {string} - SQL string.
305
- */
306
- upsertSql(args) { return new Upsert({ ...args, driver: this }).toSql(); }
307
- /**
308
- * Runs structure sql.
309
- * @returns {Promise<string | null>} - Resolves with SQL string.
310
- */
311
- async structureSql() {
312
- return await this._cachedSchemaMetadata("structureSql", async () => await new StructureSql({ driver: this }).toSql());
313
- }
314
- /**
315
- * Blocks until an in-process advisory lock with the given name is
316
- * acquired. SQLite has no built-in advisory lock primitive, so this is
317
- * implemented as a process-local waiter queue. Typical SQLite deployments
318
- * run inside a single Node process, which is exactly the scope this
319
- * emulation covers; multi-process SQLite setups should not rely on this
320
- * for cross-process mutual exclusion.
321
- *
322
- * The owning driver instance is recorded so that `releaseAdvisoryLock`
323
- * can refuse to release a lock that was acquired by someone else.
324
- * @param {string} name - Lock name.
325
- * @param {{timeoutMs?: number | null}} [args] - Optional timeout in milliseconds; `null`, `undefined`, or negative blocks forever.
326
- * @returns {Promise<boolean>} - True if the lock was acquired, false if the timeout elapsed.
327
- */
328
- async acquireAdvisoryLock(name, { timeoutMs } = {}) {
329
- const state = VelociousDatabaseDriversSqliteBase._advisoryLockState;
330
- while (state.ownersByName.has(name)) {
331
- let remainingMs = null;
332
- if (typeof timeoutMs === "number" && timeoutMs >= 0) {
333
- remainingMs = timeoutMs;
334
- if (remainingMs <= 0)
335
- return false;
336
- }
337
- await new Promise((resolve) => {
338
- const waiters = state.waitersByName.get(name) || [];
339
- /**
340
- * Timeout handle.
341
- @type {NodeJS.Timeout | null} */
342
- let timeoutHandle = null;
343
- /**
344
- * Remove and resolve.
345
- @type {(() => void) | null} */
346
- let removeAndResolve = null;
347
- removeAndResolve = () => {
348
- if (timeoutHandle)
349
- clearTimeout(timeoutHandle);
350
- const current = state.waitersByName.get(name) || [];
351
- const index = current.indexOf(/**
352
- * Narrows the runtime value to the documented type.
353
- @type {() => void} */ (removeAndResolve));
354
- if (index >= 0)
355
- current.splice(index, 1);
356
- if (current.length === 0)
357
- state.waitersByName.delete(name);
358
- resolve(undefined);
359
- };
360
- waiters.push(removeAndResolve);
361
- state.waitersByName.set(name, waiters);
362
- if (remainingMs !== null) {
363
- timeoutHandle = setTimeout(() => {
364
- if (removeAndResolve)
365
- removeAndResolve();
366
- }, remainingMs);
367
- }
368
- });
369
- if (typeof timeoutMs === "number" && timeoutMs >= 0 && state.ownersByName.has(name)) {
370
- return false;
371
- }
372
- }
373
- state.ownersByName.set(name, this);
374
- return true;
375
- }
376
- /**
377
- * Runs try acquire advisory lock.
378
- * @param {string} name - Lock name.
379
- * @returns {Promise<boolean>} - True if the lock was acquired, false if it was already held.
380
- */
381
- async tryAcquireAdvisoryLock(name) {
382
- const state = VelociousDatabaseDriversSqliteBase._advisoryLockState;
383
- if (state.ownersByName.has(name))
384
- return false;
385
- state.ownersByName.set(name, this);
386
- return true;
387
- }
388
- /**
389
- * Releases the lock only if **this** driver instance owns it. Calling
390
- * release for a lock owned by another driver instance is a no-op that
391
- * returns `false`, matching the "you can only release locks you own"
392
- * contract of MySQL's `RELEASE_LOCK` and PostgreSQL's
393
- * `pg_advisory_unlock`.
394
- * @param {string} name - Lock name.
395
- * @returns {Promise<boolean>} - True if the lock was held by this driver and has now been released.
396
- */
397
- async releaseAdvisoryLock(name) {
398
- const state = VelociousDatabaseDriversSqliteBase._advisoryLockState;
399
- const owner = state.ownersByName.get(name);
400
- if (owner !== this)
401
- return false;
402
- state.ownersByName.delete(name);
403
- const waiters = state.waitersByName.get(name);
404
- if (waiters && waiters.length > 0) {
405
- const nextWaiter = waiters.shift();
406
- if (waiters.length === 0)
407
- state.waitersByName.delete(name);
408
- if (nextWaiter)
409
- nextWaiter();
410
- }
411
- return true;
412
- }
413
- /**
414
- * Runs is advisory lock held.
415
- * @param {string} name - Lock name.
416
- * @returns {Promise<boolean>} - True if any driver instance currently holds the lock.
417
- */
418
- async isAdvisoryLockHeld(name) {
419
- return VelociousDatabaseDriversSqliteBase._advisoryLockState.ownersByName.has(name);
436
+
437
+ state.ownersByName.set(name, this)
438
+
439
+ return true
440
+ }
441
+
442
+ /**
443
+ * Runs try acquire advisory lock.
444
+ * @param {string} name - Lock name.
445
+ * @returns {Promise<boolean>} - True if the lock was acquired, false if it was already held.
446
+ */
447
+ async tryAcquireAdvisoryLock(name) {
448
+ const state = VelociousDatabaseDriversSqliteBase._advisoryLockState
449
+
450
+ if (state.ownersByName.has(name)) return false
451
+
452
+ state.ownersByName.set(name, this)
453
+
454
+ return true
455
+ }
456
+
457
+ /**
458
+ * Releases the lock only if **this** driver instance owns it. Calling
459
+ * release for a lock owned by another driver instance is a no-op that
460
+ * returns `false`, matching the "you can only release locks you own"
461
+ * contract of MySQL's `RELEASE_LOCK` and PostgreSQL's
462
+ * `pg_advisory_unlock`.
463
+ * @param {string} name - Lock name.
464
+ * @returns {Promise<boolean>} - True if the lock was held by this driver and has now been released.
465
+ */
466
+ async releaseAdvisoryLock(name) {
467
+ const state = VelociousDatabaseDriversSqliteBase._advisoryLockState
468
+ const owner = state.ownersByName.get(name)
469
+
470
+ if (owner !== this) return false
471
+
472
+ state.ownersByName.delete(name)
473
+
474
+ const waiters = state.waitersByName.get(name)
475
+
476
+ if (waiters && waiters.length > 0) {
477
+ const nextWaiter = waiters.shift()
478
+
479
+ if (waiters.length === 0) state.waitersByName.delete(name)
480
+ if (nextWaiter) nextWaiter()
420
481
  }
482
+
483
+ return true
484
+ }
485
+
486
+ /**
487
+ * Runs is advisory lock held.
488
+ * @param {string} name - Lock name.
489
+ * @returns {Promise<boolean>} - True if any driver instance currently holds the lock.
490
+ */
491
+ async isAdvisoryLockHeld(name) {
492
+ return VelociousDatabaseDriversSqliteBase._advisoryLockState.ownersByName.has(name)
493
+ }
421
494
  }
495
+
422
496
  /**
423
497
  * Process-wide state for the SQLite advisory lock emulation. Shared across
424
498
  * every SQLite driver instance (native, web, sql.js) because there is no
@@ -430,7 +504,6 @@ export default class VelociousDatabaseDriversSqliteBase extends Base {
430
504
  * @type {{ownersByName: Map<string, VelociousDatabaseDriversSqliteBase>, waitersByName: Map<string, Array<() => void>>}}
431
505
  */
432
506
  VelociousDatabaseDriversSqliteBase._advisoryLockState = {
433
- ownersByName: new Map(),
434
- waitersByName: new Map()
435
- };
436
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9kYXRhYmFzZS9kcml2ZXJzL3NxbGl0ZS9iYXNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sV0FBVyxDQUFBO0FBRTlCLE9BQU8sVUFBVSxNQUFNLHNCQUFzQixDQUFBO0FBQzdDLE9BQU8sSUFBSSxNQUFNLFlBQVksQ0FBQTtBQUM3QixPQUFPLFdBQVcsTUFBTSx1QkFBdUIsQ0FBQTtBQUMvQyxPQUFPLFdBQVcsTUFBTSx1QkFBdUIsQ0FBQTtBQUMvQyxPQUFPLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQTtBQUNwQyxPQUFPLFNBQVMsTUFBTSxxQkFBcUIsQ0FBQTtBQUMzQyxPQUFPLFlBQVksTUFBTSxtQkFBbUIsQ0FBQTtBQUM1QyxPQUFPLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQTtBQUNwQyxPQUFPLE9BQU8sTUFBTSxjQUFjLENBQUE7QUFDbEMsT0FBTyxXQUFXLE1BQU0sbUJBQW1CLENBQUE7QUFDM0MsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFBO0FBQzlCLE9BQU8sWUFBWSxNQUFNLG9CQUFvQixDQUFBO0FBQzdDLE9BQU8sTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBQ3BDLE9BQU8sTUFBTSxNQUFNLGlCQUFpQixDQUFBO0FBRXBDLE1BQU0sQ0FBQyxPQUFPLE9BQU8sa0NBQW1DLFNBQVEsSUFBSTtJQUNsRTs7bUNBRStCO0lBQy9CLFlBQVksR0FBRyxTQUFTLENBQUE7SUFDeEI7O21DQUUrQjtJQUMvQixZQUFZLEdBQUcsU0FBUyxDQUFBO0lBQ3hCOzttQ0FFK0I7SUFDL0IsWUFBWSxHQUFHLFNBQVMsQ0FBQTtJQUV4Qjs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLGNBQWMsQ0FBQyxTQUFTO1FBQzVCLE1BQU0sU0FBUyxHQUFHLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVB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QyxDQUFBO0lBQ3JGLENBQUM7Q0FDRjtBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILGtDQUFrQyxDQUFDLGtCQUFrQixHQUFHO0lBQ3RELFlBQVksRUFBRSxJQUFJLEdBQUcsRUFBRTtJQUN2QixhQUFhLEVBQUUsSUFBSSxHQUFHLEVBQUU7Q0FDekIsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQge2RpZ2d9IGZyb20gXCJkaWdnZXJpemVcIlxuXG5pbXBvcnQgQWx0ZXJUYWJsZSBmcm9tIFwiLi9zcWwvYWx0ZXItdGFibGUuanNcIlxuaW1wb3J0IEJhc2UgZnJvbSBcIi4uL2Jhc2UuanNcIlxuaW1wb3J0IENyZWF0ZUluZGV4IGZyb20gXCIuL3NxbC9jcmVhdGUtaW5kZXguanNcIlxuaW1wb3J0IENyZWF0ZVRhYmxlIGZyb20gXCIuL3NxbC9jcmVhdGUtdGFibGUuanNcIlxuaW1wb3J0IERlbGV0ZSBmcm9tIFwiLi9zcWwvZGVsZXRlLmpzXCJcbmltcG9ydCBEcm9wVGFibGUgZnJvbSBcIi4vc3FsL2Ryb3AtdGFibGUuanNcIlxuaW1wb3J0IGVzY2FwZVN0cmluZyBmcm9tIFwic3FsLWVzY2FwZS1zdHJpbmdcIlxuaW1wb3J0IEluc2VydCBmcm9tIFwiLi9zcWwvaW5zZXJ0LmpzXCJcbmltcG9ydCBPcHRpb25zIGZyb20gXCIuL29wdGlvbnMuanNcIlxuaW1wb3J0IFF1ZXJ5UGFyc2VyIGZyb20gXCIuL3F1ZXJ5LXBhcnNlci5qc1wiXG5pbXBvcnQgVGFibGUgZnJvbSBcIi4vdGFibGUuanNcIlxuaW1wb3J0IFN0cnVjdHVyZVNxbCBmcm9tIFwiLi9zdHJ1Y3R1cmUtc3FsLmpzXCJcbmltcG9ydCBVcHNlcnQgZnJvbSBcIi4vc3FsL3Vwc2VydC5qc1wiXG5pbXBvcnQgVXBkYXRlIGZyb20gXCIuL3NxbC91cGRhdGUuanNcIlxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZWxvY2lvdXNEYXRhYmFzZURyaXZlcnNTcWxpdGVCYXNlIGV4dGVuZHMgQmFzZSB7XG4gIC8qKlxuICAgKiBWZXJzaW9uIG1ham9yLlxuICAgIEB0eXBlIHtudW1iZXIgfCB1bmRlZmluZWR9ICovXG4gIHZlcnNpb25NYWpvciA9IHVuZGVmaW5lZFxuICAvKipcbiAgICogVmVyc2lvbiBtaW5vci5cbiAgICBAdHlwZSB7bnVtYmVyIHwgdW5kZWZpbmVkfSAqL1xuICB2ZXJzaW9uTWlub3IgPSB1bmRlZmluZWRcbiAgLyoqXG4gICAqIFZlcnNpb24gcGF0Y2guXG4gICAgQHR5cGUge251bWJlciB8IHVuZGVmaW5lZH0gKi9cbiAgdmVyc2lvblBhdGNoID0gdW5kZWZpbmVkXG5cbiAgLyoqXG4gICAqIFJ1bnMgYWx0ZXIgdGFibGUgc3Fscy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi90YWJsZS1kYXRhL2luZGV4LmpzXCIpLmRlZmF1bHR9IHRhYmxlRGF0YSAtIFRhYmxlIGRhdGEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gLSBSZXNvbHZlcyB3aXRoIFNRTCBzdGF0ZW1lbnRzLlxuICAgKi9cbiAgYXN5bmMgYWx0ZXJUYWJsZVNRTHModGFibGVEYXRhKSB7XG4gICAgY29uc3QgYWx0ZXJBcmdzID0ge2RyaXZlcjogdGhpcywgdGFibGVEYXRhfVxuICAgIGNvbnN0IGFsdGVyVGFibGUgPSBuZXcgQWx0ZXJUYWJsZShhbHRlckFyZ3MpXG5cbiAgICByZXR1cm4gYXdhaXQgYWx0ZXJUYWJsZS50b1NRTHMoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY3JlYXRlIGluZGV4IHNxbHMuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vYmFzZS5qc1wiKS5DcmVhdGVJbmRleFNxbEFyZ3N9IGluZGV4RGF0YSAtIEluZGV4IGRhdGEuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZ1tdPn0gLSBSZXNvbHZlcyB3aXRoIFNRTCBzdGF0ZW1lbnRzLlxuICAgKi9cbiAgYXN5bmMgY3JlYXRlSW5kZXhTUUxzKGluZGV4RGF0YSkge1xuICAgIGNvbnN0IGNyZWF0ZUFyZ3MgPSBPYmplY3QuYXNzaWduKHtkcml2ZXI6IHRoaXN9LCBpbmRleERhdGEpXG4gICAgY29uc3QgY3JlYXRlSW5kZXggPSBuZXcgQ3JlYXRlSW5kZXgoY3JlYXRlQXJncylcblxuICAgIHJldHVybiBhd2FpdCBjcmVhdGVJbmRleC50b1NRTHMoKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgY3JlYXRlIHRhYmxlIHNxbC5cbiAgICogQGFic3RyYWN0XG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vLi4vdGFibGUtZGF0YS9pbmRleC5qc1wiKS5kZWZhdWx0fSB0YWJsZURhdGEgLSBUYWJsZSBkYXRhLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmdbXT59IC0gUmVzb2x2ZXMgd2l0aCBTUUwgc3RhdGVtZW50cy5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZVRhYmxlU3FsKHRhYmxlRGF0YSkge1xuICAgIGNvbnN0IGNyZWF0ZUFyZ3MgPSB7dGFibGVEYXRhLCBkcml2ZXI6IHRoaXMsIGluZGV4SW5DcmVhdGVUYWJsZTogZmFsc2V9XG4gICAgY29uc3QgY3JlYXRlVGFibGUgPSBuZXcgQ3JlYXRlVGFibGUoY3JlYXRlQXJncylcblxuICAgIHJldHVybiBhd2FpdCBjcmVhdGVUYWJsZS50b1NxbCgpXG4gIH1cblxuICBjdXJyZW50RGF0YWJhc2UoKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIGFzeW5jIGRpc2FibGVGb3JlaWduS2V5cygpIHtcbiAgICBhd2FpdCB0aGlzLnF1ZXJ5KFwiUFJBR01BIGZvcmVpZ25fa2V5cyA9IDBcIilcbiAgfVxuXG4gIGFzeW5jIGVuYWJsZUZvcmVpZ25LZXlzKCkge1xuICAgIGF3YWl0IHRoaXMucXVlcnkoXCJQUkFHTUEgZm9yZWlnbl9rZXlzID0gMVwiKVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZHJvcCB0YWJsZSBzcWxzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLkRyb3BUYWJsZVNxbEFyZ3NUeXBlfSBbYXJnc10gLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nW10+fSAtIFJlc29sdmVzIHdpdGggU1FMIHN0YXRlbWVudHMuXG4gICAqL1xuICBhc3luYyBkcm9wVGFibGVTUUxzKHRhYmxlTmFtZSwgYXJncyA9IHt9KSB7XG4gICAgY29uc3QgZHJpdmVyID0gLyoqXG4gICAgICAgICAgICAgICAgICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAgICAgICAgICAgICAgICAgQHR5cGUge2ltcG9ydChcIi4uL2Jhc2UuanNcIikuZGVmYXVsdH0gKi8gKHRoaXMpXG4gICAgY29uc3QgZHJvcEFyZ3MgPSBPYmplY3QuYXNzaWduKHt0YWJsZU5hbWUsIGRyaXZlcn0sIGFyZ3MpXG4gICAgY29uc3QgZHJvcFRhYmxlID0gbmV3IERyb3BUYWJsZShkcm9wQXJncylcblxuICAgIHJldHVybiBhd2FpdCBkcm9wVGFibGUudG9TUUxzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGRlbGV0ZSBzcWwuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vYmFzZS5qc1wiKS5EZWxldGVTcWxBcmdzVHlwZX0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFNRTCBzdHJpbmcuXG4gICAqL1xuICBkZWxldGVTcWwoYXJncykgeyByZXR1cm4gbmV3IERlbGV0ZShPYmplY3QuYXNzaWduKHtkcml2ZXI6IHRoaXN9LCBhcmdzKSkudG9TcWwoKSB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZ2V0IHR5cGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIHR5cGUuXG4gICAqL1xuICBnZXRUeXBlKCkgeyByZXR1cm4gXCJzcWxpdGVcIiB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaW5zZXJ0IHNxbC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9iYXNlLmpzXCIpLkluc2VydFNxbEFyZ3NUeXBlfSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU1FMIHN0cmluZy5cbiAgICovXG4gIGluc2VydFNxbChhcmdzKSB7IHJldHVybiBuZXcgSW5zZXJ0KE9iamVjdC5hc3NpZ24oe2RyaXZlcjogdGhpc30sIGFyZ3MpKS50b1NxbCgpIH1cblxuICAvKipcbiAgICogUnVucyBnZXQgdGFibGVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxpbXBvcnQoXCIuLi9iYXNlLXRhYmxlLmpzXCIpLmRlZmF1bHQ+Pn0gLSBSZXNvbHZlcyB3aXRoIHRoZSB0YWJsZXMuXG4gICAqL1xuICBhc3luYyBnZXRUYWJsZXMoKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX2NhY2hlZFNjaGVtYU1ldGFkYXRhKFwidGFibGVzXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucXVlcnkoXCJTRUxFQ1QgbmFtZSBGUk9NIHNxbGl0ZV9tYXN0ZXIgV0hFUkUgdHlwZSA9ICd0YWJsZScgT1JERVIgQlkgbmFtZVwiKVxuICAgICAgY29uc3QgdGFibGVzID0gW11cblxuICAgICAgZm9yIChjb25zdCByb3cgb2YgcmVzdWx0KSB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gbmV3IFRhYmxlKHtkcml2ZXI6IHRoaXMsIHJvdzogLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogTmFycm93cyB0aGUgcnVudGltZSB2YWx1ZSB0byB0aGUgZG9jdW1lbnRlZCB0eXBlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHR5cGUge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IG51bGw+fSAqLyAocm93KX0pXG5cbiAgICAgICAgdGFibGVzLnB1c2godGFibGUpXG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0YWJsZXNcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaW5zZXJ0IG11bHRpcGxlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBjb2x1bW5zIC0gQ29sdW1uIG5hbWVzLlxuICAgKiBAcGFyYW0ge0FycmF5PEFycmF5PD8+Pn0gcm93cyAtIFJvd3MgdG8gaW5zZXJ0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgaW5zZXJ0TXVsdGlwbGUodGFibGVOYW1lLCBjb2x1bW5zLCByb3dzKSB7XG4gICAgdGhpcy5fYXNzZXJ0Tm90UmVhZE9ubHkoKVxuICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJWZXJzaW9uKClcblxuICAgIGlmICh0aGlzLnN1cHBvcnRzTXVsdGlwbGVJbnNlcnRWYWx1ZXMoKSkge1xuICAgICAgYXdhaXQgdGhpcy5pbnNlcnRNdWx0aXBsZVdpdGhTaW5nbGVJbnNlcnQodGFibGVOYW1lLCBjb2x1bW5zLCByb3dzKVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmluc2VydE11bHRpcGxlV2l0aFRyYW5zYWN0aW9uKHRhYmxlTmFtZSwgY29sdW1ucywgcm93cylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBzdXBwb3J0cyBtdWx0aXBsZSBpbnNlcnQgdmFsdWVzLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIHN1cHBvcnRzIG11bHRpcGxlIGluc2VydCB2YWx1ZXMuXG4gICAqL1xuICBzdXBwb3J0c011bHRpcGxlSW5zZXJ0VmFsdWVzKCkge1xuICAgIC8qKlxuICAgICAqIFZlcnNpb24gbWFqb3IuXG4gICAgICBAdHlwZSB7bnVtYmVyfSAqL1xuICAgIGNvbnN0IHZlcnNpb25NYWpvciA9IHRoaXMudmVyc2lvbk1ham9yIHx8IDBcbiAgICAvKipcbiAgICAgKiBWZXJzaW9uIG1pbm9yLlxuICAgICAgQHR5cGUge251bWJlcn0gKi9cbiAgICBjb25zdCB2ZXJzaW9uTWlub3IgPSB0aGlzLnZlcnNpb25NaW5vciB8fCAwXG4gICAgLyoqXG4gICAgICogVmVyc2lvbiBwYXRjaC5cbiAgICAgIEB0eXBlIHtudW1iZXJ9ICovXG4gICAgY29uc3QgdmVyc2lvblBhdGNoID0gdGhpcy52ZXJzaW9uUGF0Y2ggfHwgMFxuXG4gICAgaWYgKHZlcnNpb25NYWpvciA+PSA0KSByZXR1cm4gdHJ1ZVxuICAgIGlmICh2ZXJzaW9uTWFqb3IgPT0gMyAmJiB2ZXJzaW9uTWlub3IgPj0gOCkgcmV0dXJuIHRydWVcbiAgICBpZiAodmVyc2lvbk1ham9yID09IDMgJiYgdmVyc2lvbk1pbm9yID09IDcgJiYgdmVyc2lvblBhdGNoID49IDExKSByZXR1cm4gdHJ1ZVxuXG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogUnVucyBzdXBwb3J0cyBpbnNlcnQgaW50byByZXR1cm5pbmcuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgc3VwcG9ydHMgaW5zZXJ0IGludG8gcmV0dXJuaW5nLlxuICAgKi9cbiAgc3VwcG9ydHNJbnNlcnRJbnRvUmV0dXJuaW5nKCkge1xuICAgIC8qKlxuICAgICAqIFZlcnNpb24gbWFqb3IuXG4gICAgICBAdHlwZSB7bnVtYmVyfSAqL1xuICAgIGNvbnN0IHZlcnNpb25NYWpvciA9IHRoaXMudmVyc2lvbk1ham9yIHx8IDBcbiAgICAvKipcbiAgICAgKiBWZXJzaW9uIG1pbm9yLlxuICAgICAgQHR5cGUge251bWJlcn0gKi9cbiAgICBjb25zdCB2ZXJzaW9uTWlub3IgPSB0aGlzLnZlcnNpb25NaW5vciB8fCAwXG5cbiAgICBpZiAodmVyc2lvbk1ham9yID49IDQpIHJldHVybiB0cnVlXG4gICAgaWYgKHZlcnNpb25NYWpvciA9PSAzICYmIHZlcnNpb25NaW5vciA+PSAzNSkgcmV0dXJuIHRydWVcblxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgaW5zZXJ0IG11bHRpcGxlIHdpdGggc2luZ2xlIGluc2VydC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhYmxlTmFtZSAtIFRhYmxlIG5hbWUuXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gY29sdW1ucyAtIENvbHVtbiBuYW1lcy5cbiAgICogQHBhcmFtIHtBcnJheTxBcnJheTw/Pj59IHJvd3MgLSBSb3dzIHRvIGluc2VydC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGluc2VydE11bHRpcGxlV2l0aFNpbmdsZUluc2VydCh0YWJsZU5hbWUsIGNvbHVtbnMsIHJvd3MpIHtcbiAgICB0aGlzLl9hc3NlcnROb3RSZWFkT25seSgpXG4gICAgY29uc3Qgc3FsID0gbmV3IEluc2VydCh7Y29sdW1ucywgZHJpdmVyOiB0aGlzLCByb3dzLCB0YWJsZU5hbWV9KS50b1NxbCgpXG5cbiAgICBhd2FpdCB0aGlzLnF1ZXJ5KHNxbClcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGluc2VydCBtdWx0aXBsZSB3aXRoIHRyYW5zYWN0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdGFibGVOYW1lIC0gVGFibGUgbmFtZS5cbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBjb2x1bW5zIC0gQ29sdW1uIG5hbWVzLlxuICAgKiBAcGFyYW0ge0FycmF5PEFycmF5PD8+Pn0gcm93cyAtIFJvd3MgdG8gaW5zZXJ0LlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgaW5zZXJ0TXVsdGlwbGVXaXRoVHJhbnNhY3Rpb24odGFibGVOYW1lLCBjb2x1bW5zLCByb3dzKSB7XG4gICAgdGhpcy5fYXNzZXJ0Tm90UmVhZE9ubHkoKVxuICAgIC8qKlxuICAgICAqIFNxbHMuXG4gICAgICBAdHlwZSB7c3RyaW5nW119ICovXG4gICAgY29uc3Qgc3FscyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICAvKipcbiAgICAgICAqIERhdGEuXG4gICAgICAgIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi9cbiAgICAgIGNvbnN0IGRhdGEgPSB7fVxuXG4gICAgICBmb3IgKGNvbnN0IGNvbHVtbkluZGV4IGluIGNvbHVtbnMpIHtcbiAgICAgICAgY29uc3QgY29sdW1uTmFtZSA9IGNvbHVtbnNbY29sdW1uSW5kZXhdXG4gICAgICAgIGNvbnN0IHZhbHVlID0gcm93W2NvbHVtbkluZGV4XVxuXG4gICAgICAgIGRhdGFbY29sdW1uTmFtZV0gPSB2YWx1ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBpbnNlcnRTcWwgPSB0aGlzLmluc2VydFNxbCh7dGFibGVOYW1lLCBkYXRhfSlcblxuICAgICAgc3Fscy5wdXNoKGluc2VydFNxbClcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnRyYW5zYWN0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIGZvciAoY29uc3Qgc3FsIG9mIHNxbHMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5xdWVyeShzcWwpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIGxhc3RJbnNlcnRJRCgpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnF1ZXJ5KFwiU0VMRUNUIExBU1RfSU5TRVJUX1JPV0lEKCkgQVMgbGFzdF9pbnNlcnRfaWRcIilcblxuICAgIHJldHVybiBkaWdnKHJlc3VsdCwgMCwgXCJsYXN0X2luc2VydF9pZFwiKVxuICB9XG5cbiAgb3B0aW9ucygpIHtcbiAgICBpZiAoIXRoaXMuX29wdGlvbnMpIHRoaXMuX29wdGlvbnMgPSBuZXcgT3B0aW9ucyh0aGlzKVxuXG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnNcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHByaW1hcnkga2V5IHR5cGUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIHR5cGUgb2YgdGhlIHByaW1hcnkga2V5IGZvciB0aGlzIGRyaXZlci5cbiAgICovXG4gIHByaW1hcnlLZXlUeXBlKCkgeyByZXR1cm4gXCJpbnRlZ2VyXCIgfSAvLyBCZWNhdXNlIGJpZ2ludCBvbiBTUUxpdGUgZG9lc24ndCBzdXBwb3J0IGF1dG8gaW5jcmVtZW50XG5cbiAgLyoqXG4gICAqIFJ1bnMgcXVlcnkgdG8gc3FsLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL3F1ZXJ5L2luZGV4LmpzXCIpLmRlZmF1bHR9IHF1ZXJ5IC0gUXVlcnkgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IC0gU1FMIHN0cmluZy5cbiAgICovXG4gIHF1ZXJ5VG9TcWwocXVlcnkpIHsgcmV0dXJuIG5ldyBRdWVyeVBhcnNlcih7cXVlcnl9KS50b1NxbCgpIH1cblxuICBhc3luYyByZWdpc3RlclZlcnNpb24oKSB7XG4gICAgaWYgKHRoaXMudmVyc2lvbk1ham9yIHx8IHRoaXMudmVyc2lvbk1pbm9yKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCB2ZXJzaW9uUmVzdWx0ID0gYXdhaXQgdGhpcy5xdWVyeShcIlNFTEVDVCBzcWxpdGVfdmVyc2lvbigpIEFTIHZlcnNpb25cIilcblxuICAgIHRoaXMudmVyc2lvbiA9IFN0cmluZyh2ZXJzaW9uUmVzdWx0WzBdLnZlcnNpb24pXG5cbiAgICBjb25zdCB2ZXJzaW9uUGFydHMgPSB0aGlzLnZlcnNpb24uc3BsaXQoXCIuXCIpXG5cbiAgICB0aGlzLnZlcnNpb25NYWpvciA9IE51bWJlcih2ZXJzaW9uUGFydHNbMF0pXG4gICAgdGhpcy52ZXJzaW9uTWlub3IgPSBOdW1iZXIodmVyc2lvblBhcnRzWzFdKVxuICAgIHRoaXMudmVyc2lvblBhdGNoID0gTnVtYmVyKHZlcnNpb25QYXJ0c1syXSlcbiAgfVxuXG4gIHNob3VsZFNldEF1dG9JbmNyZW1lbnRXaGVuUHJpbWFyeUtleSgpIHsgcmV0dXJuIGZhbHNlIH1cbiAgc3VwcG9ydHNEZWZhdWx0UHJpbWFyeUtleVVVSUQoKSB7IHJldHVybiBmYWxzZSB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZXNjYXBlLlxuICAgKiBAcGFyYW0gez99IHZhbHVlIC0gVmFsdWUgdG8gdXNlLlxuICAgKiBAcmV0dXJucyB7P30gLSBUaGUgZXNjYXBlLlxuICAgKi9cbiAgZXNjYXBlKHZhbHVlKSB7XG4gICAgdmFsdWUgPSB0aGlzLl9jb252ZXJ0VmFsdWUodmFsdWUpXG5cbiAgICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbHVlXG5cbiAgICBpZiAodHlwZSAhPSBcInN0cmluZ1wiKSB2YWx1ZSA9IGAke3ZhbHVlfWBcblxuICAgIGNvbnN0IHJlc3VsdFdpdGhRdW90ZXMgPSBlc2NhcGVTdHJpbmcodmFsdWUsIG51bGwpXG4gICAgY29uc3QgcmVzdWx0ID0gcmVzdWx0V2l0aFF1b3Rlcy5zdWJzdHJpbmcoMSwgcmVzdWx0V2l0aFF1b3Rlcy5sZW5ndGggLSAxKVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgcmV0cnlhYmxlIGRhdGFiYXNlIGVycm9yLlxuICAgKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAtIEVycm9yIGluc3RhbmNlLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vYmFzZS5qc1wiKS5SZXRyeWFibGVEYXRhYmFzZUVycm9yUmVzdWx0fSAtIFJldHJ5IGluZm8uXG4gICAqL1xuICByZXRyeWFibGVEYXRhYmFzZUVycm9yKGVycm9yKSB7XG4gICAgY29uc3Qgc2hvdWxkUmV0cnkgPSAoXG4gICAgICBlcnJvci5tZXNzYWdlPy5zdGFydHNXaXRoKFwiYXR0ZW1wdCB0byB3cml0ZSBhIHJlYWRvbmx5IGRhdGFiYXNlXCIpIHx8XG4gICAgICBlcnJvci5tZXNzYWdlPy5zdGFydHNXaXRoKFwiZGF0YWJhc2UgaXMgbG9ja2VkXCIpIHx8XG4gICAgICBlcnJvci5tZXNzYWdlPy5pbmNsdWRlcyhcIuKGkiBDYXVzZWQgYnk6IEVycm9yIGNvZGUgOiBkYXRhYmFzZSBpcyBsb2NrZWRcIilcbiAgICApXG5cbiAgICByZXR1cm4ge3JldHJ5OiBzaG91bGRSZXRyeSwgcmVjb25uZWN0OiBmYWxzZX1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHF1b3RlLlxuICAgKiBAcGFyYW0gez99IHZhbHVlIC0gVmFsdWUgdG8gdXNlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVtYmVyfSAtIFRoZSBxdW90ZWQgdmFsdWUuXG4gICAqL1xuICBxdW90ZSh2YWx1ZSkge1xuICAgIHZhbHVlID0gdGhpcy5fY29udmVydFZhbHVlKHZhbHVlKVxuXG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiB2YWx1ZVxuXG4gICAgaWYgKHR5cGUgPT0gXCJudW1iZXJcIikgcmV0dXJuIC8qKiBOYXJyb3dzIHRoZSBydW50aW1lIHZhbHVlIHRvIHRoZSBkb2N1bWVudGVkIHR5cGUuIEB0eXBlIHtudW1iZXJ9ICovICh2YWx1ZSlcbiAgICBpZiAodHlwZSAhPSBcInN0cmluZ1wiKSB2YWx1ZSA9IFN0cmluZyh2YWx1ZSlcblxuICAgIHJldHVybiBlc2NhcGVTdHJpbmcodmFsdWUsIG51bGwpXG4gIH1cblxuICAvKipcbiAgICogUnVucyB1cGRhdGUgc3FsLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4uL2Jhc2UuanNcIikuVXBkYXRlU3FsQXJnc1R5cGV9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHJldHVybnMge3N0cmluZ30gLSBTUUwgc3RyaW5nLlxuICAgKi9cbiAgdXBkYXRlU3FsKHtjb25kaXRpb25zLCBkYXRhLCB0YWJsZU5hbWV9KSB7IHJldHVybiBuZXcgVXBkYXRlKHtjb25kaXRpb25zLCBkYXRhLCBkcml2ZXI6IHRoaXMsIHRhYmxlTmFtZX0pLnRvU3FsKCkgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHVwc2VydCBzcWwuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vYmFzZS5qc1wiKS5VcHNlcnRTcWxBcmdzVHlwZX0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSAtIFNRTCBzdHJpbmcuXG4gICAqL1xuICB1cHNlcnRTcWwoYXJncykgeyByZXR1cm4gbmV3IFVwc2VydCh7Li4uYXJncywgZHJpdmVyOiB0aGlzfSkudG9TcWwoKSB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc3RydWN0dXJlIHNxbC5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nIHwgbnVsbD59IC0gUmVzb2x2ZXMgd2l0aCBTUUwgc3RyaW5nLlxuICAgKi9cbiAgYXN5bmMgc3RydWN0dXJlU3FsKCkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9jYWNoZWRTY2hlbWFNZXRhZGF0YShcInN0cnVjdHVyZVNxbFwiLCBhc3luYyAoKSA9PiBhd2FpdCBuZXcgU3RydWN0dXJlU3FsKHtkcml2ZXI6IHRoaXN9KS50b1NxbCgpKVxuICB9XG5cbiAgLyoqXG4gICAqIEJsb2NrcyB1bnRpbCBhbiBpbi1wcm9jZXNzIGFkdmlzb3J5IGxvY2sgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpc1xuICAgKiBhY3F1aXJlZC4gU1FMaXRlIGhhcyBubyBidWlsdC1pbiBhZHZpc29yeSBsb2NrIHByaW1pdGl2ZSwgc28gdGhpcyBpc1xuICAgKiBpbXBsZW1lbnRlZCBhcyBhIHByb2Nlc3MtbG9jYWwgd2FpdGVyIHF1ZXVlLiBUeXBpY2FsIFNRTGl0ZSBkZXBsb3ltZW50c1xuICAgKiBydW4gaW5zaWRlIGEgc2luZ2xlIE5vZGUgcHJvY2Vzcywgd2hpY2ggaXMgZXhhY3RseSB0aGUgc2NvcGUgdGhpc1xuICAgKiBlbXVsYXRpb24gY292ZXJzOyBtdWx0aS1wcm9jZXNzIFNRTGl0ZSBzZXR1cHMgc2hvdWxkIG5vdCByZWx5IG9uIHRoaXNcbiAgICogZm9yIGNyb3NzLXByb2Nlc3MgbXV0dWFsIGV4Y2x1c2lvbi5cbiAgICpcbiAgICogVGhlIG93bmluZyBkcml2ZXIgaW5zdGFuY2UgaXMgcmVjb3JkZWQgc28gdGhhdCBgcmVsZWFzZUFkdmlzb3J5TG9ja2BcbiAgICogY2FuIHJlZnVzZSB0byByZWxlYXNlIGEgbG9jayB0aGF0IHdhcyBhY3F1aXJlZCBieSBzb21lb25lIGVsc2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTG9jayBuYW1lLlxuICAgKiBAcGFyYW0ge3t0aW1lb3V0TXM/OiBudW1iZXIgfCBudWxsfX0gW2FyZ3NdIC0gT3B0aW9uYWwgdGltZW91dCBpbiBtaWxsaXNlY29uZHM7IGBudWxsYCwgYHVuZGVmaW5lZGAsIG9yIG5lZ2F0aXZlIGJsb2NrcyBmb3JldmVyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBUcnVlIGlmIHRoZSBsb2NrIHdhcyBhY3F1aXJlZCwgZmFsc2UgaWYgdGhlIHRpbWVvdXQgZWxhcHNlZC5cbiAgICovXG4gIGFzeW5jIGFjcXVpcmVBZHZpc29yeUxvY2sobmFtZSwge3RpbWVvdXRNc30gPSB7fSkge1xuICAgIGNvbnN0IHN0YXRlID0gVmVsb2Npb3VzRGF0YWJhc2VEcml2ZXJzU3FsaXRlQmFzZS5fYWR2aXNvcnlMb2NrU3RhdGVcblxuICAgIHdoaWxlIChzdGF0ZS5vd25lcnNCeU5hbWUuaGFzKG5hbWUpKSB7XG4gICAgICBsZXQgcmVtYWluaW5nTXMgPSBudWxsXG5cbiAgICAgIGlmICh0eXBlb2YgdGltZW91dE1zID09PSBcIm51bWJlclwiICYmIHRpbWVvdXRNcyA+PSAwKSB7XG4gICAgICAgIHJlbWFpbmluZ01zID0gdGltZW91dE1zXG5cbiAgICAgICAgaWYgKHJlbWFpbmluZ01zIDw9IDApIHJldHVybiBmYWxzZVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBjb25zdCB3YWl0ZXJzID0gc3RhdGUud2FpdGVyc0J5TmFtZS5nZXQobmFtZSkgfHwgW11cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRpbWVvdXQgaGFuZGxlLlxuICAgICAgICAgIEB0eXBlIHtOb2RlSlMuVGltZW91dCB8IG51bGx9ICovXG4gICAgICAgIGxldCB0aW1lb3V0SGFuZGxlID0gbnVsbFxuICAgICAgICAvKipcbiAgICAgICAgICogUmVtb3ZlIGFuZCByZXNvbHZlLlxuICAgICAgICAgIEB0eXBlIHsoKCkgPT4gdm9pZCkgfCBudWxsfSAqL1xuICAgICAgICBsZXQgcmVtb3ZlQW5kUmVzb2x2ZSA9IG51bGxcblxuICAgICAgICByZW1vdmVBbmRSZXNvbHZlID0gKCkgPT4ge1xuICAgICAgICAgIGlmICh0aW1lb3V0SGFuZGxlKSBjbGVhclRpbWVvdXQodGltZW91dEhhbmRsZSlcblxuICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBzdGF0ZS53YWl0ZXJzQnlOYW1lLmdldChuYW1lKSB8fCBbXVxuICAgICAgICAgIGNvbnN0IGluZGV4ID0gY3VycmVudC5pbmRleE9mKC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIE5hcnJvd3MgdGhlIHJ1bnRpbWUgdmFsdWUgdG8gdGhlIGRvY3VtZW50ZWQgdHlwZS5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB0eXBlIHsoKSA9PiB2b2lkfSAqLyAocmVtb3ZlQW5kUmVzb2x2ZSkpXG5cbiAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgY3VycmVudC5zcGxpY2UoaW5kZXgsIDEpXG4gICAgICAgICAgaWYgKGN1cnJlbnQubGVuZ3RoID09PSAwKSBzdGF0ZS53YWl0ZXJzQnlOYW1lLmRlbGV0ZShuYW1lKVxuXG4gICAgICAgICAgcmVzb2x2ZSh1bmRlZmluZWQpXG4gICAgICAgIH1cblxuICAgICAgICB3YWl0ZXJzLnB1c2gocmVtb3ZlQW5kUmVzb2x2ZSlcbiAgICAgICAgc3RhdGUud2FpdGVyc0J5TmFtZS5zZXQobmFtZSwgd2FpdGVycylcblxuICAgICAgICBpZiAocmVtYWluaW5nTXMgIT09IG51bGwpIHtcbiAgICAgICAgICB0aW1lb3V0SGFuZGxlID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVtb3ZlQW5kUmVzb2x2ZSkgcmVtb3ZlQW5kUmVzb2x2ZSgpXG4gICAgICAgICAgfSwgcmVtYWluaW5nTXMpXG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIGlmICh0eXBlb2YgdGltZW91dE1zID09PSBcIm51bWJlclwiICYmIHRpbWVvdXRNcyA+PSAwICYmIHN0YXRlLm93bmVyc0J5TmFtZS5oYXMobmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGUub3duZXJzQnlOYW1lLnNldChuYW1lLCB0aGlzKVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHRyeSBhY3F1aXJlIGFkdmlzb3J5IGxvY2suXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gTG9jayBuYW1lLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gLSBUcnVlIGlmIHRoZSBsb2NrIHdhcyBhY3F1aXJlZCwgZmFsc2UgaWYgaXQgd2FzIGFscmVhZHkgaGVsZC5cbiAgICovXG4gIGFzeW5jIHRyeUFjcXVpcmVBZHZpc29yeUxvY2sobmFtZSkge1xuICAgIGNvbnN0IHN0YXRlID0gVmVsb2Npb3VzRGF0YWJhc2VEcml2ZXJzU3FsaXRlQmFzZS5fYWR2aXNvcnlMb2NrU3RhdGVcblxuICAgIGlmIChzdGF0ZS5vd25lcnNCeU5hbWUuaGFzKG5hbWUpKSByZXR1cm4gZmFsc2VcblxuICAgIHN0YXRlLm93bmVyc0J5TmFtZS5zZXQobmFtZSwgdGhpcylcblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZXMgdGhlIGxvY2sgb25seSBpZiAqKnRoaXMqKiBkcml2ZXIgaW5zdGFuY2Ugb3ducyBpdC4gQ2FsbGluZ1xuICAgKiByZWxlYXNlIGZvciBhIGxvY2sgb3duZWQgYnkgYW5vdGhlciBkcml2ZXIgaW5zdGFuY2UgaXMgYSBuby1vcCB0aGF0XG4gICAqIHJldHVybnMgYGZhbHNlYCwgbWF0Y2hpbmcgdGhlIFwieW91IGNhbiBvbmx5IHJlbGVhc2UgbG9ja3MgeW91IG93blwiXG4gICAqIGNvbnRyYWN0IG9mIE15U1FMJ3MgYFJFTEVBU0VfTE9DS2AgYW5kIFBvc3RncmVTUUwnc1xuICAgKiBgcGdfYWR2aXNvcnlfdW5sb2NrYC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFRydWUgaWYgdGhlIGxvY2sgd2FzIGhlbGQgYnkgdGhpcyBkcml2ZXIgYW5kIGhhcyBub3cgYmVlbiByZWxlYXNlZC5cbiAgICovXG4gIGFzeW5jIHJlbGVhc2VBZHZpc29yeUxvY2sobmFtZSkge1xuICAgIGNvbnN0IHN0YXRlID0gVmVsb2Npb3VzRGF0YWJhc2VEcml2ZXJzU3FsaXRlQmFzZS5fYWR2aXNvcnlMb2NrU3RhdGVcbiAgICBjb25zdCBvd25lciA9IHN0YXRlLm93bmVyc0J5TmFtZS5nZXQobmFtZSlcblxuICAgIGlmIChvd25lciAhPT0gdGhpcykgcmV0dXJuIGZhbHNlXG5cbiAgICBzdGF0ZS5vd25lcnNCeU5hbWUuZGVsZXRlKG5hbWUpXG5cbiAgICBjb25zdCB3YWl0ZXJzID0gc3RhdGUud2FpdGVyc0J5TmFtZS5nZXQobmFtZSlcblxuICAgIGlmICh3YWl0ZXJzICYmIHdhaXRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgbmV4dFdhaXRlciA9IHdhaXRlcnMuc2hpZnQoKVxuXG4gICAgICBpZiAod2FpdGVycy5sZW5ndGggPT09IDApIHN0YXRlLndhaXRlcnNCeU5hbWUuZGVsZXRlKG5hbWUpXG4gICAgICBpZiAobmV4dFdhaXRlcikgbmV4dFdhaXRlcigpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGlzIGFkdmlzb3J5IGxvY2sgaGVsZC5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBMb2NrIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSAtIFRydWUgaWYgYW55IGRyaXZlciBpbnN0YW5jZSBjdXJyZW50bHkgaG9sZHMgdGhlIGxvY2suXG4gICAqL1xuICBhc3luYyBpc0Fkdmlzb3J5TG9ja0hlbGQobmFtZSkge1xuICAgIHJldHVybiBWZWxvY2lvdXNEYXRhYmFzZURyaXZlcnNTcWxpdGVCYXNlLl9hZHZpc29yeUxvY2tTdGF0ZS5vd25lcnNCeU5hbWUuaGFzKG5hbWUpXG4gIH1cbn1cblxuLyoqXG4gKiBQcm9jZXNzLXdpZGUgc3RhdGUgZm9yIHRoZSBTUUxpdGUgYWR2aXNvcnkgbG9jayBlbXVsYXRpb24uIFNoYXJlZCBhY3Jvc3NcbiAqIGV2ZXJ5IFNRTGl0ZSBkcml2ZXIgaW5zdGFuY2UgKG5hdGl2ZSwgd2ViLCBzcWwuanMpIGJlY2F1c2UgdGhlcmUgaXMgbm9cbiAqIGNvbmNlcHQgb2YgXCJjb25uZWN0aW9uXCIgdG8gZGlzdGluZ3Vpc2ggdGhlbSBhdCB0aGUgU1FMaXRlIGxldmVsLlxuICpcbiAqIGBvd25lcnNCeU5hbWVgIG1hcHMgZWFjaCBoZWxkIGxvY2sgbmFtZSB0byB0aGUgZHJpdmVyIGluc3RhbmNlIHRoYXRcbiAqIGFjcXVpcmVkIGl0IHNvIGByZWxlYXNlQWR2aXNvcnlMb2NrYCBjYW4gcmVqZWN0IHJlbGVhc2VzIGZyb20gZHJpdmVyc1xuICogdGhhdCBkbyBub3Qgb3duIHRoZSBsb2NrLlxuICogQHR5cGUge3tvd25lcnNCeU5hbWU6IE1hcDxzdHJpbmcsIFZlbG9jaW91c0RhdGFiYXNlRHJpdmVyc1NxbGl0ZUJhc2U+LCB3YWl0ZXJzQnlOYW1lOiBNYXA8c3RyaW5nLCBBcnJheTwoKSA9PiB2b2lkPj59fVxuICovXG5WZWxvY2lvdXNEYXRhYmFzZURyaXZlcnNTcWxpdGVCYXNlLl9hZHZpc29yeUxvY2tTdGF0ZSA9IHtcbiAgb3duZXJzQnlOYW1lOiBuZXcgTWFwKCksXG4gIHdhaXRlcnNCeU5hbWU6IG5ldyBNYXAoKVxufVxuIl19
507
+ ownersByName: new Map(),
508
+ waitersByName: new Map()
509
+ }