velocious 1.0.431 → 1.0.433

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 (794) hide show
  1. package/build/application.js +229 -0
  2. package/build/authorization/ability.js +329 -0
  3. package/build/authorization/base-resource.js +143 -0
  4. package/build/background-jobs/client.js +50 -0
  5. package/build/background-jobs/cron-expression.js +277 -0
  6. package/build/background-jobs/forked-runner-child.js +86 -0
  7. package/build/background-jobs/job-record.js +13 -0
  8. package/build/background-jobs/job-registry.js +92 -0
  9. package/build/background-jobs/job-runner.js +107 -0
  10. package/build/background-jobs/job.js +77 -0
  11. package/build/background-jobs/json-socket.js +78 -0
  12. package/build/background-jobs/main.js +926 -0
  13. package/build/background-jobs/normalize-error.js +26 -0
  14. package/build/background-jobs/scheduler.js +274 -0
  15. package/build/background-jobs/socket-request.js +68 -0
  16. package/build/background-jobs/status-reporter.js +101 -0
  17. package/build/background-jobs/store.js +994 -0
  18. package/build/background-jobs/types.js +70 -0
  19. package/build/background-jobs/web/authorization.js +89 -0
  20. package/build/background-jobs/web/controller.js +280 -0
  21. package/build/background-jobs/web/index.js +57 -0
  22. package/build/background-jobs/web/path-matcher.js +74 -0
  23. package/build/background-jobs/web/registry.js +49 -0
  24. package/build/background-jobs/worker.js +683 -0
  25. package/build/beacon/client.js +330 -0
  26. package/build/beacon/in-process-broker.js +71 -0
  27. package/build/beacon/in-process-client.js +139 -0
  28. package/build/beacon/server.js +148 -0
  29. package/build/beacon/types.js +55 -0
  30. package/build/cli/base-command.js +67 -0
  31. package/build/cli/browser-cli.js +45 -0
  32. package/build/cli/commands/background-jobs-main.js +7 -0
  33. package/build/cli/commands/background-jobs-runner.js +7 -0
  34. package/build/cli/commands/background-jobs-worker.js +7 -0
  35. package/build/cli/commands/beacon.js +7 -0
  36. package/build/cli/commands/console.js +12 -0
  37. package/build/cli/commands/db/base-command.js +82 -0
  38. package/build/cli/commands/db/create.js +64 -0
  39. package/build/cli/commands/db/drop.js +75 -0
  40. package/build/cli/commands/db/migrate.js +17 -0
  41. package/build/cli/commands/db/reset.js +22 -0
  42. package/build/cli/commands/db/rollback.js +15 -0
  43. package/build/cli/commands/db/schema/dump.js +12 -0
  44. package/build/cli/commands/db/schema/load.js +12 -0
  45. package/build/cli/commands/db/seed.js +12 -0
  46. package/build/cli/commands/db/tenants/check.js +38 -0
  47. package/build/cli/commands/db/tenants/create.js +33 -0
  48. package/build/cli/commands/db/tenants/migrate.js +49 -0
  49. package/build/cli/commands/destroy/migration.js +7 -0
  50. package/build/cli/commands/generate/base-models.js +7 -0
  51. package/build/cli/commands/generate/frontend-models.js +12 -0
  52. package/build/cli/commands/generate/migration.js +7 -0
  53. package/build/cli/commands/generate/model.js +7 -0
  54. package/build/cli/commands/init.js +11 -0
  55. package/build/cli/commands/routes.js +7 -0
  56. package/build/cli/commands/run-script.js +12 -0
  57. package/build/cli/commands/runner.js +12 -0
  58. package/build/cli/commands/server.js +7 -0
  59. package/build/cli/commands/test.js +9 -0
  60. package/build/cli/index.js +152 -0
  61. package/build/cli/tenant-database-command-helper.js +198 -0
  62. package/build/cli/use-browser-cli.js +30 -0
  63. package/build/configuration-resolver.js +65 -0
  64. package/build/configuration-types.js +429 -0
  65. package/build/configuration.js +2590 -0
  66. package/build/controller.js +421 -0
  67. package/build/current-configuration.js +31 -0
  68. package/build/current.js +80 -0
  69. package/build/database/annotations-async-hooks.js +47 -0
  70. package/build/database/annotations.js +40 -0
  71. package/build/database/drivers/base-column.js +182 -0
  72. package/build/database/drivers/base-columns-index.js +81 -0
  73. package/build/database/drivers/base-foreign-key.js +104 -0
  74. package/build/database/drivers/base-table.js +156 -0
  75. package/build/database/drivers/base.js +1609 -0
  76. package/build/database/drivers/mssql/column.js +74 -0
  77. package/build/database/drivers/mssql/columns-index.js +6 -0
  78. package/build/database/drivers/mssql/connect-connection.js +16 -0
  79. package/build/database/drivers/mssql/foreign-key.js +12 -0
  80. package/build/database/drivers/mssql/index.js +590 -0
  81. package/build/database/drivers/mssql/options.js +79 -0
  82. package/build/database/drivers/mssql/query-parser.js +6 -0
  83. package/build/database/drivers/mssql/sql/alter-table.js +4 -0
  84. package/build/database/drivers/mssql/sql/create-database.js +36 -0
  85. package/build/database/drivers/mssql/sql/create-index.js +4 -0
  86. package/build/database/drivers/mssql/sql/create-table.js +4 -0
  87. package/build/database/drivers/mssql/sql/delete.js +19 -0
  88. package/build/database/drivers/mssql/sql/drop-database.js +36 -0
  89. package/build/database/drivers/mssql/sql/drop-table.js +4 -0
  90. package/build/database/drivers/mssql/sql/insert.js +4 -0
  91. package/build/database/drivers/mssql/sql/update.js +31 -0
  92. package/build/database/drivers/mssql/sql/upsert.js +23 -0
  93. package/build/database/drivers/mssql/structure-sql.js +120 -0
  94. package/build/database/drivers/mssql/table.js +145 -0
  95. package/build/database/drivers/mysql/column.js +112 -0
  96. package/build/database/drivers/mysql/columns-index.js +22 -0
  97. package/build/database/drivers/mysql/foreign-key.js +12 -0
  98. package/build/database/drivers/mysql/index.js +473 -0
  99. package/build/database/drivers/mysql/options.js +34 -0
  100. package/build/database/drivers/mysql/query-parser.js +6 -0
  101. package/build/database/drivers/mysql/query.js +37 -0
  102. package/build/database/drivers/mysql/sql/alter-table.js +6 -0
  103. package/build/database/drivers/mysql/sql/create-database.js +39 -0
  104. package/build/database/drivers/mysql/sql/create-index.js +6 -0
  105. package/build/database/drivers/mysql/sql/create-table.js +6 -0
  106. package/build/database/drivers/mysql/sql/delete.js +21 -0
  107. package/build/database/drivers/mysql/sql/drop-database.js +6 -0
  108. package/build/database/drivers/mysql/sql/drop-table.js +6 -0
  109. package/build/database/drivers/mysql/sql/insert.js +6 -0
  110. package/build/database/drivers/mysql/sql/update.js +33 -0
  111. package/build/database/drivers/mysql/sql/upsert.js +13 -0
  112. package/build/database/drivers/mysql/structure-sql.js +93 -0
  113. package/build/database/drivers/mysql/table.js +121 -0
  114. package/build/database/drivers/pgsql/column.js +90 -0
  115. package/build/database/drivers/pgsql/columns-index.js +6 -0
  116. package/build/database/drivers/pgsql/foreign-key.js +12 -0
  117. package/build/database/drivers/pgsql/index.js +441 -0
  118. package/build/database/drivers/pgsql/options.js +32 -0
  119. package/build/database/drivers/pgsql/query-parser.js +6 -0
  120. package/build/database/drivers/pgsql/sql/alter-table.js +6 -0
  121. package/build/database/drivers/pgsql/sql/create-database.js +38 -0
  122. package/build/database/drivers/pgsql/sql/create-index.js +6 -0
  123. package/build/database/drivers/pgsql/sql/create-table.js +6 -0
  124. package/build/database/drivers/pgsql/sql/delete.js +21 -0
  125. package/build/database/drivers/pgsql/sql/drop-database.js +6 -0
  126. package/build/database/drivers/pgsql/sql/drop-table.js +6 -0
  127. package/build/database/drivers/pgsql/sql/insert.js +6 -0
  128. package/build/database/drivers/pgsql/sql/update.js +33 -0
  129. package/build/database/drivers/pgsql/sql/upsert.js +14 -0
  130. package/build/database/drivers/pgsql/structure-sql.js +126 -0
  131. package/build/database/drivers/pgsql/table.js +135 -0
  132. package/build/database/drivers/sqlite/base.js +509 -0
  133. package/build/database/drivers/sqlite/column.js +75 -0
  134. package/build/database/drivers/sqlite/columns-index.js +30 -0
  135. package/build/database/drivers/sqlite/connection-sql-js.js +46 -0
  136. package/build/database/drivers/sqlite/foreign-key.js +24 -0
  137. package/build/database/drivers/sqlite/index.js +394 -0
  138. package/build/database/drivers/sqlite/index.native.js +72 -0
  139. package/build/database/drivers/sqlite/index.web.js +99 -0
  140. package/build/database/drivers/sqlite/options.js +32 -0
  141. package/build/database/drivers/sqlite/query-parser.js +6 -0
  142. package/build/database/drivers/sqlite/query.js +35 -0
  143. package/build/database/drivers/sqlite/query.native.js +35 -0
  144. package/build/database/drivers/sqlite/query.web.js +49 -0
  145. package/build/database/drivers/sqlite/sql/alter-table.js +187 -0
  146. package/build/database/drivers/sqlite/sql/create-index.js +6 -0
  147. package/build/database/drivers/sqlite/sql/create-table.js +6 -0
  148. package/build/database/drivers/sqlite/sql/delete.js +26 -0
  149. package/build/database/drivers/sqlite/sql/drop-table.js +6 -0
  150. package/build/database/drivers/sqlite/sql/insert.js +6 -0
  151. package/build/database/drivers/sqlite/sql/update.js +33 -0
  152. package/build/database/drivers/sqlite/sql/upsert.js +14 -0
  153. package/build/database/drivers/sqlite/structure-sql.js +56 -0
  154. package/build/database/drivers/sqlite/table-rebuilder.js +96 -0
  155. package/build/database/drivers/sqlite/table.js +131 -0
  156. package/build/database/drivers/structure-sql/utils.js +35 -0
  157. package/build/database/handler.js +13 -0
  158. package/build/database/initializer-from-require-context.js +101 -0
  159. package/build/database/migration/index.js +438 -0
  160. package/build/database/migrator/files-finder.js +55 -0
  161. package/build/database/migrator/types.js +31 -0
  162. package/build/database/migrator.js +557 -0
  163. package/build/database/pool/async-tracked-multi-connection.js +1164 -0
  164. package/build/database/pool/base-methods-forward.js +52 -0
  165. package/build/database/pool/base.js +380 -0
  166. package/build/database/pool/single-multi-use.js +118 -0
  167. package/build/database/query/alter-table-base.js +104 -0
  168. package/build/database/query/base.js +49 -0
  169. package/build/database/query/create-database-base.js +42 -0
  170. package/build/database/query/create-index-base.js +117 -0
  171. package/build/database/query/create-table-base.js +205 -0
  172. package/build/database/query/delete-base.js +19 -0
  173. package/build/database/query/drop-database-base.js +38 -0
  174. package/build/database/query/drop-table-base.js +58 -0
  175. package/build/database/query/from-base.js +36 -0
  176. package/build/database/query/from-plain.js +16 -0
  177. package/build/database/query/from-table.js +18 -0
  178. package/build/database/query/index.js +533 -0
  179. package/build/database/query/insert-base.js +172 -0
  180. package/build/database/query/join-base.js +43 -0
  181. package/build/database/query/join-object.js +167 -0
  182. package/build/database/query/join-plain.js +18 -0
  183. package/build/database/query/join-tracker.js +93 -0
  184. package/build/database/query/model-class-query.js +1577 -0
  185. package/build/database/query/order-base.js +33 -0
  186. package/build/database/query/order-column.js +77 -0
  187. package/build/database/query/order-plain.js +28 -0
  188. package/build/database/query/preloader/belongs-to.js +267 -0
  189. package/build/database/query/preloader/ensure-model-class-initialized.js +18 -0
  190. package/build/database/query/preloader/has-many.js +316 -0
  191. package/build/database/query/preloader/has-one.js +123 -0
  192. package/build/database/query/preloader/selection.js +152 -0
  193. package/build/database/query/preloader.js +201 -0
  194. package/build/database/query/query-data.js +305 -0
  195. package/build/database/query/select-base.js +30 -0
  196. package/build/database/query/select-plain.js +18 -0
  197. package/build/database/query/select-table-and-column.js +28 -0
  198. package/build/database/query/update-base.js +41 -0
  199. package/build/database/query/upsert-base.js +103 -0
  200. package/build/database/query/where-base.js +38 -0
  201. package/build/database/query/where-combinator.js +31 -0
  202. package/build/database/query/where-hash.js +77 -0
  203. package/build/database/query/where-model-class-hash.js +505 -0
  204. package/build/database/query/where-not.js +23 -0
  205. package/build/database/query/where-plain.js +20 -0
  206. package/build/database/query/with-count.js +219 -0
  207. package/build/database/query-parser/base-query-parser.js +40 -0
  208. package/build/database/query-parser/from-parser.js +49 -0
  209. package/build/database/query-parser/group-parser.js +55 -0
  210. package/build/database/query-parser/joins-parser.js +37 -0
  211. package/build/database/query-parser/limit-parser.js +77 -0
  212. package/build/database/query-parser/options.js +94 -0
  213. package/build/database/query-parser/order-parser.js +45 -0
  214. package/build/database/query-parser/select-parser.js +67 -0
  215. package/build/database/query-parser/where-parser.js +46 -0
  216. package/build/database/record/acts-as-list.js +374 -0
  217. package/build/database/record/attachments/download.js +49 -0
  218. package/build/database/record/attachments/handle.js +188 -0
  219. package/build/database/record/attachments/normalize-input.js +213 -0
  220. package/build/database/record/attachments/storage-drivers/filesystem.js +114 -0
  221. package/build/database/record/attachments/storage-drivers/native.js +146 -0
  222. package/build/database/record/attachments/storage-drivers/s3.js +245 -0
  223. package/build/database/record/attachments/store.js +591 -0
  224. package/build/database/record/index.js +4119 -0
  225. package/build/database/record/instance-relationships/base.js +289 -0
  226. package/build/database/record/instance-relationships/belongs-to.js +84 -0
  227. package/build/database/record/instance-relationships/has-many.js +284 -0
  228. package/build/database/record/instance-relationships/has-one.js +117 -0
  229. package/build/database/record/record-not-found-error.js +3 -0
  230. package/build/database/record/relationships/base.js +195 -0
  231. package/build/database/record/relationships/belongs-to.js +57 -0
  232. package/build/database/record/relationships/has-many.js +46 -0
  233. package/build/database/record/relationships/has-one.js +46 -0
  234. package/build/database/record/state-machine.js +278 -0
  235. package/build/database/record/user-module.js +43 -0
  236. package/build/database/record/validators/base.js +27 -0
  237. package/build/database/record/validators/format.js +50 -0
  238. package/build/database/record/validators/presence.js +24 -0
  239. package/build/database/record/validators/uniqueness.js +124 -0
  240. package/build/database/table-data/index.js +241 -0
  241. package/build/database/table-data/table-column.js +416 -0
  242. package/build/database/table-data/table-foreign-key.js +69 -0
  243. package/build/database/table-data/table-index.js +46 -0
  244. package/build/database/table-data/table-reference.js +13 -0
  245. package/build/database/use-database.js +48 -0
  246. package/build/environment-handlers/base.js +561 -0
  247. package/build/environment-handlers/browser.js +338 -0
  248. package/build/environment-handlers/node/cli/commands/background-jobs-main.js +21 -0
  249. package/build/environment-handlers/node/cli/commands/background-jobs-runner.js +24 -0
  250. package/build/environment-handlers/node/cli/commands/background-jobs-worker.js +47 -0
  251. package/build/environment-handlers/node/cli/commands/beacon.js +21 -0
  252. package/build/environment-handlers/node/cli/commands/cli-command-context.js +31 -0
  253. package/build/environment-handlers/node/cli/commands/console.js +149 -0
  254. package/build/environment-handlers/node/cli/commands/db/schema/dump.js +43 -0
  255. package/build/environment-handlers/node/cli/commands/db/schema/load.js +69 -0
  256. package/build/environment-handlers/node/cli/commands/db/seed.js +79 -0
  257. package/build/environment-handlers/node/cli/commands/destroy/migration.js +47 -0
  258. package/build/environment-handlers/node/cli/commands/generate/base-models.js +396 -0
  259. package/build/environment-handlers/node/cli/commands/generate/frontend-models.js +872 -0
  260. package/build/environment-handlers/node/cli/commands/generate/migration.js +45 -0
  261. package/build/environment-handlers/node/cli/commands/generate/model.js +45 -0
  262. package/build/environment-handlers/node/cli/commands/init.js +68 -0
  263. package/build/environment-handlers/node/cli/commands/routes.js +63 -0
  264. package/build/environment-handlers/node/cli/commands/run-script.js +85 -0
  265. package/build/environment-handlers/node/cli/commands/runner.js +84 -0
  266. package/build/environment-handlers/node/cli/commands/server.js +151 -0
  267. package/build/environment-handlers/node/cli/commands/test.js +118 -0
  268. package/build/environment-handlers/node.js +887 -0
  269. package/build/error-logger.js +30 -0
  270. package/build/frontend-model-controller.js +3491 -0
  271. package/build/frontend-model-resource/base-resource.js +939 -0
  272. package/build/frontend-models/base.js +4004 -0
  273. package/build/frontend-models/clear-pending-debounced-callback.js +16 -0
  274. package/build/frontend-models/event-hook-models.js +49 -0
  275. package/build/frontend-models/model-registry.js +28 -0
  276. package/build/frontend-models/outgoing-event-buffer.js +51 -0
  277. package/build/frontend-models/preloader.js +169 -0
  278. package/build/frontend-models/query.js +2245 -0
  279. package/build/frontend-models/resource-config-validation.js +56 -0
  280. package/build/frontend-models/resource-definition.js +399 -0
  281. package/build/frontend-models/transport-serialization.js +369 -0
  282. package/build/frontend-models/use-created-event.js +21 -0
  283. package/build/frontend-models/use-destroyed-event.js +148 -0
  284. package/build/frontend-models/use-model-class-event.js +164 -0
  285. package/build/frontend-models/use-updated-event.js +152 -0
  286. package/build/frontend-models/websocket-channel.js +494 -0
  287. package/build/frontend-models/websocket-publishers.js +224 -0
  288. package/build/http-client/header.js +17 -0
  289. package/build/http-client/index.js +139 -0
  290. package/build/http-client/request.js +94 -0
  291. package/build/http-client/response.js +151 -0
  292. package/build/http-client/websocket-client.js +27 -0
  293. package/build/http-server/client/index.js +507 -0
  294. package/build/http-server/client/params-to-object.js +152 -0
  295. package/build/http-server/client/request-buffer/form-data-part.js +139 -0
  296. package/build/http-server/client/request-buffer/header.js +19 -0
  297. package/build/http-server/client/request-buffer/index.js +535 -0
  298. package/build/http-server/client/request-parser.js +195 -0
  299. package/build/http-server/client/request-runner.js +321 -0
  300. package/build/http-server/client/request-timing.js +171 -0
  301. package/build/http-server/client/request.js +114 -0
  302. package/build/http-server/client/response.js +251 -0
  303. package/build/http-server/client/uploaded-file/memory-uploaded-file.js +32 -0
  304. package/build/http-server/client/uploaded-file/temporary-uploaded-file.js +32 -0
  305. package/build/http-server/client/uploaded-file/uploaded-file.js +36 -0
  306. package/build/http-server/client/websocket-request.js +147 -0
  307. package/build/http-server/client/websocket-session.js +1755 -0
  308. package/build/http-server/cookie.js +245 -0
  309. package/build/http-server/development-reloader.js +240 -0
  310. package/build/http-server/index.js +561 -0
  311. package/build/http-server/remote-address.js +77 -0
  312. package/build/http-server/server-client.js +222 -0
  313. package/build/http-server/server-lock.js +178 -0
  314. package/build/http-server/websocket-channel-subscribers.js +110 -0
  315. package/build/http-server/websocket-channel.js +137 -0
  316. package/build/http-server/websocket-connection.js +118 -0
  317. package/build/http-server/websocket-event-log-store.js +433 -0
  318. package/build/http-server/websocket-events-host.js +170 -0
  319. package/build/http-server/websocket-events.js +50 -0
  320. package/build/http-server/worker-handler/channel-subscriber-dispatch.js +28 -0
  321. package/build/http-server/worker-handler/in-process.js +155 -0
  322. package/build/http-server/worker-handler/index.js +370 -0
  323. package/build/http-server/worker-handler/worker-script.js +6 -0
  324. package/build/http-server/worker-handler/worker-thread.js +286 -0
  325. package/build/initializer.js +39 -0
  326. package/build/jobs/mail-delivery.js +22 -0
  327. package/build/logger/base-logger.js +34 -0
  328. package/build/logger/console-logger.js +28 -0
  329. package/build/logger/file-logger.js +36 -0
  330. package/build/logger/outputs/array-output.js +50 -0
  331. package/build/logger/outputs/console-output.js +32 -0
  332. package/build/logger/outputs/file-output.js +55 -0
  333. package/build/logger/outputs/stdout-output.js +64 -0
  334. package/build/logger.js +507 -0
  335. package/build/mailer/backends/smtp.js +197 -0
  336. package/build/mailer/base.js +337 -0
  337. package/build/mailer/delivery.js +70 -0
  338. package/build/mailer/index.js +24 -0
  339. package/build/mailer.js +15 -0
  340. package/build/plugins/sqljs-wasm-route-controller.js +70 -0
  341. package/build/plugins/sqljs-wasm-route.js +71 -0
  342. package/build/record-payload-values.js +83 -0
  343. package/build/routes/app-routes.js +17 -0
  344. package/build/routes/base-route.js +133 -0
  345. package/build/routes/basic-route.js +109 -0
  346. package/build/routes/built-in/debug/controller.js +12 -0
  347. package/build/routes/built-in/errors/controller.js +7 -0
  348. package/build/routes/get-route.js +75 -0
  349. package/build/routes/hooks/frontend-model-command-route-hook.js +100 -0
  350. package/build/routes/index.js +50 -0
  351. package/build/routes/namespace-route.js +51 -0
  352. package/build/routes/plugin-routes.js +141 -0
  353. package/build/routes/post-route.js +74 -0
  354. package/build/routes/resolver.js +535 -0
  355. package/build/routes/resource-route.js +154 -0
  356. package/build/routes/root-route.js +11 -0
  357. package/build/src/application.js +187 -214
  358. package/build/src/authorization/ability.js +250 -297
  359. package/build/src/authorization/base-resource.js +120 -136
  360. package/build/src/background-jobs/client.js +43 -47
  361. package/build/src/background-jobs/cron-expression.js +127 -166
  362. package/build/src/background-jobs/forked-runner-child.js +37 -47
  363. package/build/src/background-jobs/job-record.js +8 -10
  364. package/build/src/background-jobs/job-registry.js +72 -84
  365. package/build/src/background-jobs/job-runner.js +74 -81
  366. package/build/src/background-jobs/job.js +62 -72
  367. package/build/src/background-jobs/json-socket.js +65 -70
  368. package/build/src/background-jobs/main.js +841 -900
  369. package/build/src/background-jobs/normalize-error.js +12 -11
  370. package/build/src/background-jobs/scheduler.js +205 -247
  371. package/build/src/background-jobs/socket-request.js +60 -65
  372. package/build/src/background-jobs/status-reporter.js +86 -96
  373. package/build/src/background-jobs/store.js +862 -980
  374. package/build/src/background-jobs/types.js +2 -3
  375. package/build/src/background-jobs/web/authorization.js +38 -50
  376. package/build/src/background-jobs/web/controller.js +232 -268
  377. package/build/src/background-jobs/web/index.js +36 -40
  378. package/build/src/background-jobs/web/path-matcher.js +45 -48
  379. package/build/src/background-jobs/web/registry.js +9 -14
  380. package/build/src/background-jobs/worker.js +585 -639
  381. package/build/src/beacon/client.js +264 -293
  382. package/build/src/beacon/in-process-broker.js +20 -25
  383. package/build/src/beacon/in-process-client.js +104 -116
  384. package/build/src/beacon/server.js +110 -126
  385. package/build/src/beacon/types.js +2 -8
  386. package/build/src/cli/base-command.js +49 -57
  387. package/build/src/cli/browser-cli.js +37 -42
  388. package/build/src/cli/commands/background-jobs-main.js +5 -5
  389. package/build/src/cli/commands/background-jobs-runner.js +5 -5
  390. package/build/src/cli/commands/background-jobs-worker.js +5 -5
  391. package/build/src/cli/commands/beacon.js +5 -5
  392. package/build/src/cli/commands/console.js +10 -10
  393. package/build/src/cli/commands/db/base-command.js +71 -76
  394. package/build/src/cli/commands/db/create.js +53 -61
  395. package/build/src/cli/commands/db/drop.js +62 -71
  396. package/build/src/cli/commands/db/migrate.js +13 -15
  397. package/build/src/cli/commands/db/reset.js +16 -19
  398. package/build/src/cli/commands/db/rollback.js +12 -13
  399. package/build/src/cli/commands/db/schema/dump.js +9 -9
  400. package/build/src/cli/commands/db/schema/load.js +9 -9
  401. package/build/src/cli/commands/db/seed.js +9 -9
  402. package/build/src/cli/commands/db/tenants/check.js +32 -35
  403. package/build/src/cli/commands/db/tenants/create.js +26 -29
  404. package/build/src/cli/commands/db/tenants/migrate.js +40 -44
  405. package/build/src/cli/commands/destroy/migration.js +5 -5
  406. package/build/src/cli/commands/generate/base-models.js +5 -5
  407. package/build/src/cli/commands/generate/frontend-models.js +9 -9
  408. package/build/src/cli/commands/generate/migration.js +5 -5
  409. package/build/src/cli/commands/generate/model.js +5 -5
  410. package/build/src/cli/commands/init.js +7 -9
  411. package/build/src/cli/commands/routes.js +6 -6
  412. package/build/src/cli/commands/run-script.js +9 -9
  413. package/build/src/cli/commands/runner.js +9 -9
  414. package/build/src/cli/commands/server.js +6 -6
  415. package/build/src/cli/commands/test.js +6 -7
  416. package/build/src/cli/index.js +127 -141
  417. package/build/src/cli/tenant-database-command-helper.js +154 -185
  418. package/build/src/cli/use-browser-cli.js +15 -20
  419. package/build/src/configuration-resolver.js +47 -54
  420. package/build/src/configuration-types.d.ts +5 -3
  421. package/build/src/configuration-types.d.ts.map +1 -1
  422. package/build/src/configuration-types.js +3 -54
  423. package/build/src/configuration.js +2240 -2547
  424. package/build/src/controller.js +363 -407
  425. package/build/src/current-configuration.js +9 -12
  426. package/build/src/current.js +70 -75
  427. package/build/src/database/annotations-async-hooks.js +16 -22
  428. package/build/src/database/annotations.js +12 -18
  429. package/build/src/database/drivers/base-column.js +155 -179
  430. package/build/src/database/drivers/base-columns-index.js +69 -78
  431. package/build/src/database/drivers/base-foreign-key.js +89 -101
  432. package/build/src/database/drivers/base-table.js +124 -149
  433. package/build/src/database/drivers/base.js +1306 -1489
  434. package/build/src/database/drivers/mssql/column.js +39 -50
  435. package/build/src/database/drivers/mssql/columns-index.js +2 -3
  436. package/build/src/database/drivers/mssql/connect-connection.js +11 -9
  437. package/build/src/database/drivers/mssql/foreign-key.js +8 -9
  438. package/build/src/database/drivers/mssql/index.js +507 -587
  439. package/build/src/database/drivers/mssql/options.js +68 -75
  440. package/build/src/database/drivers/mssql/query-parser.js +2 -3
  441. package/build/src/database/drivers/mssql/sql/alter-table.js +2 -2
  442. package/build/src/database/drivers/mssql/sql/create-database.js +24 -31
  443. package/build/src/database/drivers/mssql/sql/create-index.js +2 -2
  444. package/build/src/database/drivers/mssql/sql/create-table.js +2 -2
  445. package/build/src/database/drivers/mssql/sql/delete.js +14 -16
  446. package/build/src/database/drivers/mssql/sql/drop-database.js +24 -31
  447. package/build/src/database/drivers/mssql/sql/drop-table.js +2 -2
  448. package/build/src/database/drivers/mssql/sql/insert.js +2 -2
  449. package/build/src/database/drivers/mssql/sql/update.js +24 -28
  450. package/build/src/database/drivers/mssql/sql/upsert.js +18 -20
  451. package/build/src/database/drivers/mssql/structure-sql.js +102 -114
  452. package/build/src/database/drivers/mssql/table.js +81 -96
  453. package/build/src/database/drivers/mysql/column.js +75 -92
  454. package/build/src/database/drivers/mysql/columns-index.js +16 -19
  455. package/build/src/database/drivers/mysql/foreign-key.js +8 -9
  456. package/build/src/database/drivers/mysql/index.js +396 -457
  457. package/build/src/database/drivers/mysql/options.js +26 -30
  458. package/build/src/database/drivers/mysql/query-parser.js +2 -3
  459. package/build/src/database/drivers/mysql/query.js +26 -29
  460. package/build/src/database/drivers/mysql/sql/alter-table.js +2 -3
  461. package/build/src/database/drivers/mysql/sql/create-database.js +23 -28
  462. package/build/src/database/drivers/mysql/sql/create-index.js +2 -3
  463. package/build/src/database/drivers/mysql/sql/create-table.js +2 -3
  464. package/build/src/database/drivers/mysql/sql/delete.js +14 -17
  465. package/build/src/database/drivers/mysql/sql/drop-database.js +2 -3
  466. package/build/src/database/drivers/mysql/sql/drop-table.js +2 -3
  467. package/build/src/database/drivers/mysql/sql/insert.js +2 -3
  468. package/build/src/database/drivers/mysql/sql/update.js +24 -29
  469. package/build/src/database/drivers/mysql/sql/upsert.js +8 -10
  470. package/build/src/database/drivers/mysql/structure-sql.js +79 -88
  471. package/build/src/database/drivers/mysql/table.js +83 -98
  472. package/build/src/database/drivers/pgsql/column.js +56 -72
  473. package/build/src/database/drivers/pgsql/columns-index.js +2 -3
  474. package/build/src/database/drivers/pgsql/foreign-key.js +8 -9
  475. package/build/src/database/drivers/pgsql/index.js +377 -438
  476. package/build/src/database/drivers/pgsql/options.js +25 -28
  477. package/build/src/database/drivers/pgsql/query-parser.js +2 -3
  478. package/build/src/database/drivers/pgsql/sql/alter-table.js +2 -3
  479. package/build/src/database/drivers/pgsql/sql/create-database.js +19 -23
  480. package/build/src/database/drivers/pgsql/sql/create-index.js +2 -3
  481. package/build/src/database/drivers/pgsql/sql/create-table.js +2 -3
  482. package/build/src/database/drivers/pgsql/sql/delete.js +14 -17
  483. package/build/src/database/drivers/pgsql/sql/drop-database.js +2 -3
  484. package/build/src/database/drivers/pgsql/sql/drop-table.js +2 -3
  485. package/build/src/database/drivers/pgsql/sql/insert.js +2 -3
  486. package/build/src/database/drivers/pgsql/sql/update.js +24 -29
  487. package/build/src/database/drivers/pgsql/sql/upsert.js +9 -11
  488. package/build/src/database/drivers/pgsql/structure-sql.js +108 -120
  489. package/build/src/database/drivers/pgsql/table.js +60 -77
  490. package/build/src/database/drivers/sqlite/base.js +405 -478
  491. package/build/src/database/drivers/sqlite/column.js +54 -69
  492. package/build/src/database/drivers/sqlite/columns-index.js +22 -27
  493. package/build/src/database/drivers/sqlite/connection-sql-js.js +35 -42
  494. package/build/src/database/drivers/sqlite/foreign-key.js +18 -21
  495. package/build/src/database/drivers/sqlite/index.js +330 -373
  496. package/build/src/database/drivers/sqlite/index.native.js +55 -64
  497. package/build/src/database/drivers/sqlite/index.web.js +69 -87
  498. package/build/src/database/drivers/sqlite/options.js +25 -28
  499. package/build/src/database/drivers/sqlite/query-parser.js +2 -3
  500. package/build/src/database/drivers/sqlite/query.js +21 -24
  501. package/build/src/database/drivers/sqlite/query.native.js +20 -25
  502. package/build/src/database/drivers/sqlite/query.web.js +30 -37
  503. package/build/src/database/drivers/sqlite/sql/alter-table.js +159 -179
  504. package/build/src/database/drivers/sqlite/sql/create-index.js +2 -3
  505. package/build/src/database/drivers/sqlite/sql/create-table.js +2 -3
  506. package/build/src/database/drivers/sqlite/sql/delete.js +17 -22
  507. package/build/src/database/drivers/sqlite/sql/drop-table.js +2 -3
  508. package/build/src/database/drivers/sqlite/sql/insert.js +2 -3
  509. package/build/src/database/drivers/sqlite/sql/update.js +24 -29
  510. package/build/src/database/drivers/sqlite/sql/upsert.js +9 -11
  511. package/build/src/database/drivers/sqlite/structure-sql.js +49 -52
  512. package/build/src/database/drivers/sqlite/table-rebuilder.js +62 -75
  513. package/build/src/database/drivers/sqlite/table.js +102 -125
  514. package/build/src/database/drivers/structure-sql/utils.js +14 -17
  515. package/build/src/database/handler.js +9 -10
  516. package/build/src/database/initializer-from-require-context.js +76 -87
  517. package/build/src/database/migration/index.js +332 -395
  518. package/build/src/database/migrator/files-finder.js +40 -50
  519. package/build/src/database/migrator/types.js +2 -30
  520. package/build/src/database/migrator.js +454 -526
  521. package/build/src/database/pool/async-tracked-multi-connection.js +997 -1147
  522. package/build/src/database/pool/base-methods-forward.js +40 -43
  523. package/build/src/database/pool/base.js +298 -343
  524. package/build/src/database/pool/single-multi-use.js +93 -110
  525. package/build/src/database/query/alter-table-base.js +84 -99
  526. package/build/src/database/query/base.js +39 -46
  527. package/build/src/database/query/create-database-base.js +25 -30
  528. package/build/src/database/query/create-index-base.js +75 -94
  529. package/build/src/database/query/create-table-base.js +151 -193
  530. package/build/src/database/query/delete-base.js +14 -16
  531. package/build/src/database/query/drop-database-base.js +23 -28
  532. package/build/src/database/query/drop-table-base.js +42 -53
  533. package/build/src/database/query/from-base.js +30 -33
  534. package/build/src/database/query/from-plain.js +11 -13
  535. package/build/src/database/query/from-table.js +13 -15
  536. package/build/src/database/query/index.js +410 -472
  537. package/build/src/database/query/insert-base.js +143 -164
  538. package/build/src/database/query/join-base.js +35 -40
  539. package/build/src/database/query/join-object.js +128 -153
  540. package/build/src/database/query/join-plain.js +13 -15
  541. package/build/src/database/query/join-tracker.js +76 -90
  542. package/build/src/database/query/model-class-query.js +1134 -1370
  543. package/build/src/database/query/order-base.js +27 -30
  544. package/build/src/database/query/order-column.js +44 -53
  545. package/build/src/database/query/order-plain.js +20 -24
  546. package/build/src/database/query/preloader/belongs-to.js +210 -258
  547. package/build/src/database/query/preloader/ensure-model-class-initialized.js +8 -9
  548. package/build/src/database/query/preloader/has-many.js +240 -301
  549. package/build/src/database/query/preloader/has-one.js +91 -117
  550. package/build/src/database/query/preloader/selection.js +117 -129
  551. package/build/src/database/query/preloader.js +160 -185
  552. package/build/src/database/query/query-data.js +157 -201
  553. package/build/src/database/query/select-base.js +25 -27
  554. package/build/src/database/query/select-plain.js +13 -15
  555. package/build/src/database/query/select-table-and-column.js +21 -25
  556. package/build/src/database/query/update-base.js +35 -38
  557. package/build/src/database/query/upsert-base.js +93 -100
  558. package/build/src/database/query/where-base.js +32 -35
  559. package/build/src/database/query/where-combinator.js +25 -28
  560. package/build/src/database/query/where-hash.js +61 -68
  561. package/build/src/database/query/where-model-class-hash.js +414 -469
  562. package/build/src/database/query/where-not.js +18 -20
  563. package/build/src/database/query/where-plain.js +15 -17
  564. package/build/src/database/query/with-count.js +125 -159
  565. package/build/src/database/query-parser/base-query-parser.js +32 -37
  566. package/build/src/database/query-parser/from-parser.js +36 -45
  567. package/build/src/database/query-parser/group-parser.js +42 -50
  568. package/build/src/database/query-parser/joins-parser.js +28 -33
  569. package/build/src/database/query-parser/limit-parser.js +67 -70
  570. package/build/src/database/query-parser/options.js +75 -82
  571. package/build/src/database/query-parser/order-parser.js +36 -40
  572. package/build/src/database/query-parser/select-parser.js +49 -60
  573. package/build/src/database/query-parser/where-parser.js +36 -41
  574. package/build/src/database/record/acts-as-list.js +235 -273
  575. package/build/src/database/record/attachments/download.js +44 -45
  576. package/build/src/database/record/attachments/handle.js +141 -161
  577. package/build/src/database/record/attachments/normalize-input.js +128 -138
  578. package/build/src/database/record/attachments/storage-drivers/filesystem.js +77 -91
  579. package/build/src/database/record/attachments/storage-drivers/native.js +112 -121
  580. package/build/src/database/record/attachments/storage-drivers/s3.js +177 -208
  581. package/build/src/database/record/attachments/store.js +467 -539
  582. package/build/src/database/record/index.d.ts +109 -25
  583. package/build/src/database/record/index.d.ts.map +1 -1
  584. package/build/src/database/record/index.js +3502 -3898
  585. package/build/src/database/record/instance-relationships/base.js +234 -268
  586. package/build/src/database/record/instance-relationships/belongs-to.js +58 -73
  587. package/build/src/database/record/instance-relationships/has-many.js +225 -264
  588. package/build/src/database/record/instance-relationships/has-one.js +85 -105
  589. package/build/src/database/record/record-not-found-error.js +3 -2
  590. package/build/src/database/record/relationships/base.js +144 -166
  591. package/build/src/database/record/relationships/belongs-to.js +44 -51
  592. package/build/src/database/record/relationships/has-many.js +32 -40
  593. package/build/src/database/record/relationships/has-one.js +32 -40
  594. package/build/src/database/record/state-machine.js +156 -208
  595. package/build/src/database/record/user-module.js +32 -38
  596. package/build/src/database/record/validators/base.js +22 -24
  597. package/build/src/database/record/validators/format.js +36 -46
  598. package/build/src/database/record/validators/presence.js +18 -20
  599. package/build/src/database/record/validators/uniqueness.js +99 -117
  600. package/build/src/database/table-data/index.js +199 -231
  601. package/build/src/database/table-data/table-column.js +338 -382
  602. package/build/src/database/table-data/table-foreign-key.js +57 -66
  603. package/build/src/database/table-data/table-index.js +29 -36
  604. package/build/src/database/table-data/table-reference.js +10 -10
  605. package/build/src/database/use-database.js +32 -40
  606. package/build/src/environment-handlers/base.js +484 -544
  607. package/build/src/environment-handlers/browser.js +241 -294
  608. package/build/src/environment-handlers/node/cli/commands/background-jobs-main.js +16 -19
  609. package/build/src/environment-handlers/node/cli/commands/background-jobs-runner.js +18 -21
  610. package/build/src/environment-handlers/node/cli/commands/background-jobs-worker.js +22 -29
  611. package/build/src/environment-handlers/node/cli/commands/beacon.js +16 -19
  612. package/build/src/environment-handlers/node/cli/commands/cli-command-context.js +14 -15
  613. package/build/src/environment-handlers/node/cli/commands/console.js +99 -120
  614. package/build/src/environment-handlers/node/cli/commands/db/schema/dump.js +34 -39
  615. package/build/src/environment-handlers/node/cli/commands/db/schema/load.js +57 -63
  616. package/build/src/environment-handlers/node/cli/commands/db/seed.js +51 -63
  617. package/build/src/environment-handlers/node/cli/commands/destroy/migration.js +32 -40
  618. package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts +4 -2
  619. package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts.map +1 -1
  620. package/build/src/environment-handlers/node/cli/commands/generate/base-models.js +326 -358
  621. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts +10 -10
  622. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.d.ts.map +1 -1
  623. package/build/src/environment-handlers/node/cli/commands/generate/frontend-models.js +729 -844
  624. package/build/src/environment-handlers/node/cli/commands/generate/migration.js +34 -38
  625. package/build/src/environment-handlers/node/cli/commands/generate/model.js +34 -38
  626. package/build/src/environment-handlers/node/cli/commands/init.js +56 -61
  627. package/build/src/environment-handlers/node/cli/commands/routes.js +51 -59
  628. package/build/src/environment-handlers/node/cli/commands/run-script.js +54 -68
  629. package/build/src/environment-handlers/node/cli/commands/runner.js +56 -74
  630. package/build/src/environment-handlers/node/cli/commands/server.js +93 -106
  631. package/build/src/environment-handlers/node/cli/commands/test.js +97 -113
  632. package/build/src/environment-handlers/node.js +753 -874
  633. package/build/src/error-logger.js +22 -21
  634. package/build/src/frontend-model-controller.js +2791 -3291
  635. package/build/src/frontend-model-resource/base-resource.d.ts +8 -3
  636. package/build/src/frontend-model-resource/base-resource.d.ts.map +1 -1
  637. package/build/src/frontend-model-resource/base-resource.js +770 -865
  638. package/build/src/frontend-models/base.js +3136 -3593
  639. package/build/src/frontend-models/clear-pending-debounced-callback.js +7 -8
  640. package/build/src/frontend-models/event-hook-models.js +16 -21
  641. package/build/src/frontend-models/model-registry.js +9 -11
  642. package/build/src/frontend-models/outgoing-event-buffer.js +10 -17
  643. package/build/src/frontend-models/preloader.js +131 -149
  644. package/build/src/frontend-models/query.js +1557 -1855
  645. package/build/src/frontend-models/resource-config-validation.js +27 -37
  646. package/build/src/frontend-models/resource-definition.d.ts +6 -7
  647. package/build/src/frontend-models/resource-definition.d.ts.map +1 -1
  648. package/build/src/frontend-models/resource-definition.js +237 -291
  649. package/build/src/frontend-models/transport-serialization.js +203 -266
  650. package/build/src/frontend-models/use-created-event.js +5 -7
  651. package/build/src/frontend-models/use-destroyed-event.js +80 -93
  652. package/build/src/frontend-models/use-model-class-event.js +79 -91
  653. package/build/src/frontend-models/use-updated-event.js +84 -97
  654. package/build/src/frontend-models/websocket-channel.js +381 -441
  655. package/build/src/frontend-models/websocket-publishers.js +142 -175
  656. package/build/src/http-client/header.js +13 -14
  657. package/build/src/http-client/index.js +116 -132
  658. package/build/src/http-client/request.js +71 -87
  659. package/build/src/http-client/response.js +122 -140
  660. package/build/src/http-client/websocket-client.js +15 -17
  661. package/build/src/http-server/client/index.js +409 -465
  662. package/build/src/http-server/client/params-to-object.js +124 -135
  663. package/build/src/http-server/client/request-buffer/form-data-part.js +111 -132
  664. package/build/src/http-server/client/request-buffer/header.js +15 -16
  665. package/build/src/http-server/client/request-buffer/index.js +446 -506
  666. package/build/src/http-server/client/request-parser.js +163 -186
  667. package/build/src/http-server/client/request-runner.js +226 -259
  668. package/build/src/http-server/client/request-timing.js +132 -151
  669. package/build/src/http-server/client/request.js +96 -108
  670. package/build/src/http-server/client/response.js +213 -235
  671. package/build/src/http-server/client/uploaded-file/memory-uploaded-file.js +25 -29
  672. package/build/src/http-server/client/uploaded-file/temporary-uploaded-file.js +25 -29
  673. package/build/src/http-server/client/uploaded-file/uploaded-file.js +33 -33
  674. package/build/src/http-server/client/websocket-request.js +114 -137
  675. package/build/src/http-server/client/websocket-session.js +1452 -1657
  676. package/build/src/http-server/cookie.js +216 -236
  677. package/build/src/http-server/development-reloader.js +190 -221
  678. package/build/src/http-server/index.js +451 -525
  679. package/build/src/http-server/remote-address.js +38 -50
  680. package/build/src/http-server/server-client.js +181 -208
  681. package/build/src/http-server/server-lock.js +153 -167
  682. package/build/src/http-server/websocket-channel-subscribers.js +81 -93
  683. package/build/src/http-server/websocket-channel.js +104 -117
  684. package/build/src/http-server/websocket-connection.js +96 -104
  685. package/build/src/http-server/websocket-event-log-store.js +350 -404
  686. package/build/src/http-server/websocket-events-host.js +145 -164
  687. package/build/src/http-server/websocket-events.js +47 -47
  688. package/build/src/http-server/worker-handler/channel-subscriber-dispatch.js +13 -14
  689. package/build/src/http-server/worker-handler/in-process.js +123 -141
  690. package/build/src/http-server/worker-handler/index.js +313 -349
  691. package/build/src/http-server/worker-handler/worker-script.js +4 -5
  692. package/build/src/http-server/worker-handler/worker-thread.js +240 -269
  693. package/build/src/initializer.js +31 -36
  694. package/build/src/jobs/mail-delivery.js +13 -15
  695. package/build/src/logger/base-logger.js +24 -26
  696. package/build/src/logger/console-logger.js +21 -23
  697. package/build/src/logger/file-logger.js +29 -31
  698. package/build/src/logger/outputs/array-output.js +37 -42
  699. package/build/src/logger/outputs/console-output.js +20 -24
  700. package/build/src/logger/outputs/file-output.js +43 -48
  701. package/build/src/logger/outputs/stdout-output.js +39 -48
  702. package/build/src/logger.js +338 -394
  703. package/build/src/mailer/backends/smtp.js +134 -163
  704. package/build/src/mailer/base.js +211 -251
  705. package/build/src/mailer/delivery.js +56 -64
  706. package/build/src/mailer/index.js +4 -22
  707. package/build/src/mailer.js +4 -13
  708. package/build/src/plugins/sqljs-wasm-route-controller.js +42 -52
  709. package/build/src/plugins/sqljs-wasm-route.js +28 -38
  710. package/build/src/record-payload-values.js +25 -28
  711. package/build/src/routes/app-routes.js +12 -14
  712. package/build/src/routes/base-route.js +112 -130
  713. package/build/src/routes/basic-route.js +83 -102
  714. package/build/src/routes/built-in/debug/controller.js +10 -10
  715. package/build/src/routes/built-in/errors/controller.js +5 -5
  716. package/build/src/routes/get-route.js +50 -63
  717. package/build/src/routes/hooks/frontend-model-command-route-hook.js +66 -80
  718. package/build/src/routes/index.js +36 -43
  719. package/build/src/routes/namespace-route.js +38 -47
  720. package/build/src/routes/plugin-routes.js +107 -124
  721. package/build/src/routes/post-route.js +51 -62
  722. package/build/src/routes/resolver.js +422 -494
  723. package/build/src/routes/resource-route.js +124 -143
  724. package/build/src/routes/root-route.js +7 -8
  725. package/build/src/testing/base-expect.js +13 -14
  726. package/build/src/testing/browser-frontend-model-event-hook-scenarios.js +329 -405
  727. package/build/src/testing/browser-test-app.js +23 -29
  728. package/build/src/testing/expect-to-change.js +41 -50
  729. package/build/src/testing/expect-utils.js +139 -184
  730. package/build/src/testing/expect.js +638 -731
  731. package/build/src/testing/request-client.js +70 -85
  732. package/build/src/testing/test-files-finder.js +285 -339
  733. package/build/src/testing/test-filter-parser.js +124 -155
  734. package/build/src/testing/test-runner.js +883 -1020
  735. package/build/src/testing/test-suite-splitter.js +114 -142
  736. package/build/src/testing/test.js +216 -256
  737. package/build/src/utils/backtrace-cleaner-node.js +62 -69
  738. package/build/src/utils/backtrace-cleaner.js +188 -216
  739. package/build/src/utils/ensure-error.js +7 -7
  740. package/build/src/utils/event-emitter.js +4 -6
  741. package/build/src/utils/file-exists.js +9 -10
  742. package/build/src/utils/format-value.js +67 -76
  743. package/build/src/utils/model-scope.js +27 -31
  744. package/build/src/utils/nest-callbacks.js +10 -13
  745. package/build/src/utils/plain-object.js +5 -6
  746. package/build/src/utils/ransack.js +448 -563
  747. package/build/src/utils/rest-args-error.js +5 -6
  748. package/build/src/utils/singularize-model-name.js +9 -11
  749. package/build/src/utils/split-sql-statements.js +68 -79
  750. package/build/src/utils/to-import-specifier.js +24 -30
  751. package/build/src/utils/with-tracked-stack-async-hooks.js +60 -74
  752. package/build/src/utils/with-tracked-stack.js +14 -18
  753. package/build/src/velocious-error.js +27 -30
  754. package/build/templates/configuration.js +61 -0
  755. package/build/templates/generate-migration.js +11 -0
  756. package/build/templates/generate-model.js +6 -0
  757. package/build/templates/routes.js +11 -0
  758. package/build/testing/base-expect.js +17 -0
  759. package/build/testing/browser-frontend-model-event-hook-scenarios.js +520 -0
  760. package/build/testing/browser-test-app.js +32 -0
  761. package/build/testing/expect-to-change.js +55 -0
  762. package/build/testing/expect-utils.js +269 -0
  763. package/build/testing/expect.js +763 -0
  764. package/build/testing/request-client.js +90 -0
  765. package/build/testing/test-files-finder.js +364 -0
  766. package/build/testing/test-filter-parser.js +198 -0
  767. package/build/testing/test-runner.js +1168 -0
  768. package/build/testing/test-suite-splitter.js +177 -0
  769. package/build/testing/test.js +370 -0
  770. package/build/utils/backtrace-cleaner-node.js +87 -0
  771. package/build/utils/backtrace-cleaner.js +266 -0
  772. package/build/utils/ensure-error.js +15 -0
  773. package/build/utils/event-emitter.js +8 -0
  774. package/build/utils/file-exists.js +18 -0
  775. package/build/utils/format-value.js +101 -0
  776. package/build/utils/model-scope.js +56 -0
  777. package/build/utils/nest-callbacks.js +22 -0
  778. package/build/utils/plain-object.js +14 -0
  779. package/build/utils/ransack.js +859 -0
  780. package/build/utils/rest-args-error.js +14 -0
  781. package/build/utils/singularize-model-name.js +18 -0
  782. package/build/utils/split-sql-statements.js +88 -0
  783. package/build/utils/to-import-specifier.js +53 -0
  784. package/build/utils/with-tracked-stack-async-hooks.js +103 -0
  785. package/build/utils/with-tracked-stack.js +38 -0
  786. package/build/velocious-error.js +34 -0
  787. package/package.json +3 -3
  788. package/src/configuration-types.js +1 -1
  789. package/src/database/record/index.js +174 -25
  790. package/src/environment-handlers/node/cli/commands/generate/base-models.js +50 -21
  791. package/src/environment-handlers/node/cli/commands/generate/frontend-models.js +5 -5
  792. package/src/frontend-model-resource/base-resource.js +6 -2
  793. package/src/frontend-models/resource-definition.js +3 -3
  794. package/src/frontend-models/websocket-publishers.js +6 -6
