velocious 1.0.475 → 1.0.476

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 (86) hide show
  1. package/README.md +3 -0
  2. package/build/configuration-types.js +1 -0
  3. package/build/configuration.js +5 -0
  4. package/build/database/drivers/base.js +16 -0
  5. package/build/database/drivers/mssql/index.js +13 -0
  6. package/build/database/drivers/mssql/sql/remove-index.js +6 -0
  7. package/build/database/drivers/mysql/index.js +13 -0
  8. package/build/database/drivers/mysql/sql/remove-index.js +6 -0
  9. package/build/database/drivers/pgsql/index.js +13 -0
  10. package/build/database/drivers/pgsql/sql/remove-index.js +6 -0
  11. package/build/database/drivers/sqlite/base.js +13 -0
  12. package/build/database/drivers/sqlite/sql/remove-index.js +6 -0
  13. package/build/database/migration/index.js +44 -0
  14. package/build/database/pool/base-methods-forward.js +1 -0
  15. package/build/database/query/remove-index-base.js +39 -0
  16. package/build/database/record/index.js +25 -9
  17. package/build/environment-handlers/node/cli/commands/generate/base-models.js +36 -0
  18. package/build/frontend-model-controller.js +275 -1
  19. package/build/routes/hooks/frontend-model-command-route-hook.js +8 -0
  20. package/build/src/configuration-types.d.ts +5 -0
  21. package/build/src/configuration-types.d.ts.map +1 -1
  22. package/build/src/configuration-types.js +2 -1
  23. package/build/src/configuration.d.ts.map +1 -1
  24. package/build/src/configuration.js +6 -1
  25. package/build/src/database/drivers/base.d.ts +20 -0
  26. package/build/src/database/drivers/base.d.ts.map +1 -1
  27. package/build/src/database/drivers/base.js +16 -1
  28. package/build/src/database/drivers/mssql/index.d.ts.map +1 -1
  29. package/build/src/database/drivers/mssql/index.js +12 -1
  30. package/build/src/database/drivers/mssql/sql/remove-index.d.ts +4 -0
  31. package/build/src/database/drivers/mssql/sql/remove-index.d.ts.map +1 -0
  32. package/build/src/database/drivers/mssql/sql/remove-index.js +5 -0
  33. package/build/src/database/drivers/mysql/index.d.ts.map +1 -1
  34. package/build/src/database/drivers/mysql/index.js +12 -1
  35. package/build/src/database/drivers/mysql/sql/remove-index.d.ts +4 -0
  36. package/build/src/database/drivers/mysql/sql/remove-index.d.ts.map +1 -0
  37. package/build/src/database/drivers/mysql/sql/remove-index.js +5 -0
  38. package/build/src/database/drivers/pgsql/index.d.ts.map +1 -1
  39. package/build/src/database/drivers/pgsql/index.js +12 -1
  40. package/build/src/database/drivers/pgsql/sql/remove-index.d.ts +4 -0
  41. package/build/src/database/drivers/pgsql/sql/remove-index.d.ts.map +1 -0
  42. package/build/src/database/drivers/pgsql/sql/remove-index.js +5 -0
  43. package/build/src/database/drivers/sqlite/base.d.ts.map +1 -1
  44. package/build/src/database/drivers/sqlite/base.js +12 -1
  45. package/build/src/database/drivers/sqlite/sql/remove-index.d.ts +4 -0
  46. package/build/src/database/drivers/sqlite/sql/remove-index.d.ts.map +1 -0
  47. package/build/src/database/drivers/sqlite/sql/remove-index.js +5 -0
  48. package/build/src/database/migration/index.d.ts +25 -0
  49. package/build/src/database/migration/index.d.ts.map +1 -1
  50. package/build/src/database/migration/index.js +39 -1
  51. package/build/src/database/pool/base-methods-forward.d.ts.map +1 -1
  52. package/build/src/database/pool/base-methods-forward.js +2 -1
  53. package/build/src/database/query/remove-index-base.d.ts +35 -0
  54. package/build/src/database/query/remove-index-base.d.ts.map +1 -0
  55. package/build/src/database/query/remove-index-base.js +34 -0
  56. package/build/src/database/record/index.d.ts +11 -0
  57. package/build/src/database/record/index.d.ts.map +1 -1
  58. package/build/src/database/record/index.js +26 -11
  59. package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts +15 -0
  60. package/build/src/environment-handlers/node/cli/commands/generate/base-models.d.ts.map +1 -1
  61. package/build/src/environment-handlers/node/cli/commands/generate/base-models.js +33 -1
  62. package/build/src/frontend-model-controller.d.ts +62 -0
  63. package/build/src/frontend-model-controller.d.ts.map +1 -1
  64. package/build/src/frontend-model-controller.js +248 -2
  65. package/build/src/routes/hooks/frontend-model-command-route-hook.d.ts.map +1 -1
  66. package/build/src/routes/hooks/frontend-model-command-route-hook.js +8 -1
  67. package/build/tsconfig.tsbuildinfo +1 -1
  68. package/package.json +1 -1
  69. package/src/configuration-types.js +1 -0
  70. package/src/configuration.js +5 -0
  71. package/src/database/drivers/base.js +16 -0
  72. package/src/database/drivers/mssql/index.js +13 -0
  73. package/src/database/drivers/mssql/sql/remove-index.js +6 -0
  74. package/src/database/drivers/mysql/index.js +13 -0
  75. package/src/database/drivers/mysql/sql/remove-index.js +6 -0
  76. package/src/database/drivers/pgsql/index.js +13 -0
  77. package/src/database/drivers/pgsql/sql/remove-index.js +6 -0
  78. package/src/database/drivers/sqlite/base.js +13 -0
  79. package/src/database/drivers/sqlite/sql/remove-index.js +6 -0
  80. package/src/database/migration/index.js +44 -0
  81. package/src/database/pool/base-methods-forward.js +1 -0
  82. package/src/database/query/remove-index-base.js +39 -0
  83. package/src/database/record/index.js +25 -9
  84. package/src/environment-handlers/node/cli/commands/generate/base-models.js +36 -0
  85. package/src/frontend-model-controller.js +275 -1
  86. package/src/routes/hooks/frontend-model-command-route-hook.js +8 -0
@@ -1 +1 @@
1
- {"version":3,"file":"frontend-model-command-route-hook.d.ts","sourceRoot":"","sources":["../../../../src/routes/hooks/frontend-model-command-route-hook.js"],"names":[],"mappings":"AAQA;;;;;;;GAOG;AACH,8GALG;IAAuD,aAAa,EAA5D,OAAO,wBAAwB,EAAE,OAAO;IAC3B,WAAW,EAAxB,MAAM;IACS,sBAAsB;CAC7C,GAAU,OAAO,CAAC,OAAO,8BAA8B,EAAE,uBAAuB,GAAG,IAAI,CAAC,CA+E1F"}
1
+ {"version":3,"file":"frontend-model-command-route-hook.d.ts","sourceRoot":"","sources":["../../../../src/routes/hooks/frontend-model-command-route-hook.js"],"names":[],"mappings":"AAQA;;;;;;;GAOG;AACH,8GALG;IAAuD,aAAa,EAA5D,OAAO,wBAAwB,EAAE,OAAO;IAC3B,WAAW,EAAxB,MAAM;IACS,sBAAsB;CAC7C,GAAU,OAAO,CAAC,OAAO,8BAA8B,EAAE,uBAAuB,GAAG,IAAI,CAAC,CAuF1F"}
@@ -20,6 +20,13 @@ export default async function frontendModelCommandRouteHook({ configuration, cur
20
20
  controllerPath: FRONTEND_MODEL_CONTROLLER_PATH
21
21
  };
22
22
  }