@@ -1,60 +1,50 @@
1
1
  // @ts-check
2
-
3
- import LoggerConsoleOutput from "./logger/outputs/console-output.js"
4
- import LoggerFileOutput from "./logger/outputs/file-output.js"
5
- import {currentConfiguration} from "./current-configuration.js"
6
- import {formatValue} from "./utils/format-value.js"
7
- import restArgsError from "./utils/rest-args-error.js"
8
-
2
+ import LoggerConsoleOutput from "./logger/outputs/console-output.js";
3
+ import LoggerFileOutput from "./logger/outputs/file-output.js";
4
+ import { currentConfiguration } from "./current-configuration.js";
5
+ import { formatValue } from "./utils/format-value.js";
6
+ import restArgsError from "./utils/rest-args-error.js";
9
7
  /**
10
8
  * LogLevel type.
11
9
  @typedef {"debug-low-level" | "debug" | "info" | "warn" | "error"} LogLevel */
12
-
13
10
  const DEFAULT_LOGGING_CONFIGURATION = {
14
- console: true,
15
- file: false,
16
- /**
17
- * Types the following value.
18
- @type {LogLevel[]} */
19
- levels: ["info", "warn", "error"]
20
- }
21
-
11
+ console: true,
12
+ file: false,
13
+ /**
14
+ * Types the following value.
15
+ @type {LogLevel[]} */
16
+ levels: ["info", "warn", "error"]
17
+ };
22
18
  /**
23
19
  * Level order.
24
20
  @type {LogLevel[]} */
25
- const LEVEL_ORDER = ["debug-low-level", "debug", "info", "warn", "error"]
26
-
21
+ const LEVEL_ORDER = ["debug-low-level", "debug", "info", "warn", "error"];
27
22
  /**
28
23
  * Runs function or messages.
29
24
  * @param {...?|function() : Array<?>} messages - Messages.
30
25
  * @returns {Array<?>} - Either the function result or the messages
31
26
  */
32
27
  function functionOrMessages(...messages) {
33
- if (messages.length === 1 && typeof messages[0] == "function") {
34
- const result = messages[0]()
35
- messages = Array.isArray(result) ? result : [result]
36
- }
37
-
38
- return messages
28
+ if (messages.length === 1 && typeof messages[0] == "function") {
29
+ const result = messages[0]();
30
+ messages = Array.isArray(result) ? result : [result];
31
+ }
32
+ return messages;
39
33
  }
40
-
41
34
  /**
42
35
  * Format a single value for inclusion in a log message.
43
36
  * @param {?} value - Value to format.
44
37
  * @returns {string} - String representation.
45
38
  */
46
39
  function formatPart(value) {
47
- if (value instanceof Error) {
48
- return `${value.message}\n${value.stack}`
49
- }
50
-
51
- if (typeof value === "object") {
52
- return formatValue(value)
53
- }
54
-
55
- return String(value)
40
+ if (value instanceof Error) {
41
+ return `${value.message}\n${value.stack}`;
42
+ }
43
+ if (typeof value === "object") {
44
+ return formatValue(value);
45
+ }
46
+ return String(value);
56
47
  }