23
+ if (normalizedCurrentPath === "/frontend-models/sync/replay") {
24
+ return {
25
+ action: "frontend-sync-replay",
26
+ controller: "velocious/api",
27
+ controllerPath: FRONTEND_MODEL_CONTROLLER_PATH
28
+ };
29
+ }
23
30
  if (normalizedCurrentPath === SHARED_FRONTEND_MODEL_API_PATH) {
24
31
  return {
25
32
  action: "frontend-api",
@@ -91,4 +98,4 @@ function normalizePath(path) {
91
98
  }
92
99
  return withLeadingSlash;
93
100
  }
94
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRlbmQtbW9kZWwtY29tbWFuZC1yb3V0ZS1ob29rLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3JvdXRlcy9ob29rcy9mcm9udGVuZC1tb2RlbC1jb21tYW5kLXJvdXRlLWhvb2suanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxtREFBbUQsRUFBQyxNQUFNLDZDQUE2QyxDQUFBO0FBQy9HLE9BQU8sRUFBQyw2QkFBNkIsRUFBRSxpQ0FBaUMsRUFBRSx5QkFBeUIsRUFBQyxNQUFNLDhDQUE4QyxDQUFBO0FBRXhKLE1BQU0sOEJBQThCLEdBQUcsa0JBQWtCLENBQUE7QUFDekQsTUFBTSw4QkFBOEIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxvQ0FBb0MsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQTtBQUUxRzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLFVBQVUsNkJBQTZCLENBQUMsRUFBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLHNCQUFzQixFQUFDO0lBQzlHLE1BQU0scUJBQXFCLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBRXhELElBQUkscUJBQXFCLEtBQUssaUNBQWlDLEVBQUUsQ0FBQztRQUNoRSxPQUFPO1lBQ0wsTUFBTSxFQUFFLHlCQUF5QjtZQUNqQyxVQUFVLEVBQUUsZUFBZTtZQUMzQixjQUFjLEVBQUUsOEJBQThCO1NBQy9DLENBQUE7SUFDSCxDQUFDO0lBRUQsSUFBSSxxQkFBcUIsS0FBSyw4QkFBOEIsRUFBRSxDQUFDO1FBQzdELE9BQU87WUFDTCxNQUFNLEVBQUUsY0FBYztZQUN0QixVQUFVLEVBQUUsZUFBZTtZQUMzQixjQUFjLEVBQUUsOEJBQThCO1NBQy9DLENBQUE7SUFDSCxDQUFDO0lBRUQsb0VBQW9FO0lBQ3BFLElBQUksc0JBQXNCO1FBQUUsT0FBTyxJQUFJLENBQUE7SUFFdkMsTUFBTSxlQUFlLEdBQUcsYUFBYSxDQUFDLGtCQUFrQixFQUFFLENBQUE7SUFDMUQsTUFBTSxrQkFBa0IsR0FBRyxpQ0FBaUMsQ0FBQztRQUMzRCxlQUFlO1FBQ2YsV0FBVyxFQUFFLHFCQUFxQjtLQUNuQyxDQUFDLENBQUE7SUFFRixJQUFJLGtCQUFrQixFQUFFLENBQUM7UUFDdkI7O3VDQUUrQjtRQUMvQixNQUFNLE1BQU0sR0FBRztZQUNiLG9DQUFvQyxFQUFFLGtCQUFrQixDQUFDLFVBQVU7WUFDbkUsK0JBQStCLEVBQUUsa0JBQWtCLENBQUMsS0FBSztZQUN6RCxLQUFLLEVBQUUsa0JBQWtCLENBQUMsU0FBUztTQUNwQyxDQUFBO1FBRUQsSUFBSSxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQyxNQUFNLENBQUMsRUFBRSxHQUFHLGtCQUFrQixDQUFDLFFBQVEsQ0FBQTtRQUN6QyxDQUFDO1FBRUQsT0FBTztZQUNMLE1BQU0sRUFBRSx5QkFBeUI7WUFDakMsVUFBVSxFQUFFLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQztZQUMvRCxjQUFjLEVBQUUsOEJBQThCO1lBQzlDLE1BQU07U0FDUCxDQUFBO0lBQ0gsQ0FBQztJQUVELEtBQUssTUFBTSxjQUFjLElBQUksZUFBZSxFQUFFLENBQUM7UUFDN0MsTUFBTSxTQUFTLEdBQUcsbURBQW1ELENBQUMsY0FBYyxDQUFDLENBQUE7UUFFckYsS0FBSyxNQUFNLFNBQVMsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNsQyxNQUFNLGtCQUFrQixHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUMvQyxNQUFNLFlBQVksR0FBRyx5QkFBeUIsQ0FBQyxTQUFTLEVBQUUsa0JBQWtCLENBQUMsQ0FBQTtZQUM3RSxNQUFNLHNCQUFzQixHQUFHLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQTtZQUMxRCxNQUFNLGNBQWMsR0FBRyxHQUFHLHNCQUFzQixHQUFHLENBQUE7WUFFbkQsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUM7Z0JBQUUsU0FBUTtZQUUvRCxNQUFNLFdBQVcsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQ3RFLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7Z0JBQUUsU0FBUTtZQUV2QyxNQUFNLE1BQU0sR0FBRyw2QkFBNkIsQ0FBQyxFQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQUMsQ0FBQyxDQUFBO1lBQzFGLElBQUksQ0FBQyxNQUFNO2dCQUFFLFNBQVE7WUFDckIsTUFBTSxVQUFVLEdBQUcsc0JBQXNCLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQTtZQUU3RCxPQUFPO2dCQUNMLE1BQU0sRUFBRSxZQUFZLE1BQU0sRUFBRTtnQkFDNUIsVUFBVTtnQkFDVixjQUFjLEVBQUUsOEJBQThCO2FBQy9DLENBQUE7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGFBQWEsQ0FBQyxJQUFJO0lBQ3pCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFBO0lBRWpFLElBQUksZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2hDLE9BQU8sZ0JBQWdCLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUM3QyxDQUFDO0lBRUQsT0FBTyxnQkFBZ0IsQ0FBQTtBQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7ZnJvbnRlbmRNb2RlbFJlc291cmNlc1dpdGhCdWlsdEluc0ZvckJhY2tlbmRQcm9qZWN0fSBmcm9tIFwiLi4vLi4vZnJvbnRlbmQtbW9kZWxzL2J1aWx0LWluLXJlc291cmNlcy5qc1wiXG5pbXBvcnQge2Zyb250ZW5kTW9kZWxBY3Rpb25Gb3JDb21tYW5kLCBmcm9udGVuZE1vZGVsQ3VzdG9tQ29tbWFuZEZvclBhdGgsIGZyb250ZW5kTW9kZWxSZXNvdXJjZVBhdGh9IGZyb20gXCIuLi8uLi9mcm9udGVuZC1tb2RlbHMvcmVzb3VyY2UtZGVmaW5pdGlvbi5qc1wiXG5cbmNvbnN0IFNIQVJFRF9GUk9OVEVORF9NT0RFTF9BUElfUEFUSCA9IFwiL2Zyb250ZW5kLW1vZGVsc1wiXG5jb25zdCBGUk9OVEVORF9NT0RFTF9DT05UUk9MTEVSX1BBVEggPSBuZXcgVVJMKFwiLi4vLi4vZnJvbnRlbmQtbW9kZWwtY29udHJvbGxlci5qc1wiLCBpbXBvcnQubWV0YS51cmwpLmhyZWZcblxuLyoqXG4gKiBSdW5zIGZyb250ZW5kIG1vZGVsIGNvbW1hbmQgcm91dGUgaG9vay5cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gSG9vayBhcmdzLlxuICogQHBhcmFtIHtpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IGFyZ3MuY29uZmlndXJhdGlvbiAtIENvbmZpZ3VyYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jdXJyZW50UGF0aCAtIFJlcXVlc3QgcGF0aCB3aXRob3V0IHF1ZXJ5LlxuICogQHBhcmFtIHtib29sZWFufSBbYXJncy5oYXNNYXRjaGluZ0N1c3RvbVJvdXRlXSAtIFNldCB3aGVuIHRoZSByZXF1ZXN0IHBhdGggbWF0Y2hlcyBhbiBleHBsaWNpdCBjdXN0b20gcm91dGUuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxpbXBvcnQoXCIuLi8uLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLlJvdXRlUmVzb2x2ZXJIb29rUmVzdWx0IHwgbnVsbD59IC0gUm91dGUgb3ZlcnJpZGUgb3IgbnVsbC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gZnJvbnRlbmRNb2RlbENvbW1hbmRSb3V0ZUhvb2soe2NvbmZpZ3VyYXRpb24sIGN1cnJlbnRQYXRoLCBoYXNNYXRjaGluZ0N1c3RvbVJvdXRlfSkge1xuICBjb25zdCBub3JtYWxpemVkQ3VycmVudFBhdGggPSBub3JtYWxpemVQYXRoKGN1cnJlbnRQYXRoKVxuXG4gIGlmIChub3JtYWxpemVkQ3VycmVudFBhdGggPT09IFwiL2Zyb250ZW5kLW1vZGVscy9zeW5jL2Jvb3RzdHJhcFwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogXCJmcm9udGVuZC1zeW5jLWJvb3RzdHJhcFwiLFxuICAgICAgY29udHJvbGxlcjogXCJ2ZWxvY2lvdXMvYXBpXCIsXG4gICAgICBjb250cm9sbGVyUGF0aDogRlJPTlRFTkRfTU9ERUxfQ09OVFJPTExFUl9QQVRIXG4gICAgfVxuICB9XG5cbiAgaWYgKG5vcm1hbGl6ZWRDdXJyZW50UGF0aCA9PT0gU0hBUkVEX0ZST05URU5EX01PREVMX0FQSV9QQVRIKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbjogXCJmcm9udGVuZC1hcGlcIixcbiAgICAgIGNvbnRyb2xsZXI6IFwidmVsb2Npb3VzL2FwaVwiLFxuICAgICAgY29udHJvbGxlclBhdGg6IEZST05URU5EX01PREVMX0NPTlRST0xMRVJfUEFUSFxuICAgIH1cbiAgfVxuXG4gIC8vIERvbid0IGludGVyY2VwdCBwYXRocyB0aGF0IG1hdGNoIGV4cGxpY2l0bHkgZGVmaW5lZCBjdXN0b20gcm91dGVzXG4gIGlmIChoYXNNYXRjaGluZ0N1c3RvbVJvdXRlKSByZXR1cm4gbnVsbFxuXG4gIGNvbnN0IGJhY2tlbmRQcm9qZWN0cyA9IGNvbmZpZ3VyYXRpb24uZ2V0QmFja2VuZFByb2plY3RzKClcbiAgY29uc3QgY3VzdG9tQ29tbWFuZE1hdGNoID0gZnJvbnRlbmRNb2RlbEN1c3RvbUNvbW1hbmRGb3JQYXRoKHtcbiAgICBiYWNrZW5kUHJvamVjdHMsXG4gICAgY3VycmVudFBhdGg6IG5vcm1hbGl6ZWRDdXJyZW50UGF0aFxuICB9KVxuXG4gIGlmIChjdXN0b21Db21tYW5kTWF0Y2gpIHtcbiAgICAvKipcbiAgICAgKiBQYXJhbXMuXG4gICAgICogQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqL1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIGZyb250ZW5kTW9kZWxDdXN0b21Db21tYW5kTWV0aG9kTmFtZTogY3VzdG9tQ29tbWFuZE1hdGNoLm1ldGhvZE5hbWUsXG4gICAgICBmcm9udGVuZE1vZGVsQ3VzdG9tQ29tbWFuZFNjb3BlOiBjdXN0b21Db21tYW5kTWF0Y2guc2NvcGUsXG4gICAgICBtb2RlbDogY3VzdG9tQ29tbWFuZE1hdGNoLm1vZGVsTmFtZVxuICAgIH1cblxuICAgIGlmIChjdXN0b21Db21tYW5kTWF0Y2gubWVtYmVySWQpIHtcbiAgICAgIHBhcmFtcy5pZCA9IGN1c3RvbUNvbW1hbmRNYXRjaC5tZW1iZXJJZFxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246IFwiZnJvbnRlbmQtY3VzdG9tLWNvbW1hbmRcIixcbiAgICAgIGNvbnRyb2xsZXI6IGN1c3RvbUNvbW1hbmRNYXRjaC5yZXNvdXJjZVBhdGgucmVwbGFjZSgvXlxcLysvLCBcIlwiKSxcbiAgICAgIGNvbnRyb2xsZXJQYXRoOiBGUk9OVEVORF9NT0RFTF9DT05UUk9MTEVSX1BBVEgsXG4gICAgICBwYXJhbXNcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IGJhY2tlbmRQcm9qZWN0IG9mIGJhY2tlbmRQcm9qZWN0cykge1xuICAgIGNvbnN0IHJlc291cmNlcyA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZXNXaXRoQnVpbHRJbnNGb3JCYWNrZW5kUHJvamVjdChiYWNrZW5kUHJvamVjdClcblxuICAgIGZvciAoY29uc3QgbW9kZWxOYW1lIGluIHJlc291cmNlcykge1xuICAgICAgY29uc3QgcmVzb3VyY2VEZWZpbml0aW9uID0gcmVzb3VyY2VzW21vZGVsTmFtZV1cbiAgICAgIGNvbnN0IHJlc291cmNlUGF0aCA9IGZyb250ZW5kTW9kZWxSZXNvdXJjZVBhdGgobW9kZWxOYW1lLCByZXNvdXJjZURlZmluaXRpb24pXG4gICAgICBjb25zdCBub3JtYWxpemVkUmVzb3VyY2VQYXRoID0gbm9ybWFsaXplUGF0aChyZXNvdXJjZVBhdGgpXG4gICAgICBjb25zdCBleHBlY3RlZFByZWZpeCA9IGAke25vcm1hbGl6ZWRSZXNvdXJjZVBhdGh9L2BcblxuICAgICAgaWYgKCFub3JtYWxpemVkQ3VycmVudFBhdGguc3RhcnRzV2l0aChleHBlY3RlZFByZWZpeCkpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IGNvbW1hbmROYW1lID0gbm9ybWFsaXplZEN1cnJlbnRQYXRoLnNsaWNlKGV4cGVjdGVkUHJlZml4Lmxlbmd0aClcbiAgICAgIGlmIChjb21tYW5kTmFtZS5pbmNsdWRlcyhcIi9cIikpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IGFjdGlvbiA9IGZyb250ZW5kTW9kZWxBY3Rpb25Gb3JDb21tYW5kKHtjb21tYW5kTmFtZSwgbW9kZWxOYW1lLCByZXNvdXJjZURlZmluaXRpb259KVxuICAgICAgaWYgKCFhY3Rpb24pIGNvbnRpbnVlXG4gICAgICBjb25zdCBjb250cm9sbGVyID0gbm9ybWFsaXplZFJlc291cmNlUGF0aC5yZXBsYWNlKC9eXFwvKy8sIFwiXCIpXG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFjdGlvbjogYGZyb250ZW5kLSR7YWN0aW9ufWAsXG4gICAgICAgIGNvbnRyb2xsZXIsXG4gICAgICAgIGNvbnRyb2xsZXJQYXRoOiBGUk9OVEVORF9NT0RFTF9DT05UUk9MTEVSX1BBVEhcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG4vKipcbiAqIFJ1bnMgbm9ybWFsaXplIHBhdGguXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFBhdGggdmFsdWUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSAtIE5vcm1hbGl6ZWQgcGF0aCB3aXRoIGxlYWRpbmcgc2xhc2ggYW5kIG5vIHRyYWlsaW5nIHNsYXNoLlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVQYXRoKHBhdGgpIHtcbiAgY29uc3Qgd2l0aExlYWRpbmdTbGFzaCA9IHBhdGguc3RhcnRzV2l0aChcIi9cIikgPyBwYXRoIDogYC8ke3BhdGh9YFxuXG4gIGlmICh3aXRoTGVhZGluZ1NsYXNoLmxlbmd0aCA+IDEpIHtcbiAgICByZXR1cm4gd2l0aExlYWRpbmdTbGFzaC5yZXBsYWNlKC9cXC8rJC8sIFwiXCIpXG4gIH1cblxuICByZXR1cm4gd2l0aExlYWRpbmdTbGFzaFxufVxuIl19
101
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbnRlbmQtbW9kZWwtY29tbWFuZC1yb3V0ZS1ob29rLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3JvdXRlcy9ob29rcy9mcm9udGVuZC1tb2RlbC1jb21tYW5kLXJvdXRlLWhvb2suanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxtREFBbUQsRUFBQyxNQUFNLDZDQUE2QyxDQUFBO0FBQy9HLE9BQU8sRUFBQyw2QkFBNkIsRUFBRSxpQ0FBaUMsRUFBRSx5QkFBeUIsRUFBQyxNQUFNLDhDQUE4QyxDQUFBO0FBRXhKLE1BQU0sOEJBQThCLEdBQUcsa0JBQWtCLENBQUE7QUFDekQsTUFBTSw4QkFBOEIsR0FBRyxJQUFJLEdBQUcsQ0FBQyxvQ0FBb0MsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQTtBQUUxRzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLFVBQVUsNkJBQTZCLENBQUMsRUFBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLHNCQUFzQixFQUFDO0lBQzlHLE1BQU0scUJBQXFCLEdBQUcsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFBO0lBRXhELElBQUkscUJBQXFCLEtBQUssaUNBQWlDLEVBQUUsQ0FBQztRQUNoRSxPQUFPO1lBQ0wsTUFBTSxFQUFFLHlCQUF5QjtZQUNqQyxVQUFVLEVBQUUsZUFBZTtZQUMzQixjQUFjLEVBQUUsOEJBQThCO1NBQy9DLENBQUE7SUFDSCxDQUFDO0lBRUQsSUFBSSxxQkFBcUIsS0FBSyw4QkFBOEIsRUFBRSxDQUFDO1FBQzdELE9BQU87WUFDTCxNQUFNLEVBQUUsc0JBQXNCO1lBQzlCLFVBQVUsRUFBRSxlQUFlO1lBQzNCLGNBQWMsRUFBRSw4QkFBOEI7U0FDL0MsQ0FBQTtJQUNILENBQUM7SUFFRCxJQUFJLHFCQUFxQixLQUFLLDhCQUE4QixFQUFFLENBQUM7UUFDN0QsT0FBTztZQUNMLE1BQU0sRUFBRSxjQUFjO1lBQ3RCLFVBQVUsRUFBRSxlQUFlO1lBQzNCLGNBQWMsRUFBRSw4QkFBOEI7U0FDL0MsQ0FBQTtJQUNILENBQUM7SUFFRCxvRUFBb0U7SUFDcEUsSUFBSSxzQkFBc0I7UUFBRSxPQUFPLElBQUksQ0FBQTtJQUV2QyxNQUFNLGVBQWUsR0FBRyxhQUFhLENBQUMsa0JBQWtCLEVBQUUsQ0FBQTtJQUMxRCxNQUFNLGtCQUFrQixHQUFHLGlDQUFpQyxDQUFDO1FBQzNELGVBQWU7UUFDZixXQUFXLEVBQUUscUJBQXFCO0tBQ25DLENBQUMsQ0FBQTtJQUVGLElBQUksa0JBQWtCLEVBQUUsQ0FBQztRQUN2Qjs7dUNBRStCO1FBQy9CLE1BQU0sTUFBTSxHQUFHO1lBQ2Isb0NBQW9DLEVBQUUsa0JBQWtCLENBQUMsVUFBVTtZQUNuRSwrQkFBK0IsRUFBRSxrQkFBa0IsQ0FBQyxLQUFLO1lBQ3pELEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxTQUFTO1NBQ3BDLENBQUE7UUFFRCxJQUFJLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2hDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsa0JBQWtCLENBQUMsUUFBUSxDQUFBO1FBQ3pDLENBQUM7UUFFRCxPQUFPO1lBQ0wsTUFBTSxFQUFFLHlCQUF5QjtZQUNqQyxVQUFVLEVBQUUsa0JBQWtCLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO1lBQy9ELGNBQWMsRUFBRSw4QkFBOEI7WUFDOUMsTUFBTTtTQUNQLENBQUE7SUFDSCxDQUFDO0lBRUQsS0FBSyxNQUFNLGNBQWMsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUM3QyxNQUFNLFNBQVMsR0FBRyxtREFBbUQsQ0FBQyxjQUFjLENBQUMsQ0FBQTtRQUVyRixLQUFLLE1BQU0sU0FBUyxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sa0JBQWtCLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQy9DLE1BQU0sWUFBWSxHQUFHLHlCQUF5QixDQUFDLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFBO1lBQzdFLE1BQU0sc0JBQXNCLEdBQUcsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFBO1lBQzFELE1BQU0sY0FBYyxHQUFHLEdBQUcsc0JBQXNCLEdBQUcsQ0FBQTtZQUVuRCxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQztnQkFBRSxTQUFRO1lBRS9ELE1BQU0sV0FBVyxHQUFHLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDdEUsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQztnQkFBRSxTQUFRO1lBRXZDLE1BQU0sTUFBTSxHQUFHLDZCQUE2QixDQUFDLEVBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxrQkFBa0IsRUFBQyxDQUFDLENBQUE7WUFDMUYsSUFBSSxDQUFDLE1BQU07Z0JBQUUsU0FBUTtZQUNyQixNQUFNLFVBQVUsR0FBRyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFBO1lBRTdELE9BQU87Z0JBQ0wsTUFBTSxFQUFFLFlBQVksTUFBTSxFQUFFO2dCQUM1QixVQUFVO2dCQUNWLGNBQWMsRUFBRSw4QkFBOEI7YUFDL0MsQ0FBQTtRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQVMsYUFBYSxDQUFDLElBQUk7SUFDekIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUE7SUFFakUsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDaEMsT0FBTyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0lBQzdDLENBQUM7SUFFRCxPQUFPLGdCQUFnQixDQUFBO0FBQ3pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtmcm9udGVuZE1vZGVsUmVzb3VyY2VzV2l0aEJ1aWx0SW5zRm9yQmFja2VuZFByb2plY3R9IGZyb20gXCIuLi8uLi9mcm9udGVuZC1tb2RlbHMvYnVpbHQtaW4tcmVzb3VyY2VzLmpzXCJcbmltcG9ydCB7ZnJvbnRlbmRNb2RlbEFjdGlvbkZvckNvbW1hbmQsIGZyb250ZW5kTW9kZWxDdXN0b21Db21tYW5kRm9yUGF0aCwgZnJvbnRlbmRNb2RlbFJlc291cmNlUGF0aH0gZnJvbSBcIi4uLy4uL2Zyb250ZW5kLW1vZGVscy9yZXNvdXJjZS1kZWZpbml0aW9uLmpzXCJcblxuY29uc3QgU0hBUkVEX0ZST05URU5EX01PREVMX0FQSV9QQVRIID0gXCIvZnJvbnRlbmQtbW9kZWxzXCJcbmNvbnN0IEZST05URU5EX01PREVMX0NPTlRST0xMRVJfUEFUSCA9IG5ldyBVUkwoXCIuLi8uLi9mcm9udGVuZC1tb2RlbC1jb250cm9sbGVyLmpzXCIsIGltcG9ydC5tZXRhLnVybCkuaHJlZlxuXG4vKipcbiAqIFJ1bnMgZnJvbnRlbmQgbW9kZWwgY29tbWFuZCByb3V0ZSBob29rLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBIb29rIGFyZ3MuXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gYXJncy5jb25maWd1cmF0aW9uIC0gQ29uZmlndXJhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmN1cnJlbnRQYXRoIC0gUmVxdWVzdCBwYXRoIHdpdGhvdXQgcXVlcnkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmhhc01hdGNoaW5nQ3VzdG9tUm91dGVdIC0gU2V0IHdoZW4gdGhlIHJlcXVlc3QgcGF0aCBtYXRjaGVzIGFuIGV4cGxpY2l0IGN1c3RvbSByb3V0ZS5cbiAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4uLy4uL2NvbmZpZ3VyYXRpb24tdHlwZXMuanNcIikuUm91dGVSZXNvbHZlckhvb2tSZXN1bHQgfCBudWxsPn0gLSBSb3V0ZSBvdmVycmlkZSBvciBudWxsLlxuICovXG5leHBvcnQgZGVmYXVsdCBhc3luYyBmdW5jdGlvbiBmcm9udGVuZE1vZGVsQ29tbWFuZFJvdXRlSG9vayh7Y29uZmlndXJhdGlvbiwgY3VycmVudFBhdGgsIGhhc01hdGNoaW5nQ3VzdG9tUm91dGV9KSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRDdXJyZW50UGF0aCA9IG5vcm1hbGl6ZVBhdGgoY3VycmVudFBhdGgpXG5cbiAgaWYgKG5vcm1hbGl6ZWRDdXJyZW50UGF0aCA9PT0gXCIvZnJvbnRlbmQtbW9kZWxzL3N5bmMvYm9vdHN0cmFwXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiBcImZyb250ZW5kLXN5bmMtYm9vdHN0cmFwXCIsXG4gICAgICBjb250cm9sbGVyOiBcInZlbG9jaW91cy9hcGlcIixcbiAgICAgIGNvbnRyb2xsZXJQYXRoOiBGUk9OVEVORF9NT0RFTF9DT05UUk9MTEVSX1BBVEhcbiAgICB9XG4gIH1cblxuICBpZiAobm9ybWFsaXplZEN1cnJlbnRQYXRoID09PSBcIi9mcm9udGVuZC1tb2RlbHMvc3luYy9yZXBsYXlcIikge1xuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246IFwiZnJvbnRlbmQtc3luYy1yZXBsYXlcIixcbiAgICAgIGNvbnRyb2xsZXI6IFwidmVsb2Npb3VzL2FwaVwiLFxuICAgICAgY29udHJvbGxlclBhdGg6IEZST05URU5EX01PREVMX0NPTlRST0xMRVJfUEFUSFxuICAgIH1cbiAgfVxuXG4gIGlmIChub3JtYWxpemVkQ3VycmVudFBhdGggPT09IFNIQVJFRF9GUk9OVEVORF9NT0RFTF9BUElfUEFUSCkge1xuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb246IFwiZnJvbnRlbmQtYXBpXCIsXG4gICAgICBjb250cm9sbGVyOiBcInZlbG9jaW91cy9hcGlcIixcbiAgICAgIGNvbnRyb2xsZXJQYXRoOiBGUk9OVEVORF9NT0RFTF9DT05UUk9MTEVSX1BBVEhcbiAgICB9XG4gIH1cblxuICAvLyBEb24ndCBpbnRlcmNlcHQgcGF0aHMgdGhhdCBtYXRjaCBleHBsaWNpdGx5IGRlZmluZWQgY3VzdG9tIHJvdXRlc1xuICBpZiAoaGFzTWF0Y2hpbmdDdXN0b21Sb3V0ZSkgcmV0dXJuIG51bGxcblxuICBjb25zdCBiYWNrZW5kUHJvamVjdHMgPSBjb25maWd1cmF0aW9uLmdldEJhY2tlbmRQcm9qZWN0cygpXG4gIGNvbnN0IGN1c3RvbUNvbW1hbmRNYXRjaCA9IGZyb250ZW5kTW9kZWxDdXN0b21Db21tYW5kRm9yUGF0aCh7XG4gICAgYmFja2VuZFByb2plY3RzLFxuICAgIGN1cnJlbnRQYXRoOiBub3JtYWxpemVkQ3VycmVudFBhdGhcbiAgfSlcblxuICBpZiAoY3VzdG9tQ29tbWFuZE1hdGNoKSB7XG4gICAgLyoqXG4gICAgICogUGFyYW1zLlxuICAgICAqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCA/Pn0gKi9cbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICBmcm9udGVuZE1vZGVsQ3VzdG9tQ29tbWFuZE1ldGhvZE5hbWU6IGN1c3RvbUNvbW1hbmRNYXRjaC5tZXRob2ROYW1lLFxuICAgICAgZnJvbnRlbmRNb2RlbEN1c3RvbUNvbW1hbmRTY29wZTogY3VzdG9tQ29tbWFuZE1hdGNoLnNjb3BlLFxuICAgICAgbW9kZWw6IGN1c3RvbUNvbW1hbmRNYXRjaC5tb2RlbE5hbWVcbiAgICB9XG5cbiAgICBpZiAoY3VzdG9tQ29tbWFuZE1hdGNoLm1lbWJlcklkKSB7XG4gICAgICBwYXJhbXMuaWQgPSBjdXN0b21Db21tYW5kTWF0Y2gubWVtYmVySWRcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWN0aW9uOiBcImZyb250ZW5kLWN1c3RvbS1jb21tYW5kXCIsXG4gICAgICBjb250cm9sbGVyOiBjdXN0b21Db21tYW5kTWF0Y2gucmVzb3VyY2VQYXRoLnJlcGxhY2UoL15cXC8rLywgXCJcIiksXG4gICAgICBjb250cm9sbGVyUGF0aDogRlJPTlRFTkRfTU9ERUxfQ09OVFJPTExFUl9QQVRILFxuICAgICAgcGFyYW1zXG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBiYWNrZW5kUHJvamVjdCBvZiBiYWNrZW5kUHJvamVjdHMpIHtcbiAgICBjb25zdCByZXNvdXJjZXMgPSBmcm9udGVuZE1vZGVsUmVzb3VyY2VzV2l0aEJ1aWx0SW5zRm9yQmFja2VuZFByb2plY3QoYmFja2VuZFByb2plY3QpXG5cbiAgICBmb3IgKGNvbnN0IG1vZGVsTmFtZSBpbiByZXNvdXJjZXMpIHtcbiAgICAgIGNvbnN0IHJlc291cmNlRGVmaW5pdGlvbiA9IHJlc291cmNlc1ttb2RlbE5hbWVdXG4gICAgICBjb25zdCByZXNvdXJjZVBhdGggPSBmcm9udGVuZE1vZGVsUmVzb3VyY2VQYXRoKG1vZGVsTmFtZSwgcmVzb3VyY2VEZWZpbml0aW9uKVxuICAgICAgY29uc3Qgbm9ybWFsaXplZFJlc291cmNlUGF0aCA9IG5vcm1hbGl6ZVBhdGgocmVzb3VyY2VQYXRoKVxuICAgICAgY29uc3QgZXhwZWN0ZWRQcmVmaXggPSBgJHtub3JtYWxpemVkUmVzb3VyY2VQYXRofS9gXG5cbiAgICAgIGlmICghbm9ybWFsaXplZEN1cnJlbnRQYXRoLnN0YXJ0c1dpdGgoZXhwZWN0ZWRQcmVmaXgpKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBjb21tYW5kTmFtZSA9IG5vcm1hbGl6ZWRDdXJyZW50UGF0aC5zbGljZShleHBlY3RlZFByZWZpeC5sZW5ndGgpXG4gICAgICBpZiAoY29tbWFuZE5hbWUuaW5jbHVkZXMoXCIvXCIpKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBhY3Rpb24gPSBmcm9udGVuZE1vZGVsQWN0aW9uRm9yQ29tbWFuZCh7Y29tbWFuZE5hbWUsIG1vZGVsTmFtZSwgcmVzb3VyY2VEZWZpbml0aW9ufSlcbiAgICAgIGlmICghYWN0aW9uKSBjb250aW51ZVxuICAgICAgY29uc3QgY29udHJvbGxlciA9IG5vcm1hbGl6ZWRSZXNvdXJjZVBhdGgucmVwbGFjZSgvXlxcLysvLCBcIlwiKVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBhY3Rpb246IGBmcm9udGVuZC0ke2FjdGlvbn1gLFxuICAgICAgICBjb250cm9sbGVyLFxuICAgICAgICBjb250cm9sbGVyUGF0aDogRlJPTlRFTkRfTU9ERUxfQ09OVFJPTExFUl9QQVRIXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuLyoqXG4gKiBSdW5zIG5vcm1hbGl6ZSBwYXRoLlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBQYXRoIHZhbHVlLlxuICogQHJldHVybnMge3N0cmluZ30gLSBOb3JtYWxpemVkIHBhdGggd2l0aCBsZWFkaW5nIHNsYXNoIGFuZCBubyB0cmFpbGluZyBzbGFzaC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUGF0aChwYXRoKSB7XG4gIGNvbnN0IHdpdGhMZWFkaW5nU2xhc2ggPSBwYXRoLnN0YXJ0c1dpdGgoXCIvXCIpID8gcGF0aCA6IGAvJHtwYXRofWBcblxuICBpZiAod2l0aExlYWRpbmdTbGFzaC5sZW5ndGggPiAxKSB7XG4gICAgcmV0dXJuIHdpdGhMZWFkaW5nU2xhc2gucmVwbGFjZSgvXFwvKyQvLCBcIlwiKVxuICB9XG5cbiAgcmV0dXJuIHdpdGhMZWFkaW5nU2xhc2hcbn1cbiJdfQ==
@@ -1 +1 @@
1
- {"root":["../index.js","../bin/velocious.js","../src/application.js","../src/configuration-resolver.js","../src/configuration-types.js","../src/configuration.js","../src/controller.js","../src/current-configuration.js","../src/current.js","../src/error-logger.js","../src/frontend-model-controller.js","../src/initializer.js","../src/logger.js","../src/mailer.js","../src/record-payload-values.js","../src/time-zone.js","../src/velocious-error.js","../src/authorization/ability.js","../src/authorization/base-resource.js","../src/background-jobs/client.js","../src/background-jobs/cron-expression.js","../src/background-jobs/forked-runner-child.js","../src/background-jobs/job-record.js","../src/background-jobs/job-registry.js","../src/background-jobs/job-runner.js","../src/background-jobs/job.js","../src/background-jobs/json-socket.js","../src/background-jobs/main.js","../src/background-jobs/normalize-error.js","../src/background-jobs/scheduler.js","../src/background-jobs/socket-request.js","../src/background-jobs/status-reporter.js","../src/background-jobs/store.js","../src/background-jobs/types.js","../src/background-jobs/worker.js","../src/background-jobs/web/authorization.js","../src/background-jobs/web/controller.js","../src/background-jobs/web/index.js","../src/background-jobs/web/path-matcher.js","../src/background-jobs/web/registry.js","../src/beacon/client.js","../src/beacon/in-process-broker.js","../src/beacon/in-process-client.js","../src/beacon/server.js","../src/beacon/types.js","../src/cli/base-command.js","../src/cli/browser-cli.js","../src/cli/index.js","../src/cli/tenant-database-command-helper.js","../src/cli/use-browser-cli.js","../src/cli/commands/background-jobs-main.js","../src/cli/commands/background-jobs-runner.js","../src/cli/commands/background-jobs-worker.js","../src/cli/commands/beacon.js","../src/cli/commands/console.js","../src/cli/commands/init.js","../src/cli/commands/routes.js","../src/cli/commands/run-script.js","../src/cli/commands/runner.js","../src/cli/commands/server.js","../src/cli/commands/test.js","../src/cli/commands/db/base-command.js","../src/cli/commands/db/create.js","../src/cli/commands/db/drop.js","../src/cli/commands/db/migrate.js","../src/cli/commands/db/reset.js","../src/cli/commands/db/rollback.js","../src/cli/commands/db/seed.js","../src/cli/commands/db/schema/dump.js","../src/cli/commands/db/schema/load.js","../src/cli/commands/db/tenants/check.js","../src/cli/commands/db/tenants/create.js","../src/cli/commands/db/tenants/migrate.js","../src/cli/commands/destroy/migration.js","../src/cli/commands/generate/base-models.js","../src/cli/commands/generate/frontend-models.js","../src/cli/commands/generate/migration.js","../src/cli/commands/generate/model.js","../src/cli/commands/lint/relationships.js","../src/database/annotations-async-hooks.js","../src/database/annotations.js","../src/database/datetime-storage.js","../src/database/handler.js","../src/database/initializer-from-require-context.js","../src/database/migrator.js","../src/database/use-database.js","../src/database/drivers/base-column.js","../src/database/drivers/base-columns-index.js","../src/database/drivers/base-foreign-key.js","../src/database/drivers/base-table.js","../src/database/drivers/base.js","../src/database/drivers/mssql/column.js","../src/database/drivers/mssql/columns-index.js","../src/database/drivers/mssql/connect-connection.js","../src/database/drivers/mssql/foreign-key.js","../src/database/drivers/mssql/index.js","../src/database/drivers/mssql/options.js","../src/database/drivers/mssql/query-parser.js","../src/database/drivers/mssql/structure-sql.js","../src/database/drivers/mssql/table.js","../src/database/drivers/mssql/sql/alter-table.js","../src/database/drivers/mssql/sql/create-database.js","../src/database/drivers/mssql/sql/create-index.js","../src/database/drivers/mssql/sql/create-table.js","../src/database/drivers/mssql/sql/delete.js","../src/database/drivers/mssql/sql/drop-database.js","../src/database/drivers/mssql/sql/drop-table.js","../src/database/drivers/mssql/sql/insert.js","../src/database/drivers/mssql/sql/update.js","../src/database/drivers/mssql/sql/upsert.js","../src/database/drivers/mysql/column.js","../src/database/drivers/mysql/columns-index.js","../src/database/drivers/mysql/foreign-key.js","../src/database/drivers/mysql/index.js","../src/database/drivers/mysql/options.js","../src/database/drivers/mysql/query-parser.js","../src/database/drivers/mysql/query.js","../src/database/drivers/mysql/structure-sql.js","../src/database/drivers/mysql/table.js","../src/database/drivers/mysql/sql/alter-table.js","../src/database/drivers/mysql/sql/create-database.js","../src/database/drivers/mysql/sql/create-index.js","../src/database/drivers/mysql/sql/create-table.js","../src/database/drivers/mysql/sql/delete.js","../src/database/drivers/mysql/sql/drop-database.js","../src/database/drivers/mysql/sql/drop-table.js","../src/database/drivers/mysql/sql/insert.js","../src/database/drivers/mysql/sql/update.js","../src/database/drivers/mysql/sql/upsert.js","../src/database/drivers/pgsql/column.js","../src/database/drivers/pgsql/columns-index.js","../src/database/drivers/pgsql/foreign-key.js","../src/database/drivers/pgsql/index.js","../src/database/drivers/pgsql/options.js","../src/database/drivers/pgsql/query-parser.js","../src/database/drivers/pgsql/structure-sql.js","../src/database/drivers/pgsql/table.js","../src/database/drivers/pgsql/sql/alter-table.js","../src/database/drivers/pgsql/sql/create-database.js","../src/database/drivers/pgsql/sql/create-index.js","../src/database/drivers/pgsql/sql/create-table.js","../src/database/drivers/pgsql/sql/delete.js","../src/database/drivers/pgsql/sql/drop-database.js","../src/database/drivers/pgsql/sql/drop-table.js","../src/database/drivers/pgsql/sql/insert.js","../src/database/drivers/pgsql/sql/update.js","../src/database/drivers/pgsql/sql/upsert.js","../src/database/drivers/sqlite/base.js","../src/database/drivers/sqlite/column.js","../src/database/drivers/sqlite/columns-index.js","../src/database/drivers/sqlite/connection-sql-js.js","../src/database/drivers/sqlite/foreign-key.js","../src/database/drivers/sqlite/index.js","../src/database/drivers/sqlite/index.native.js","../src/database/drivers/sqlite/index.web.js","../src/database/drivers/sqlite/options.js","../src/database/drivers/sqlite/query-parser.js","../src/database/drivers/sqlite/query.js","../src/database/drivers/sqlite/query.native.js","../src/database/drivers/sqlite/query.web.js","../src/database/drivers/sqlite/structure-sql.js","../src/database/drivers/sqlite/table-rebuilder.js","../src/database/drivers/sqlite/table.js","../src/database/drivers/sqlite/web-persistence.js","../src/database/drivers/sqlite/sql/alter-table.js","../src/database/drivers/sqlite/sql/create-index.js","../src/database/drivers/sqlite/sql/create-table.js","../src/database/drivers/sqlite/sql/delete.js","../src/database/drivers/sqlite/sql/drop-table.js","../src/database/drivers/sqlite/sql/insert.js","../src/database/drivers/sqlite/sql/update.js","../src/database/drivers/sqlite/sql/upsert.js","../src/database/drivers/structure-sql/utils.js","../src/database/migration/index.js","../src/database/migrator/files-finder.js","../src/database/migrator/types.js","../src/database/pool/async-tracked-multi-connection.js","../src/database/pool/base-methods-forward.js","../src/database/pool/base.js","../src/database/pool/single-multi-use.js","../src/database/query/alter-table-base.js","../src/database/query/base.js","../src/database/query/create-database-base.js","../src/database/query/create-index-base.js","../src/database/query/create-table-base.js","../src/database/query/delete-base.js","../src/database/query/drop-database-base.js","../src/database/query/drop-table-base.js","../src/database/query/from-base.js","../src/database/query/from-plain.js","../src/database/query/from-table.js","../src/database/query/index.js","../src/database/query/insert-base.js","../src/database/query/join-base.js","../src/database/query/join-object.js","../src/database/query/join-plain.js","../src/database/query/join-tracker.js","../src/database/query/model-class-query.js","../src/database/query/order-base.js","../src/database/query/order-column.js","../src/database/query/order-plain.js","../src/database/query/preloader.js","../src/database/query/query-data.js","../src/database/query/select-base.js","../src/database/query/select-plain.js","../src/database/query/select-table-and-column.js","../src/database/query/update-base.js","../src/database/query/upsert-base.js","../src/database/query/where-base.js","../src/database/query/where-combinator.js","../src/database/query/where-hash.js","../src/database/query/where-model-class-hash.js","../src/database/query/where-not.js","../src/database/query/where-plain.js","../src/database/query/with-count.js","../src/database/query/preloader/belongs-to.js","../src/database/query/preloader/ensure-model-class-initialized.js","../src/database/query/preloader/has-many.js","../src/database/query/preloader/has-one.js","../src/database/query/preloader/selection.js","../src/database/query-parser/base-query-parser.js","../src/database/query-parser/from-parser.js","../src/database/query-parser/group-parser.js","../src/database/query-parser/joins-parser.js","../src/database/query-parser/limit-parser.js","../src/database/query-parser/options.js","../src/database/query-parser/order-parser.js","../src/database/query-parser/select-parser.js","../src/database/query-parser/where-parser.js","../src/database/record/acts-as-list.js","../src/database/record/index.js","../src/database/record/record-not-found-error.js","../src/database/record/state-machine.js","../src/database/record/user-module.js","../src/database/record/attachments/attachment-record.js","../src/database/record/attachments/download.js","../src/database/record/attachments/handle.js","../src/database/record/attachments/normalize-input.js","../src/database/record/attachments/store.js","../src/database/record/attachments/storage-drivers/filesystem.js","../src/database/record/attachments/storage-drivers/native.js","../src/database/record/attachments/storage-drivers/s3.js","../src/database/record/instance-relationships/base.js","../src/database/record/instance-relationships/belongs-to.js","../src/database/record/instance-relationships/has-many.js","../src/database/record/instance-relationships/has-one.js","../src/database/record/relationships/base.js","../src/database/record/relationships/belongs-to.js","../src/database/record/relationships/has-many.js","../src/database/record/relationships/has-one.js","../src/database/record/validators/base.js","../src/database/record/validators/format.js","../src/database/record/validators/presence.js","../src/database/record/validators/uniqueness.js","../src/database/table-data/index.js","../src/database/table-data/table-column.js","../src/database/table-data/table-foreign-key.js","../src/database/table-data/table-index.js","../src/database/table-data/table-reference.js","../src/environment-handlers/base.js","../src/environment-handlers/browser.js","../src/environment-handlers/node.js","../src/environment-handlers/node/cli/commands/background-jobs-main.js","../src/environment-handlers/node/cli/commands/background-jobs-runner.js","../src/environment-handlers/node/cli/commands/background-jobs-worker.js","../src/environment-handlers/node/cli/commands/beacon.js","../src/environment-handlers/node/cli/commands/cli-command-context.js","../src/environment-handlers/node/cli/commands/console.js","../src/environment-handlers/node/cli/commands/init.js","../src/environment-handlers/node/cli/commands/routes.js","../src/environment-handlers/node/cli/commands/run-script.js","../src/environment-handlers/node/cli/commands/runner.js","../src/environment-handlers/node/cli/commands/server.js","../src/environment-handlers/node/cli/commands/test.js","../src/environment-handlers/node/cli/commands/db/seed.js","../src/environment-handlers/node/cli/commands/db/schema/dump.js","../src/environment-handlers/node/cli/commands/db/schema/load.js","../src/environment-handlers/node/cli/commands/destroy/migration.js","../src/environment-handlers/node/cli/commands/generate/base-models.js","../src/environment-handlers/node/cli/commands/generate/frontend-models.js","../src/environment-handlers/node/cli/commands/generate/generated-file-banner.js","../src/environment-handlers/node/cli/commands/generate/migration.js","../src/environment-handlers/node/cli/commands/generate/model.js","../src/environment-handlers/node/cli/commands/lint/relationships.js","../src/error-reporting/request-details.js","../src/frontend-model-resource/base-resource.js","../src/frontend-model-resource/velocious-attachment-resource.js","../src/frontend-models/base.js","../src/frontend-models/built-in-resources.js","../src/frontend-models/clear-pending-debounced-callback.js","../src/frontend-models/event-hook-models.js","../src/frontend-models/model-registry.js","../src/frontend-models/outgoing-event-buffer.js","../src/frontend-models/preloader.js","../src/frontend-models/query.js","../src/frontend-models/resource-config-validation.js","../src/frontend-models/resource-definition.js","../src/frontend-models/transport-serialization.js","../src/frontend-models/use-created-event.js","../src/frontend-models/use-destroyed-event.js","../src/frontend-models/use-model-class-event.js","../src/frontend-models/use-updated-event.js","../src/frontend-models/websocket-channel.js","../src/frontend-models/websocket-publishers.js","../src/http-client/header.js","../src/http-client/index.js","../src/http-client/request.js","../src/http-client/response.js","../src/http-client/websocket-client.js","../src/http-server/cookie.js","../src/http-server/development-reloader.js","../src/http-server/index.js","../src/http-server/remote-address.js","../src/http-server/server-client.js","../src/http-server/server-lock.js","../src/http-server/websocket-channel-subscribers.js","../src/http-server/websocket-channel.js","../src/http-server/websocket-connection.js","../src/http-server/websocket-event-log-store.js","../src/http-server/websocket-events-host.js","../src/http-server/websocket-events.js","../src/http-server/client/index.js","../src/http-server/client/params-to-object.js","../src/http-server/client/request-parser.js","../src/http-server/client/request-runner.js","../src/http-server/client/request-timing.js","../src/http-server/client/request.js","../src/http-server/client/response.js","../src/http-server/client/websocket-request.js","../src/http-server/client/websocket-session.js","../src/http-server/client/request-buffer/form-data-part.js","../src/http-server/client/request-buffer/header.js","../src/http-server/client/request-buffer/index.js","../src/http-server/client/uploaded-file/memory-uploaded-file.js","../src/http-server/client/uploaded-file/temporary-uploaded-file.js","../src/http-server/client/uploaded-file/uploaded-file.js","../src/http-server/worker-handler/channel-subscriber-dispatch.js","../src/http-server/worker-handler/in-process.js","../src/http-server/worker-handler/index.js","../src/http-server/worker-handler/worker-script.js","../src/http-server/worker-handler/worker-thread.js","../src/jobs/mail-delivery.js","../src/logger/base-logger.js","../src/logger/console-logger.js","../src/logger/file-logger.js","../src/logger/outputs/array-output.js","../src/logger/outputs/console-output.js","../src/logger/outputs/file-output.js","../src/logger/outputs/stdout-output.js","../src/mailer/base.js","../src/mailer/delivery.js","../src/mailer/index.js","../src/mailer/backends/smtp.js","../src/plugins/sqljs-wasm-route-controller.js","../src/plugins/sqljs-wasm-route.js","../src/routes/app-routes.js","../src/routes/base-route.js","../src/routes/basic-route.js","../src/routes/get-route.js","../src/routes/index.js","../src/routes/namespace-route.js","../src/routes/plugin-routes.js","../src/routes/post-route.js","../src/routes/resolver.js","../src/routes/resource-route.js","../src/routes/root-route.js","../src/routes/built-in/debug/controller.js","../src/routes/built-in/errors/controller.js","../src/routes/hooks/frontend-model-command-route-hook.js","../src/sync/device-identity.js","../src/sync/local-mutation-log.js","../src/sync/offline-grant.js","../src/testing/base-expect.js","../src/testing/browser-frontend-model-event-hook-scenarios.js","../src/testing/browser-test-app.js","../src/testing/expect-to-change.js","../src/testing/expect-utils.js","../src/testing/expect.js","../src/testing/request-client.js","../src/testing/test-files-finder.js","../src/testing/test-filter-parser.js","../src/testing/test-runner.js","../src/testing/test-suite-splitter.js","../src/testing/test.js","../src/types/external-modules.d.ts","../src/utils/backtrace-cleaner-node.js","../src/utils/backtrace-cleaner.js","../src/utils/deburr-column-name.js","../src/utils/event-emitter.js","../src/utils/file-exists.js","../src/utils/format-value.js","../src/utils/is-date.js","../src/utils/model-scope.js","../src/utils/nest-callbacks.js","../src/utils/plain-object.js","../src/utils/ransack.js","../src/utils/rest-args-error.js","../src/utils/singularize-model-name.js","../src/utils/split-sql-statements.js","../src/utils/to-import-specifier.js","../src/utils/with-tracked-stack-async-hooks.js","../src/utils/with-tracked-stack.js"],"version":"6.0.3"}
1
+ {"root":["../index.js","../bin/velocious.js","../src/application.js","../src/configuration-resolver.js","../src/configuration-types.js","../src/configuration.js","../src/controller.js","../src/current-configuration.js","../src/current.js","../src/error-logger.js","../src/frontend-model-controller.js","../src/initializer.js","../src/logger.js","../src/mailer.js","../src/record-payload-values.js","../src/time-zone.js","../src/velocious-error.js","../src/authorization/ability.js","../src/authorization/base-resource.js","../src/background-jobs/client.js","../src/background-jobs/cron-expression.js","../src/background-jobs/forked-runner-child.js","../src/background-jobs/job-record.js","../src/background-jobs/job-registry.js","../src/background-jobs/job-runner.js","../src/background-jobs/job.js","../src/background-jobs/json-socket.js","../src/background-jobs/main.js","../src/background-jobs/normalize-error.js","../src/background-jobs/scheduler.js","../src/background-jobs/socket-request.js","../src/background-jobs/status-reporter.js","../src/background-jobs/store.js","../src/background-jobs/types.js","../src/background-jobs/worker.js","../src/background-jobs/web/authorization.js","../src/background-jobs/web/controller.js","../src/background-jobs/web/index.js","../src/background-jobs/web/path-matcher.js","../src/background-jobs/web/registry.js","../src/beacon/client.js","../src/beacon/in-process-broker.js","../src/beacon/in-process-client.js","../src/beacon/server.js","../src/beacon/types.js","../src/cli/base-command.js","../src/cli/browser-cli.js","../src/cli/index.js","../src/cli/tenant-database-command-helper.js","../src/cli/use-browser-cli.js","../src/cli/commands/background-jobs-main.js","../src/cli/commands/background-jobs-runner.js","../src/cli/commands/background-jobs-worker.js","../src/cli/commands/beacon.js","../src/cli/commands/console.js","../src/cli/commands/init.js","../src/cli/commands/routes.js","../src/cli/commands/run-script.js","../src/cli/commands/runner.js","../src/cli/commands/server.js","../src/cli/commands/test.js","../src/cli/commands/db/base-command.js","../src/cli/commands/db/create.js","../src/cli/commands/db/drop.js","../src/cli/commands/db/migrate.js","../src/cli/commands/db/reset.js","../src/cli/commands/db/rollback.js","../src/cli/commands/db/seed.js","../src/cli/commands/db/schema/dump.js","../src/cli/commands/db/schema/load.js","../src/cli/commands/db/tenants/check.js","../src/cli/commands/db/tenants/create.js","../src/cli/commands/db/tenants/migrate.js","../src/cli/commands/destroy/migration.js","../src/cli/commands/generate/base-models.js","../src/cli/commands/generate/frontend-models.js","../src/cli/commands/generate/migration.js","../src/cli/commands/generate/model.js","../src/cli/commands/lint/relationships.js","../src/database/annotations-async-hooks.js","../src/database/annotations.js","../src/database/datetime-storage.js","../src/database/handler.js","../src/database/initializer-from-require-context.js","../src/database/migrator.js","../src/database/use-database.js","../src/database/drivers/base-column.js","../src/database/drivers/base-columns-index.js","../src/database/drivers/base-foreign-key.js","../src/database/drivers/base-table.js","../src/database/drivers/base.js","../src/database/drivers/mssql/column.js","../src/database/drivers/mssql/columns-index.js","../src/database/drivers/mssql/connect-connection.js","../src/database/drivers/mssql/foreign-key.js","../src/database/drivers/mssql/index.js","../src/database/drivers/mssql/options.js","../src/database/drivers/mssql/query-parser.js","../src/database/drivers/mssql/structure-sql.js","../src/database/drivers/mssql/table.js","../src/database/drivers/mssql/sql/alter-table.js","../src/database/drivers/mssql/sql/create-database.js","../src/database/drivers/mssql/sql/create-index.js","../src/database/drivers/mssql/sql/create-table.js","../src/database/drivers/mssql/sql/delete.js","../src/database/drivers/mssql/sql/drop-database.js","../src/database/drivers/mssql/sql/drop-table.js","../src/database/drivers/mssql/sql/insert.js","../src/database/drivers/mssql/sql/remove-index.js","../src/database/drivers/mssql/sql/update.js","../src/database/drivers/mssql/sql/upsert.js","../src/database/drivers/mysql/column.js","../src/database/drivers/mysql/columns-index.js","../src/database/drivers/mysql/foreign-key.js","../src/database/drivers/mysql/index.js","../src/database/drivers/mysql/options.js","../src/database/drivers/mysql/query-parser.js","../src/database/drivers/mysql/query.js","../src/database/drivers/mysql/structure-sql.js","../src/database/drivers/mysql/table.js","../src/database/drivers/mysql/sql/alter-table.js","../src/database/drivers/mysql/sql/create-database.js","../src/database/drivers/mysql/sql/create-index.js","../src/database/drivers/mysql/sql/create-table.js","../src/database/drivers/mysql/sql/delete.js","../src/database/drivers/mysql/sql/drop-database.js","../src/database/drivers/mysql/sql/drop-table.js","../src/database/drivers/mysql/sql/insert.js","../src/database/drivers/mysql/sql/remove-index.js","../src/database/drivers/mysql/sql/update.js","../src/database/drivers/mysql/sql/upsert.js","../src/database/drivers/pgsql/column.js","../src/database/drivers/pgsql/columns-index.js","../src/database/drivers/pgsql/foreign-key.js","../src/database/drivers/pgsql/index.js","../src/database/drivers/pgsql/options.js","../src/database/drivers/pgsql/query-parser.js","../src/database/drivers/pgsql/structure-sql.js","../src/database/drivers/pgsql/table.js","../src/database/drivers/pgsql/sql/alter-table.js","../src/database/drivers/pgsql/sql/create-database.js","../src/database/drivers/pgsql/sql/create-index.js","../src/database/drivers/pgsql/sql/create-table.js","../src/database/drivers/pgsql/sql/delete.js","../src/database/drivers/pgsql/sql/drop-database.js","../src/database/drivers/pgsql/sql/drop-table.js","../src/database/drivers/pgsql/sql/insert.js","../src/database/drivers/pgsql/sql/remove-index.js","../src/database/drivers/pgsql/sql/update.js","../src/database/drivers/pgsql/sql/upsert.js","../src/database/drivers/sqlite/base.js","../src/database/drivers/sqlite/column.js","../src/database/drivers/sqlite/columns-index.js","../src/database/drivers/sqlite/connection-sql-js.js","../src/database/drivers/sqlite/foreign-key.js","../src/database/drivers/sqlite/index.js","../src/database/drivers/sqlite/index.native.js","../src/database/drivers/sqlite/index.web.js","../src/database/drivers/sqlite/options.js","../src/database/drivers/sqlite/query-parser.js","../src/database/drivers/sqlite/query.js","../src/database/drivers/sqlite/query.native.js","../src/database/drivers/sqlite/query.web.js","../src/database/drivers/sqlite/structure-sql.js","../src/database/drivers/sqlite/table-rebuilder.js","../src/database/drivers/sqlite/table.js","../src/database/drivers/sqlite/web-persistence.js","../src/database/drivers/sqlite/sql/alter-table.js","../src/database/drivers/sqlite/sql/create-index.js","../src/database/drivers/sqlite/sql/create-table.js","../src/database/drivers/sqlite/sql/delete.js","../src/database/drivers/sqlite/sql/drop-table.js","../src/database/drivers/sqlite/sql/insert.js","../src/database/drivers/sqlite/sql/remove-index.js","../src/database/drivers/sqlite/sql/update.js","../src/database/drivers/sqlite/sql/upsert.js","../src/database/drivers/structure-sql/utils.js","../src/database/migration/index.js","../src/database/migrator/files-finder.js","../src/database/migrator/types.js","../src/database/pool/async-tracked-multi-connection.js","../src/database/pool/base-methods-forward.js","../src/database/pool/base.js","../src/database/pool/single-multi-use.js","../src/database/query/alter-table-base.js","../src/database/query/base.js","../src/database/query/create-database-base.js","../src/database/query/create-index-base.js","../src/database/query/create-table-base.js","../src/database/query/delete-base.js","../src/database/query/drop-database-base.js","../src/database/query/drop-table-base.js","../src/database/query/from-base.js","../src/database/query/from-plain.js","../src/database/query/from-table.js","../src/database/query/index.js","../src/database/query/insert-base.js","../src/database/query/join-base.js","../src/database/query/join-object.js","../src/database/query/join-plain.js","../src/database/query/join-tracker.js","../src/database/query/model-class-query.js","../src/database/query/order-base.js","../src/database/query/order-column.js","../src/database/query/order-plain.js","../src/database/query/preloader.js","../src/database/query/query-data.js","../src/database/query/remove-index-base.js","../src/database/query/select-base.js","../src/database/query/select-plain.js","../src/database/query/select-table-and-column.js","../src/database/query/update-base.js","../src/database/query/upsert-base.js","../src/database/query/where-base.js","../src/database/query/where-combinator.js","../src/database/query/where-hash.js","../src/database/query/where-model-class-hash.js","../src/database/query/where-not.js","../src/database/query/where-plain.js","../src/database/query/with-count.js","../src/database/query/preloader/belongs-to.js","../src/database/query/preloader/ensure-model-class-initialized.js","../src/database/query/preloader/has-many.js","../src/database/query/preloader/has-one.js","../src/database/query/preloader/selection.js","../src/database/query-parser/base-query-parser.js","../src/database/query-parser/from-parser.js","../src/database/query-parser/group-parser.js","../src/database/query-parser/joins-parser.js","../src/database/query-parser/limit-parser.js","../src/database/query-parser/options.js","../src/database/query-parser/order-parser.js","../src/database/query-parser/select-parser.js","../src/database/query-parser/where-parser.js","../src/database/record/acts-as-list.js","../src/database/record/index.js","../src/database/record/record-not-found-error.js","../src/database/record/state-machine.js","../src/database/record/user-module.js","../src/database/record/attachments/attachment-record.js","../src/database/record/attachments/download.js","../src/database/record/attachments/handle.js","../src/database/record/attachments/normalize-input.js","../src/database/record/attachments/store.js","../src/database/record/attachments/storage-drivers/filesystem.js","../src/database/record/attachments/storage-drivers/native.js","../src/database/record/attachments/storage-drivers/s3.js","../src/database/record/instance-relationships/base.js","../src/database/record/instance-relationships/belongs-to.js","../src/database/record/instance-relationships/has-many.js","../src/database/record/instance-relationships/has-one.js","../src/database/record/relationships/base.js","../src/database/record/relationships/belongs-to.js","../src/database/record/relationships/has-many.js","../src/database/record/relationships/has-one.js","../src/database/record/validators/base.js","../src/database/record/validators/format.js","../src/database/record/validators/presence.js","../src/database/record/validators/uniqueness.js","../src/database/table-data/index.js","../src/database/table-data/table-column.js","../src/database/table-data/table-foreign-key.js","../src/database/table-data/table-index.js","../src/database/table-data/table-reference.js","../src/environment-handlers/base.js","../src/environment-handlers/browser.js","../src/environment-handlers/node.js","../src/environment-handlers/node/cli/commands/background-jobs-main.js","../src/environment-handlers/node/cli/commands/background-jobs-runner.js","../src/environment-handlers/node/cli/commands/background-jobs-worker.js","../src/environment-handlers/node/cli/commands/beacon.js","../src/environment-handlers/node/cli/commands/cli-command-context.js","../src/environment-handlers/node/cli/commands/console.js","../src/environment-handlers/node/cli/commands/init.js","../src/environment-handlers/node/cli/commands/routes.js","../src/environment-handlers/node/cli/commands/run-script.js","../src/environment-handlers/node/cli/commands/runner.js","../src/environment-handlers/node/cli/commands/server.js","../src/environment-handlers/node/cli/commands/test.js","../src/environment-handlers/node/cli/commands/db/seed.js","../src/environment-handlers/node/cli/commands/db/schema/dump.js","../src/environment-handlers/node/cli/commands/db/schema/load.js","../src/environment-handlers/node/cli/commands/destroy/migration.js","../src/environment-handlers/node/cli/commands/generate/base-models.js","../src/environment-handlers/node/cli/commands/generate/frontend-models.js","../src/environment-handlers/node/cli/commands/generate/generated-file-banner.js","../src/environment-handlers/node/cli/commands/generate/migration.js","../src/environment-handlers/node/cli/commands/generate/model.js","../src/environment-handlers/node/cli/commands/lint/relationships.js","../src/error-reporting/request-details.js","../src/frontend-model-resource/base-resource.js","../src/frontend-model-resource/velocious-attachment-resource.js","../src/frontend-models/base.js","../src/frontend-models/built-in-resources.js","../src/frontend-models/clear-pending-debounced-callback.js","../src/frontend-models/event-hook-models.js","../src/frontend-models/model-registry.js","../src/frontend-models/outgoing-event-buffer.js","../src/frontend-models/preloader.js","../src/frontend-models/query.js","../src/frontend-models/resource-config-validation.js","../src/frontend-models/resource-definition.js","../src/frontend-models/transport-serialization.js","../src/frontend-models/use-created-event.js","../src/frontend-models/use-destroyed-event.js","../src/frontend-models/use-model-class-event.js","../src/frontend-models/use-updated-event.js","../src/frontend-models/websocket-channel.js","../src/frontend-models/websocket-publishers.js","../src/http-client/header.js","../src/http-client/index.js","../src/http-client/request.js","../src/http-client/response.js","../src/http-client/websocket-client.js","../src/http-server/cookie.js","../src/http-server/development-reloader.js","../src/http-server/index.js","../src/http-server/remote-address.js","../src/http-server/server-client.js","../src/http-server/server-lock.js","../src/http-server/websocket-channel-subscribers.js","../src/http-server/websocket-channel.js","../src/http-server/websocket-connection.js","../src/http-server/websocket-event-log-store.js","../src/http-server/websocket-events-host.js","../src/http-server/websocket-events.js","../src/http-server/client/index.js","../src/http-server/client/params-to-object.js","../src/http-server/client/request-parser.js","../src/http-server/client/request-runner.js","../src/http-server/client/request-timing.js","../src/http-server/client/request.js","../src/http-server/client/response.js","../src/http-server/client/websocket-request.js","../src/http-server/client/websocket-session.js","../src/http-server/client/request-buffer/form-data-part.js","../src/http-server/client/request-buffer/header.js","../src/http-server/client/request-buffer/index.js","../src/http-server/client/uploaded-file/memory-uploaded-file.js","../src/http-server/client/uploaded-file/temporary-uploaded-file.js","../src/http-server/client/uploaded-file/uploaded-file.js","../src/http-server/worker-handler/channel-subscriber-dispatch.js","../src/http-server/worker-handler/in-process.js","../src/http-server/worker-handler/index.js","../src/http-server/worker-handler/worker-script.js","../src/http-server/worker-handler/worker-thread.js","../src/jobs/mail-delivery.js","../src/logger/base-logger.js","../src/logger/console-logger.js","../src/logger/file-logger.js","../src/logger/outputs/array-output.js","../src/logger/outputs/console-output.js","../src/logger/outputs/file-output.js","../src/logger/outputs/stdout-output.js","../src/mailer/base.js","../src/mailer/delivery.js","../src/mailer/index.js","../src/mailer/backends/smtp.js","../src/plugins/sqljs-wasm-route-controller.js","../src/plugins/sqljs-wasm-route.js","../src/routes/app-routes.js","../src/routes/base-route.js","../src/routes/basic-route.js","../src/routes/get-route.js","../src/routes/index.js","../src/routes/namespace-route.js","../src/routes/plugin-routes.js","../src/routes/post-route.js","../src/routes/resolver.js","../src/routes/resource-route.js","../src/routes/root-route.js","../src/routes/built-in/debug/controller.js","../src/routes/built-in/errors/controller.js","../src/routes/hooks/frontend-model-command-route-hook.js","../src/sync/device-identity.js","../src/sync/local-mutation-log.js","../src/sync/offline-grant.js","../src/testing/base-expect.js","../src/testing/browser-frontend-model-event-hook-scenarios.js","../src/testing/browser-test-app.js","../src/testing/expect-to-change.js","../src/testing/expect-utils.js","../src/testing/expect.js","../src/testing/request-client.js","../src/testing/test-files-finder.js","../src/testing/test-filter-parser.js","../src/testing/test-runner.js","../src/testing/test-suite-splitter.js","../src/testing/test.js","../src/types/external-modules.d.ts","../src/utils/backtrace-cleaner-node.js","../src/utils/backtrace-cleaner.js","../src/utils/deburr-column-name.js","../src/utils/event-emitter.js","../src/utils/file-exists.js","../src/utils/format-value.js","../src/utils/is-date.js","../src/utils/model-scope.js","../src/utils/nest-callbacks.js","../src/utils/plain-object.js","../src/utils/ransack.js","../src/utils/rest-args-error.js","../src/utils/singularize-model-name.js","../src/utils/split-sql-statements.js","../src/utils/to-import-specifier.js","../src/utils/with-tracked-stack-async-hooks.js","../src/utils/with-tracked-stack.js"],"version":"6.0.3"}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "velocious": "build/bin/velocious.js"
4
4
  },
5
5
  "name": "velocious",
6
- "version": "1.0.475",
6
+ "version": "1.0.476",
7
7
  "main": "build/index.js",
8
8
  "types": "build/index.d.ts",
9
9
  "files": [
@@ -358,6 +358,7 @@
358
358
  /**
359
359
  * Velocious sync configuration.
360
360
  * @typedef {object} VelociousSyncConfiguration
361
+ * @property {import("./sync/device-identity.js").SyncJsonWebKey | null} [deviceCertificateBackendPublicKey] - Public backend key used to verify offline device certificates for sync replay.
361
362
  * @property {Array<import("./sync/offline-grant.js").OfflineGrantSigningKey>} offlineGrantSigningKeys - Signing keys used to issue and verify offline grants. Secrets must never be exposed to clients.
362
363
  * @property {number} [offlineGrantTtlMs] - Default offline grant TTL in milliseconds. Defaults to 24 hours.
363
364
  */
@@ -406,15 +406,20 @@ export default class VelociousConfiguration {
406
406
  * @returns {import("./configuration-types.js").VelociousSyncConfiguration} - Normalized sync configuration.
407
407
  */
408
408
  _normalizeSyncConfiguration(sync) {
409
+ const deviceCertificateBackendPublicKey = sync?.deviceCertificateBackendPublicKey || null
409
410
  const offlineGrantSigningKeys = sync?.offlineGrantSigningKeys || []
410
411
  const offlineGrantTtlMs = sync?.offlineGrantTtlMs
411
412
 
413
+ if (deviceCertificateBackendPublicKey !== null && (typeof deviceCertificateBackendPublicKey !== "object" || Array.isArray(deviceCertificateBackendPublicKey))) {
414
+ throw new Error("sync.deviceCertificateBackendPublicKey must be a public JSON Web Key object")
415
+ }
412
416
  if (!Array.isArray(offlineGrantSigningKeys)) throw new Error("sync.offlineGrantSigningKeys must be an array")
413
417
  if (offlineGrantTtlMs !== undefined && (!Number.isInteger(offlineGrantTtlMs) || offlineGrantTtlMs <= 0)) {
414
418
  throw new Error("sync.offlineGrantTtlMs must be a positive integer number of milliseconds")
415
419
  }
416
420
 
417
421
  return {
422
+ deviceCertificateBackendPublicKey,
418
423
  offlineGrantSigningKeys: offlineGrantSigningKeys.map((key) => normalizeOfflineGrantSigningKey(key)),
419
424
  offlineGrantTtlMs: offlineGrantTtlMs || 24 * 60 * 60 * 1000
420
425
  }
@@ -9,6 +9,12 @@
9
9
  * @property {boolean} [unique] - Whether the index should enforce uniqueness.
10
10
  * @property {string} tableName - Name of the table to add the index to.
11
11
  */
12
+ /**
13
+ * RemoveIndexSqlArgs type.
14
+ * @typedef {object} RemoveIndexSqlArgs
15
+ * @property {string} name - Index name to drop.
16
+ * @property {string} tableName - Name of the table the index belongs to.
17
+ */
12
18
  /**
13
19
  * DropTableSqlArgsType type.
14
20
  * @typedef {object} DropTableSqlArgsType
@@ -307,6 +313,16 @@ export default class VelociousDatabaseDriversBase {
307
313
  throw new Error("'createIndexSQLs' not implemented")
308
314
  }
309
315
 
316
+ /**
317
+ * Runs remove index sqls.
318
+ * @abstract
319
+ * @param {RemoveIndexSqlArgs} indexData - Index data.
320
+ * @returns {Promise<string[]>} - Resolves with SQL statements.
321
+ */
322
+ async removeIndexSQLs(indexData) { // eslint-disable-line no-unused-vars
323
+ throw new Error("'removeIndexSQLs' not implemented")
324
+ }
325
+
310
326
  /**
311
327
  * Runs create table.
312
328
  * @param {import("../table-data/index.js").default} tableData - Table data.
@@ -15,6 +15,7 @@ import Options from "./options.js"
15
15
  import mssql from "mssql"
16
16
  import net from "node:net"
17
17
  import QueryParser from "./query-parser.js"
18
+ import RemoveIndex from "./sql/remove-index.js"
18
19
  import Table from "./table.js"
19
20
  import StructureSql from "./structure-sql.js"
20
21
  import timeout from "awaitery/build/timeout.js"
@@ -113,6 +114,18 @@ export default class VelociousDatabaseDriversMssql extends Base{
113
114
  return await createIndex.toSQLs()
114
115
  }
115
116
 
117
+ /**
118
+ * Runs remove index sqls.
119
+ * @param {import("../base.js").RemoveIndexSqlArgs} indexData - Index data.
120
+ * @returns {Promise<string[]>} - Resolves with SQL statements.
121
+ */
122
+ async removeIndexSQLs(indexData) {
123
+ const removeArgs = Object.assign({driver: this}, indexData)
124
+ const removeIndex = new RemoveIndex(removeArgs)
125
+
126
+ return await removeIndex.toSQLs()
127
+ }
128
+
116
129
  /**
117
130
  * Runs create table sql.
118
131
  * @param {import("../../table-data/index.js").default} tableData - Table data.
@@ -0,0 +1,6 @@
1
+ // @ts-check
2
+
3
+ import RemoveIndexBase from "../../../query/remove-index-base.js"
4
+
5
+ export default class VelociousDatabaseConnectionDriversMssqlSqlRemoveIndex extends RemoveIndexBase {
6
+ }
@@ -14,6 +14,7 @@ import Options from "./options.js"
14
14
  import mysql from "mysql"
15
15
  import query from "./query.js"
16
16
  import QueryParser from "./query-parser.js"
17
+ import RemoveIndex from "./sql/remove-index.js"
17
18
  import Table from "./table.js"
18
19
  import StructureSql from "./structure-sql.js"
19
20
  import Upsert from "./sql/upsert.js"
@@ -227,6 +228,18 @@ export default class VelociousDatabaseDriversMysql extends Base{
227
228
  return await createIndex.toSQLs()
228
229
  }
229
230
 
231
+ /**
232
+ * Runs remove index sqls.
233
+ * @param {import("../base.js").RemoveIndexSqlArgs} indexData - Index data.
234
+ * @returns {Promise<string[]>} - Resolves with SQL statements.
235
+ */
236
+ async removeIndexSQLs(indexData) {
237
+ const removeArgs = Object.assign({driver: this}, indexData)
238
+ const removeIndex = new RemoveIndex(removeArgs)
239
+
240
+ return await removeIndex.toSQLs()
241
+ }
242
+
230
243
  /**
231
244
  * Runs create table sql.
232
245
  * @param {import("../../table-data/index.js").default} tableData - Table data.
@@ -0,0 +1,6 @@
1
+ // @ts-check
2
+
3
+ import RemoveIndexBase from "../../../query/remove-index-base.js"
4
+
5
+ export default class VelociousDatabaseConnectionDriversMysqlSqlRemoveIndex extends RemoveIndexBase {
6
+ }
@@ -14,6 +14,7 @@ import DropTable from "./sql/drop-table.js"
14
14
  import Insert from "./sql/insert.js"
15
15
  import Options from "./options.js"
16
16
  import QueryParser from "./query-parser.js"
17
+ import RemoveIndex from "./sql/remove-index.js"
17
18
  import Table from "./table.js"
18
19
  import StructureSql from "./structure-sql.js"
19
20
  import Upsert from "./sql/upsert.js"
@@ -149,6 +150,18 @@ export default class VelociousDatabaseDriversPgsql extends Base{
149
150
  return await createIndex.toSQLs()
150
151
  }
151
152
 
153
+ /**
154
+ * Runs remove index sqls.
155
+ * @param {import("../base.js").RemoveIndexSqlArgs} indexData - Index data.
156
+ * @returns {Promise<string[]>} - Resolves with SQL statements.
157
+ */
158
+ async removeIndexSQLs(indexData) {
159
+ const removeArgs = Object.assign({driver: this}, indexData)
160
+ const removeIndex = new RemoveIndex(removeArgs)
161
+
162
+ return await removeIndex.toSQLs()
163
+ }
164
+
152
165
  /**
153
166
  * Runs create table sql.
154
167
  * @param {import("../../table-data/index.js").default} tableData - Table data.
@@ -0,0 +1,6 @@
1
+ // @ts-check
2
+
3
+ import RemoveIndexBase from "../../../query/remove-index-base.js"
4
+
5
+ export default class VelociousDatabaseConnectionDriversPgsqlSqlRemoveIndex extends RemoveIndexBase {
6
+ }
@@ -12,6 +12,7 @@ import escapeString from "sql-escape-string"
12
12
  import Insert from "./sql/insert.js"
13
13
  import Options from "./options.js"
14
14
  import QueryParser from "./query-parser.js"
15
+ import RemoveIndex from "./sql/remove-index.js"
15
16
  import Table from "./table.js"
16
17
  import StructureSql from "./structure-sql.js"
17
18
  import Upsert from "./sql/upsert.js"
@@ -55,6 +56,18 @@ export default class VelociousDatabaseDriversSqliteBase extends Base {
55
56
  return await createIndex.toSQLs()
56
57
  }
57
58
 
59
+ /**
60
+ * Runs remove index sqls.
61
+ * @param {import("../base.js").RemoveIndexSqlArgs} indexData - Index data.
62
+ * @returns {Promise<string[]>} - Resolves with SQL statements.
63
+ */
64
+ async removeIndexSQLs(indexData) {
65
+ const removeArgs = Object.assign({driver: this}, indexData)
66
+ const removeIndex = new RemoveIndex(removeArgs)
67
+
68
+ return await removeIndex.toSQLs()
69
+ }
70
+
58
71
  /**
59
72
  * Runs create table sql.
60
73
  * @abstract
@@ -0,0 +1,6 @@
1
+ // @ts-check
2
+
3
+ import RemoveIndexBase from "../../../query/remove-index-base.js"
4
+
5
+ export default class VelociousDatabaseConnectionDriversSqliteSqlRemoveIndex extends RemoveIndexBase {
6
+ }
@@ -39,6 +39,7 @@
39
39
  import { convertLegacyDateValueToUtcStorage } from "../datetime-storage.js"
40
40
  import * as inflection from "inflection"
41
41
  import restArgsError from "../../utils/rest-args-error.js"
42
+ import CreateIndexBase from "../query/create-index-base.js"
42
43
  import TableData from "../table-data/index.js"
43
44
  class NotImplementedError extends Error {}
44
45
 
@@ -184,6 +185,49 @@ export default class VelociousDatabaseMigration {
184
185
  }
185
186
  }
186
187
 
188
+ /**
189
+ * RemoveIndexArgsType type.
190
+ * @typedef {object} RemoveIndexArgsType
191
+ * @property {string} [name] - Explicit index name to remove.
192
+ */
193
+ /**
194
+ * Runs remove index.
195
+ * @param {string} tableName - Table name.
196
+ * @param {string | Array<string | import("../table-data/table-column.js").default>} nameOrColumns - Index name or columns whose default addIndex name should be removed.
197
+ * @param {RemoveIndexArgsType} [args] - Options object.
198
+ * @returns {Promise<void>} - Resolves when complete.
199
+ */
200
+ async removeIndex(tableName, nameOrColumns, args = {}) {
201
+ const {name, ...restArgs} = args
202
+
203
+ restArgsError(restArgs)
204
+
205
+ const removeIndexName = name || this._removeIndexName(tableName, nameOrColumns)
206
+ const sqls = await this.getDriver().removeIndexSQLs({name: removeIndexName, tableName})
207
+
208
+ for (const sql of sqls) {
209
+ await this.getDriver().query(sql)
210
+ }
211
+ }
212
+
213
+ /**
214
+ * Runs remove index name.
215
+ * @param {string} tableName - Table name.
216
+ * @param {string | Array<string | import("../table-data/table-column.js").default>} nameOrColumns - Index name or columns.
217
+ * @returns {string} - The index name.
218
+ */
219
+ _removeIndexName(tableName, nameOrColumns) {
220
+ if (typeof nameOrColumns === "string") return nameOrColumns
221
+
222
+ const createIndex = new CreateIndexBase({
223
+ columns: nameOrColumns,
224
+ driver: this.getDriver(),
225
+ tableName
226
+ })
227
+
228
+ return createIndex.generateIndexName()
229
+ }
230
+
187
231
  /**
188
232
  * AddForeignKeyArgsType type.
189
233
  * @typedef {object} AddForeignKeyArgsType
@@ -23,6 +23,7 @@ export default function baseMethodsForward(PoolBase) {
23
23
  "quote",
24
24
  "quoteColumn",
25
25
  "quoteTable",
26
+ "removeIndexSQLs",
26
27
  "select",
27
28
  "update",
28
29
  "updateSql"
@@ -0,0 +1,39 @@
1
+ // @ts-check
2
+
3
+ import QueryBase from "./base.js"
4
+
5
+ /**
6
+ * RemoveIndexBaseArgsType type.
7
+ * @typedef {object} RemoveIndexBaseArgsType
8
+ * @property {import("../drivers/base.js").default} driver - Database driver used to generate SQL.
9
+ * @property {string} name - Index name to drop.
10
+ * @property {string} tableName - Name of the table the index belongs to.
11
+ */
12
+
13
+ export default class VelociousDatabaseQueryRemoveIndexBase extends QueryBase {
14
+ /**
15
+ * Runs constructor.
16
+ * @param {RemoveIndexBaseArgsType} args - Options object.
17
+ */
18
+ constructor({driver, name, tableName}) {
19
+ super({driver})
20
+ this.name = name
21
+ this.tableName = tableName
22
+ }
23
+
24
+ /**
25
+ * Runs to sqls.
26
+ * @returns {Promise<string[]>} - Resolves with SQL statements.
27
+ */
28
+ async toSQLs() {
29
+ const databaseType = this.getDriver().getType()
30
+ const options = this.getOptions()
31
+ let sql = `DROP INDEX ${options.quoteIndexName(this.name)}`
32
+
33
+ if (databaseType == "mssql" || databaseType == "mysql") {
34
+ sql += ` ON ${options.quoteTableName(this.tableName)}`
35
+ }
36
+
37
+ return [sql]
38
+ }
39
+ }
@@ -690,11 +690,14 @@ class VelociousDatabaseRecord {
690
690
  return await this.relationshipOrLoad(relationshipName, {preloadTranslations: true})
691
691
  }
692
692
 
693
- prototype[`set${inflection.camelize(relationshipName)}`] = function(/** @type {?} */ model) {
693
+ prototype[`set${inflection.camelize(relationshipName)}`] = function(/** @type {VelociousDatabaseRecord | null | undefined} */ model) {
694
694
  const relationship = this.getRelationshipByName(relationshipName)
695
+ const foreignKeyValue = this._belongsToForeignKeyValue({model, relationship})
695
696
 
696
- relationship.setLoaded(model)
697
+ relationship.setLoaded(model || undefined)
698
+ relationship.setPreloaded(true)
697
699
  relationship.setDirty(true)
700
+ this._setColumnAttribute(relationship.getForeignKey(), foreignKeyValue)
698
701
  }
699
702
  } else if (actualData.type == "hasMany") {
700
703
  relationship = new HasManyRelationship(actualData)
@@ -1783,6 +1786,20 @@ class VelociousDatabaseRecord {
1783
1786
  return loaded.readColumn(relationship.getPrimaryKey()) == normalizedValue
1784
1787
  }
1785
1788
 
1789
+ /**
1790
+ * Returns the foreign key value for a belongs-to relationship assignment.
1791
+ * @param {object} args - Relationship assignment arguments.
1792
+ * @param {VelociousDatabaseRecord | null | undefined} args.model - Assigned model.
1793
+ * @param {import("./instance-relationships/base.js").default} args.relationship - Belongs-to relationship instance.
1794
+ * @returns {string | number | null | undefined} - Foreign key value for the assignment.
1795
+ */
1796
+ _belongsToForeignKeyValue({model, relationship}) {
1797
+ if (model == null) return null
1798
+ if (!(model instanceof VelociousDatabaseRecord)) throw new Error(`Unexpected model type: ${typeof model}`)
1799
+
1800
+ return /** @type {string | number | null | undefined} */ (model.readColumn(relationship.getPrimaryKey()))
1801
+ }
1802
+
1786
1803
  /**
1787
1804
  * Runs clear loaded belongs to relationship.
1788
1805
  * @param {?} relationship - Relationship instance.
@@ -2364,8 +2381,9 @@ class VelociousDatabaseRecord {
2364
2381
  await model.save()
2365
2382
 
2366
2383
  const foreignKey = this._relationshipForeignKeyAttribute(instanceRelationship)
2384
+ const foreignKeyValue = this._belongsToForeignKeyValue({model, relationship: instanceRelationship})
2367
2385
 
2368
- this.setAttribute(foreignKey, model.id())
2386
+ this.setAttribute(foreignKey, foreignKeyValue)
2369
2387
 
2370
2388
  instanceRelationship.setPreloaded(true)
2371
2389
  instanceRelationship.setDirty(false)
@@ -3801,14 +3819,12 @@ class VelociousDatabaseRecord {
3801
3819
  const relationship = this._instanceRelationships[relationshipName]
3802
3820
 
3803
3821
  if (relationship.getType() == "belongsTo" && relationship.getDirty()) {
3804
- const model = relationship.loaded()
3822
+ const model = relationship.getLoadedOrUndefined()
3805
3823
 
3806
3824
  if (model) {
3807
- if (model instanceof VelociousDatabaseRecord) {
3808
- belongsToChanges[relationship.getForeignKey()] = model?.id()
3809
- } else {
3810
- throw new Error(`Unexpected model type: ${typeof model}`)
3811
- }
3825
+ if (Array.isArray(model)) throw new Error("Unexpected belongs-to model array")
3826
+
3827
+ belongsToChanges[relationship.getForeignKey()] = this._belongsToForeignKeyValue({model, relationship})
3812
3828
  }
3813
3829
  }
3814
3830
  }