57
-
58
48
  /**
59
49
  * Formats the user-supplied messages into a single string.
60
50
  *
@@ -67,53 +57,46 @@ function formatPart(value) {
67
57
  * @returns {string} - The formatted user message.
68
58
  */
69
59
  function formatUserMessages(messages) {
70
- if (messages.length === 0) return ""
71
-
72
- const first = messages[0]
73
-
74
- if (typeof first === "string" && /%[sdjoO%]/.test(first)) {
75
- let argIndex = 1
76
- const formatted = first.replace(/%[sdjoO%]/g, (match) => {
77
- if (match === "%%") return "%"
78
- if (argIndex >= messages.length) return match
79
-
80
- const value = messages[argIndex]
81
-
82
- argIndex += 1
83
-
84
- if (match === "%d") {
85
- // Match util.format: never throw for non-coercible values — yield "NaN" instead.
86
- // Number(Symbol()) throws, so catch and fall back.
87
- try {
88
- return String(Number(value))
89
- } catch {
90
- return "NaN"
60
+ if (messages.length === 0)
61
+ return "";
62
+ const first = messages[0];
63
+ if (typeof first === "string" && /%[sdjoO%]/.test(first)) {
64
+ let argIndex = 1;
65
+ const formatted = first.replace(/%[sdjoO%]/g, (match) => {
66
+ if (match === "%%")
67
+ return "%";
68
+ if (argIndex >= messages.length)
69
+ return match;
70
+ const value = messages[argIndex];
71
+ argIndex += 1;
72
+ if (match === "%d") {
73
+ // Match util.format: never throw for non-coercible values — yield "NaN" instead.
74
+ // Number(Symbol()) throws, so catch and fall back.
75
+ try {
76
+ return String(Number(value));
77
+ }
78
+ catch {
79
+ return "NaN";
80
+ }
81
+ }
82
+ if (match === "%j" || match === "%o" || match === "%O")
83
+ return formatValue(value);
84
+ return formatPart(value);
85
+ });
86
+ let message = formatted;
87
+ for (let index = argIndex; index < messages.length; index += 1) {
88
+ message += ` ${formatPart(messages[index])}`;
91
89
  }
92
- }
93
- if (match === "%j" || match === "%o" || match === "%O") return formatValue(value)
94
-
95
- return formatPart(value)
96
- })
97
-
98
- let message = formatted
99
-
100
- for (let index = argIndex; index < messages.length; index += 1) {
101
- message += ` ${formatPart(messages[index])}`
90
+ return message;
102
91
  }
103
-
104
- return message
105
- }
106
-
107
- let message = ""
108
-
109
- for (let index = 0; index < messages.length; index += 1) {
110
- if (index > 0) message += " "
111
- message += formatPart(messages[index])
112
- }
113
-
114
- return message
92
+ let message = "";
93
+ for (let index = 0; index < messages.length; index += 1) {
94
+ if (index > 0)
95
+ message += " ";
96
+ message += formatPart(messages[index]);
97
+ }
98
+ return message;
115
99
  }
116
-
117
100
  /**
118
101
  * Converts a logger subject and message parts into a single log line.
119
102
  * @param {string} subject - Logger subject / category prefix.
@@ -121,46 +104,40 @@ function formatUserMessages(messages) {
121
104
  * @returns {string} - The formatted log line.
122
105
  */
123
106
  function messagesToMessage(subject, ...messages) {
124
- const userMessage = formatUserMessages(messages)
125
-
126
- if (!subject) return userMessage
127
- if (!userMessage) return String(subject)
128
-
129
- return `${subject} ${userMessage}`
107
+ const userMessage = formatUserMessages(messages);
108
+ if (!subject)
109
+ return userMessage;
110
+ if (!userMessage)
111
+ return String(subject);
112
+ return `${subject} ${userMessage}`;
130
113
  }
131
-
132
114
  /**
133
115
  * Runs resolve logging configuration.
134
116
  * @param {import("./configuration.js").default | undefined} configuration - Configuration instance.
135
117
  * @returns {Required<Pick<import("./configuration-types.js").LoggingConfiguration, "console" | "file" | "levels">> & Partial<Pick<import("./configuration-types.js").LoggingConfiguration, "filePath" | "outputs">>} - The logging configuration.
136
118
  */
137
119
  function resolveLoggingConfiguration(configuration) {
138
- const debugEnabled = configuration?.debug === true
139
- if (configuration && typeof configuration.getLoggingConfiguration === "function") {
140
- const resolved = configuration.getLoggingConfiguration()
141
-
142
- if (debugEnabled) {
143
- return {
144
- ...resolved,
145
- console: true,
146
- levels: LEVEL_ORDER
147
- }
120
+ const debugEnabled = configuration?.debug === true;
121
+ if (configuration && typeof configuration.getLoggingConfiguration === "function") {
122
+ const resolved = configuration.getLoggingConfiguration();
123
+ if (debugEnabled) {
124
+ return {
125
+ ...resolved,
126
+ console: true,
127
+ levels: LEVEL_ORDER
128
+ };
129
+ }
130
+ return resolved;
148
131
  }
149
-
150
- return resolved
151
- }
152
-
153
- if (debugEnabled) {
154
- return {
155
- ...DEFAULT_LOGGING_CONFIGURATION,
156
- console: true,
157
- levels: LEVEL_ORDER
132
+ if (debugEnabled) {
133
+ return {
134
+ ...DEFAULT_LOGGING_CONFIGURATION,
135
+ console: true,
136
+ levels: LEVEL_ORDER
137
+ };
158
138
  }
159
- }
160
-
161
- return DEFAULT_LOGGING_CONFIGURATION
139
+ return DEFAULT_LOGGING_CONFIGURATION;
162
140
  }
163
-
164
141
  /**
165
142
  * Runs is level allowed.
166
143
  * @param {object} args - Options object.
@@ -169,14 +146,13 @@ function resolveLoggingConfiguration(configuration) {
169
146
  * @param {boolean} [args.debugFlag] - Whether debug flag.
170
147
  * @returns {boolean} - Whether level allowed.
171
148
  */
172
- function isLevelAllowed({level, allowedLevels, debugFlag}) {
173
- if (allowedLevels.includes(level)) return true
174
-
175
- if (debugFlag && LEVEL_ORDER.indexOf(level) >= LEVEL_ORDER.indexOf("debug")) return true
176
-
177
- return false
149
+ function isLevelAllowed({ level, allowedLevels, debugFlag }) {
150
+ if (allowedLevels.includes(level))
151
+ return true;
152
+ if (debugFlag && LEVEL_ORDER.indexOf(level) >= LEVEL_ORDER.indexOf("debug"))
153
+ return true;
154
+ return false;
178
155
  }
179
-
180
156
  /**
181
157
  * Runs resolve logging outputs.
182
158
  * @param {object} args - Options object.
@@ -184,75 +160,65 @@ function isLevelAllowed({level, allowedLevels, debugFlag}) {
184
160
  * @param {import("./configuration.js").default | undefined} args.configuration - Configuration instance.
185
161
  * @returns {import("./configuration-types.js").LoggingOutputConfig[]} - Logging outputs.
186
162
  */
187
- function resolveLoggingOutputs({loggingConfiguration, configuration}) {
188
- if (Array.isArray(loggingConfiguration.outputs)) return loggingConfiguration.outputs
189
-
190
- if (Array.isArray(loggingConfiguration.loggers)) {
163
+ function resolveLoggingOutputs({ loggingConfiguration, configuration }) {
164
+ if (Array.isArray(loggingConfiguration.outputs))
165
+ return loggingConfiguration.outputs;
166
+ if (Array.isArray(loggingConfiguration.loggers)) {
167
+ /**
168
+ * Logger outputs.
169
+ @type {import("./configuration-types.js").LoggingOutputConfig[]} */
170
+ const loggerOutputs = [];
171
+ for (const logger of loggingConfiguration.loggers) {
172
+ if (!logger)
173
+ continue;
174
+ const loggerConfig = /**
175
+ * Types the following value.
176
+ @type {?} */ (logger);
177
+ if (typeof loggerConfig.toOutputConfig === "function") {
178
+ loggerOutputs.push(loggerConfig.toOutputConfig({ configuration }));
179
+ continue;
180
+ }
181
+ if (loggerConfig.output && typeof loggerConfig.output.write === "function") {
182
+ loggerOutputs.push({
183
+ output: loggerConfig.output,
184
+ levels: loggerConfig.levels
185
+ });
186
+ continue;
187
+ }
188
+ if (typeof loggerConfig.write === "function") {
189
+ loggerOutputs.push({
190
+ output: loggerConfig,
191
+ levels: loggerConfig.levels
192
+ });
193
+ continue;
194
+ }
195
+ const loggerName = loggerConfig?.constructor?.name || "UnknownLogger";
196
+ throw new Error(`Logger must implement toOutputConfig or write: ${loggerName}`);
197
+ }
198
+ return loggerOutputs;
199
+ }
191
200
  /**
192
- * Logger outputs.
201
+ * Outputs.
193
202
  @type {import("./configuration-types.js").LoggingOutputConfig[]} */
194
- const loggerOutputs = []
195
-
196
- for (const logger of loggingConfiguration.loggers) {
197
- if (!logger) continue
198
-
199
- const loggerConfig = /**
200
- * Types the following value.
201
- @type {?} */ (logger)
202
-
203
- if (typeof loggerConfig.toOutputConfig === "function") {
204
- loggerOutputs.push(loggerConfig.toOutputConfig({configuration}))
205
- continue
206
- }
207
-
208
- if (loggerConfig.output && typeof loggerConfig.output.write === "function") {
209
- loggerOutputs.push({
210
- output: loggerConfig.output,
211
- levels: loggerConfig.levels
212
- })
213
- continue
214
- }
215
-
216
- if (typeof loggerConfig.write === "function") {
217
- loggerOutputs.push({
218
- output: loggerConfig,
219
- levels: loggerConfig.levels
220
- })
221
- continue
222
- }
223
-
224
- const loggerName = loggerConfig?.constructor?.name || "UnknownLogger"
225
- throw new Error(`Logger must implement toOutputConfig or write: ${loggerName}`)
203
+ const outputs = [];
204
+ if (loggingConfiguration.console !== false) {
205
+ outputs.push({
206
+ output: new LoggerConsoleOutput(),
207
+ levels: loggingConfiguration.levels
208
+ });
226
209
  }
227
-
228
- return loggerOutputs
229
- }
230
-
231
- /**
232
- * Outputs.
233
- @type {import("./configuration-types.js").LoggingOutputConfig[]} */
234
- const outputs = []
235
- if (loggingConfiguration.console !== false) {
236
- outputs.push({
237
- output: new LoggerConsoleOutput(),
238
- levels: loggingConfiguration.levels
239
- })
240
- }
241
-
242
- if (loggingConfiguration.file !== false && loggingConfiguration.filePath) {
243
- outputs.push({
244
- output: new LoggerFileOutput({
245
- configuration,
246
- getConfiguration: () => configuration,
247
- filePath: loggingConfiguration.filePath
248
- }),
249
- levels: loggingConfiguration.levels
250
- })
251
- }
252
-
253
- return outputs
210
+ if (loggingConfiguration.file !== false && loggingConfiguration.filePath) {
211
+ outputs.push({
212
+ output: new LoggerFileOutput({
213
+ configuration,
214
+ getConfiguration: () => configuration,
215
+ filePath: loggingConfiguration.filePath
216
+ }),
217
+ levels: loggingConfiguration.levels
218
+ });
219
+ }
220
+ return outputs;
254
221
  }
255
-
256
222
  /**
257
223
  * Runs is output level allowed.
258
224
  * @param {object} args - Options object.
@@ -262,20 +228,16 @@ function resolveLoggingOutputs({loggingConfiguration, configuration}) {
262
228
  * @param {boolean} [args.debugFlag] - Whether debug flag.
263
229
  * @returns {boolean} - Whether output should log.
264
230
  */
265
- function isOutputLevelAllowed({level, outputConfig, loggingConfiguration, debugFlag}) {
266
- if (Array.isArray(outputConfig.levels)) {
267
- return isLevelAllowed({level, allowedLevels: outputConfig.levels, debugFlag: false})
268
- }
269
-
270
- if (Array.isArray(outputConfig.output?.levels)) {
271
- return isLevelAllowed({level, allowedLevels: outputConfig.output.levels, debugFlag: false})
272
- }
273
-
274
- const allowedLevels = loggingConfiguration.levels || DEFAULT_LOGGING_CONFIGURATION.levels
275
-
276
- return isLevelAllowed({level, allowedLevels, debugFlag})
231
+ function isOutputLevelAllowed({ level, outputConfig, loggingConfiguration, debugFlag }) {
232
+ if (Array.isArray(outputConfig.levels)) {
233
+ return isLevelAllowed({ level, allowedLevels: outputConfig.levels, debugFlag: false });
234
+ }
235
+ if (Array.isArray(outputConfig.output?.levels)) {
236
+ return isLevelAllowed({ level, allowedLevels: outputConfig.output.levels, debugFlag: false });
237
+ }
238
+ const allowedLevels = loggingConfiguration.levels || DEFAULT_LOGGING_CONFIGURATION.levels;
239
+ return isLevelAllowed({ level, allowedLevels, debugFlag });
277
240
  }
278
-
279
241
  /**
280
242
  * Runs enabled output configs.
281
243
  * @param {object} args - Options object.
@@ -285,14 +247,13 @@ function isOutputLevelAllowed({level, outputConfig, loggingConfiguration, debugF
285
247
  * @param {boolean} [args.debugFlag] - Whether debug flag.
286
248
  * @returns {import("./configuration-types.js").LoggingOutputConfig[]} - Outputs enabled for the level.
287
249
  */
288
- function enabledOutputConfigs({level, outputs, loggingConfiguration, debugFlag}) {
289
- return outputs.filter((outputConfig) => {
290
- if (!outputConfig || !outputConfig.output || typeof outputConfig.output.write !== "function") return false
291
-
292
- return isOutputLevelAllowed({level, outputConfig, loggingConfiguration, debugFlag})
293
- })
250
+ function enabledOutputConfigs({ level, outputs, loggingConfiguration, debugFlag }) {
251
+ return outputs.filter((outputConfig) => {
252
+ if (!outputConfig || !outputConfig.output || typeof outputConfig.output.write !== "function")
253
+ return false;
254
+ return isOutputLevelAllowed({ level, outputConfig, loggingConfiguration, debugFlag });
255
+ });
294
256
  }
295
-
296
257
  /**
297
258
  * Runs write log.
298
259
  * @param {object} args - Options object.
@@ -304,204 +265,187 @@ function enabledOutputConfigs({level, outputs, loggingConfiguration, debugFlag})
304
265
  * @param {boolean} [args.debugFlag] - Whether debug flag.
305
266
  * @returns {Promise<void>} - Resolves when complete.
306
267
  */
307
- async function writeLog({subject, level, messages, configuration, loggingConfiguration, debugFlag}) {
308
- const resolvedLoggingConfiguration = loggingConfiguration || resolveLoggingConfiguration(configuration)
309
- const outputs = resolveLoggingOutputs({loggingConfiguration: resolvedLoggingConfiguration, configuration})
310
- const enabledOutputs = enabledOutputConfigs({
311
- level,
312
- outputs,
313
- loggingConfiguration: resolvedLoggingConfiguration,
314
- debugFlag
315
- })
316
-
317
- if (enabledOutputs.length === 0) return
318
-
319
- const writes = []
320
- /**
321
- * Types the following value.
322
- @type {Array<?> | undefined} */
323
- let resolvedMessages
324
- /**
325
- * Types the following value.
326
- @type {string | undefined} */
327
- let message
328
- /**
329
- * Payload.
330
- @type {import("./configuration-types.js").LoggingOutputPayload | null} */
331
- let payload = null
332
-
333
- for (const outputConfig of enabledOutputs) {
334
- if (!payload) {
335
- resolvedMessages = functionOrMessages(...messages)
336
- message = messagesToMessage(subject, ...resolvedMessages)
337
- // subject is the first positional arg, then the user messages
338
- payload = {
268
+ async function writeLog({ subject, level, messages, configuration, loggingConfiguration, debugFlag }) {
269
+ const resolvedLoggingConfiguration = loggingConfiguration || resolveLoggingConfiguration(configuration);
270
+ const outputs = resolveLoggingOutputs({ loggingConfiguration: resolvedLoggingConfiguration, configuration });
271
+ const enabledOutputs = enabledOutputConfigs({
339
272
  level,
340
- message,
341
- subject,
342
- timestamp: new Date()
343
- }
273
+ outputs,
274
+ loggingConfiguration: resolvedLoggingConfiguration,
275
+ debugFlag
276
+ });
277
+ if (enabledOutputs.length === 0)
278
+ return;
279
+ const writes = [];
280
+ /**
281
+ * Types the following value.
282
+ @type {Array<?> | undefined} */
283
+ let resolvedMessages;
284
+ /**
285
+ * Types the following value.
286
+ @type {string | undefined} */
287
+ let message;
288
+ /**
289
+ * Payload.
290
+ @type {import("./configuration-types.js").LoggingOutputPayload | null} */
291
+ let payload = null;
292
+ for (const outputConfig of enabledOutputs) {
293
+ if (!payload) {
294
+ resolvedMessages = functionOrMessages(...messages);
295
+ message = messagesToMessage(subject, ...resolvedMessages);
296
+ // subject is the first positional arg, then the user messages
297
+ payload = {
298
+ level,
299
+ message,
300
+ subject,
301
+ timestamp: new Date()
302
+ };
303
+ }
304
+ writes.push(outputConfig.output.write(payload));
305
+ }
306
+ if (writes.length === 1) {
307
+ await writes[0];
308
+ }
309
+ else if (writes.length > 1) {
310
+ await Promise.all(writes);
344
311
  }
345
-
346
- writes.push(outputConfig.output.write(payload))
347
- }
348
-
349
- if (writes.length === 1) {
350
- await writes[0]
351
- } else if (writes.length > 1) {
352
- await Promise.all(writes)
353
- }
354
312
  }
355
-
356
313
  export default class Logger {
357
- /**
358
- * Runs constructor.
359
- * @param {string | object} object - Object.
360
- * @param {object} args - Options object.
361
- * @param {import("./configuration.js").default} [args.configuration] - Configuration instance.
362
- * @param {boolean} [args.debug] - Whether debug.
363
- * @param {import("./configuration-types.js").LoggingConfiguration} [args.loggingConfiguration] - Logging configuration.
364
- */
365
- constructor(object, {configuration, debug = false, loggingConfiguration, ...restArgs} = {}) {
366
- restArgsError(restArgs)
367
-
368
- this._debug = debug
369
- this._configuration = configuration
370
- this._loggingConfiguration = loggingConfiguration
371
-
372
- if (typeof object == "string") {
373
- this._subject = object || "EmptyString"
374
- } else {
375
- this._object = object
376
- this._subject = object.constructor.name || "UnknownClass"
314
+ /**
315
+ * Runs constructor.
316
+ * @param {string | object} object - Object.
317
+ * @param {object} args - Options object.
318
+ * @param {import("./configuration.js").default} [args.configuration] - Configuration instance.
319
+ * @param {boolean} [args.debug] - Whether debug.
320
+ * @param {import("./configuration-types.js").LoggingConfiguration} [args.loggingConfiguration] - Logging configuration.
321
+ */
322
+ constructor(object, { configuration, debug = false, loggingConfiguration, ...restArgs } = {}) {
323
+ restArgsError(restArgs);
324
+ this._debug = debug;
325
+ this._configuration = configuration;
326
+ this._loggingConfiguration = loggingConfiguration;
327
+ if (typeof object == "string") {
328
+ this._subject = object || "EmptyString";
329
+ }
330
+ else {
331
+ this._object = object;
332
+ this._subject = object.constructor.name || "UnknownClass";
333
+ }
377
334
  }
378
- }
379
-
380
- /**
381
- * Runs get configuration.
382
- * @returns {import("./configuration.js").default} - The configuration.
383
- */
384
- getConfiguration() {
385
- if (!this._configuration) {
386
- const objectWithConfig = /**
387
- * Types the following value.
388
- @type {{configuration?: import("./configuration.js").default}} */ (this._object)
389
- this._configuration = objectWithConfig?.configuration || currentConfiguration()
335
+ /**
336
+ * Runs get configuration.
337
+ * @returns {import("./configuration.js").default} - The configuration.
338
+ */
339
+ getConfiguration() {
340
+ if (!this._configuration) {
341
+ const objectWithConfig = /**
342
+ * Types the following value.
343
+ @type {{configuration?: import("./configuration.js").default}} */ (this._object);
344
+ this._configuration = objectWithConfig?.configuration || currentConfiguration();
345
+ }
346
+ return this._configuration;
347
+ }
348
+ /**
349
+ * Runs safe configuration.
350
+ * @returns {import("./configuration.js").default | undefined} - The safe configuration.
351
+ */
352
+ _safeConfiguration() {
353
+ try {
354
+ return this.getConfiguration();
355
+ }
356
+ catch {
357
+ return undefined;
358
+ }
359
+ }
360
+ /**
361
+ * Runs is level enabled.
362
+ * @param {LogLevel} level - Level.
363
+ * @returns {boolean} - Whether any configured output emits this level.
364
+ */
365
+ isLevelEnabled(level) {
366
+ const configuration = this._safeConfiguration();
367
+ const loggingConfiguration = this._loggingConfiguration || resolveLoggingConfiguration(configuration);
368
+ const outputs = resolveLoggingOutputs({ loggingConfiguration, configuration });
369
+ return enabledOutputConfigs({
370
+ level,
371
+ outputs,
372
+ loggingConfiguration,
373
+ debugFlag: this._debug
374
+ }).length > 0;
375
+ }
376
+ /**
377
+ * Runs debug.
378
+ * @param {Array<?>} messages - Messages.
379
+ * @returns {Promise<void>} - Resolves when complete.
380
+ */
381
+ async debug(...messages) {
382
+ await this._write({ level: "debug", messages });
383
+ }
384
+ /**
385
+ * Runs info.
386
+ * @param {Array<?>} messages - Messages.
387
+ * @returns {Promise<void>} - Resolves when complete.
388
+ */
389
+ async info(...messages) {
390
+ await this._write({ level: "info", messages });
391
+ }
392
+ /**
393
+ * Runs debug low level.
394
+ * @param {Array<?>} messages - Messages.
395
+ * @returns {Promise<void>} - Resolves when complete.
396
+ */
397
+ async debugLowLevel(...messages) {
398
+ await this._write({ level: "debug-low-level", messages });
399
+ }
400
+ /**
401
+ * Runs log.
402
+ * @param {Array<?>} messages - Messages.
403
+ * @returns {Promise<void>} - Resolves when complete.
404
+ */
405
+ async log(...messages) {
406
+ await this._write({ level: "info", messages });
407
+ }
408
+ /**
409
+ * Runs error.
410
+ * @param {Array<?>} messages - Messages.
411
+ * @returns {Promise<void>} - Resolves when complete.
412
+ */
413
+ async error(...messages) {
414
+ await this._write({ level: "error", messages });
415
+ }
416
+ /**
417
+ * Runs set debug.
418
+ * @param {boolean} newValue - New value.
419
+ * @returns {void} - No return value.
420
+ */
421
+ setDebug(newValue) {
422
+ this._debug = newValue;
390
423
  }
391
-
392
- return this._configuration
393
- }
394
-
395
- /**
396
- * Runs safe configuration.
397
- * @returns {import("./configuration.js").default | undefined} - The safe configuration.
398
- */
399
- _safeConfiguration() {
400
- try {
401
- return this.getConfiguration()
402
- } catch {
403
- return undefined
424
+ /**
425
+ * Runs warn.
426
+ * @type {(...args: Parameters<typeof functionOrMessages>) => Promise<void>}
427
+ */
428
+ async warn(...messages) {
429
+ await this._write({ level: "warn", messages });
430
+ }
431
+ /**
432
+ * Runs write.
433
+ * @param {object} args - Options object.
434
+ * @param {LogLevel} args.level - Level.
435
+ * @param {Parameters<typeof functionOrMessages>} args.messages - Messages.
436
+ * @returns {Promise<void>} - Resolves when complete.
437
+ */
438
+ async _write({ level, messages }) {
439
+ const configuration = this._safeConfiguration();
440
+ const loggingConfiguration = this._loggingConfiguration || resolveLoggingConfiguration(configuration);
441
+ await writeLog({
442
+ subject: this._subject,
443
+ level,
444
+ messages,
445
+ configuration,
446
+ loggingConfiguration,
447
+ debugFlag: this._debug
448
+ });
404
449
  }
405
- }
406
-
407
- /**
408
- * Runs is level enabled.
409
- * @param {LogLevel} level - Level.
410
- * @returns {boolean} - Whether any configured output emits this level.
411
- */
412
- isLevelEnabled(level) {
413
- const configuration = this._safeConfiguration()
414
- const loggingConfiguration = this._loggingConfiguration || resolveLoggingConfiguration(configuration)
415
- const outputs = resolveLoggingOutputs({loggingConfiguration, configuration})
416
-
417
- return enabledOutputConfigs({
418
- level,
419
- outputs,
420
- loggingConfiguration,
421
- debugFlag: this._debug
422
- }).length > 0
423
- }
424
-
425
- /**
426
- * Runs debug.
427
- * @param {Array<?>} messages - Messages.
428
- * @returns {Promise<void>} - Resolves when complete.
429
- */
430
- async debug(...messages) {
431
- await this._write({level: "debug", messages})
432
- }
433
-
434
- /**
435
- * Runs info.
436
- * @param {Array<?>} messages - Messages.
437
- * @returns {Promise<void>} - Resolves when complete.
438
- */
439
- async info(...messages) {
440
- await this._write({level: "info", messages})
441
- }
442
-
443
- /**
444
- * Runs debug low level.
445
- * @param {Array<?>} messages - Messages.
446
- * @returns {Promise<void>} - Resolves when complete.
447
- */
448
- async debugLowLevel(...messages) {
449
- await this._write({level: "debug-low-level", messages})
450
- }
451
-
452
- /**
453
- * Runs log.
454
- * @param {Array<?>} messages - Messages.
455
- * @returns {Promise<void>} - Resolves when complete.
456
- */
457
- async log(...messages) {
458
- await this._write({level: "info", messages})
459
- }
460
-
461
- /**
462
- * Runs error.
463
- * @param {Array<?>} messages - Messages.
464
- * @returns {Promise<void>} - Resolves when complete.
465
- */
466
- async error(...messages) {
467
- await this._write({level: "error", messages})
468
- }
469
-
470
- /**
471
- * Runs set debug.
472
- * @param {boolean} newValue - New value.
473
- * @returns {void} - No return value.
474
- */
475
- setDebug(newValue) {
476
- this._debug = newValue
477
- }
478
-
479
- /**
480
- * Runs warn.
481
- * @type {(...args: Parameters<typeof functionOrMessages>) => Promise<void>}
482
- */
483
- async warn(...messages) {
484
- await this._write({level: "warn", messages})
485
- }
486
-
487
- /**
488
- * Runs write.
489
- * @param {object} args - Options object.
490
- * @param {LogLevel} args.level - Level.
491
- * @param {Parameters<typeof functionOrMessages>} args.messages - Messages.
492
- * @returns {Promise<void>} - Resolves when complete.
493
- */
494
- async _write({level, messages}) {
495
- const configuration = this._safeConfiguration()
496
- const loggingConfiguration = this._loggingConfiguration || resolveLoggingConfiguration(configuration)
497
-
498
- await writeLog({
499
- subject: this._subject,
500
- level,
501
- messages,
502
- configuration,
503
- loggingConfiguration,
504
- debugFlag: this._debug
505
- })
506
- }
507
450
  }
451
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xvZ2dlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxtQkFBbUIsTUFBTSxvQ0FBb0MsQ0FBQTtBQUNwRSxPQUFPLGdCQUFnQixNQUFNLGlDQUFpQyxDQUFBO0FBQzlELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDRCQUE0QixDQUFBO0FBQy9ELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQTtBQUNuRCxPQUFPLGFBQWEsTUFBTSw0QkFBNEIsQ0FBQTtBQUV0RDs7Z0ZBRWdGO0FBRWhGLE1BQU0sNkJBQTZCLEdBQUc7SUFDcEMsT0FBTyxFQUFFLElBQUk7SUFDYixJQUFJLEVBQUUsS0FBSztJQUNYOzsyQkFFdUI7SUFDdkIsTUFBTSxFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUM7Q0FDbEMsQ0FBQTtBQUVEOzt1QkFFdUI7QUFDdkIsTUFBTSxXQUFXLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQTtBQUV6RTs7OztHQUlHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FBQyxHQUFHLFFBQVE7SUFDckMsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUM5RCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtRQUM1QixRQUFRLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3RELENBQUM7SUFFRCxPQUFPLFFBQVEsQ0FBQTtBQUNqQixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNB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QUE7SUFDOUMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsUUFBUTtRQUNyQixNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUE7SUFDL0MsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxRQUFRLENBQUMsUUFBUTtRQUNmLElBQUksQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFBO0lBQ3hCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBUTtRQUNwQixNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUE7SUFDOUMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFDO1FBQzVCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFBO1FBQy9DLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixJQUFJLDJCQUEyQixDQUFDLGFBQWEsQ0FBQyxDQUFBO1FBRXJHLE1BQU0sUUFBUSxDQUFDO1lBQ2IsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3RCLEtBQUs7WUFDTCxRQUFRO1lBQ1IsYUFBYTtZQUNiLG9CQUFvQjtZQUNwQixTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU07U0FDdkIsQ0FBQyxDQUFBO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCBMb2dnZXJDb25zb2xlT3V0cHV0IGZyb20gXCIuL2xvZ2dlci9vdXRwdXRzL2NvbnNvbGUtb3V0cHV0LmpzXCJcbmltcG9ydCBMb2dnZXJGaWxlT3V0cHV0IGZyb20gXCIuL2xvZ2dlci9vdXRwdXRzL2ZpbGUtb3V0cHV0LmpzXCJcbmltcG9ydCB7Y3VycmVudENvbmZpZ3VyYXRpb259IGZyb20gXCIuL2N1cnJlbnQtY29uZmlndXJhdGlvbi5qc1wiXG5pbXBvcnQge2Zvcm1hdFZhbHVlfSBmcm9tIFwiLi91dGlscy9mb3JtYXQtdmFsdWUuanNcIlxuaW1wb3J0IHJlc3RBcmdzRXJyb3IgZnJvbSBcIi4vdXRpbHMvcmVzdC1hcmdzLWVycm9yLmpzXCJcblxuLyoqXG4gKiBMb2dMZXZlbCB0eXBlLlxuICBAdHlwZWRlZiB7XCJkZWJ1Zy1sb3ctbGV2ZWxcIiB8IFwiZGVidWdcIiB8IFwiaW5mb1wiIHwgXCJ3YXJuXCIgfCBcImVycm9yXCJ9IExvZ0xldmVsICovXG5cbmNvbnN0IERFRkFVTFRfTE9HR0lOR19DT05GSUdVUkFUSU9OID0ge1xuICBjb25zb2xlOiB0cnVlLFxuICBmaWxlOiBmYWxzZSxcbiAgLyoqXG4gICAqIFR5cGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUuXG4gICAgQHR5cGUge0xvZ0xldmVsW119ICovXG4gIGxldmVsczogW1wiaW5mb1wiLCBcIndhcm5cIiwgXCJlcnJvclwiXVxufVxuXG4vKipcbiAqIExldmVsIG9yZGVyLlxuICBAdHlwZSB7TG9nTGV2ZWxbXX0gKi9cbmNvbnN0IExFVkVMX09SREVSID0gW1wiZGVidWctbG93LWxldmVsXCIsIFwiZGVidWdcIiwgXCJpbmZvXCIsIFwid2FyblwiLCBcImVycm9yXCJdXG5cbi8qKlxuICogUnVucyBmdW5jdGlvbiBvciBtZXNzYWdlcy5cbiAqIEBwYXJhbSB7Li4uP3xmdW5jdGlvbigpIDogQXJyYXk8Pz59IG1lc3NhZ2VzIC0gTWVzc2FnZXMuXG4gKiBAcmV0dXJucyB7QXJyYXk8Pz59IC0gRWl0aGVyIHRoZSBmdW5jdGlvbiByZXN1bHQgb3IgdGhlIG1lc3NhZ2VzXG4gKi9cbmZ1bmN0aW9uIGZ1bmN0aW9uT3JNZXNzYWdlcyguLi5tZXNzYWdlcykge1xuICBpZiAobWVzc2FnZXMubGVuZ3RoID09PSAxICYmIHR5cGVvZiBtZXNzYWdlc1swXSA9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjb25zdCByZXN1bHQgPSBtZXNzYWdlc1swXSgpXG4gICAgbWVzc2FnZXMgPSBBcnJheS5pc0FycmF5KHJlc3VsdCkgPyByZXN1bHQgOiBbcmVzdWx0XVxuICB9XG5cbiAgcmV0dXJuIG1lc3NhZ2VzXG59XG5cbi8qKlxuICogRm9ybWF0IGEgc2luZ2xlIHZhbHVlIGZvciBpbmNsdXNpb24gaW4gYSBsb2cgbWVzc2FnZS5cbiAqIEBwYXJhbSB7P30gdmFsdWUgLSBWYWx1ZSB0byBmb3JtYXQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIFN0cmluZyByZXByZXNlbnRhdGlvbi5cbiAqL1xuZnVuY3Rpb24gZm9ybWF0UGFydCh2YWx1ZSkge1xuICBpZiAodmFsdWUgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIHJldHVybiBgJHt2YWx1ZS5tZXNzYWdlfVxcbiR7dmFsdWUuc3RhY2t9YFxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBmb3JtYXRWYWx1ZSh2YWx1ZSlcbiAgfVxuXG4gIHJldHVybiBTdHJpbmcodmFsdWUpXG59XG5cbi8qKlxuICogRm9ybWF0cyB0aGUgdXNlci1zdXBwbGllZCBtZXNzYWdlcyBpbnRvIGEgc2luZ2xlIHN0cmluZy5cbiAqXG4gKiBJZiB0aGUgZmlyc3QgbWVzc2FnZSBpcyBhIHN0cmluZyBjb250YWluaW5nIHByaW50Zi1zdHlsZSBmb3JtYXRcbiAqIHNwZWNpZmllcnMgKGAlc2AsIGAlZGAsIGAlamAsIGAlb2AsIGAlT2AsIG9yIGAlJWApLCB0aGUgcmVtYWluaW5nXG4gKiBtZXNzYWdlcyBhcmUgaW50ZXJwb2xhdGVkIGludG8gaXQgaW4gb3JkZXIgKGxpa2UgYGNvbnNvbGUubG9nYCAvXG4gKiBgdXRpbC5mb3JtYXRgKS4gQW55IGxlZnRvdmVyIG1lc3NhZ2VzIGFyZSBhcHBlbmRlZCB3aXRoIGEgc3BhY2VcbiAqIHNlcGFyYXRvci4gT3RoZXJ3aXNlLCBhbGwgcGFydHMgYXJlIGpvaW5lZCB3aXRoIHNwYWNlcy5cbiAqIEBwYXJhbSB7QXJyYXk8Pz59IG1lc3NhZ2VzIC0gVXNlci1zdXBwbGllZCBtZXNzYWdlIHBhcnRzLlxuICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgZm9ybWF0dGVkIHVzZXIgbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gZm9ybWF0VXNlck1lc3NhZ2VzKG1lc3NhZ2VzKSB7XG4gIGlmIChtZXNzYWdlcy5sZW5ndGggPT09IDApIHJldHVybiBcIlwiXG5cbiAgY29uc3QgZmlyc3QgPSBtZXNzYWdlc1swXVxuXG4gIGlmICh0eXBlb2YgZmlyc3QgPT09IFwic3RyaW5nXCIgJiYgLyVbc2Rqb08lXS8udGVzdChmaXJzdCkpIHtcbiAgICBsZXQgYXJnSW5kZXggPSAxXG4gICAgY29uc3QgZm9ybWF0dGVkID0gZmlyc3QucmVwbGFjZSgvJVtzZGpvTyVdL2csIChtYXRjaCkgPT4ge1xuICAgICAgaWYgKG1hdGNoID09PSBcIiUlXCIpIHJldHVybiBcIiVcIlxuICAgICAgaWYgKGFyZ0luZGV4ID49IG1lc3NhZ2VzLmxlbmd0aCkgcmV0dXJuIG1hdGNoXG5cbiAgICAgIGNvbnN0IHZhbHVlID0gbWVzc2FnZXNbYXJnSW5kZXhdXG5cbiAgICAgIGFyZ0luZGV4ICs9IDFcblxuICAgICAgaWYgKG1hdGNoID09PSBcIiVkXCIpIHtcbiAgICAgICAgLy8gTWF0Y2ggdXRpbC5mb3JtYXQ6IG5ldmVyIHRocm93IGZvciBub24tY29lcmNpYmxlIHZhbHVlcyDigJQgeWllbGQgXCJOYU5cIiBpbnN0ZWFkLlxuICAgICAgICAvLyBOdW1iZXIoU3ltYm9sKCkpIHRocm93cywgc28gY2F0Y2ggYW5kIGZhbGwgYmFjay5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gU3RyaW5nKE51bWJlcih2YWx1ZSkpXG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBcIk5hTlwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChtYXRjaCA9PT0gXCIlalwiIHx8IG1hdGNoID09PSBcIiVvXCIgfHwgbWF0Y2ggPT09IFwiJU9cIikgcmV0dXJuIGZvcm1hdFZhbHVlKHZhbHVlKVxuXG4gICAgICByZXR1cm4gZm9ybWF0UGFydCh2YWx1ZSlcbiAgICB9KVxuXG4gICAgbGV0IG1lc3NhZ2UgPSBmb3JtYXR0ZWRcblxuICAgIGZvciAobGV0IGluZGV4ID0gYXJnSW5kZXg7IGluZGV4IDwgbWVzc2FnZXMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBtZXNzYWdlICs9IGAgJHtmb3JtYXRQYXJ0KG1lc3NhZ2VzW2luZGV4XSl9YFxuICAgIH1cblxuICAgIHJldHVybiBtZXNzYWdlXG4gIH1cblxuICBsZXQgbWVzc2FnZSA9IFwiXCJcblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbWVzc2FnZXMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgaWYgKGluZGV4ID4gMCkgbWVzc2FnZSArPSBcIiBcIlxuICAgIG1lc3NhZ2UgKz0gZm9ybWF0UGFydChtZXNzYWdlc1tpbmRleF0pXG4gIH1cblxuICByZXR1cm4gbWVzc2FnZVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgbG9nZ2VyIHN1YmplY3QgYW5kIG1lc3NhZ2UgcGFydHMgaW50byBhIHNpbmdsZSBsb2cgbGluZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzdWJqZWN0IC0gTG9nZ2VyIHN1YmplY3QgLyBjYXRlZ29yeSBwcmVmaXguXG4gKiBAcGFyYW0gey4uLj99IG1lc3NhZ2VzIC0gVXNlci1zdXBwbGllZCBtZXNzYWdlIHBhcnRzIChzdXBwb3J0cyBwcmludGYtc3R5bGUgZm9ybWF0IHNwZWNpZmllcnMgb24gdGhlIGZpcnN0IHBhcnQpLlxuICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgZm9ybWF0dGVkIGxvZyBsaW5lLlxuICovXG5mdW5jdGlvbiBtZXNzYWdlc1RvTWVzc2FnZShzdWJqZWN0LCAuLi5tZXNzYWdlcykge1xuICBjb25zdCB1c2VyTWVzc2FnZSA9IGZvcm1hdFVzZXJNZXNzYWdlcyhtZXNzYWdlcylcblxuICBpZiAoIXN1YmplY3QpIHJldHVybiB1c2VyTWVzc2FnZVxuICBpZiAoIXVzZXJNZXNzYWdlKSByZXR1cm4gU3RyaW5nKHN1YmplY3QpXG5cbiAgcmV0dXJuIGAke3N1YmplY3R9ICR7dXNlck1lc3NhZ2V9YFxufVxuXG4vKipcbiAqIFJ1bnMgcmVzb2x2ZSBsb2dnaW5nIGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSBjb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAqIEByZXR1cm5zIHtSZXF1aXJlZDxQaWNrPGltcG9ydChcIi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Mb2dnaW5nQ29uZmlndXJhdGlvbiwgXCJjb25zb2xlXCIgfCBcImZpbGVcIiB8IFwibGV2ZWxzXCI+PiAmIFBhcnRpYWw8UGljazxpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTG9nZ2luZ0NvbmZpZ3VyYXRpb24sIFwiZmlsZVBhdGhcIiB8IFwib3V0cHV0c1wiPj59IC0gVGhlIGxvZ2dpbmcgY29uZmlndXJhdGlvbi5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUxvZ2dpbmdDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pIHtcbiAgY29uc3QgZGVidWdFbmFibGVkID0gY29uZmlndXJhdGlvbj8uZGVidWcgPT09IHRydWVcbiAgaWYgKGNvbmZpZ3VyYXRpb24gJiYgdHlwZW9mIGNvbmZpZ3VyYXRpb24uZ2V0TG9nZ2luZ0NvbmZpZ3VyYXRpb24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNvbnN0IHJlc29sdmVkID0gY29uZmlndXJhdGlvbi5nZXRMb2dnaW5nQ29uZmlndXJhdGlvbigpXG5cbiAgICBpZiAoZGVidWdFbmFibGVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5yZXNvbHZlZCxcbiAgICAgICAgY29uc29sZTogdHJ1ZSxcbiAgICAgICAgbGV2ZWxzOiBMRVZFTF9PUkRFUlxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiByZXNvbHZlZFxuICB9XG5cbiAgaWYgKGRlYnVnRW5hYmxlZCkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5ERUZBVUxUX0xPR0dJTkdfQ09ORklHVVJBVElPTixcbiAgICAgIGNvbnNvbGU6IHRydWUsXG4gICAgICBsZXZlbHM6IExFVkVMX09SREVSXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIERFRkFVTFRfTE9HR0lOR19DT05GSUdVUkFUSU9OXG59XG5cbi8qKlxuICogUnVucyBpcyBsZXZlbCBhbGxvd2VkLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAqIEBwYXJhbSB7TG9nTGV2ZWx9IGFyZ3MubGV2ZWwgLSBMZXZlbC5cbiAqIEBwYXJhbSB7TG9nTGV2ZWxbXX0gYXJncy5hbGxvd2VkTGV2ZWxzIC0gQWxsb3dlZCBsZXZlbHMuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmRlYnVnRmxhZ10gLSBXaGV0aGVyIGRlYnVnIGZsYWcuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBXaGV0aGVyIGxldmVsIGFsbG93ZWQuXG4gKi9cbmZ1bmN0aW9uIGlzTGV2ZWxBbGxvd2VkKHtsZXZlbCwgYWxsb3dlZExldmVscywgZGVidWdGbGFnfSkge1xuICBpZiAoYWxsb3dlZExldmVscy5pbmNsdWRlcyhsZXZlbCkpIHJldHVybiB0cnVlXG5cbiAgaWYgKGRlYnVnRmxhZyAmJiBMRVZFTF9PUkRFUi5pbmRleE9mKGxldmVsKSA+PSBMRVZFTF9PUkRFUi5pbmRleE9mKFwiZGVidWdcIikpIHJldHVybiB0cnVlXG5cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qKlxuICogUnVucyByZXNvbHZlIGxvZ2dpbmcgb3V0cHV0cy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Mb2dnaW5nQ29uZmlndXJhdGlvbn0gYXJncy5sb2dnaW5nQ29uZmlndXJhdGlvbiAtIExvZ2dpbmcgY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHQgfCB1bmRlZmluZWR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkxvZ2dpbmdPdXRwdXRDb25maWdbXX0gLSBMb2dnaW5nIG91dHB1dHMuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVMb2dnaW5nT3V0cHV0cyh7bG9nZ2luZ0NvbmZpZ3VyYXRpb24sIGNvbmZpZ3VyYXRpb259KSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGxvZ2dpbmdDb25maWd1cmF0aW9uLm91dHB1dHMpKSByZXR1cm4gbG9nZ2luZ0NvbmZpZ3VyYXRpb24ub3V0cHV0c1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGxvZ2dpbmdDb25maWd1cmF0aW9uLmxvZ2dlcnMpKSB7XG4gICAgLyoqXG4gICAgICogTG9nZ2VyIG91dHB1dHMuXG4gICAgICBAdHlwZSB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkxvZ2dpbmdPdXRwdXRDb25maWdbXX0gKi9cbiAgICBjb25zdCBsb2dnZXJPdXRwdXRzID0gW11cblxuICAgIGZvciAoY29uc3QgbG9nZ2VyIG9mIGxvZ2dpbmdDb25maWd1cmF0aW9uLmxvZ2dlcnMpIHtcbiAgICAgIGlmICghbG9nZ2VyKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBsb2dnZXJDb25maWcgPSAvKipcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFR5cGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB0eXBlIHs/fSAqLyAobG9nZ2VyKVxuXG4gICAgICBpZiAodHlwZW9mIGxvZ2dlckNvbmZpZy50b091dHB1dENvbmZpZyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIGxvZ2dlck91dHB1dHMucHVzaChsb2dnZXJDb25maWcudG9PdXRwdXRDb25maWcoe2NvbmZpZ3VyYXRpb259KSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKGxvZ2dlckNvbmZpZy5vdXRwdXQgJiYgdHlwZW9mIGxvZ2dlckNvbmZpZy5vdXRwdXQud3JpdGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBsb2dnZXJPdXRwdXRzLnB1c2goe1xuICAgICAgICAgIG91dHB1dDogbG9nZ2VyQ29uZmlnLm91dHB1dCxcbiAgICAgICAgICBsZXZlbHM6IGxvZ2dlckNvbmZpZy5sZXZlbHNcbiAgICAgICAgfSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBsb2dnZXJDb25maWcud3JpdGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBsb2dnZXJPdXRwdXRzLnB1c2goe1xuICAgICAgICAgIG91dHB1dDogbG9nZ2VyQ29uZmlnLFxuICAgICAgICAgIGxldmVsczogbG9nZ2VyQ29uZmlnLmxldmVsc1xuICAgICAgICB9KVxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICBjb25zdCBsb2dnZXJOYW1lID0gbG9nZ2VyQ29uZmlnPy5jb25zdHJ1Y3Rvcj8ubmFtZSB8fCBcIlVua25vd25Mb2dnZXJcIlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBMb2dnZXIgbXVzdCBpbXBsZW1lbnQgdG9PdXRwdXRDb25maWcgb3Igd3JpdGU6ICR7bG9nZ2VyTmFtZX1gKVxuICAgIH1cblxuICAgIHJldHVybiBsb2dnZXJPdXRwdXRzXG4gIH1cblxuICAvKipcbiAgICogT3V0cHV0cy5cbiAgICBAdHlwZSB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkxvZ2dpbmdPdXRwdXRDb25maWdbXX0gKi9cbiAgY29uc3Qgb3V0cHV0cyA9IFtdXG4gIGlmIChsb2dnaW5nQ29uZmlndXJhdGlvbi5jb25zb2xlICE9PSBmYWxzZSkge1xuICAgIG91dHB1dHMucHVzaCh7XG4gICAgICBvdXRwdXQ6IG5ldyBMb2dnZXJDb25zb2xlT3V0cHV0KCksXG4gICAgICBsZXZlbHM6IGxvZ2dpbmdDb25maWd1cmF0aW9uLmxldmVsc1xuICAgIH0pXG4gIH1cblxuICBpZiAobG9nZ2luZ0NvbmZpZ3VyYXRpb24uZmlsZSAhPT0gZmFsc2UgJiYgbG9nZ2luZ0NvbmZpZ3VyYXRpb24uZmlsZVBhdGgpIHtcbiAgICBvdXRwdXRzLnB1c2goe1xuICAgICAgb3V0cHV0OiBuZXcgTG9nZ2VyRmlsZU91dHB1dCh7XG4gICAgICAgIGNvbmZpZ3VyYXRpb24sXG4gICAgICAgIGdldENvbmZpZ3VyYXRpb246ICgpID0+IGNvbmZpZ3VyYXRpb24sXG4gICAgICAgIGZpbGVQYXRoOiBsb2dnaW5nQ29uZmlndXJhdGlvbi5maWxlUGF0aFxuICAgICAgfSksXG4gICAgICBsZXZlbHM6IGxvZ2dpbmdDb25maWd1cmF0aW9uLmxldmVsc1xuICAgIH0pXG4gIH1cblxuICByZXR1cm4gb3V0cHV0c1xufVxuXG4vKipcbiAqIFJ1bnMgaXMgb3V0cHV0IGxldmVsIGFsbG93ZWQuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtMb2dMZXZlbH0gYXJncy5sZXZlbCAtIExldmVsLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTG9nZ2luZ091dHB1dENvbmZpZ30gYXJncy5vdXRwdXRDb25maWcgLSBPdXRwdXQgY29uZmlndXJhdGlvbi5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkxvZ2dpbmdDb25maWd1cmF0aW9ufSBhcmdzLmxvZ2dpbmdDb25maWd1cmF0aW9uIC0gTG9nZ2luZyBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5kZWJ1Z0ZsYWddIC0gV2hldGhlciBkZWJ1ZyBmbGFnLlxuICogQHJldHVybnMge2Jvb2xlYW59IC0gV2hldGhlciBvdXRwdXQgc2hvdWxkIGxvZy5cbiAqL1xuZnVuY3Rpb24gaXNPdXRwdXRMZXZlbEFsbG93ZWQoe2xldmVsLCBvdXRwdXRDb25maWcsIGxvZ2dpbmdDb25maWd1cmF0aW9uLCBkZWJ1Z0ZsYWd9KSB7XG4gIGlmIChBcnJheS5pc0FycmF5KG91dHB1dENvbmZpZy5sZXZlbHMpKSB7XG4gICAgcmV0dXJuIGlzTGV2ZWxBbGxvd2VkKHtsZXZlbCwgYWxsb3dlZExldmVsczogb3V0cHV0Q29uZmlnLmxldmVscywgZGVidWdGbGFnOiBmYWxzZX0pXG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShvdXRwdXRDb25maWcub3V0cHV0Py5sZXZlbHMpKSB7XG4gICAgcmV0dXJuIGlzTGV2ZWxBbGxvd2VkKHtsZXZlbCwgYWxsb3dlZExldmVsczogb3V0cHV0Q29uZmlnLm91dHB1dC5sZXZlbHMsIGRlYnVnRmxhZzogZmFsc2V9KVxuICB9XG5cbiAgY29uc3QgYWxsb3dlZExldmVscyA9IGxvZ2dpbmdDb25maWd1cmF0aW9uLmxldmVscyB8fCBERUZBVUxUX0xPR0dJTkdfQ09ORklHVVJBVElPTi5sZXZlbHNcblxuICByZXR1cm4gaXNMZXZlbEFsbG93ZWQoe2xldmVsLCBhbGxvd2VkTGV2ZWxzLCBkZWJ1Z0ZsYWd9KVxufVxuXG4vKipcbiAqIFJ1bnMgZW5hYmxlZCBvdXRwdXQgY29uZmlncy5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gT3B0aW9ucyBvYmplY3QuXG4gKiBAcGFyYW0ge0xvZ0xldmVsfSBhcmdzLmxldmVsIC0gTGV2ZWwuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Mb2dnaW5nT3V0cHV0Q29uZmlnW119IGFyZ3Mub3V0cHV0cyAtIE91dHB1dCBjb25maWd1cmF0aW9ucy5cbiAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkxvZ2dpbmdDb25maWd1cmF0aW9ufSBhcmdzLmxvZ2dpbmdDb25maWd1cmF0aW9uIC0gTG9nZ2luZyBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5kZWJ1Z0ZsYWddIC0gV2hldGhlciBkZWJ1ZyBmbGFnLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Mb2dnaW5nT3V0cHV0Q29uZmlnW119IC0gT3V0cHV0cyBlbmFibGVkIGZvciB0aGUgbGV2ZWwuXG4gKi9cbmZ1bmN0aW9uIGVuYWJsZWRPdXRwdXRDb25maWdzKHtsZXZlbCwgb3V0cHV0cywgbG9nZ2luZ0NvbmZpZ3VyYXRpb24sIGRlYnVnRmxhZ30pIHtcbiAgcmV0dXJuIG91dHB1dHMuZmlsdGVyKChvdXRwdXRDb25maWcpID0+IHtcbiAgICBpZiAoIW91dHB1dENvbmZpZyB8fCAhb3V0cHV0Q29uZmlnLm91dHB1dCB8fCB0eXBlb2Ygb3V0cHV0Q29uZmlnLm91dHB1dC53cml0ZSAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gZmFsc2VcblxuICAgIHJldHVybiBpc091dHB1dExldmVsQWxsb3dlZCh7bGV2ZWwsIG91dHB1dENvbmZpZywgbG9nZ2luZ0NvbmZpZ3VyYXRpb24sIGRlYnVnRmxhZ30pXG4gIH0pXG59XG5cbi8qKlxuICogUnVucyB3cml0ZSBsb2cuXG4gKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIE9wdGlvbnMgb2JqZWN0LlxuICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc3ViamVjdCAtIExvZyBzdWJqZWN0LlxuICogQHBhcmFtIHtMb2dMZXZlbH0gYXJncy5sZXZlbCAtIExldmVsLlxuICogQHBhcmFtIHtQYXJhbWV0ZXJzPHR5cGVvZiBmdW5jdGlvbk9yTWVzc2FnZXM+fSBhcmdzLm1lc3NhZ2VzIC0gTWVzc2FnZXMuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSBhcmdzLmNvbmZpZ3VyYXRpb24gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTG9nZ2luZ0NvbmZpZ3VyYXRpb24gfCB1bmRlZmluZWR9IGFyZ3MubG9nZ2luZ0NvbmZpZ3VyYXRpb24gLSBMb2dnaW5nIGNvbmZpZ3VyYXRpb24uXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmRlYnVnRmxhZ10gLSBXaGV0aGVyIGRlYnVnIGZsYWcuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICovXG5hc3luYyBmdW5jdGlvbiB3cml0ZUxvZyh7c3ViamVjdCwgbGV2ZWwsIG1lc3NhZ2VzLCBjb25maWd1cmF0aW9uLCBsb2dnaW5nQ29uZmlndXJhdGlvbiwgZGVidWdGbGFnfSkge1xuICBjb25zdCByZXNvbHZlZExvZ2dpbmdDb25maWd1cmF0aW9uID0gbG9nZ2luZ0NvbmZpZ3VyYXRpb24gfHwgcmVzb2x2ZUxvZ2dpbmdDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pXG4gIGNvbnN0IG91dHB1dHMgPSByZXNvbHZlTG9nZ2luZ091dHB1dHMoe2xvZ2dpbmdDb25maWd1cmF0aW9uOiByZXNvbHZlZExvZ2dpbmdDb25maWd1cmF0aW9uLCBjb25maWd1cmF0aW9ufSlcbiAgY29uc3QgZW5hYmxlZE91dHB1dHMgPSBlbmFibGVkT3V0cHV0Q29uZmlncyh7XG4gICAgbGV2ZWwsXG4gICAgb3V0cHV0cyxcbiAgICBsb2dnaW5nQ29uZmlndXJhdGlvbjogcmVzb2x2ZWRMb2dnaW5nQ29uZmlndXJhdGlvbixcbiAgICBkZWJ1Z0ZsYWdcbiAgfSlcblxuICBpZiAoZW5hYmxlZE91dHB1dHMubGVuZ3RoID09PSAwKSByZXR1cm5cblxuICBjb25zdCB3cml0ZXMgPSBbXVxuICAvKipcbiAgICogVHlwZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS5cbiAgICBAdHlwZSB7QXJyYXk8Pz4gfCB1bmRlZmluZWR9ICovXG4gIGxldCByZXNvbHZlZE1lc3NhZ2VzXG4gIC8qKlxuICAgKiBUeXBlcyB0aGUgZm9sbG93aW5nIHZhbHVlLlxuICAgIEB0eXBlIHtzdHJpbmcgfCB1bmRlZmluZWR9ICovXG4gIGxldCBtZXNzYWdlXG4gIC8qKlxuICAgKiBQYXlsb2FkLlxuICAgIEB0eXBlIHtpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuTG9nZ2luZ091dHB1dFBheWxvYWQgfCBudWxsfSAqL1xuICBsZXQgcGF5bG9hZCA9IG51bGxcblxuICBmb3IgKGNvbnN0IG91dHB1dENvbmZpZyBvZiBlbmFibGVkT3V0cHV0cykge1xuICAgIGlmICghcGF5bG9hZCkge1xuICAgICAgcmVzb2x2ZWRNZXNzYWdlcyA9IGZ1bmN0aW9uT3JNZXNzYWdlcyguLi5tZXNzYWdlcylcbiAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlc1RvTWVzc2FnZShzdWJqZWN0LCAuLi5yZXNvbHZlZE1lc3NhZ2VzKVxuICAgICAgLy8gc3ViamVjdCBpcyB0aGUgZmlyc3QgcG9zaXRpb25hbCBhcmcsIHRoZW4gdGhlIHVzZXIgbWVzc2FnZXNcbiAgICAgIHBheWxvYWQgPSB7XG4gICAgICAgIGxldmVsLFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBzdWJqZWN0LFxuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKClcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3cml0ZXMucHVzaChvdXRwdXRDb25maWcub3V0cHV0LndyaXRlKHBheWxvYWQpKVxuICB9XG5cbiAgaWYgKHdyaXRlcy5sZW5ndGggPT09IDEpIHtcbiAgICBhd2FpdCB3cml0ZXNbMF1cbiAgfSBlbHNlIGlmICh3cml0ZXMubGVuZ3RoID4gMSkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHdyaXRlcylcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMb2dnZXIge1xuICAvKipcbiAgICogUnVucyBjb25zdHJ1Y3Rvci5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBvYmplY3R9IG9iamVjdCAtIE9iamVjdC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gW2FyZ3MuY29uZmlndXJhdGlvbl0gLSBDb25maWd1cmF0aW9uIGluc3RhbmNlLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmRlYnVnXSAtIFdoZXRoZXIgZGVidWcuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkxvZ2dpbmdDb25maWd1cmF0aW9ufSBbYXJncy5sb2dnaW5nQ29uZmlndXJhdGlvbl0gLSBMb2dnaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvYmplY3QsIHtjb25maWd1cmF0aW9uLCBkZWJ1ZyA9IGZhbHNlLCBsb2dnaW5nQ29uZmlndXJhdGlvbiwgLi4ucmVzdEFyZ3N9ID0ge30pIHtcbiAgICByZXN0QXJnc0Vycm9yKHJlc3RBcmdzKVxuXG4gICAgdGhpcy5fZGVidWcgPSBkZWJ1Z1xuICAgIHRoaXMuX2NvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uXG4gICAgdGhpcy5fbG9nZ2luZ0NvbmZpZ3VyYXRpb24gPSBsb2dnaW5nQ29uZmlndXJhdGlvblxuXG4gICAgaWYgKHR5cGVvZiBvYmplY3QgPT0gXCJzdHJpbmdcIikge1xuICAgICAgdGhpcy5fc3ViamVjdCA9IG9iamVjdCB8fCBcIkVtcHR5U3RyaW5nXCJcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fb2JqZWN0ID0gb2JqZWN0XG4gICAgICB0aGlzLl9zdWJqZWN0ID0gb2JqZWN0LmNvbnN0cnVjdG9yLm5hbWUgfHwgXCJVbmtub3duQ2xhc3NcIlxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGdldCBjb25maWd1cmF0aW9uLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IC0gVGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBnZXRDb25maWd1cmF0aW9uKCkge1xuICAgIGlmICghdGhpcy5fY29uZmlndXJhdGlvbikge1xuICAgICAgY29uc3Qgb2JqZWN0V2l0aENvbmZpZyA9IC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIFR5cGVzIHRoZSBmb2xsb3dpbmcgdmFsdWUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAdHlwZSB7e2NvbmZpZ3VyYXRpb24/OiBpbXBvcnQoXCIuL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH19ICovICh0aGlzLl9vYmplY3QpXG4gICAgICB0aGlzLl9jb25maWd1cmF0aW9uID0gb2JqZWN0V2l0aENvbmZpZz8uY29uZmlndXJhdGlvbiB8fCBjdXJyZW50Q29uZmlndXJhdGlvbigpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZ3VyYXRpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHNhZmUgY29uZmlndXJhdGlvbi5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4vY29uZmlndXJhdGlvbi5qc1wiKS5kZWZhdWx0IHwgdW5kZWZpbmVkfSAtIFRoZSBzYWZlIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBfc2FmZUNvbmZpZ3VyYXRpb24oKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKVxuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGlzIGxldmVsIGVuYWJsZWQuXG4gICAqIEBwYXJhbSB7TG9nTGV2ZWx9IGxldmVsIC0gTGV2ZWwuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFdoZXRoZXIgYW55IGNvbmZpZ3VyZWQgb3V0cHV0IGVtaXRzIHRoaXMgbGV2ZWwuXG4gICAqL1xuICBpc0xldmVsRW5hYmxlZChsZXZlbCkge1xuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLl9zYWZlQ29uZmlndXJhdGlvbigpXG4gICAgY29uc3QgbG9nZ2luZ0NvbmZpZ3VyYXRpb24gPSB0aGlzLl9sb2dnaW5nQ29uZmlndXJhdGlvbiB8fCByZXNvbHZlTG9nZ2luZ0NvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbilcbiAgICBjb25zdCBvdXRwdXRzID0gcmVzb2x2ZUxvZ2dpbmdPdXRwdXRzKHtsb2dnaW5nQ29uZmlndXJhdGlvbiwgY29uZmlndXJhdGlvbn0pXG5cbiAgICByZXR1cm4gZW5hYmxlZE91dHB1dENvbmZpZ3Moe1xuICAgICAgbGV2ZWwsXG4gICAgICBvdXRwdXRzLFxuICAgICAgbG9nZ2luZ0NvbmZpZ3VyYXRpb24sXG4gICAgICBkZWJ1Z0ZsYWc6IHRoaXMuX2RlYnVnXG4gICAgfSkubGVuZ3RoID4gMFxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgZGVidWcuXG4gICAqIEBwYXJhbSB7QXJyYXk8Pz59IG1lc3NhZ2VzIC0gTWVzc2FnZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAtIFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAqL1xuICBhc3luYyBkZWJ1ZyguLi5tZXNzYWdlcykge1xuICAgIGF3YWl0IHRoaXMuX3dyaXRlKHtsZXZlbDogXCJkZWJ1Z1wiLCBtZXNzYWdlc30pXG4gIH1cblxuICAvKipcbiAgICogUnVucyBpbmZvLlxuICAgKiBAcGFyYW0ge0FycmF5PD8+fSBtZXNzYWdlcyAtIE1lc3NhZ2VzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgaW5mbyguLi5tZXNzYWdlcykge1xuICAgIGF3YWl0IHRoaXMuX3dyaXRlKHtsZXZlbDogXCJpbmZvXCIsIG1lc3NhZ2VzfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGRlYnVnIGxvdyBsZXZlbC5cbiAgICogQHBhcmFtIHtBcnJheTw/Pn0gbWVzc2FnZXMgLSBNZXNzYWdlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGRlYnVnTG93TGV2ZWwoLi4ubWVzc2FnZXMpIHtcbiAgICBhd2FpdCB0aGlzLl93cml0ZSh7bGV2ZWw6IFwiZGVidWctbG93LWxldmVsXCIsIG1lc3NhZ2VzfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGxvZy5cbiAgICogQHBhcmFtIHtBcnJheTw/Pn0gbWVzc2FnZXMgLSBNZXNzYWdlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIGxvZyguLi5tZXNzYWdlcykge1xuICAgIGF3YWl0IHRoaXMuX3dyaXRlKHtsZXZlbDogXCJpbmZvXCIsIG1lc3NhZ2VzfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGVycm9yLlxuICAgKiBAcGFyYW0ge0FycmF5PD8+fSBtZXNzYWdlcyAtIE1lc3NhZ2VzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBSZXNvbHZlcyB3aGVuIGNvbXBsZXRlLlxuICAgKi9cbiAgYXN5bmMgZXJyb3IoLi4ubWVzc2FnZXMpIHtcbiAgICBhd2FpdCB0aGlzLl93cml0ZSh7bGV2ZWw6IFwiZXJyb3JcIiwgbWVzc2FnZXN9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgc2V0IGRlYnVnLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IG5ld1ZhbHVlIC0gTmV3IHZhbHVlLlxuICAgKiBAcmV0dXJucyB7dm9pZH0gLSBObyByZXR1cm4gdmFsdWUuXG4gICAqL1xuICBzZXREZWJ1ZyhuZXdWYWx1ZSkge1xuICAgIHRoaXMuX2RlYnVnID0gbmV3VmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIHdhcm4uXG4gICAqIEB0eXBlIHsoLi4uYXJnczogUGFyYW1ldGVyczx0eXBlb2YgZnVuY3Rpb25Pck1lc3NhZ2VzPikgPT4gUHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGFzeW5jIHdhcm4oLi4ubWVzc2FnZXMpIHtcbiAgICBhd2FpdCB0aGlzLl93cml0ZSh7bGV2ZWw6IFwid2FyblwiLCBtZXNzYWdlc30pXG4gIH1cblxuICAvKipcbiAgICogUnVucyB3cml0ZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBPcHRpb25zIG9iamVjdC5cbiAgICogQHBhcmFtIHtMb2dMZXZlbH0gYXJncy5sZXZlbCAtIExldmVsLlxuICAgKiBAcGFyYW0ge1BhcmFtZXRlcnM8dHlwZW9mIGZ1bmN0aW9uT3JNZXNzYWdlcz59IGFyZ3MubWVzc2FnZXMgLSBNZXNzYWdlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IC0gUmVzb2x2ZXMgd2hlbiBjb21wbGV0ZS5cbiAgICovXG4gIGFzeW5jIF93cml0ZSh7bGV2ZWwsIG1lc3NhZ2VzfSkge1xuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLl9zYWZlQ29uZmlndXJhdGlvbigpXG4gICAgY29uc3QgbG9nZ2luZ0NvbmZpZ3VyYXRpb24gPSB0aGlzLl9sb2dnaW5nQ29uZmlndXJhdGlvbiB8fCByZXNvbHZlTG9nZ2luZ0NvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbilcblxuICAgIGF3YWl0IHdyaXRlTG9nKHtcbiAgICAgIHN1YmplY3Q6IHRoaXMuX3N1YmplY3QsXG4gICAgICBsZXZlbCxcbiAgICAgIG1lc3NhZ2VzLFxuICAgICAgY29uZmlndXJhdGlvbixcbiAgICAgIGxvZ2dpbmdDb25maWd1cmF0aW9uLFxuICAgICAgZGVidWdGbGFnOiB0aGlzLl9kZWJ1Z1xuICAgIH0pXG4gIH1cbn1cbiJdfQ==