lumen-framework 3.1.1 → 4.0.0

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 (258) hide show
  1. package/README.md +75 -109
  2. package/bin/lumen +23 -41
  3. package/dist/cli.cjs +856 -479
  4. package/dist/cli.cjs.map +4 -4
  5. package/dist/index.js +3273 -1719
  6. package/dist/index.js.map +4 -4
  7. package/dist/index.mjs +3251 -1697
  8. package/dist/index.mjs.map +4 -4
  9. package/dist/testing.js +280 -0
  10. package/dist/testing.js.map +7 -0
  11. package/dist/testing.mjs +252 -0
  12. package/dist/testing.mjs.map +7 -0
  13. package/dist/types/errors/links-only-error.d.ts +13 -0
  14. package/dist/types/errors/reserved-field-name-error.d.ts +13 -0
  15. package/dist/types/errors/unknown-attribute-error.d.ts +13 -0
  16. package/dist/types/index.d.ts +14 -0
  17. package/dist/types/interfaces.d.ts +1 -1
  18. package/dist/types/packages/application/index.d.ts +38 -45
  19. package/dist/types/packages/application/initialize.d.ts +3 -5
  20. package/dist/types/packages/application/interfaces.d.ts +13 -5
  21. package/dist/types/packages/application/utils/create-controller.d.ts +14 -4
  22. package/dist/types/packages/application/utils/create-serializer.d.ts +2 -2
  23. package/dist/types/packages/application/utils/normalize-port.d.ts +1 -3
  24. package/dist/types/packages/application/utils/resolve-visibility.d.ts +15 -0
  25. package/dist/types/packages/application/utils/restrict-open-namespaces.d.ts +19 -0
  26. package/dist/types/packages/application/utils/validate-attributes.d.ts +17 -0
  27. package/dist/types/packages/application/utils/validate-links-only.d.ts +19 -0
  28. package/dist/types/packages/application/utils/validate-namespaced-serializers.d.ts +3 -3
  29. package/dist/types/packages/application/utils/validate-reserved-names.d.ts +12 -0
  30. package/dist/types/packages/application/utils/warn-query-param-names.d.ts +10 -0
  31. package/dist/types/packages/cli/commands/dbcreate.d.ts +1 -1
  32. package/dist/types/packages/cli/commands/dbdrop.d.ts +1 -1
  33. package/dist/types/packages/cli/commands/destroy.d.ts +3 -2
  34. package/dist/types/packages/cli/commands/generate.d.ts +5 -5
  35. package/dist/types/packages/cli/commands/index.d.ts +0 -1
  36. package/dist/types/packages/cli/generator/index.d.ts +6 -6
  37. package/dist/types/packages/cli/generator/interfaces.d.ts +3 -3
  38. package/dist/types/packages/cli/generator/utils/create-generator.d.ts +2 -2
  39. package/dist/types/packages/cli/generator/utils/generate-type.d.ts +9 -9
  40. package/dist/types/packages/cli/generator/utils/migration-conflict.d.ts +4 -4
  41. package/dist/types/packages/cli/templates/pnpm-workspace.d.ts +15 -0
  42. package/dist/types/packages/cli/utils/create-spinner.d.ts +14 -0
  43. package/dist/types/packages/cli/utils/print-statements.d.ts +12 -0
  44. package/dist/types/packages/cli/utils/server-database.d.ts +27 -0
  45. package/dist/types/packages/compiler/interfaces.d.ts +1 -1
  46. package/dist/types/packages/config/interfaces.d.ts +10 -4
  47. package/dist/types/packages/controller/constants.d.ts +7 -2
  48. package/dist/types/packages/controller/errors/related-record-not-found-error.d.ts +4 -4
  49. package/dist/types/packages/controller/index.d.ts +364 -473
  50. package/dist/types/packages/controller/interfaces.d.ts +21 -6
  51. package/dist/types/packages/controller/utils/find-many.d.ts +2 -5
  52. package/dist/types/packages/controller/utils/find-one.d.ts +2 -5
  53. package/dist/types/packages/controller/utils/params-to-query.d.ts +8 -10
  54. package/dist/types/packages/controller/utils/resolve-relationships.d.ts +1 -3
  55. package/dist/types/packages/controller/utils/validate-relationships.d.ts +5 -3
  56. package/dist/types/packages/controller/visibility/errors.d.ts +21 -0
  57. package/dist/types/packages/controller/visibility/index.d.ts +51 -0
  58. package/dist/types/packages/database/attribute/index.d.ts +4 -6
  59. package/dist/types/packages/database/attribute/interfaces.d.ts +1 -1
  60. package/dist/types/packages/database/attribute/utils/create-attribute.d.ts +3 -5
  61. package/dist/types/packages/database/attribute/utils/create-getter.d.ts +2 -2
  62. package/dist/types/packages/database/attribute/utils/create-setter.d.ts +3 -5
  63. package/dist/types/packages/database/constants.d.ts +1 -0
  64. package/dist/types/packages/database/errors/index.d.ts +1 -0
  65. package/dist/types/packages/database/errors/invalid-driver-error.d.ts +1 -3
  66. package/dist/types/packages/database/errors/migrations-pending-error.d.ts +1 -3
  67. package/dist/types/packages/database/errors/model-missing-error.d.ts +1 -3
  68. package/dist/types/packages/database/errors/relationship-config-error.d.ts +10 -0
  69. package/dist/types/packages/database/errors/unique-constraint-error.d.ts +1 -1
  70. package/dist/types/packages/database/index.d.ts +9 -6
  71. package/dist/types/packages/database/initialize.d.ts +3 -5
  72. package/dist/types/packages/database/interfaces.d.ts +115 -25
  73. package/dist/types/packages/database/migration/index.d.ts +5 -7
  74. package/dist/types/packages/database/migration/interfaces.d.ts +2 -4
  75. package/dist/types/packages/database/migration/utils/generate-timestamp.d.ts +9 -1
  76. package/dist/types/packages/database/model/index.d.ts +348 -759
  77. package/dist/types/packages/database/model/initialize-class.d.ts +7 -1
  78. package/dist/types/packages/database/model/interfaces.d.ts +30 -12
  79. package/dist/types/packages/database/model/utils/attribute.d.ts +14 -0
  80. package/dist/types/packages/database/model/utils/get-columns.d.ts +1 -3
  81. package/dist/types/packages/database/model/utils/persistence.d.ts +5 -14
  82. package/dist/types/packages/database/model/utils/process-write-error.d.ts +2 -2
  83. package/dist/types/packages/database/model/utils/run-hooks.d.ts +7 -3
  84. package/dist/types/packages/database/model/utils/validate.d.ts +4 -1
  85. package/dist/types/packages/database/query/errors/record-not-found-error.d.ts +1 -1
  86. package/dist/types/packages/database/query/index.d.ts +179 -3
  87. package/dist/types/packages/database/query/runner/index.d.ts +1 -3
  88. package/dist/types/packages/database/query/runner/utils/build-results.d.ts +3 -4
  89. package/dist/types/packages/database/query/utils/format-select.d.ts +1 -3
  90. package/dist/types/packages/database/relationship/index.d.ts +7 -6
  91. package/dist/types/packages/database/relationship/interfaces.d.ts +16 -3
  92. package/dist/types/packages/database/relationship/utils/getters.d.ts +7 -13
  93. package/dist/types/packages/database/relationship/utils/inverse-setters.d.ts +5 -9
  94. package/dist/types/packages/database/relationship/utils/setters.d.ts +7 -13
  95. package/dist/types/packages/database/relationship/utils/unassociate.d.ts +1 -3
  96. package/dist/types/packages/database/relationship/utils/update-relationship.d.ts +6 -2
  97. package/dist/types/packages/database/transaction/index.d.ts +9 -10
  98. package/dist/types/packages/database/transaction/interfaces.d.ts +7 -1
  99. package/dist/types/packages/database/utils/connect.d.ts +16 -3
  100. package/dist/types/packages/database/utils/create-migrations.d.ts +1 -3
  101. package/dist/types/packages/database/utils/normalize-model-name.d.ts +1 -3
  102. package/dist/types/packages/database/utils/pending-migrations.d.ts +1 -3
  103. package/dist/types/packages/database/utils/primary-key-type.d.ts +10 -0
  104. package/dist/types/packages/database/utils/type-for-column.d.ts +3 -5
  105. package/dist/types/packages/database/utils/validate-relationships.d.ts +13 -0
  106. package/dist/types/packages/database/validation/errors/validation-error.d.ts +4 -4
  107. package/dist/types/packages/database/validation/index.d.ts +3 -5
  108. package/dist/types/packages/database/validation/interfaces.d.ts +1 -1
  109. package/dist/types/packages/freezeable/map/index.d.ts +1 -3
  110. package/dist/types/packages/freezeable/set/index.d.ts +1 -3
  111. package/dist/types/packages/freezeable/utils/freeze.d.ts +5 -15
  112. package/dist/types/packages/freezeable/utils/is-frozen.d.ts +1 -3
  113. package/dist/types/packages/fs/index.d.ts +7 -7
  114. package/dist/types/packages/fs/interfaces.d.ts +4 -4
  115. package/dist/types/packages/fs/utils/parse-path.d.ts +2 -2
  116. package/dist/types/packages/fs/watcher/interfaces.d.ts +1 -1
  117. package/dist/types/packages/jsonapi/errors/invalid-content-type-error.d.ts +3 -5
  118. package/dist/types/packages/jsonapi/errors/not-acceptable-error.d.ts +2 -4
  119. package/dist/types/packages/jsonapi/errors/unsupported-media-type-error.d.ts +2 -4
  120. package/dist/types/packages/jsonapi/index.d.ts +1 -1
  121. package/dist/types/packages/jsonapi/interfaces.d.ts +47 -36
  122. package/dist/types/packages/jsonapi/utils/has-media-type-params.d.ts +1 -1
  123. package/dist/types/packages/jsonapi/utils/is-jsonapi.d.ts +1 -1
  124. package/dist/types/packages/jsonapi/utils/media-type.d.ts +2 -2
  125. package/dist/types/packages/loader/builder/index.d.ts +3 -3
  126. package/dist/types/packages/loader/builder/interfaces.d.ts +7 -7
  127. package/dist/types/packages/loader/builder/utils/create-children-builder.d.ts +2 -2
  128. package/dist/types/packages/loader/builder/utils/create-parent-builder.d.ts +9 -2
  129. package/dist/types/packages/loader/builder/utils/sort-by-namespace.d.ts +2 -2
  130. package/dist/types/packages/loader/index.d.ts +1 -1
  131. package/dist/types/packages/loader/interfaces.d.ts +2 -2
  132. package/dist/types/packages/loader/resolver/index.d.ts +2 -2
  133. package/dist/types/packages/loader/resolver/utils/closest-ancestor.d.ts +2 -2
  134. package/dist/types/packages/loader/resolver/utils/closest-child.d.ts +2 -2
  135. package/dist/types/packages/logger/constants.d.ts +3 -3
  136. package/dist/types/packages/logger/errors/invalid-config-error.d.ts +5 -0
  137. package/dist/types/packages/logger/index.d.ts +65 -142
  138. package/dist/types/packages/logger/interfaces.d.ts +52 -10
  139. package/dist/types/packages/logger/request-logger/index.d.ts +3 -5
  140. package/dist/types/packages/logger/request-logger/interfaces.d.ts +5 -5
  141. package/dist/types/packages/logger/request-logger/templates.d.ts +5 -9
  142. package/dist/types/packages/logger/request-logger/utils/filter-params.d.ts +6 -1
  143. package/dist/types/packages/logger/request-logger/utils/log-json.d.ts +2 -4
  144. package/dist/types/packages/logger/request-logger/utils/log-text.d.ts +1 -3
  145. package/dist/types/packages/logger/request-logger/utils/params-for.d.ts +9 -0
  146. package/dist/types/packages/logger/utils/error-name.d.ts +7 -0
  147. package/dist/types/packages/logger/utils/line.d.ts +1 -3
  148. package/dist/types/packages/logger/writer/constants.d.ts +0 -1
  149. package/dist/types/packages/logger/writer/index.d.ts +6 -6
  150. package/dist/types/packages/logger/writer/interfaces.d.ts +2 -2
  151. package/dist/types/packages/logger/writer/utils/format-message.d.ts +2 -2
  152. package/dist/types/packages/lumenify/index.d.ts +20 -5
  153. package/dist/types/packages/lumenify/utils/create-response-proxy.d.ts +1 -1
  154. package/dist/types/packages/pm/cluster/index.d.ts +56 -7
  155. package/dist/types/packages/pm/cluster/interfaces.d.ts +2 -1
  156. package/dist/types/packages/pm/index.d.ts +2 -2
  157. package/dist/types/packages/router/definitions/context/index.d.ts +5 -7
  158. package/dist/types/packages/router/definitions/context/utils/create-definition-group.d.ts +3 -5
  159. package/dist/types/packages/router/definitions/context/utils/create-definition.d.ts +11 -6
  160. package/dist/types/packages/router/definitions/context/utils/normalize-resource-args.d.ts +4 -5
  161. package/dist/types/packages/router/definitions/index.d.ts +5 -9
  162. package/dist/types/packages/router/definitions/interfaces.d.ts +4 -4
  163. package/dist/types/packages/router/index.d.ts +23 -11
  164. package/dist/types/packages/router/interfaces.d.ts +4 -4
  165. package/dist/types/packages/router/namespace/index.d.ts +7 -9
  166. package/dist/types/packages/router/namespace/interfaces.d.ts +3 -3
  167. package/dist/types/packages/router/namespace/utils/normalize-name.d.ts +1 -3
  168. package/dist/types/packages/router/namespace/utils/normalize-path.d.ts +1 -3
  169. package/dist/types/packages/router/resource/index.d.ts +7 -8
  170. package/dist/types/packages/router/resource/interfaces.d.ts +12 -4
  171. package/dist/types/packages/router/resource/utils/normalize-only.d.ts +3 -5
  172. package/dist/types/packages/router/route/action/enhancers/resource.d.ts +1 -3
  173. package/dist/types/packages/router/route/action/enhancers/track-perf.d.ts +1 -3
  174. package/dist/types/packages/router/route/action/index.d.ts +7 -2
  175. package/dist/types/packages/router/route/action/interfaces.d.ts +4 -0
  176. package/dist/types/packages/router/route/action/utils/create-page-links.d.ts +21 -5
  177. package/dist/types/packages/router/route/action/utils/get-action-name.d.ts +1 -3
  178. package/dist/types/packages/router/route/action/utils/get-controller-name.d.ts +1 -3
  179. package/dist/types/packages/router/route/index.d.ts +13 -9
  180. package/dist/types/packages/router/route/interfaces.d.ts +7 -5
  181. package/dist/types/packages/router/route/params/errors/client-generated-id-error.d.ts +4 -4
  182. package/dist/types/packages/router/route/params/errors/forbidden-parameter-error.d.ts +4 -4
  183. package/dist/types/packages/router/route/params/errors/index.d.ts +1 -0
  184. package/dist/types/packages/router/route/params/errors/invalid-parameter-error.d.ts +4 -6
  185. package/dist/types/packages/router/route/params/errors/parameter-not-nullable-error.d.ts +4 -6
  186. package/dist/types/packages/router/route/params/errors/parameter-range-error.d.ts +9 -0
  187. package/dist/types/packages/router/route/params/errors/parameter-required-error.d.ts +4 -6
  188. package/dist/types/packages/router/route/params/errors/parameter-type-error.d.ts +4 -6
  189. package/dist/types/packages/router/route/params/errors/parameter-value-error.d.ts +4 -6
  190. package/dist/types/packages/router/route/params/errors/resource-mismatch-error.d.ts +4 -6
  191. package/dist/types/packages/router/route/params/index.d.ts +5 -9
  192. package/dist/types/packages/router/route/params/interfaces.d.ts +12 -8
  193. package/dist/types/packages/router/route/params/parameter/forbidden-parameter.d.ts +1 -1
  194. package/dist/types/packages/router/route/params/parameter/ignored-parameter.d.ts +14 -0
  195. package/dist/types/packages/router/route/params/parameter/index.d.ts +21 -5
  196. package/dist/types/packages/router/route/params/parameter/interfaces.d.ts +2 -2
  197. package/dist/types/packages/router/route/params/parameter/utils/validate-range.d.ts +3 -0
  198. package/dist/types/packages/router/route/params/parameter/utils/validate-value.d.ts +1 -3
  199. package/dist/types/packages/router/route/params/parameter-group/index.d.ts +3 -5
  200. package/dist/types/packages/router/route/params/parameter-group/utils/missing-params.d.ts +8 -0
  201. package/dist/types/packages/router/route/params/utils/get-data-params.d.ts +5 -1
  202. package/dist/types/packages/router/route/params/utils/get-default-collection-params.d.ts +1 -3
  203. package/dist/types/packages/router/route/params/utils/get-default-member-params.d.ts +5 -2
  204. package/dist/types/packages/router/route/params/utils/get-query-params.d.ts +3 -9
  205. package/dist/types/packages/router/route/params/utils/get-url-params.d.ts +1 -3
  206. package/dist/types/packages/router/route/params/utils/parse-column-value.d.ts +16 -0
  207. package/dist/types/packages/router/route/params/utils/validate-client-id.d.ts +1 -1
  208. package/dist/types/packages/router/route/params/utils/validate-resource-id.d.ts +1 -3
  209. package/dist/types/packages/router/route/params/utils/validate-type.d.ts +3 -5
  210. package/dist/types/packages/router/route/utils/get-dynamic-segments.d.ts +1 -3
  211. package/dist/types/packages/router/route/utils/get-static-path.d.ts +6 -2
  212. package/dist/types/packages/router/utils/create-replacer.d.ts +10 -2
  213. package/dist/types/packages/serializer/index.d.ts +243 -434
  214. package/dist/types/packages/serializer/interfaces.d.ts +19 -1
  215. package/dist/types/packages/serializer/utils/include-tree.d.ts +12 -3
  216. package/dist/types/packages/serializer/utils/load-linkage.d.ts +9 -3
  217. package/dist/types/packages/server/errors/error-list.d.ts +25 -0
  218. package/dist/types/packages/server/errors/method-not-allowed-error.d.ts +11 -0
  219. package/dist/types/packages/server/index.d.ts +9 -9
  220. package/dist/types/packages/server/interfaces.d.ts +59 -7
  221. package/dist/types/packages/server/request/constants.d.ts +2 -2
  222. package/dist/types/packages/server/request/index.d.ts +3 -5
  223. package/dist/types/packages/server/request/interfaces.d.ts +72 -8
  224. package/dist/types/packages/server/request/parser/errors/malformed-request-error.d.ts +3 -5
  225. package/dist/types/packages/server/request/parser/index.d.ts +6 -1
  226. package/dist/types/packages/server/request/parser/utils/format.d.ts +13 -11
  227. package/dist/types/packages/server/request/parser/utils/normalize-document.d.ts +13 -0
  228. package/dist/types/packages/server/request/parser/utils/parse-nested-object.d.ts +1 -3
  229. package/dist/types/packages/server/request/parser/utils/parse-read.d.ts +2 -4
  230. package/dist/types/packages/server/request/parser/utils/parse-write.d.ts +17 -1
  231. package/dist/types/packages/server/request/utils/get-domain.d.ts +1 -3
  232. package/dist/types/packages/server/responder/index.d.ts +1 -3
  233. package/dist/types/packages/server/responder/utils/content-type-for.d.ts +8 -0
  234. package/dist/types/packages/server/responder/utils/data-for.d.ts +3 -5
  235. package/dist/types/packages/server/responder/utils/normalize.d.ts +2 -3
  236. package/dist/types/packages/server/response/index.d.ts +3 -5
  237. package/dist/types/packages/server/response/interfaces.d.ts +14 -3
  238. package/dist/types/packages/server/utils/client-ip-for.d.ts +10 -0
  239. package/dist/types/packages/server/utils/create-server-error.d.ts +11 -3
  240. package/dist/types/packages/server/utils/request-id-for.d.ts +9 -0
  241. package/dist/types/packages/server/utils/set-cors-headers.d.ts +2 -2
  242. package/dist/types/packages/server/utils/source-for.d.ts +19 -3
  243. package/dist/types/packages/server/utils/status-for-error.d.ts +6 -0
  244. package/dist/types/packages/server/utils/validate-accept.d.ts +1 -1
  245. package/dist/types/packages/server/utils/validate-content-type.d.ts +8 -3
  246. package/dist/types/packages/testing/audit-visibility.d.ts +189 -0
  247. package/dist/types/packages/testing/index.d.ts +4 -0
  248. package/dist/types/packages/testing/start-app.d.ts +52 -0
  249. package/dist/types/packages/testing/utils/identifiers-in.d.ts +14 -0
  250. package/dist/types/testing.d.ts +9 -0
  251. package/dist/types/utils/chalk.d.ts +16 -0
  252. package/dist/types/utils/pick.d.ts +2 -2
  253. package/package.json +54 -26
  254. package/dist/types/packages/cli/commands/test.d.ts +0 -4
  255. package/dist/types/packages/logger/utils/sql.d.ts +0 -4
  256. package/dist/types/packages/router/route/params/parameter-group/utils/has-required-params.d.ts +0 -5
  257. package/dist/types/utils/create-query-string.d.ts +0 -6
  258. package/dist/types/utils/has-own-property.d.ts +0 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/packages/database/errors/invalid-driver-error.ts", "../src/packages/database/constants.ts", "../src/constants.ts", "../src/utils/k.ts", "../src/packages/freezeable/constants.ts", "../src/utils/insert.ts", "../src/utils/is-object.ts", "../src/packages/freezeable/utils/freeze.ts", "../src/packages/freezeable/utils/is-frozen.ts", "../src/packages/freezeable/map/index.ts", "../src/packages/freezeable/set/index.ts", "../src/packages/logger/constants.ts", "../src/packages/logger/writer/index.ts", "../src/utils/entries.ts", "../src/utils/omit.ts", "../src/packages/logger/writer/constants.ts", "../src/utils/stringify.ts", "../src/packages/logger/writer/utils/format-message.ts", "../src/packages/logger/request-logger/utils/log-text.ts", "../src/packages/logger/request-logger/templates.ts", "../src/packages/template/utils/insert-values.ts", "../src/packages/logger/utils/line.ts", "../src/packages/logger/request-logger/utils/filter-params.ts", "../src/packages/logger/request-logger/utils/log-json.ts", "../src/packages/logger/request-logger/index.ts", "../src/packages/logger/utils/sql.ts", "../src/packages/logger/index.ts", "../src/packages/database/errors/model-missing-error.ts", "../src/packages/database/errors/migrations-pending-error.ts", "../src/packages/server/utils/create-server-error.ts", "../src/packages/database/errors/unique-constraint-error.ts", "../src/packages/database/errors/config-missing-error.ts", "../src/packages/database/initialize.ts", "../src/packages/database/utils/connect.ts", "../src/packages/database/utils/create-migrations.ts", "../src/packages/fs/index.ts", "../src/packages/fs/watcher/index.ts", "../src/packages/fs/watcher/initialize.ts", "../src/utils/try-catch.ts", "../src/packages/fs/utils/create-resolver.ts", "../src/utils/chain.ts", "../src/packages/database/utils/pending-migrations.ts", "../src/packages/database/utils/normalize-model-name.ts", "../src/utils/compose.ts", "../src/utils/underscore.ts", "../src/packages/database/model/index.ts", "../src/packages/database/query/index.ts", "../src/utils/uniq.ts", "../src/packages/database/query/utils/scopes-for.ts", "../src/packages/database/query/utils/format-select.ts", "../src/packages/database/query/errors/record-not-found-error.ts", "../src/packages/database/query/runner/constants.ts", "../src/packages/database/query/runner/utils/get-find-param.ts", "../src/packages/database/query/runner/utils/build-results.ts", "../src/utils/promise-hash.ts", "../src/packages/database/query/runner/index.ts", "../src/utils/map-to-object.ts", "../src/packages/database/change-set/index.ts", "../src/packages/database/relationship/index.ts", "../src/packages/database/relationship/utils/getters.ts", "../src/packages/database/relationship/utils/unassociate.ts", "../src/utils/is-null.ts", "../src/packages/database/relationship/utils/validate-type.ts", "../src/packages/database/relationship/utils/inverse-setters.ts", "../src/packages/database/relationship/utils/setters.ts", "../src/packages/database/relationship/utils/update-relationship.ts", "../src/utils/has-own-property.ts", "../src/utils/proxy.ts", "../src/packages/database/transaction/index.ts", "../src/utils/pick.ts", "../src/utils/diff.ts", "../src/packages/database/model/utils/get-columns.ts", "../src/packages/database/model/utils/persistence.ts", "../src/packages/database/model/initialize-class.ts", "../src/utils/is-undefined.ts", "../src/packages/database/attribute/utils/create-getter.ts", "../src/packages/database/attribute/utils/create-setter.ts", "../src/packages/database/attribute/utils/create-normalizer.ts", "../src/packages/database/attribute/index.ts", "../src/packages/server/utils/source-for.ts", "../src/packages/database/validation/errors/validation-error.ts", "../src/packages/database/validation/index.ts", "../src/packages/database/model/utils/validate.ts", "../src/packages/database/model/utils/process-write-error.ts", "../src/packages/database/model/utils/run-hooks.ts", "../src/packages/database/migration/index.ts", "../src/packages/database/utils/type-for-column.ts", "../src/packages/database/index.ts", "../src/packages/server/index.ts", "../src/packages/server/constants.ts", "../src/packages/server/request/index.ts", "../src/packages/server/request/constants.ts", "../src/packages/server/request/parser/utils/parse-nested-object.ts", "../src/packages/server/request/parser/utils/format.ts", "../src/packages/server/request/parser/constants.ts", "../src/utils/transform-keys.ts", "../src/packages/server/request/parser/utils/parse-read.ts", "../src/packages/server/request/parser/errors/malformed-request-error.ts", "../src/packages/server/request/parser/utils/parse-write.ts", "../src/packages/server/request/parser/index.ts", "../src/packages/server/request/utils/get-domain.ts", "../src/packages/server/response/index.ts", "../src/packages/jsonapi/constants.ts", "../src/packages/jsonapi/errors/not-acceptable-error.ts", "../src/packages/jsonapi/errors/unsupported-media-type-error.ts", "../src/packages/jsonapi/errors/invalid-content-type-error.ts", "../src/packages/jsonapi/utils/media-type.ts", "../src/packages/jsonapi/utils/is-jsonapi.ts", "../src/packages/jsonapi/utils/has-media-type-params.ts", "../src/utils/env.ts", "../src/packages/server/responder/utils/data-for.ts", "../src/packages/server/responder/utils/normalize.ts", "../src/packages/server/responder/utils/has-content-type.ts", "../src/packages/server/responder/index.ts", "../src/packages/server/utils/validate-accept.ts", "../src/packages/server/utils/validate-content-type.ts", "../src/packages/server/utils/set-cors-headers.ts", "../src/utils/merge.ts", "../src/packages/controller/utils/params-to-query.ts", "../src/packages/controller/utils/find-one.ts", "../src/packages/controller/utils/find-many.ts", "../src/packages/controller/utils/resolve-relationships.ts", "../src/packages/controller/errors/related-record-not-found-error.ts", "../src/packages/controller/utils/validate-relationships.ts", "../src/packages/controller/constants.ts", "../src/packages/controller/index.ts", "../src/packages/serializer/index.ts", "../src/packages/loader/resolver/utils/closest-ancestor.ts", "../src/packages/serializer/utils/load-linkage.ts", "../src/packages/serializer/utils/include-tree.ts", "../src/packages/config/index.ts", "../src/packages/router/namespace/utils/normalize-name.ts", "../src/packages/router/namespace/utils/normalize-path.ts", "../src/packages/router/namespace/index.ts", "../src/utils/create-query-string.ts", "../src/packages/router/route/action/utils/create-page-links.ts", "../src/packages/router/route/action/enhancers/resource.ts", "../src/packages/router/route/action/constants.ts", "../src/packages/router/route/action/utils/get-action-name.ts", "../src/packages/router/route/action/utils/get-controller-name.ts", "../src/packages/router/route/action/enhancers/track-perf.ts", "../src/packages/router/route/action/index.ts", "../src/packages/router/route/params/errors/parameter-type-error.ts", "../src/packages/router/route/params/errors/parameter-value-error.ts", "../src/packages/router/route/params/errors/invalid-parameter-error.ts", "../src/packages/router/route/params/errors/resource-mismatch-error.ts", "../src/packages/router/route/params/errors/parameter-required-error.ts", "../src/packages/router/route/params/errors/client-generated-id-error.ts", "../src/packages/router/route/params/errors/forbidden-parameter-error.ts", "../src/packages/router/route/params/errors/parameter-not-nullable-error.ts", "../src/utils/is-buffer.ts", "../src/packages/router/route/params/utils/validate-type.ts", "../src/packages/router/route/params/parameter-group/utils/has-required-params.ts", "../src/packages/router/route/params/parameter-group/index.ts", "../src/packages/router/route/params/parameter/utils/validate-value.ts", "../src/packages/router/route/params/parameter/index.ts", "../src/packages/router/route/params/utils/get-url-params.ts", "../src/packages/router/route/params/parameter/forbidden-parameter.ts", "../src/packages/router/route/params/utils/get-data-params.ts", "../src/packages/router/route/params/utils/get-default-member-params.ts", "../src/packages/router/route/params/utils/get-default-collection-params.ts", "../src/packages/router/route/params/utils/get-query-params.ts", "../src/packages/router/route/params/utils/validate-client-id.ts", "../src/packages/router/route/params/utils/validate-resource-id.ts", "../src/packages/router/route/params/index.ts", "../src/packages/router/route/utils/get-static-path.ts", "../src/packages/router/route/constants.ts", "../src/packages/router/route/utils/get-dynamic-segments.ts", "../src/packages/router/route/index.ts", "../src/packages/router/resource/utils/normalize-only.ts", "../src/packages/router/resource/index.ts", "../src/errors/controller-missing-error.ts", "../src/packages/router/definitions/context/utils/create-definition.ts", "../src/packages/router/definitions/context/utils/create-definition-group.ts", "../src/packages/router/definitions/context/utils/normalize-resource-args.ts", "../src/packages/router/definitions/context/index.ts", "../src/packages/router/definitions/index.ts", "../src/packages/router/utils/create-replacer.ts", "../src/packages/router/index.ts", "../src/packages/loader/utils/bundle-for.ts", "../src/packages/loader/utils/format-key.ts", "../src/packages/loader/resolver/utils/closest-child.ts", "../src/packages/loader/resolver/index.ts", "../src/packages/loader/builder/utils/create-parent-builder.ts", "../src/packages/loader/builder/utils/sort-by-namespace.ts", "../src/packages/loader/builder/utils/create-children-builder.ts", "../src/packages/loader/builder/index.ts", "../src/packages/loader/index.ts", "../src/packages/application/utils/normalize-port.ts", "../src/packages/application/utils/create-controller.ts", "../src/packages/application/utils/create-serializer.ts", "../src/packages/application/utils/validate-namespaced-serializers.ts", "../src/errors/namespaced-serializer-missing-error.ts", "../src/packages/application/initialize.ts", "../src/packages/application/index.ts", "../src/packages/lumenify/utils/create-response-proxy.ts", "../src/packages/lumenify/index.ts"],
4
- "sourcesContent": ["import { green, yellow } from 'chalk';\n\nimport { VALID_DRIVERS } from '../constants';\nimport { line } from '../../logger';\n\n/**\n * @private\n */\nclass InvalidDriverError extends Error {\n constructor(driver: string) {\n super(line`\n Invalid database driver ${yellow(driver)} in ./config/database.js.\n Please use one of the following database drivers:\n ${VALID_DRIVERS.map(str => green(str)).join(', ')}.\n `);\n }\n}\n\nexport default InvalidDriverError;\n", "// Driver error codes and messages for a unique-constraint violation: pg\n// (`23505`, \"duplicate key value violates unique constraint\"), mysql\n// (`ER_DUP_ENTRY`), sqlite (\"UNIQUE constraint failed\") and mssql\n// (\"Violation of UNIQUE KEY constraint\"). No `g` flag \u2014 `.test()` on a\n// global regex is stateful and would miss every other match.\nexport const UNIQUE_CONSTRAINT_CODES = new Set(['23505', 'ER_DUP_ENTRY']);\nexport const UNIQUE_CONSTRAINT = /unique(\\s+key)?\\s+constraint|duplicate key/i;\n\nexport const VALID_DRIVERS = [\n 'pg',\n 'sqlite3',\n 'mssql',\n 'mysql',\n 'mysql2',\n 'mariasql',\n 'strong-oracle',\n 'oracle'\n];\n\nexport const TYPE_ALIASES = new Map([\n ['enu', 'array'],\n ['enum', 'array'],\n\n ['json', 'object'],\n ['jsonb', 'object'],\n\n ['binary', 'buffer'],\n\n ['bool', 'boolean'],\n ['boolean', 'boolean'],\n\n ['time', 'date'],\n ['date', 'date'],\n ['datetime', 'date'],\n\n ['text', 'string'],\n ['uuid', 'string'],\n ['string', 'string'],\n ['varchar', 'string'],\n\n ['int', 'number'],\n ['float', 'number'],\n ['integer', 'number'],\n ['decimal', 'number'],\n ['floating', 'number'],\n ['bigInteger', 'number']\n]);\n", "import { platform } from 'os';\n\nconst { env: ENV } = process;\n\nexport const CWD = process.cwd();\n\n// NOTE: the Flow original derived this via a `cluster.worker.pid` check, but\n// Node's `Worker` has no `pid` property \u2014 the pid lives at\n// `worker.process.pid` \u2014 so `typeof worker.pid === 'number'` was always false\n// and the branch never ran. It was a no-op either way: inside a worker process\n// `worker.process.pid` *is* `process.pid`. Simplified rather than preserving\n// dead code; behaviour is unchanged.\nexport const PID = process.pid;\n\n// `ENV.PORT` is `string | undefined`; `parseInt(undefined)` yields NaN, which\n// the `||` below turns into the default. Cast rather than `??` so the emitted\n// bundle stays parseable by the Babel 6 stages that still consume it.\nexport const PORT = parseInt(ENV.PORT as string, 10) || 4000;\nexport const NODE_ENV = ENV.NODE_ENV || 'development';\nexport const DATABASE_URL = ENV.DATABASE_URL;\nexport const LUMEN_CONSOLE = ENV.LUMEN_CONSOLE || false;\nexport const PLATFORM = platform();\n", "/**\n * A utility function that always returns `this` based on it's current\n * context.\n *\n * A common use case for the K function is a default parameter for optional\n * callback functions or general function arguments.\n *\n * @private\n */\nexport default function K(this: unknown): unknown {\n return this;\n}\n", "export const FREEZER = new WeakSet<object>();\n", "/**\n * @private\n */\nexport default function insert<T, U extends T[]>(target: U, items: T[]): U {\n for (let i = 0; i < items.length; i += 1) {\n target.splice(i, 1, items[i]);\n }\n\n return target;\n}\n", "/**\n * Determine wether or not a value is an Object.\n *\n * @example\n * const a = null;\n * const b = [];\n * const c = {};\n *\n * console.log(typeof a, typeof b, typeof c);\n * // => 'object', 'object', 'object' \uD83D\uDC4E\n *\n * console.log(isObject(a), isObject(b), isObject(c));\n * // => false, false, true \uD83D\uDC4D\n *\n * @private\n */\nexport default function isObject(\n value: unknown\n): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n", "import { FREEZER } from '../constants';\nimport insert from '../../../utils/insert';\nimport isObject from '../../../utils/is-object';\n\n/**\n * Anything exposing a `freeze` method \u2014 in practice FreezeableMap/FreezeableSet.\n *\n * @private\n */\ninterface Freezeable {\n freeze(deep?: boolean): unknown;\n}\n\nfunction isFreezeable(value: unknown): value is Freezeable {\n return Boolean(value) && typeof (value as Freezeable).freeze === 'function';\n}\n\n/**\n * @private\n */\nexport default function freeze<T extends object>(value: T): T {\n FREEZER.add(value);\n return value;\n}\n\n/**\n * @private\n */\nexport function freezeArray<T>(target: T[]): readonly T[] {\n const result = insert(new Array<T>(target.length), target);\n\n return Object.freeze(result);\n}\n\n/**\n * @private\n */\nexport function freezeValue<T>(value: T): T {\n if (isFreezeable(value)) {\n return Object.freeze(value).freeze(true) as T;\n } else if (isObject(value)) {\n return Object.freeze(value) as T;\n }\n\n return value;\n}\n\n/**\n * @private\n */\nexport function freezeProps<T extends object>(\n target: T,\n makePublic: boolean,\n ...props: string[]\n): T {\n Object.defineProperties(\n target,\n props.reduce<PropertyDescriptorMap>(\n (obj, key) => ({\n ...obj,\n [key]: {\n value: Reflect.get(target, key),\n writable: false,\n enumerable: makePublic,\n configurable: false\n }\n }),\n {}\n )\n );\n\n return target;\n}\n\n/**\n * @private\n */\nexport function deepFreezeProps<T extends object>(\n target: T,\n makePublic: boolean,\n ...props: string[]\n): T {\n Object.defineProperties(\n target,\n props.reduce<PropertyDescriptorMap>((obj, key) => {\n let value: unknown = Reflect.get(target, key);\n\n if (Array.isArray(value)) {\n value = freezeArray(value);\n } else {\n value = freezeValue(value);\n }\n\n return {\n ...obj,\n [key]: {\n value,\n writable: false,\n enumerable: makePublic,\n configurable: false\n }\n };\n }, {})\n );\n\n return target;\n}\n", "import { FREEZER } from '../constants';\n\n/**\n * @private\n */\nexport default function isFrozen(value: unknown): boolean {\n // `WeakSet#has` returns false for non-objects rather than throwing, so this\n // keeps the original behaviour of accepting any value.\n return FREEZER.has(value as object);\n}\n", "import freeze from '../utils/freeze';\nimport isFrozen from '../utils/is-frozen';\n\n/**\n * @private\n */\nclass FreezeableMap<K, V> extends Map<K, V> {\n override set(key: K, value: V): this {\n if (!this.isFrozen()) {\n super.set(key, value);\n }\n\n return this;\n }\n\n override clear(): void {\n if (!this.isFrozen()) {\n super.clear();\n }\n }\n\n override delete(key: K): boolean {\n return this.isFrozen() ? false : super.delete(key);\n }\n\n freeze(deep?: boolean): this {\n if (deep) {\n this.forEach(Object.freeze);\n }\n\n return freeze(this);\n }\n\n isFrozen(): boolean {\n return isFrozen(this);\n }\n}\n\nexport default FreezeableMap;\n", "import freeze from '../utils/freeze';\nimport isFrozen from '../utils/is-frozen';\n\n/**\n * @private\n */\nclass FreezeableSet<T> extends Set<T> {\n override add(value: T): this {\n if (!this.isFrozen()) {\n super.add(value);\n }\n\n return this;\n }\n\n override clear(): void {\n if (!this.isFrozen()) {\n super.clear();\n }\n }\n\n override delete(value: T): boolean {\n return this.isFrozen() ? false : super.delete(value);\n }\n\n freeze(deep?: boolean): this {\n if (deep) {\n this.forEach(Object.freeze);\n }\n\n return freeze(this);\n }\n\n isFrozen(): boolean {\n return isFrozen(this);\n }\n}\n\nexport default FreezeableSet;\n", "import { FreezeableMap, FreezeableSet } from '../freezeable';\n\nimport type { Logger$level, Logger$format } from './interfaces';\n\nexport const DEBUG = 'DEBUG';\nexport const INFO = 'INFO';\nexport const WARN = 'WARN';\nexport const ERROR = 'ERROR';\n\nexport const FORMATS: FreezeableSet<Logger$format> =\n new FreezeableSet<Logger$format>(['text', 'json']);\n\nFORMATS.freeze();\n\nexport const LEVELS: FreezeableMap<Logger$level, number> = new FreezeableMap<\n Logger$level,\n number\n>([\n [DEBUG, 0],\n [INFO, 1],\n [WARN, 2],\n [ERROR, 3]\n]);\n\nLEVELS.freeze();\n", "import { WriteStream } from 'tty';\n\nimport { dim, red, yellow } from 'chalk';\n\nimport { WARN, ERROR } from '../constants';\nimport omit from '../../../utils/omit';\nimport type { Logger$format } from '../interfaces';\n\nimport { STDOUT, STDERR } from './constants';\nimport formatMessage from './utils/format-message';\nimport type { Logger$Writer } from './interfaces';\n\n/**\n * A logged message that is itself an object carrying its own `message` field,\n * which the JSON writer hoists to the top level.\n */\nfunction isMessageObject(value: unknown): value is { message?: unknown } {\n return Boolean(value) && typeof value === 'object';\n}\n\n/**\n * @private\n */\nexport function createWriter(format: Logger$format): Logger$Writer {\n return function write(data) {\n const { level, ...etc } = data;\n let { message, timestamp } = etc;\n let output: unknown;\n\n if (format === 'json') {\n output = {};\n\n if (isMessageObject(message) && message.message) {\n output = {\n timestamp,\n level,\n message: message.message,\n ...omit(message, 'message')\n };\n } else {\n // The Flow original spread `...etc` here too, but `etc` is just\n // `{ message, timestamp }` \u2014 both already listed above with the same\n // values \u2014 so the spread only re-wrote them. Dropping it keeps the\n // identical key order and values.\n output = {\n timestamp,\n level,\n message\n };\n }\n\n output = formatMessage(output, 'json');\n } else {\n let columns = 0;\n\n if (process.stdout instanceof WriteStream) {\n columns = process.stdout.columns;\n }\n\n message = formatMessage(message, 'text');\n\n switch (level) {\n case WARN:\n timestamp = yellow(`[${timestamp}]`);\n break;\n\n case ERROR:\n timestamp = red(`[${timestamp}]`);\n break;\n\n default:\n timestamp = dim(`[${timestamp}]`);\n break;\n }\n\n output = `${timestamp} ${message}\\n\\n${dim('-').repeat(columns)}\\n`;\n }\n\n if (STDOUT.test(level)) {\n process.stdout.write(`${output}\\n`);\n } else if (STDERR.test(level)) {\n process.stderr.write(`${output}\\n`);\n }\n };\n}\n", "/**\n * @private\n */\nexport default function entries<T>(\n source: Record<string, T>\n): Array<[string, T]> {\n return Object.entries(source);\n}\n", "import entries from './entries';\n\n/**\n * Returns a copy of `src` without `omitted` keys.\n *\n * Typed as `Partial<T>` rather than Flow's `T`, since the omitted keys are by\n * definition absent from the result.\n *\n * @private\n */\nexport default function omit<T extends object>(\n src: T,\n ...omitted: string[]\n): Partial<T> {\n return entries(src as Record<string, unknown>)\n .filter(([key]) => omitted.indexOf(key) < 0)\n .reduce<Record<string, unknown>>(\n (result, [key, value]) => ({\n ...result,\n [key]: value\n }),\n {}\n ) as Partial<T>;\n}\n", "import ansiRegex from 'ansi-regex';\n\nexport const ANSI = ansiRegex();\nexport const STDOUT = /^(DEBUG|INFO)$/;\nexport const STDERR = /^(WARN|ERROR)$/;\n", "import isObject from './is-object';\n\n/**\n * @private\n */\nexport default function stringify(value?: unknown, spaces?: number): string {\n if (isObject(value) || Array.isArray(value)) {\n return JSON.stringify(value, null, spaces);\n }\n\n return String(value);\n}\n", "import { ANSI } from '../constants';\nimport stringify from '../../../../utils/stringify';\nimport type { Logger$format } from '../../interfaces';\n\n/**\n * Returns `string | undefined` because `Error#stack` is optional \u2014 the Flow\n * original had the same behaviour, it just did not say so.\n *\n * `data` is required here; Flow allowed it to be declared optional ahead of a\n * required parameter, which TypeScript does not (and every caller passes both).\n */\nexport default function formatMessage(\n data: unknown,\n format: Logger$format\n): string | undefined {\n if (data instanceof Error) {\n return data.stack;\n } else if (format === 'json') {\n return stringify(data).replace(ANSI, '');\n }\n\n return stringify(data, 2);\n}\n", "import chalk from 'chalk';\n\nimport { DEBUG } from '../../constants';\nimport { infoTemplate, debugTemplate } from '../templates';\nimport type Logger from '../../index';\nimport type { Request, Response } from '../../../server';\n\nimport filterParams from './filter-params';\n\n/**\n * @private\n */\nexport default function logText(\n logger: Logger,\n {\n startTime,\n request: req,\n response: res\n }: {\n request: Request;\n response: Response;\n startTime: number;\n }\n): void {\n res.once('finish', () => {\n const endTime = Date.now();\n\n const {\n route,\n method,\n\n url: { path },\n\n connection: { remoteAddress }\n } = req;\n\n const { stats, statusCode, statusMessage } = res;\n const params = filterParams(req.params, ...logger.filter.params);\n const statusColor = statusCode >= 200 && statusCode < 400 ? 'green' : 'red';\n\n let colorStr: (source: string) => string = Reflect.get(chalk, statusColor);\n\n if (typeof colorStr === 'undefined') {\n colorStr = (str: string) => str;\n }\n\n const templateData = {\n path,\n stats,\n route,\n method,\n params,\n colorStr,\n startTime,\n endTime,\n statusCode: statusCode.toString(),\n statusMessage,\n remoteAddress\n };\n\n if (logger.level === DEBUG) {\n logger.debug(debugTemplate(templateData));\n } else {\n logger.info(infoTemplate(templateData));\n }\n });\n}\n", "import { blue, cyan, magenta, yellow } from 'chalk';\n\nimport line from '../utils/line';\n\nimport type { RequestLogger$templateData } from './interfaces';\n\n/**\n * @private\n */\nfunction countDigits(num: number) {\n const digits = Math.floor(Math.log10(num) + 1);\n\n return digits > 0 && Number.isFinite(digits) ? digits : 1;\n}\n\n/**\n * @private\n */\nfunction pad(startTime: number, endTime: number, duration: number) {\n const maxLength = countDigits(endTime - startTime);\n\n return ' '.repeat(maxLength - countDigits(duration)) + duration;\n}\n\n/**\n * @private\n */\nexport const debugTemplate = ({\n path,\n stats,\n route,\n method,\n params,\n colorStr,\n startTime,\n endTime,\n statusCode,\n statusMessage,\n remoteAddress\n}: RequestLogger$templateData) => `\\\n${line`\n Processed ${cyan(`${method}`)} \"${path}\" from ${remoteAddress}\n with ${Reflect.apply(colorStr, null, [`${statusCode}`])}\n ${Reflect.apply(colorStr, null, [`${statusMessage}`])} by ${\n route\n ? `${yellow(route.controller.constructor.name)}#${blue(route.action)}`\n : null\n }\n`}\n\n${magenta('Params')}\n\n${JSON.stringify(params, null, 2)}\n\n${magenta('Stats')}\n\n${stats\n .map(stat => {\n const { type, duration, controller } = stat;\n let { name } = stat;\n\n name = blue(name);\n\n if (type === 'action') {\n name = `${yellow(controller)}#${name}`;\n }\n\n return `${pad(startTime, endTime, duration)} ms ${name}`;\n })\n .join('\\n')}\n${pad(\n startTime,\n endTime,\n stats.reduce((total, { duration }) => total + duration, 0)\n)} ms Total\n${(endTime - startTime).toString()} ms Actual\\\n`;\n\n/**\n * @private\n */\nexport const infoTemplate = ({\n path,\n route,\n method,\n params,\n colorStr,\n startTime,\n endTime,\n statusCode,\n statusMessage,\n remoteAddress\n}: RequestLogger$templateData) => line`\nProcessed ${cyan(`${method}`)} \"${path}\" ${magenta('Params')} ${JSON.stringify(\n params\n)} from ${remoteAddress} in ${(endTime - startTime).toString()} ms with ${Reflect.apply(\n colorStr,\n null,\n [`${statusCode}`]\n)} ${Reflect.apply(colorStr, null, [`${statusMessage}`])} by ${\n route\n ? `${yellow(route.controller.constructor.name)}#${blue(route.action)}`\n : null\n}\n`;\n", "/**\n * @private\n */\nexport default function insertValues(\n strings: readonly string[],\n ...values: unknown[]\n): string {\n if (values.length) {\n return strings.reduce((result, part, idx): string => {\n const raw: unknown = values[idx];\n let value = '';\n\n if (\n raw &&\n typeof (raw as { toString?: unknown }).toString === 'function'\n ) {\n value = (raw as { toString(): string }).toString();\n }\n\n return result + part + value;\n }, '');\n }\n\n return strings.join('');\n}\n", "import { insertValues } from '../../template';\n\n/**\n * @private\n */\nexport default function line(\n strings: readonly string[],\n ...values: unknown[]\n): string {\n return insertValues(strings, ...values)\n .replace(/(\\r\\n|\\n|\\r|)/gm, '')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n", "import entries from '../../../../utils/entries';\n\n/**\n * @private\n */\nexport default function filterParams(\n params: Record<string, unknown>,\n ...filtered: string[]\n): Record<string, unknown> {\n return entries(params)\n .map(([key, value]): [string, unknown] => [\n key,\n filtered.indexOf(key) >= 0 ? '[FILTERED]' : value\n ])\n .reduce<Record<string, unknown>>(\n (result, [key, value]) => ({\n ...result,\n [key]:\n value && typeof value === 'object' && !Array.isArray(value)\n ? filterParams(value as Record<string, unknown>, ...filtered)\n : value\n }),\n {}\n );\n}\n", "import type Logger from '../../index';\nimport type { Request, Response } from '../../../server';\n\nimport filterParams from './filter-params';\n\nconst MESSAGE = 'Processed Request';\n\n/**\n * @private\n */\nexport default function logJSON(\n logger: Logger,\n {\n request: req,\n response: res\n }: {\n startTime: number;\n request: Request;\n response: Response;\n }\n): void {\n res.once('finish', () => {\n const {\n method,\n headers,\n httpVersion,\n\n url: { path },\n\n connection: { remoteAddress }\n } = req;\n\n const { statusCode: status } = res;\n const userAgent = headers.get('user-agent');\n const protocol = `HTTP/${httpVersion}`;\n const params = filterParams(req.params, ...logger.filter.params);\n\n logger.info({\n message: MESSAGE,\n\n method,\n path,\n params,\n status,\n protocol,\n userAgent,\n remoteAddress\n });\n });\n}\n", "import type Logger from '../index';\n\nimport logText from './utils/log-text';\nimport logJSON from './utils/log-json';\nimport type { Logger$RequestLogger } from './interfaces';\n\n/**\n * @private\n */\nexport function createRequestLogger(logger: Logger): Logger$RequestLogger {\n return function request(req, res, { startTime }: { startTime: number }) {\n if (logger.format === 'json') {\n logJSON(logger, {\n startTime,\n request: req,\n response: res\n });\n } else {\n logText(logger, {\n startTime,\n request: req,\n response: res\n });\n }\n };\n}\n", "import { insertValues } from '../../template';\n\nconst PATTERN = /(?:,?`|'|\").+(?:`|'|\"),?/;\n\n/**\n * @private\n */\nexport default function sql(\n strings: readonly string[],\n ...values: unknown[]\n): string {\n return insertValues(strings, ...values)\n .split(' ')\n .map(part => {\n if (PATTERN.test(part)) {\n return part;\n }\n\n return part.toUpperCase();\n })\n .join(' ');\n}\n", "import { LUMEN_CONSOLE } from '../../constants';\nimport K from '../../utils/k';\n\nimport { LEVELS } from './constants';\nimport { createWriter } from './writer';\nimport { createRequestLogger } from './request-logger';\nimport type { Logger$Writer } from './writer/interfaces';\nimport type { Logger$RequestLogger } from './request-logger/interfaces';\nimport type {\n Logger$config,\n Logger$format,\n Logger$level,\n Logger$logFn,\n Logger$filter\n} from './interfaces';\n\n/**\n * @class Logger\n * @public\n */\nclass Logger {\n /**\n * The level your application should log (DEBUG, INFO, WARN, or ERROR).\n *\n * @property level\n * @type {String}\n * @public\n */\n declare level: Logger$level;\n\n /**\n * The output format of log data (text or json).\n *\n * @property format\n * @type {String}\n * @public\n */\n declare format: Logger$format;\n\n /**\n * Hackers love logs. It's easy to get sensitive user information from log\n * data if your server has been breached. To prevent leaking sensitive\n * information in a potential attack, blacklist certain keys that should be\n * filtered out of the logs.\n *\n * ```javascript\n * // config/environments/development.js\n * export default {\n * logging: {\n * level: 'DEBUG',\n * format: 'text',\n * enabled: true,\n * filter: {\n * params: ['password']\n * }\n * }\n * };\n * ```\n *\n * Now that we've added password to the array of parameters we want to filter\n * out of the logs, let's try to create a new user.\n *\n * ```http\n * POST /users HTTP/1.1\n * Content-Type: application/vnd.api+json\n * Host: 127.0.0.1:4000\n * Connection: close\n * User-Agent: Paw/3.0.14 (Macintosh; OS X/10.12.1) GCDHTTPRequest\n * Content-Length: 188\n *\n * {\n * \"data\": {\n * \"type\": \"users\",\n * \"attributes\": {\n * \"name\": \"Zachary Golba\",\n * \"email\": \"zachary.golba@postlight.com\",\n * \"password\": \"vcZxniFYyfnFDcLn%nhe8Vrt\"\n * }\n * }\n * }\n * ```\n *\n * The request above will yield the following log message.\n *\n * ```text\n * [2016-12-10T18:28:04.610Z] Processed POST \"/users\" from ::ffff:127.0.0.1\n * with 201 Created by UsersController#create\n *\n * Params\n *\n * {\n * \"data\": {\n * \"type\": \"users\",\n * \"attributes\": {\n * \"name\": \"Zachary Golba\",\n * \"email\": \"zachary.golba@postlight.com\",\n * \"password\": \"[FILTERED]\"\n * }\n * }\n * }\n * ```\n *\n * It worked! The password value did not leak into the log message.\n *\n * @property filter\n * @type {Object}\n * @public\n */\n declare filter: Logger$filter;\n\n /**\n * A boolean flag that determines whether or not the logger is enabled.\n *\n * @property enabled\n * @type {Boolean}\n * @public\n */\n declare enabled: boolean;\n\n /**\n * Log a message at the DEBUG level.\n *\n * ```javascript\n * logger.debug('Hello World!');\n * // => [6/4/16 5:46:53 PM] Hello World!\n * ```\n *\n * @method debug\n * @param {any} data - The data you wish to log.\n * @return {void}\n * @public\n */\n declare debug: Logger$logFn;\n\n /**\n * Log a message at the INFO level.\n *\n * ```javascript\n * logger.info('Hello World!');\n * // => [6/4/16 5:46:53 PM] Hello World!\n * ```\n *\n * @method info\n * @param {any} data - The data you wish to log.\n * @return {void}\n * @public\n */\n declare info: Logger$logFn;\n\n /**\n * Log a message at the WARN level.\n *\n * ```javascript\n * logger.warn('Good Bye World!');\n * // => [6/4/16 5:46:53 PM] Good Bye World!\n * ```\n *\n * @method warn\n * @param {any} data - The data you wish to log.\n * @return {void}\n * @public\n */\n declare warn: Logger$logFn;\n\n /**\n * Log a message at the ERROR level.\n *\n * ```javascript\n * logger.warn('HELP!');\n * // => [6/4/16 5:46:53 PM] HELP!\n * ```\n *\n * @method error\n * @param {any} data - The data you wish to log.\n * @return {void}\n * @public\n */\n declare error: Logger$logFn;\n\n /**\n * Internal method used for logging requests.\n *\n * @method request\n * @param {Request} request\n * @param {Response} response\n * @param {Object} opts - An options object.\n * @param {Number} opts.startTime - The timestamp from when the request was\n * received.\n * @return {void}\n * @private\n */\n declare request: Logger$RequestLogger;\n\n constructor({ level, format, filter, enabled }: Logger$config) {\n let write: Logger$Writer = K;\n let request: Logger$RequestLogger = K;\n\n if (!LUMEN_CONSOLE && enabled) {\n write = createWriter(format);\n request = createRequestLogger(this);\n }\n\n Object.defineProperties(this, {\n level: {\n value: level,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n format: {\n value: format,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n filter: {\n value: filter,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n enabled: {\n value: Boolean(enabled),\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n request: {\n value: request,\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n\n const levelNum = LEVELS.get(level) || 0;\n\n LEVELS.forEach((val, key: Logger$level) => {\n Reflect.defineProperty(this, key.toLowerCase(), {\n writable: false,\n enumerable: false,\n configurable: false,\n\n value:\n val >= levelNum\n ? (message?: unknown) => {\n write({\n message,\n level: key,\n timestamp: this.getTimestamp()\n });\n }\n : K\n });\n });\n }\n\n /**\n * @method getTimestamp\n * @return {String} The current time as an ISO8601 string.\n * @private\n */\n getTimestamp() {\n return new Date().toISOString();\n }\n}\n\nexport default Logger;\nexport { default as line } from './utils/line';\nexport { default as sql } from './utils/sql';\n\nexport type { Logger$config } from './interfaces';\n", "/**\n * @private\n */\nclass ModelMissingError extends Error {\n constructor(name: string) {\n super(`Could not resolve model by name '${name}'`);\n }\n}\n\nexport default ModelMissingError;\n", "import { green, yellow } from 'chalk';\n\nimport { line } from '../../logger';\n\n/**\n * @private\n */\nclass MigrationsPendingError extends Error {\n constructor(migrations: Array<string> = []) {\n const pending = migrations\n .map(str => yellow(str.substr(0, str.length - 3)))\n .join(', ');\n\n super(line`\n The following migrations are pending ${pending}.\n Please run ${green('lumen db:migrate')} before starting your application.\n `);\n }\n}\n\nexport default MigrationsPendingError;\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * `createServerError` wraps an arbitrary error class whose constructor accepts\n * arbitrary arguments; `new (...args: any[])` is required so that error classes\n * with any constructor signature remain assignable to `Constructor<T>`.\n */\nimport type { Server$Error } from '../interfaces';\n\ntype Constructor<T> = new (...args: Array<any>) => T;\n\n/**\n * @private\n */\nexport default function createServerError<T extends object>(\n Target: Constructor<T>,\n statusCode: number\n): Constructor<T & Server$Error> {\n const ServerError = class extends (Target as Constructor<object>) {\n declare statusCode: number;\n\n constructor(...args: Array<unknown>) {\n super(...args);\n this.statusCode = statusCode;\n }\n };\n\n Reflect.defineProperty(ServerError, 'name', {\n value: Target.name\n });\n\n return ServerError as unknown as Constructor<T & Server$Error>;\n}\n", "import createServerError from '../../server/utils/create-server-error';\n\nclass UniqueConstraintError extends Error {}\n\nexport default createServerError(UniqueConstraintError, 409);\n", "class ConfigMissingError extends Error {\n constructor(environment: string) {\n super(`Database config not found for environment ${environment}.`);\n }\n}\n\nexport default ConfigMissingError;\n", "import cluster from 'cluster';\n\nimport { NODE_ENV } from '../../constants';\n\nimport { ConfigMissingError, MigrationsPendingError } from './errors';\nimport connect from './utils/connect';\nimport createMigrations from './utils/create-migrations';\nimport pendingMigrations from './utils/pending-migrations';\nimport type Database from './index';\nimport type { Database$opts } from './index';\n\n/**\n * @private\n */\nexport default async function initialize<T extends Database>(\n instance: T,\n opts: Database$opts\n): Promise<T> {\n const { path, models, logger, checkMigrations } = opts;\n const config = Reflect.get(opts.config, NODE_ENV);\n\n if (!config) {\n throw new ConfigMissingError(NODE_ENV);\n }\n\n const { debug = NODE_ENV === 'development' } = config;\n\n Object.defineProperties(instance, {\n path: {\n value: path,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n debug: {\n value: debug,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n models: {\n value: models,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n logger: {\n value: logger,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n config: {\n value: config,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n schema: {\n value: () => instance.connection.schema,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n connection: {\n value: connect(path, config),\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n\n if (cluster.isMaster || (cluster.worker && cluster.worker.id === 1)) {\n await createMigrations(instance.schema);\n\n if (checkMigrations) {\n const pending = await pendingMigrations(path, () =>\n instance.connection('migrations')\n );\n\n if (pending.length) {\n throw new MigrationsPendingError(pending);\n }\n }\n }\n\n await Promise.all(\n Array.from(models.values()).map(model =>\n model.initialize(instance, () => instance.connection(model.tableName))\n )\n );\n\n return instance;\n}\n", "import { join as joinPath } from 'path';\n\nimport type { Knex } from 'knex';\n\nimport { NODE_ENV, DATABASE_URL } from '../../../constants';\nimport { VALID_DRIVERS } from '../constants';\nimport { InvalidDriverError } from '../errors';\nimport type { Database$environment } from '../interfaces';\n\n/**\n * @private\n */\nexport default function connect(\n path: string,\n config: Database$environment\n): Knex {\n let { pool } = config;\n\n const { host, socket, driver, database, username, password, port, ssl, url } =\n config;\n\n if (VALID_DRIVERS.indexOf(driver) < 0) {\n throw new InvalidDriverError(driver);\n }\n\n if (pool && typeof pool === 'number') {\n pool = {\n min: pool > 1 ? 2 : 1,\n max: pool\n };\n }\n\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const knex = require(joinPath(path, 'node_modules', 'knex'));\n const usingSQLite = driver === 'sqlite3';\n\n const connection = DATABASE_URL ||\n url || {\n host,\n database,\n password,\n port,\n ssl,\n user: username,\n socketPath: socket,\n filename: usingSQLite\n ? joinPath(path, 'db', `${database || 'default'}_${NODE_ENV}.sqlite`)\n : undefined\n };\n\n return knex({\n pool,\n connection,\n debug: false,\n client: driver,\n useNullAsDefault: usingSQLite\n });\n}\n", "import type Database from '../index';\n\n/**\n * @private\n */\nexport default async function createMigrations(\n schema: Database['schema']\n): Promise<boolean> {\n const hasTable: boolean = await schema().hasTable('migrations');\n\n if (!hasTable) {\n await schema().createTable('migrations', table => {\n table.string('version', 16).primary();\n });\n }\n\n return true;\n}\n", "import fs from 'fs';\nimport { join as joinPath, resolve as resolvePath } from 'path';\nimport type { Stats } from 'fs';\n\nimport Watcher from './watcher';\nimport createResolver from './utils/create-resolver';\nimport createPathRemover from './utils/create-path-remover';\nimport type { fs$readOpts, fs$writeOpts } from './interfaces';\n\nexport { default as rmrf } from './utils/rmrf';\nexport { default as exists } from './utils/exists';\nexport { default as isJSFile } from './utils/is-js-file';\nexport { default as parsePath } from './utils/parse-path';\n\nexport type { fs$ParsedPath } from './interfaces';\n\n/**\n * @private\n */\nexport function watch(path: string): Promise<Watcher> {\n return new Watcher(path) as unknown as Promise<Watcher>;\n}\n\n/**\n * @private\n */\nexport function stat(path: string): Promise<Stats> {\n return new Promise((resolve, reject) => {\n fs.stat(path, createResolver(resolve, reject));\n });\n}\n\n/**\n * @private\n */\nexport function mkdir(path: string, mode: number = 511): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n fs.mkdir(path, mode, createResolver(resolve, reject));\n });\n}\n\n/**\n * @private\n */\nexport function mkdirRec(path: string, mode: number = 511): Promise<void> {\n const parent = resolvePath(path, '..');\n\n return stat(parent)\n .catch(err => {\n if (err.code === 'ENOENT') {\n return mkdirRec(parent, mode);\n }\n\n return Promise.reject(err);\n })\n .then(() => mkdir(path, mode))\n .catch(err => {\n if (err.code !== 'EEXIST') {\n return Promise.reject(err);\n }\n\n return Promise.resolve();\n });\n}\n\n/**\n * @private\n */\nexport function rmdir(path: string): Promise<void> {\n return new Promise((resolve, reject) => {\n fs.rmdir(path, createResolver(resolve, reject));\n });\n}\n\n/**\n * @private\n */\nexport function readdir(\n path: string,\n // opts is accepted for signature parity with readdirRec but unused here.\n opts?: fs$readOpts // eslint-disable-line @typescript-eslint/no-unused-vars\n): Promise<Array<string>> {\n return new Promise((resolve, reject) => {\n fs.readdir(path, createResolver(resolve, reject));\n });\n}\n\n/**\n * @private\n */\nexport function readdirRec(\n path: string,\n opts?: fs$readOpts\n): Promise<Array<string>> {\n const stripPath = createPathRemover(path);\n\n return readdir(path, opts)\n .then(files =>\n Promise.all(\n files.map(file => {\n const filePath = joinPath(path, file);\n\n return Promise.all([filePath, stat(filePath)]);\n })\n )\n )\n .then(files =>\n Promise.all(\n files.map(([file, stats]) =>\n Promise.all([file, stats.isDirectory() ? readdirRec(file) : []])\n )\n )\n )\n .then(files =>\n files.reduce<Array<string>>((arr, [file, children]) => {\n const basename = stripPath(file);\n\n return [\n ...arr,\n basename,\n ...children.map(child => joinPath(basename, stripPath(child)))\n ];\n }, [])\n );\n}\n\n/**\n * @private\n */\nexport function readFile(\n path: string,\n opts?: fs$readOpts\n): Promise<string | Buffer> {\n return new Promise((resolve, reject) => {\n fs.readFile(\n path,\n (typeof opts === 'object' ? opts : {}) as fs.ObjectEncodingOptions,\n createResolver(resolve, reject)\n );\n });\n}\n\n/**\n * @private\n */\nexport function writeFile(\n path: string,\n data: string | Buffer,\n opts?: fs$writeOpts\n): Promise<void> {\n return new Promise((resolve, reject) => {\n fs.writeFile(\n path,\n data,\n (opts || {}) as fs.WriteFileOptions,\n createResolver(resolve, reject)\n );\n });\n}\n\n/**\n * @private\n */\nexport function appendFile(\n path: string,\n data: string | Buffer,\n opts?: fs$writeOpts\n): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n fs.appendFile(\n path,\n data,\n (typeof opts === 'object' ? opts : {}) as fs.WriteFileOptions,\n createResolver(resolve, reject)\n );\n });\n}\n\n/**\n * @private\n */\nexport function unlink(path: string): Promise<void> {\n return new Promise((resolve, reject) => {\n fs.unlink(path, createResolver(resolve, reject));\n });\n}\n", "import EventEmitter from 'events';\nimport type { FSWatcher } from 'fs';\n\nimport { Client } from 'fb-watchman';\n\nimport initialize from './initialize';\n\n/**\n * @private\n */\nclass Watcher extends EventEmitter {\n declare path: string;\n\n declare client: Client | FSWatcher;\n\n constructor(path: string, useWatchman: boolean = true) {\n super();\n // Watchers initialize asynchronously; `initialize` populates `this` and\n // resolves once the watchman/native watcher is wired up, so `new Watcher()`\n // is awaited by callers. TS can't type a Promise-returning constructor.\n return initialize(this, path, useWatchman) as unknown as Watcher;\n }\n\n destroy() {\n const { client } = this;\n\n if (client instanceof Client) {\n client.end();\n } else {\n client.close();\n }\n }\n}\n\nexport default Watcher;\n", "import { join as joinPath } from 'path';\nimport { watch as nativeWatch } from 'fs';\nimport type { FSWatcher } from 'fs';\n\nimport { Client } from 'fb-watchman';\n\nimport exec from '../../../utils/exec';\nimport tryCatch from '../../../utils/try-catch';\nimport isJSFile from '../utils/is-js-file';\nimport { freezeProps } from '../../freezeable';\n\nimport type Watcher from './index';\n\nconst SUBSCRIPTION_NAME = 'lumen-watcher';\n\n/**\n * @private\n */\nfunction fallback(instance: Watcher, path: string): FSWatcher {\n return nativeWatch(\n path,\n {\n recursive: true\n },\n (type, name) => {\n if (typeof name === 'string' && isJSFile(name)) {\n instance.emit('change', [{ name, type }]);\n }\n }\n );\n}\n\n/**\n * @private\n */\nfunction setupWatchmen(instance: Watcher, path: string): Promise<Client> {\n return new Promise((resolve, reject) => {\n const client = new Client();\n\n client.capabilityCheck({}, capabilityErr => {\n if (capabilityErr) {\n reject(capabilityErr);\n return;\n }\n\n client.command(\n ['watch-project', path],\n (watchErr, { watch, relative_path: relativePath } = {}) => {\n if (watchErr) {\n reject(watchErr);\n return;\n }\n\n client.command(['clock', watch], (clockErr, { clock: since }) => {\n if (clockErr) {\n reject(clockErr);\n return;\n }\n\n client.command(\n [\n 'subscribe',\n watch,\n SUBSCRIPTION_NAME,\n {\n since,\n relative_root: relativePath,\n\n fields: ['name', 'size', 'exists', 'type'],\n\n expression: ['allof', ['match', '*.js']]\n }\n ],\n subscribeErr => {\n if (subscribeErr) {\n reject(subscribeErr);\n return;\n }\n\n client.on('subscription', ({ files, subscription }) => {\n if (subscription === SUBSCRIPTION_NAME) {\n instance.emit('change', files);\n }\n });\n\n resolve(client);\n }\n );\n });\n }\n );\n });\n });\n}\n\n/**\n * @private\n */\nexport default async function initialize<T extends Watcher>(\n instance: T,\n path: string,\n useWatchman: boolean\n): Promise<T> {\n const appPath = joinPath(path, 'app');\n let client;\n\n if (useWatchman) {\n await tryCatch(async () => {\n await exec('which watchman');\n client = await setupWatchmen(instance, appPath);\n });\n }\n\n Object.assign(instance, {\n path: appPath,\n client: client || fallback(instance, appPath)\n });\n\n freezeProps(instance, true, 'path', 'client');\n\n return instance;\n}\n", "import K from './k';\n\n/**\n * A utility function used for wrapping async code that would otherwise need a\n * try-catch block.\n *\n * V8 deoptimizes functions when running into try-catch catch due to the\n * unpredictable nature of the code. The `tryCatch` utility function is a way\n * to \"have your cake and eat it too\". Since the inner function (`fn`) will not\n * become deoptimized by V8 for including a standard try-catch block, we don't\n * have to sacrifice as much perf for error handling expensive computations.\n *\n * The `tryCatch` utility is also very useful when you want to perform a noop\n * when an error is thrown as the catch argument (`rescue`) is optional unlike\n * a traditional try-catch block.\n *\n * @example\n * tryCatch(() => {\n * const n = Math.floor(Math.random() * 6);\n *\n * if (n >= 4) {\n * throw new Error('You lose!');\n * } else {\n * return Promise.resolve(n);\n * }\n * }, err => {\n * console.error(err);\n * }).then(luckyNumber => {\n * console.log(`Your lucky number is ${luckyNumber}.`);\n * });\n *\n * @private\n */\nexport default async function tryCatch<T>(\n fn: () => Promise<T>,\n rescue: (err: unknown) => unknown = K\n): Promise<T | undefined> {\n let result: T | undefined;\n\n try {\n result = await fn();\n } catch (err) {\n // `rescue` is a caller-supplied handler with no contract on its return\n // value; when it returns something meaningful it stands in for `fn`'s.\n result = (await rescue(err)) as T | undefined;\n }\n\n return result;\n}\n\n/**\n * A syncronous implementation of the `tryCatch` utility.\n *\n * @example\n * const luckyNumber = tryCatchSync(() => {\n * const n = Math.floor(Math.random() * 6);\n *\n * if (n >= 4) {\n * throw new Error('You lose!');\n * } else {\n * return n;\n * }\n * }, err => {\n * console.error(err);\n * });\n *\n * if (luckyNumber) {\n * console.log(`Your lucky number is ${luckyNumber}.`);\n * }\n *\n * @private\n */\nexport function tryCatchSync<T>(\n fn: () => T,\n rescue: (err: unknown) => unknown = K\n): T | undefined {\n let result: T | undefined;\n\n try {\n result = fn();\n } catch (err) {\n result = rescue(err) as T | undefined;\n }\n\n return result;\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * Adapts Node's error-first callbacks to Promise settlers; the resolved data\n * varies by fs operation (Stats, string[], Buffer, void), so it is `any` at\n * this adapter boundary.\n */\n\n/**\n * @private\n */\nexport default function createResolver(\n resolve: (data: any) => void,\n reject: (err: Error) => void\n): (err: Error | null, ...args: Array<any>) => void {\n return function fsResolver(err: Error | null, ...args: Array<any>) {\n const [data] = args;\n\n if (err) {\n reject(err);\n return;\n }\n\n resolve(args.length > 1 ? args : data);\n };\n}\n", "import type { Chain } from '../interfaces';\n\n/**\n * @private\n */\nexport default function chain<T>(source: T): Chain<T> {\n return {\n pipe<U>(handler: (value: T) => U): Chain<U> {\n return chain(handler(source));\n },\n\n value(): T {\n return source;\n },\n\n construct<U>(constructor: new (value: T) => U): Chain<U> {\n return chain(Reflect.construct(constructor, [source]) as U);\n }\n };\n}\n", "import { readdir } from '../../fs';\n\n/**\n * @private\n */\nexport default async function pendingMigrations(\n appPath: string,\n table: () => any // eslint-disable-line @typescript-eslint/no-explicit-any\n): Promise<Array<string>> {\n const migrations: Array<string> = await readdir(`${appPath}/db/migrate`);\n const versions: Array<string> = await table()\n .select()\n .then((data: Array<{ version: string }>) =>\n data.map(({ version }) => version)\n );\n\n return migrations.filter(\n migration => versions.indexOf(migration.replace(/^(\\d{16})-.+$/g, '$1')) < 0\n );\n}\n", "import { dasherize, singularize } from 'inflection';\n\nimport { compose } from '../../../utils/compose';\nimport underscore from '../../../utils/underscore';\n\n/**\n * @private\n */\nexport default compose(singularize, dasherize, underscore);\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * The intermediate stages of a composed pipeline are genuinely untyped: only\n * the pipeline's input and output are knowable without full variadic typing,\n * which would cost far more than it buys for an internal helper. The `any`s\n * are confined to those intermediate positions \u2014 the exported signatures keep\n * precise `T` -> `U` types.\n */\n\n/**\n * A single stage of a composed pipeline.\n *\n * @private\n */\ntype Stage = (value: any) => any;\n\n/**\n * @private\n */\nexport function tap<T>(input: T): T {\n console.log(input);\n return input;\n}\n\n/**\n * @private\n */\nexport function compose<T, U>(\n main: (input: any) => U,\n ...etc: Stage[]\n): (input: T) => U {\n return input => main(etc.reduceRight<any>((value, fn) => fn(value), input));\n}\n\n/**\n * @private\n */\nexport function composeAsync<T, U>(\n main: (input: any) => Promise<U>,\n ...etc: Stage[]\n): (input: T | Promise<T>) => Promise<U> {\n return input =>\n etc\n .reduceRight<Promise<any>>(\n (value, fn) => Promise.resolve(value).then(fn),\n Promise.resolve(input)\n )\n .then(main);\n}\n", "import { underscore as _ } from 'inflection';\n\n/**\n * @private\n */\nexport default function underscore(\n source: string = '',\n upper: boolean = false\n): string {\n return _(source, upper).replace(/-/g, '_');\n}\n", "import { pluralize } from 'inflection';\n\nimport Query from '../query';\nimport ChangeSet from '../change-set';\nimport { updateRelationship } from '../relationship';\nimport {\n createTransactionResultProxy,\n createStaticTransactionProxy,\n createInstanceTransactionProxy\n} from '../transaction';\nimport pick from '../../../utils/pick';\nimport underscore from '../../../utils/underscore';\nimport { compose } from '../../../utils/compose';\nimport { map as diffMap } from '../../../utils/diff';\nimport mapToObject from '../../../utils/map-to-object';\nimport type Logger from '../../logger';\nimport type Database from '../../database';\nimport type Serializer from '../../serializer';\n\nimport type { Relationship$opts } from '../relationship';\nimport type { ModelClass, Database$column } from '../interfaces';\nimport type { Transaction$ResultProxy } from '../transaction';\n\nimport { create, update, destroy, createRunner } from './utils/persistence';\nimport initializeClass from './initialize-class';\nimport validate from './utils/validate';\nimport { rethrowWriteError } from './utils/process-write-error';\nimport runHooks from './utils/run-hooks';\nimport type { Model$Hooks } from './interfaces';\n\n/**\n * @class Model\n * @public\n */\nclass Model {\n // The instance's static side is a `ModelClass`; declaring it lets instance\n // code reach the model class's statics (`this.constructor.relationshipFor`,\n // `.serializer`, `.primaryKey`, ...) with proper types.\n declare ['constructor']: ModelClass;\n\n /**\n * The name of the corresponding database table for a `Model` instance's\n * constructor.\n *\n * @property tableName\n * @type {String}\n * @public\n */\n declare tableName: string;\n\n /**\n * The canonical name of a `Model`'s constructor.\n *\n * @property modelName\n * @type {String}\n * @public\n */\n declare modelName: string;\n\n /**\n * The name of the API resource a `Model` instance's constructor represents.\n *\n * @property resourceName\n * @type {String}\n * @public\n */\n declare resourceName: string;\n\n /**\n * A timestamp representing when the Model instance was created.\n *\n * @property createdAt\n * @type {Date}\n * @public\n */\n declare createdAt: Date;\n\n /**\n * A timestamp representing the last time the Model instance was updated.\n *\n * @property updatedAt\n * @type {Date}\n * @public\n */\n declare updatedAt: Date;\n\n /**\n * @property initialized\n * @type {Boolean}\n * @private\n */\n declare initialized: boolean;\n\n /**\n * @property rawColumnData\n * @type {Object}\n * @private\n */\n declare rawColumnData: Record<string, unknown>;\n\n /**\n * @property isModelInstance\n * @type {Boolean}\n * @private\n */\n declare isModelInstance: boolean;\n\n /**\n * @property prevAssociations\n * @type {Set}\n * @private\n */\n declare prevAssociations: Set<Model>;\n\n /**\n * Names of `hasOne` relationships that were eager-loaded (joined) and found\n * to have no related record. Lets the relationship getter answer `null`\n * without a per-record query. Kept outside of the change sets so it never\n * counts as a change to the record.\n *\n * @property absentRelationships\n * @type {Set}\n * @private\n */\n declare absentRelationships: Set<string>;\n\n /**\n * @property changeSets\n * @type {Array}\n * @private\n */\n declare changeSets: Array<ChangeSet>;\n\n /**\n * An object where you declare `hasOne` relationships.\n *\n * When declaring a relationship you must specify the inverse of the\n * relationship.\n *\n * ```javascript\n * class User extends Model {\n * static hasOne = {\n * profile: {\n * inverse: 'user'\n * // The line above lets Lumen know that this relationship is accessible\n * // on profile instances via `profile.user`.\n * }\n * };\n * }\n *\n * class Profile extends Model {\n * static belongsTo = {\n * user: {\n * inverse: 'profile'\n * // The line above lets Lumen know that this relationship is accessible\n * // on user instances via `user.profile`.\n * }\n * };\n * }\n * ```\n *\n * If the name of the model is different than the key of the relationship, you\n * must specify it in the relationship object.\n *\n * ```javascript\n * class Profile extends Model {\n * static belongsTo = {\n * owner: {\n * inverse: 'profile',\n * model: 'user'\n * // The line above lets Lumen know that this is a relationship with the\n * // `User` model and not a non-existent `Owner` model.\n * }\n * };\n * }\n * ```\n *\n * @property hasOne\n * @type {Object}\n * @default {}\n * @static\n * @public\n */\n declare static hasOne: Record<string, unknown>;\n\n /**\n * An object where you declare `hasMany` relationships.\n *\n * When declaring a relationship you must specify the inverse of the\n * relationship.\n *\n * ```javascript\n * class Author extends Model {\n * static hasMany = {\n * books: {\n * inverse: 'author'\n * // The line above lets Lumen know that this relationship is accessible\n * // on book instances via `book.author`.\n * }\n * };\n * }\n *\n * class Book extends Model {\n * static belongsTo = {\n * author: {\n * inverse: 'books'\n * // The line above lets Lumen know that this relationship is accessible\n * // on author instances via `author.books`.\n * }\n * };\n * }\n * ```\n *\n * If the name of the model is different than the key of the relationship, you\n * must specify it in the relationship object.\n *\n * ```javascript\n * class Author extends Model {\n * static hasMany = {\n * publications: {\n * inverse: 'author',\n * model: 'book'\n * // The line above lets Lumen know that this is a relationship with the\n * // `Book` model and not a non-existent `Publication` model.\n * }\n * };\n * }\n * ```\n *\n * ##### Many to Many\n *\n * In the examples above there is only one owner of relationship. Sometimes we\n * need to express a many to many relationship. Typically in relational\n * databases, this is done with a join table. When declaring a many to many\n * relationship that uses a join table, you must specify the join model.\n *\n * ```javascript\n * class Categorization extends Model {\n * static belongsTo = {\n * tag: {\n * inverse: 'categorization'\n * },\n * post: {\n * inverse: 'categorization'\n * }\n * }\n * }\n *\n * class Tag extends Model {\n * static hasMany = {\n * posts: {\n * inverse: 'tags',\n * through: 'categorizations'\n * }\n * };\n * }\n *\n * class Post extends Model {\n * static hasMany = {\n * tags: {\n * inverse: 'posts',\n * through: 'categorizations'\n * }\n * };\n * }\n * ```\n *\n * @property hasMany\n * @type {Object}\n * @default {}\n * @static\n * @public\n */\n declare static hasMany: Record<string, unknown>;\n\n /**\n * An object where you declare `belongsTo` relationships.\n *\n * When declaring a relationship you must specify the inverse of the\n * relationship.\n *\n * ```javascript\n * class Book extends Model {\n * static belongsTo = {\n * author: {\n * inverse: 'books'\n * // The line above lets Lumen know that this relationship is accessible\n * // on author instances via `author.books`.\n * }\n * };\n * }\n *\n * class Author extends Model {\n * static hasMany = {\n * books: {\n * inverse: 'book'\n * // The line above lets Lumen know that this relationship is accessible\n * // on book instances via `book.author`.\n * }\n * };\n * }\n * ```\n *\n * If the name of the model is different than the key of the relationship, you\n * must specify it in the relationship object.\n *\n * ```javascript\n * class Book extends Model {\n * static belongsTo = {\n * writer: {\n * inverse: 'books',\n * model: 'author'\n * // The line above lets Lumen know that this is a relationship with the\n * // `Author` model and not a non-existent `Writer` model.\n * }\n * };\n * }\n * ```\n *\n * Sometimes our foreign keys in the database do not follow conventions (i.e\n * `author_id`). You have the option to manually specify foreign keys when a\n * situation like this occurs.\n *\n * ```javascript\n * class Book extends Model {\n * static belongsTo = {\n * author: {\n * inverse: 'books',\n * foreignKey: 'SoMe_UnCoNvEnTiOnAl_FoReIgN_KeY'\n * }\n * };\n * }\n * ```\n *\n * @property belongsTo\n * @type {Object}\n * @default {}\n * @static\n * @public\n */\n declare static belongsTo: Record<string, unknown>;\n\n /**\n * An object where you declare validations for an instance's attributes.\n *\n * Before a model instance is saved, validations declared in this block are\n * executed. To declare a validation for a model attribute, simply add the\n * attribute name as a key to the validates object. The value for the\n * attribute key should be a function that takes a single argument (the value\n * to validate against) and return a boolean value represent whether or not\n * the attribute is valid.\n *\n * ```javascript\n * class User extends Model {\n * static validates {\n * username: value => /^\\w{2,30}$/.test(value),\n * password: value => String(value).length >= 8\n * };\n * }\n * ```\n *\n * In the spirit of have a small api surface area, Lumen provides no validation\n * helper functions. You can roll your own helpers with or use one of the many\n * excellent validation libraries like [validator](https://goo.gl/LWaHBB).\n *\n * ```javascript\n * import { isEmail } from 'validator';\n *\n * class User extends Model {\n * static validates {\n * email: isEmail\n * };\n * }\n * ```\n *\n * @property validates\n * @type {Object}\n * @default {}\n * @static\n * @public\n */\n declare static validates: Record<string, unknown>;\n\n /**\n * An object where you declare custom query scopes for the model.\n *\n * Scopes allow you to DRY up query logic by chaining custom set's of queries\n * with built-in query method such as `where`, `not`, `page`, etc. To declare\n * a scope, add it as a method on the scopes object.\n *\n * ```javascript\n * class Post extends Model {\n * static hasMany = {\n * tags: {\n * inverse: 'posts'\n * },\n * comments: {\n * inverse: 'post'\n * }\n * };\n *\n * static belongsTo = {\n * user: {\n * inverse: 'posts'\n * }\n * };\n *\n * static scopes = {\n * isPublic() {\n * return this.where({\n * isPublic: true\n * });\n * },\n *\n * byUser(user) {\n * return this.where({\n * userId: user.id\n * });\n * },\n *\n * withEverything() {\n * return this.includes('tags', 'user', 'comments');\n * }\n * };\n * }\n * ```\n *\n * Given the scopes declared in the example above, here is how we could return\n * all the public posts with relationships eager loaded for the user with the\n * id of 1.\n *\n * ```javascript\n * const user = await User.find(1);\n *\n * return Post\n * .byUser(user)\n * .isPublic()\n * .withEverything();\n * ```\n *\n * Since scopes can be chained with built-in query methods, we can easily\n * paginate this collection.\n *\n * ```javascript\n * const user = await User.find(1);\n *\n * return Post\n * .byUser(user)\n * .isPublic()\n * .withEverything()\n * .page(1);\n * ```\n *\n * @property scopes\n * @type {Object}\n * @default {}\n * @static\n * @public\n */\n declare static scopes: Record<string, unknown>;\n\n /**\n * An object where you declare hooks to execute at certain times in a model\n * instance's lifecycle.\n *\n * There are many lifecycle hooks that are executed through out a model\n * instance's lifetime. The have many use cases such as sanitization of\n * attributes, creating dependent relationships, hashing passwords, and much\n * more.\n *\n * ##### Execution Order\n *\n * When creating a record.\n *\n * 1. beforeValidation\n * 2. afterValidation\n * 3. beforeCreate\n * 4. beforeSave\n * 5. afterCreate\n * 6. afterSave\n *\n * When updating a record.\n *\n * 1. beforeValidation\n * 2. afterValidation\n * 3. beforeUpdate\n * 4. beforeSave\n * 5. afterUpdate\n * 6. afterSave\n *\n * When deleting a record.\n *\n * 1. beforeDestroy\n * 2. afterDestroy\n *\n * ##### Anatomy\n *\n * Hooks are async functions that are called with two arguments. The first\n * argument is the record that the hook applies to and the second argument is\n * the transaction object relevant to the method from which the hook was\n * called.\n *\n * The only time you will need to use the transaction object is if you are\n * creating, updating, or deleting different record(s) within the hook. Using\n * the transaction object when modifying the database in a hook ensures that\n * any modifications made within the hook will be rolled back if the function\n * that initiated the transaction fails.\n *\n * ```javascript\n * import Notification from 'app/models/notification';\n *\n * class Comment extends Model {\n * static belongsTo = {\n * post: {\n * inverse: 'comments'\n * },\n * user: {\n * inverse: 'comments'\n * }\n * };\n *\n * static hooks = {\n * async afterCreate(comment, trx) {\n * let [post, commenter] = await Promise.all([\n * comment.post,\n * comment.user\n * ]);\n *\n * const commentee = await post.user;\n *\n * post = post.title;\n * commenter = commenter.name;\n *\n * // Calling .transacting(trx) prevents the commentee from getting a\n * // notification if the comment fails to be persisted in the database.\n * await Notification\n * .transacting(trx)\n * .create({\n * user: commentee,\n * message: `${commenter} commented on your post \"${post}\"`\n * });\n * },\n *\n * async afterSave() {\n * // Good thing you called transacting in afterCreate.\n * throw new Error('Fatal Error');\n * }\n * };\n * }\n * ```\n *\n * @property hooks\n * @type {Object}\n * @default {}\n * @static\n * @public\n */\n declare static hooks: Model$Hooks;\n\n /**\n * A reference to the application's logger.\n *\n * @property logger\n * @type {Logger}\n * @static\n * @public\n */\n declare static logger: Logger;\n\n /**\n * The name of the corresponding database table for the model.\n *\n * @property tableName\n * @type {String}\n * @static\n * @public\n */\n declare static tableName: string;\n\n /**\n * The canonical name of the model.\n *\n * @property modelName\n * @type {String}\n * @static\n * @public\n */\n declare static modelName: string;\n\n /**\n * The name of the resource the model represents.\n *\n * @property resourceName\n * @type {String}\n * @static\n * @public\n */\n declare static resourceName: string;\n\n /**\n * The column name to use for a model's primary key.\n *\n * @property primaryKey\n * @type {String}\n * @default 'id'\n * @static\n * @public\n */\n static primaryKey: string = 'id';\n\n /**\n * @property table\n * @type {Function}\n * @static\n * @private\n */\n declare static table: () => unknown;\n\n /**\n * @property store\n * @type {Database}\n * @static\n * @private\n */\n declare static store: Database;\n\n /**\n * @property initialized\n * @type {Boolean}\n * @static\n * @private\n */\n declare static initialized: boolean;\n\n /**\n * @property serializer\n * @type {Serializer}\n * @static\n * @private\n */\n declare static serializer: Serializer<Model>;\n\n /**\n * @property attributes\n * @type {Object}\n * @static\n * @private\n */\n declare static attributes: Record<string, unknown>;\n\n /**\n * @property attributeNames\n * @type {Array}\n * @static\n * @private\n */\n declare static attributeNames: Array<string>;\n\n /**\n * @property relationships\n * @type {Object}\n * @static\n * @private\n */\n declare static relationships: Record<string, Relationship$opts>;\n\n /**\n * @property relationshipNames\n * @type {Array}\n * @static\n * @private\n */\n declare static relationshipNames: Array<string>;\n\n constructor(attrs: Record<string, unknown> = {}, initialize: boolean = true) {\n Object.defineProperties(this, {\n changeSets: {\n value: [new ChangeSet()],\n writable: false,\n enumerable: false,\n configurable: false\n },\n rawColumnData: {\n value: attrs,\n writable: false,\n enumerable: false,\n configurable: false\n },\n prevAssociations: {\n value: new Set(),\n writable: false,\n enumerable: false,\n configurable: false\n },\n absentRelationships: {\n value: new Set(),\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n\n const {\n constructor: { attributeNames, relationshipNames }\n } = this;\n const props = pick(attrs, ...attributeNames.concat(relationshipNames));\n\n Object.assign(this, props);\n\n if (initialize) {\n Reflect.defineProperty(this, 'initialized', {\n value: true,\n writable: false,\n enumerable: false,\n configurable: false\n });\n }\n\n return this;\n }\n\n /**\n * Indicates if the model is new.\n *\n * ```javascript\n * import Post from 'app/models/post';\n *\n * let post = new Post({\n * body: '',\n * title: 'New Post',\n * isPublic: false\n * });\n *\n * post.isNew;\n * // => true\n *\n * Post.create({\n * body: '',\n * title: 'New Post',\n * isPublic: false\n * }).then(post => {\n * post.isNew;\n * // => false;\n * });\n * ```\n *\n * @property isNew\n * @type {Boolean}\n * @public\n */\n get isNew(): boolean {\n return !this.persistedChangeSet;\n }\n\n /**\n * Indicates if the model is dirty.\n *\n * ```javascript\n * import Post from 'app/models/post';\n *\n * Post\n * .find(1)\n * .then(post => {\n * post.isDirty;\n * // => false\n *\n * post.isPublic = true;\n *\n * post.isDirty;\n * // => true\n *\n * return post.save();\n * })\n * .then(post => {\n * post.isDirty;\n * // => false\n * });\n * ```\n *\n * @property isDirty\n * @type {Boolean}\n * @public\n */\n get isDirty(): boolean {\n return Boolean(this.dirtyProperties.size);\n }\n\n /**\n * Indicates if the model is persisted.\n *\n * ```javascript\n * import Post from 'app/models/post';\n *\n * Post\n * .find(1)\n * .then(post => {\n * post.persisted;\n * // => true\n *\n * post.isPublic = true;\n *\n * post.persisted;\n * // => false\n *\n * return post.save();\n * })\n * .then(post => {\n * post.persisted;\n * // => true\n * });\n * ```\n *\n * @property persisted\n * @type {Boolean}\n * @public\n */\n get persisted(): boolean {\n return !this.isNew && !this.isDirty;\n }\n\n /**\n * @property dirtyAttributes\n * @type {Map}\n * @public\n */\n get dirtyAttributes(): Map<string, unknown> {\n const {\n dirtyProperties,\n constructor: { relationshipNames }\n } = this;\n\n Array.from(dirtyProperties.keys()).forEach(key => {\n if (relationshipNames.indexOf(key) >= 0) {\n dirtyProperties.delete(key);\n }\n });\n\n return dirtyProperties;\n }\n\n /**\n * @property dirtyRelationships\n * @type {Map}\n * @public\n */\n get dirtyRelationships(): Map<string, unknown> {\n const {\n dirtyProperties,\n constructor: { attributeNames }\n } = this;\n\n Array.from(dirtyProperties.keys()).forEach(key => {\n if (attributeNames.indexOf(key) >= 0) {\n dirtyProperties.delete(key);\n }\n });\n\n return dirtyProperties;\n }\n\n /**\n * @property dirtyProperties\n * @type {Map}\n * @private\n */\n get dirtyProperties(): Map<string, unknown> {\n const { currentChangeSet, persistedChangeSet } = this;\n\n if (!persistedChangeSet) {\n return new Map(currentChangeSet);\n }\n\n return diffMap(persistedChangeSet, currentChangeSet);\n }\n\n /**\n * @property currentChangeSet\n * @type {ChangeSet}\n * @private\n */\n get currentChangeSet(): ChangeSet {\n return this.changeSets[0];\n }\n\n /**\n * @property currentChangeSet\n * @type {void | ChangeSet}\n * @private\n */\n get persistedChangeSet(): ChangeSet | undefined {\n return this.changeSets.find(({ isPersisted }) => isPersisted);\n }\n\n /**\n * Specify the transaction object to use for following save, update, or\n * destroy method calls.\n *\n * When you call a method like update or destroy, lumen will create a\n * transaction and wrap the internals of the method and other downstream\n * method calls like model hooks within. In some edge cases it can be more\n * useful to manually initiate the transaction. Bulk updating or destroying\n * are good examples of this. When you manually begin a transaction, you can\n * call this method to specify the transaction object that you would like to\n * use for subsequent mutation methods (save, update, destroy, etc.) so lumen\n * knows not to automatically begin a new transaction if/when a mutation\n * method is called.\n *\n * ```javascript\n * const post = await Post.first();\n *\n * // This call to update uses the transaction that lumen will initiate.\n * await post.update({\n * // updates to post...\n * });\n *\n * await post.transaction(trx => {\n * // This call to update uses the transaction that we created with the\n * // call to the transaction method.\n * return post\n * .transacting(trx)\n * .update({\n * // updates to post...\n * });\n * });\n * ```\n *\n * @method transacting\n * @param {Transaction} transaction - A transaction object to forward to save,\n * update, or destroy method calls.\n * @return {Model} - Returns a proxied version of `this` that delagates the\n * transaction param to subsquent save, update, or destroy method calls.\n * @public\n */\n transacting(trx: unknown): this {\n return createInstanceTransactionProxy(this, trx);\n }\n\n /**\n * Manually begin a new transaction.\n *\n * Most of the time, you don't need to start transactions yourself. However,\n * if you need to do something like implement bulk updating of related records\n * the transaction method can be useful.\n *\n * ```javascript\n * const post = await Post.first().include('user');\n * const user = await post.user;\n *\n * await post.transaction(trx => {\n * return Promise.all([\n * post.transacting(trx).update({\n * // updates to post...\n * }),\n * user.transacting(trx).update({\n * // updates to user...\n * })\n * ]);\n * });\n * ```\n *\n * @method transaction\n * @param {Function} fn - The function used for executing the tranasction.\n * This function is called with a new transaction object as it's only argument\n * and is expected to return a promise.\n * @return {Promise} Resolves with the resolved value of the fn param.\n * @public\n */\n transaction<T>(fn: (...args: Array<unknown>) => Promise<T>): Promise<T> {\n return this.constructor.transaction(fn);\n }\n\n /**\n * Persist any unsaved changes to the database.\n *\n * ```javascript\n * const post = await Post.first();\n *\n * console.log(post.title, post.isDirty);\n * // => 'New Post' false\n *\n * post.title = 'How to Save a Lumen Model';\n *\n * console.log(post.title, post.isDirty);\n * // => 'How to Update a Lumen Model' true\n *\n * await post.save();\n *\n * console.log(post.title, post.isDirty);\n * // => 'How to Save a Lumen Model' false\n * ```\n *\n * @method save\n * @return {Promise} Resolves with `this`.\n * @public\n */\n save(transaction?: unknown): Promise<Transaction$ResultProxy<this, boolean>> {\n return this.update(mapToObject(this.dirtyProperties), transaction);\n }\n\n /**\n * Assign values to the instance and persist any changes to the database.\n *\n * ```javascript\n * const post = await Post.first();\n *\n * console.log(post.title, post.isPublic, post.isDirty);\n * // => 'New Post' false false\n *\n * await post.update({\n * title: 'How to Update a Lumen Model',\n * isPublic: true\n * });\n *\n * console.log(post.title, post.isPublic, post.isDirty);\n * // => 'How to Update a Lumen Model' true false\n * ```\n *\n * @method update\n * @param {Object} properties - An object containing key, value pairs of the\n * attributes and/or relationships you would like to assign to the instance.\n * @return {Promise} Resolves with `this`.\n * @public\n */\n update(\n props: Record<string, unknown> = {},\n transaction?: unknown\n ): Promise<Transaction$ResultProxy<this, boolean>> {\n const run = async (trx: unknown) => {\n const {\n constructor: { hooks, logger }\n } = this;\n let statements: Array<unknown> = [];\n let promise: Array<unknown> | Promise<Array<unknown>> = Promise.resolve(\n []\n );\n let hadDirtyAttrs = false;\n let hadDirtyAssoc = false;\n\n const associations = Object.keys(props).filter(key =>\n Boolean(this.constructor.relationshipFor(key))\n );\n\n Object.assign(this, props);\n\n if (associations.length) {\n hadDirtyAssoc = true;\n statements = associations.reduce<Array<unknown>>(\n (arr, key) => [...arr, ...updateRelationship(this, key, trx)],\n []\n );\n }\n\n if (this.isDirty) {\n hadDirtyAttrs = true;\n\n await runHooks(this, trx, hooks.beforeValidation);\n\n validate(this);\n\n await runHooks(\n this,\n trx,\n hooks.afterValidation,\n hooks.beforeUpdate,\n hooks.beforeSave\n );\n\n promise = update(this, trx);\n }\n\n await createRunner(logger, statements)(await promise);\n\n this.prevAssociations.clear();\n this.currentChangeSet.persist(this.changeSets);\n\n if (hadDirtyAttrs) {\n await runHooks(this, trx, hooks.afterUpdate, hooks.afterSave);\n }\n\n return createTransactionResultProxy(this, hadDirtyAttrs || hadDirtyAssoc);\n };\n\n if (transaction) {\n return run(transaction).catch(rethrowWriteError);\n }\n\n return this.transaction(run).catch(rethrowWriteError);\n }\n\n /**\n * Permanently delete the instance from the database.\n *\n * @method destroy\n * @return {Promise} Resolves with `this`.\n * @public\n */\n destroy(transaction?: unknown): Promise<Transaction$ResultProxy<this, true>> {\n const run = async (trx: unknown) => {\n const {\n constructor: { hooks, logger }\n } = this;\n\n await runHooks(this, trx, hooks.beforeDestroy);\n await createRunner(logger, [])(await destroy(this, trx));\n await runHooks(this, trx, hooks.afterDestroy);\n\n return createTransactionResultProxy(this, true);\n };\n\n if (transaction) {\n return run(transaction);\n }\n\n return this.transaction(run);\n }\n\n /**\n * Reload the record from the database.\n *\n * @method reload\n * @return {Promise} Resolves with `this`.\n * @public\n */\n reload(): Promise<Model> {\n if (this.isNew) {\n return Promise.resolve(this);\n }\n\n return this.constructor.find(this.getPrimaryKey());\n }\n\n /**\n * Rollback attributes and relationships to the last known persisted set of\n * values.\n *\n * @method rollback\n * @return {Model} Returns `this`.\n * @public\n */\n rollback(): this {\n const { persistedChangeSet } = this;\n\n if (persistedChangeSet && !this.currentChangeSet.isPersisted) {\n persistedChangeSet.applyTo(this).persist(this.changeSets);\n }\n\n return this;\n }\n\n /**\n * @method getAttributes\n * @param {String} [...keys] - The keys of the properties to return.\n * @return {Object} An object containing keys that were passed in as agruments\n * and their associated values.\n * @private\n */\n getAttributes(...keys: Array<string>): Record<string, unknown> {\n return pick(this, ...keys);\n }\n\n /**\n * @method getPrimaryKey\n * @return {Number} The value of the primary key for the instance.\n * @private\n */\n getPrimaryKey(): number {\n return Reflect.get(this, this.constructor.primaryKey) as number;\n }\n\n /**\n * Create and persist a new instance of the model.\n *\n * @method create\n * @param {Object} properties - An object containing key, value pairs of the\n * attributes and/or relationships you would like to assign to the instance.\n * @return {Promise} Resolves with the newly created model.\n * @static\n * @public\n */\n static create(\n props: Record<string, unknown> = {},\n transaction?: unknown\n ): Promise<Transaction$ResultProxy<Model, true>> {\n const run = async (trx: unknown) => {\n const { hooks, logger, primaryKey } = this;\n const instance = Reflect.construct(this, [props, false]);\n\n await runHooks(instance, trx, hooks.beforeValidation);\n\n validate(instance);\n\n await runHooks(\n instance,\n trx,\n hooks.afterValidation,\n hooks.beforeCreate,\n hooks.beforeSave\n );\n\n const runner = createRunner(logger, []);\n const [[firstRow]] = await runner(await create(instance, trx));\n\n // `insert().returning(pk)` yields a scalar `[1]` on knex 0.16 but an\n // object `[{ id: 1 }]` on knex >= 1 (once `RETURNING` reached sqlite).\n // Normalize both so the primary key stays a scalar.\n const primaryKeyValue =\n firstRow !== null && typeof firstRow === 'object'\n ? Reflect.get(firstRow, primaryKey)\n : firstRow;\n\n Reflect.set(instance, primaryKey, primaryKeyValue);\n Reflect.set(instance.rawColumnData, primaryKey, primaryKeyValue);\n\n let statements: Array<unknown> = [];\n const associations = Object.keys(props).filter(key =>\n Boolean(this.relationshipFor(key))\n );\n\n if (associations.length) {\n statements = associations.reduce<Array<unknown>>(\n (arr, key) => [...arr, ...updateRelationship(instance, key, trx)],\n []\n );\n }\n\n await Promise.all(statements);\n\n Reflect.defineProperty(instance, 'initialized', {\n value: true,\n writable: false,\n enumerable: false,\n configurable: false\n });\n\n instance.currentChangeSet.persist(instance.changeSets);\n\n await runHooks(instance, trx, hooks.afterCreate, hooks.afterSave);\n\n return createTransactionResultProxy(instance, true);\n };\n\n if (transaction) {\n return run(transaction).catch(rethrowWriteError);\n }\n\n return this.transaction(run).catch(rethrowWriteError);\n }\n\n /**\n * Specify the transaction object to use for following save, update, or\n * destroy method calls.\n *\n * When you call a method like update or destroy, lumen will create a\n * transaction and wrap the internals of the method and other downstream\n * method calls like model hooks within. In some edge cases it can be more\n * useful to manually initiate the transaction. Bulk updating or destroying\n * are good examples of this. When you manually begin a transaction, you can\n * call this method to specify the transaction object that you would like to\n * use for calls to the static create method so lumen knows not to automatically\n * begin a new transaction if/when the static create method is called.\n *\n * ```javascript\n * // This call to create uses the transaction that lumen will initiate.\n * await Post.create();\n *\n * await Post.transaction(trx => {\n * // This call to create uses the transaction that we created with the\n * // call to the transaction method.\n * return Post\n * .transacting(trx)\n * .create();\n * });\n * ```\n *\n * @method transacting\n * @param {Transaction} transaction - A transaction object to forward to\n * create method calls.\n * @return {Model} - Returns a proxied version of `this` that delagates the\n * transaction param to subsquent create method calls.\n * @static\n * @public\n */\n static transacting(trx: unknown): ModelClass {\n return createStaticTransactionProxy(this, trx);\n }\n\n /**\n * Manually begin a new transaction.\n *\n * Most of the time, you don't need to start transactions yourself. However,\n * the transaction method can be useful if you need to do something like\n * bulk creating records.\n *\n * ```javascript\n * await Post.transaction(trx => {\n * return Promise.all([\n * Post.transacting(trx).create({\n * // ...props\n * }),\n * Post.transacting(trx).create({\n * // ...props\n * })\n * ]);\n * });\n * ```\n *\n * @method transaction\n * @param {Function} fn - The function used for executing the tranasction.\n * This function is called with a new transaction object as it's only argument\n * and is expected to return a promise.\n * @return {Promise} Resolves with the resolved value of the fn param.\n * @static\n * @public\n */\n static transaction<T>(\n fn: (...args: Array<unknown>) => Promise<T>\n ): Promise<T> {\n return new Promise((resolve, reject) => {\n const {\n store: { connection }\n } = this;\n let result: T;\n\n connection\n .transaction(trx => {\n fn(trx)\n .then(data => {\n result = data;\n return trx.commit();\n })\n .catch(trx.rollback);\n })\n .then(() => {\n resolve(result);\n })\n .catch(err => {\n reject(err);\n });\n });\n }\n\n static all(): Query<Array<Model>> {\n return new Query(this).all();\n }\n\n static find(primaryKey: unknown): Query<Model> {\n return new Query(this).find(primaryKey);\n }\n\n static page(num: number): Query<Array<Model>> {\n return new Query(this).page(num);\n }\n\n static limit(amount: number): Query<Array<Model>> {\n return new Query(this).limit(amount);\n }\n\n static offset(amount: number): Query<Array<Model>> {\n return new Query(this).offset(amount);\n }\n\n static count(): Query<number> {\n return new Query(this).count();\n }\n\n static order(attr: string, direction?: string): Query<Array<Model>> {\n return new Query(this).order(attr, direction);\n }\n\n static where(conditions: Record<string, unknown>): Query<Array<Model>> {\n return new Query(this).where(conditions);\n }\n\n static whereBetween(\n conditions: Record<string, unknown>\n ): Query<Array<Model>> {\n return new Query(this).whereBetween(conditions);\n }\n\n static whereRaw(\n query: string,\n bindings: Array<unknown> = []\n ): Query<Array<Model>> {\n return new Query(this).whereRaw(query, bindings);\n }\n\n static not(conditions: Record<string, unknown>): Query<Array<Model>> {\n return new Query(this).not(conditions);\n }\n\n static first(): Query<Model> {\n return new Query(this).first();\n }\n\n static last(): Query<Model> {\n return new Query(this).last();\n }\n\n static select(...params: Array<string>): Query<Array<Model>> {\n return new Query(this).select(...params);\n }\n\n static distinct(...params: Array<string>): Query<Array<Model>> {\n return new Query(this).distinct(...params);\n }\n\n static include(\n ...relationships: Array<string | Record<string, unknown>>\n ): Query<Array<Model>> {\n return new Query(this).include(...relationships);\n }\n\n static unscope(...scopes: Array<string>): Query<Array<Model>> {\n return new Query(this).unscope(...scopes);\n }\n\n /**\n * Check if a model has a scope.\n *\n * @method hasScope\n * @param {String} name - The name of the scope to look for.\n * @return {Boolean}\n * @static\n * @public\n */\n static hasScope(name: string): boolean {\n return Boolean(Reflect.get(this.scopes, name));\n }\n\n /**\n * Check if a value is an instance of a model.\n *\n * @method isInstance\n * @param {any} value - The value in question.\n * @return {Boolean}\n * @static\n * @public\n */\n static isInstance(value: unknown): boolean {\n return value instanceof this;\n }\n\n /**\n * Bind the model's connection to the database and get inferred data from the\n * schema upon application boot.\n *\n * @method initialize\n * @param {Database} store - A reference of the applications database\n * instance.\n * @param {Table} table - A function that returns a knex query builder bound\n * to the model's table name.\n * @return {Promise} Resolves with the model class.\n * @static\n * @private\n */\n static initialize(\n store: Database,\n table: () => unknown\n ): Promise<ModelClass> {\n if (this.initialized) {\n return Promise.resolve(this);\n }\n\n if (!this.tableName) {\n const getTableName = compose(pluralize, underscore);\n const tableName = getTableName(this.name);\n\n Reflect.defineProperty(this, 'tableName', {\n value: tableName,\n writable: false,\n enumerable: true,\n configurable: false\n });\n\n Reflect.defineProperty(this.prototype, 'tableName', {\n value: tableName,\n writable: false,\n enumerable: false,\n configurable: false\n });\n }\n\n return initializeClass({\n store,\n table,\n model: this\n });\n }\n\n /**\n * @method columnFor\n * @param {String} key - The respective attribute name of the column.\n * @return {void | Object} An object containing metadata about the column if a\n * match is found.\n * @static\n * @private\n */\n static columnFor(key: string): Database$column | undefined {\n return Reflect.get(this.attributes, key) as Database$column | undefined;\n }\n\n /**\n * @method columnNameFor\n * @param {String} key - The respective attribute name of the column.\n * @return {void | String} The name of the column in the database if a match\n * is found.\n * @static\n * @private\n */\n static columnNameFor(key: string): string | undefined {\n const column = this.columnFor(key);\n\n return column ? column.columnName : undefined;\n }\n\n /**\n * @method relationshipFor\n * @param {String} key - The name of the relationship to match against.\n * @return {void | Object} An object containing relationship metadata if a\n * match is found.\n * @static\n * @private\n */\n static relationshipFor(key: string): Relationship$opts | undefined {\n return Reflect.get(this.relationships, key);\n }\n}\n\nexport default Model;\nexport type { Model$Hook, Model$Hooks } from './interfaces';\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * `Query` is the chainable query builder. Its snapshot tuples (method name +\n * arbitrary Knex arguments), where/include condition objects, and the values it\n * ultimately resolves are genuinely dynamic; the original Flow typed them\n * `any`/`Object` for the same reason. The generic `T` still types what a query\n * resolves to for callers.\n */\nimport { camelize } from 'inflection';\n\nimport entries from '../../../utils/entries';\nimport uniq from '../../../utils/uniq';\nimport type { ModelClass } from '../interfaces';\n\nimport scopesFor from './utils/scopes-for';\nimport formatSelect from './utils/format-select';\nimport { runQuery, createRunner } from './runner';\n\n/**\n * The snapshots that narrow which rows match \u2014 the only ones `count()` keeps.\n * Every condition the query builder can push belongs here: dropping one makes\n * the count (and so the index action's page links) disagree with the rows.\n *\n * @private\n */\nconst CONDITIONS = new Set([\n 'where',\n 'whereNot',\n 'whereIn',\n 'whereNotIn',\n 'whereNull',\n 'whereNotNull',\n 'whereBetween',\n 'whereNotBetween',\n 'whereRaw'\n]);\n\n/**\n * @class Query\n * @extends Promise\n * @private\n */\nclass Query<T = any> extends Promise<T> {\n declare model: ModelClass;\n\n declare isFind: boolean;\n\n declare snapshots: Array<Array<any>>;\n\n declare collection: boolean;\n\n declare shouldCount: boolean;\n\n declare relationships: Record<string, any>;\n\n constructor(model: ModelClass) {\n let resolve;\n let reject;\n\n super((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n createRunner(this, {\n resolve,\n reject\n });\n\n Object.defineProperties(this, {\n model: {\n value: model,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n collection: {\n value: true,\n writable: true,\n enumerable: false,\n configurable: false\n },\n\n snapshots: {\n value: [],\n writable: true,\n enumerable: false,\n configurable: false\n },\n\n shouldCount: {\n value: false,\n writable: true,\n enumerable: false,\n configurable: false\n },\n\n relationships: {\n value: {},\n writable: true,\n enumerable: false,\n configurable: false\n }\n });\n\n Object.defineProperties(this, scopesFor(this));\n }\n\n static override get [Symbol.species]() {\n return Promise;\n }\n\n all(): this {\n return this;\n }\n\n not(conditions: Record<string, any> = {}): this {\n return this.where(conditions, true);\n }\n\n find(primaryKey: any): this {\n Object.assign(this, {\n isFind: true,\n collection: false\n });\n\n this.where({\n [this.model.primaryKey]: primaryKey\n });\n\n if (!this.shouldCount) {\n this.limit(1);\n }\n\n return this;\n }\n\n page(num?: number): this {\n if (this.shouldCount) {\n return this;\n }\n\n let limit: any = this.snapshots.find(([name]) => name === 'limit');\n\n if (limit) {\n [, limit] = limit;\n }\n\n if (typeof limit !== 'number') {\n limit = 25;\n }\n\n this.limit(limit);\n\n return this.offset(Math.max(parseInt(String(num), 10) - 1, 0) * limit);\n }\n\n limit(amount?: number): this {\n if (!this.shouldCount) {\n this.snapshots.push(['limit', amount]);\n }\n\n return this;\n }\n\n order(attr: string, direction: string = 'ASC'): this {\n if (!this.shouldCount) {\n const columnName = this.model.columnNameFor(attr);\n\n if (columnName) {\n this.snapshots = this.snapshots\n .filter(([method]) => method !== 'orderByRaw')\n .concat([\n [\n 'orderByRaw',\n uniq([columnName, this.model.primaryKey])\n .map(key => `${this.model.tableName}.${key} ${direction}`)\n .join(', ')\n ]\n ]);\n }\n }\n\n return this;\n }\n\n where(conditions: Record<string, any> = {}, not: boolean = false): this {\n const {\n model: { tableName }\n } = this;\n\n const where = entries(conditions).reduce<Record<string, any>>(\n (obj, condition) => {\n let [key, value] = condition;\n const columnName = this.model.columnNameFor(key);\n\n if (columnName) {\n key = `${tableName}.${columnName}`;\n\n if (typeof value === 'undefined') {\n value = null;\n }\n\n if (Array.isArray(value)) {\n if (value.length === 1) {\n return {\n ...obj,\n [key]: value[0]\n };\n }\n\n this.snapshots.push([not ? 'whereNotIn' : 'whereIn', [key, value]]);\n } else if (value === null) {\n this.snapshots.push([not ? 'whereNotNull' : 'whereNull', [key]]);\n } else {\n return {\n ...obj,\n [key]: value\n };\n }\n }\n\n return obj;\n },\n {}\n );\n\n if (Object.keys(where).length) {\n this.snapshots.push([not ? 'whereNot' : 'where', where]);\n }\n\n return this;\n }\n\n whereBetween(conditions: Record<string, any>, not: boolean = false): this {\n const {\n model: { tableName }\n } = this;\n\n entries(conditions).forEach(condition => {\n let [key] = condition;\n const [, value] = condition;\n const columnName = this.model.columnNameFor(key);\n\n if (columnName) {\n key = `${tableName}.${columnName}`;\n\n if (Array.isArray(value)) {\n this.snapshots.push([\n `where${not ? 'NotBetween' : 'Between'}`,\n [key, value]\n ]);\n }\n }\n });\n\n return this;\n }\n\n whereRaw(query: string, bindings: Array<any> = []): this {\n this.snapshots.push(['whereRaw', [query, bindings]]);\n return this;\n }\n\n first(): this {\n if (!this.shouldCount) {\n const willSort = this.snapshots.some(\n ([method]) => method === 'orderByRaw'\n );\n\n this.collection = false;\n\n if (!willSort) {\n this.order(this.model.primaryKey, 'ASC');\n }\n\n this.limit(1);\n }\n\n return this;\n }\n\n last(): this {\n if (!this.shouldCount) {\n const willSort = this.snapshots.some(\n ([method]) => method === 'orderByRaw'\n );\n\n this.collection = false;\n\n if (!willSort) {\n this.order(this.model.primaryKey, 'DESC');\n }\n\n this.limit(1);\n }\n\n return this;\n }\n\n count(): Query<number> {\n Object.assign(this, {\n shouldCount: true,\n\n snapshots: [\n ['count', '* as countAll'],\n ...this.snapshots.filter(([name]) => CONDITIONS.has(name))\n ]\n });\n\n return this as unknown as Query<number>;\n }\n\n offset(amount: number): this {\n if (!this.shouldCount) {\n this.snapshots.push(['offset', amount]);\n }\n\n return this;\n }\n\n select(...attrs: Array<string>): this {\n if (!this.shouldCount) {\n this.snapshots.push(['select', formatSelect(this.model, attrs)]);\n }\n\n return this;\n }\n\n distinct(...attrs: Array<string>): this {\n if (!this.shouldCount) {\n this.snapshots.push(['distinct', formatSelect(this.model, attrs)]);\n }\n\n return this.select();\n }\n\n include(...relationships: Array<Record<string, any> | string>): this {\n let included: Array<any>;\n\n if (!this.shouldCount) {\n if (relationships.length === 1 && typeof relationships[0] === 'object') {\n included = entries(relationships[0]).reduce<Array<any>>(\n (arr, relationship) => {\n const [name] = relationship;\n const opts = this.model.relationshipFor(name);\n let [, attrs] = relationship;\n\n if (opts) {\n if (!attrs.length) {\n attrs = opts.model.attributeNames;\n }\n\n return [...arr, { name, attrs, relationship: opts }];\n }\n\n return arr;\n },\n []\n );\n } else {\n included = relationships.reduce<Array<any>>((arr, name) => {\n let str = name;\n\n if (typeof str !== 'string') {\n str = String(str);\n }\n\n const opts = this.model.relationshipFor(str);\n\n if (opts) {\n const attrs = opts.model.attributeNames;\n\n return [...arr, { attrs, name: str, relationship: opts }];\n }\n\n return arr;\n }, []);\n }\n\n const willInclude = included\n .filter(opts => {\n const { name, relationship } = opts;\n let { attrs } = opts;\n\n if (relationship.type === 'hasMany') {\n attrs = relationship.through\n ? attrs\n : [...attrs, camelize(relationship.foreignKey, true)];\n\n this.relationships[name] = {\n attrs,\n type: 'hasMany',\n model: relationship.model,\n through: relationship.through,\n foreignKey: relationship.foreignKey\n };\n\n return false;\n }\n\n return true;\n })\n .reduce<Array<any>>((arr, { name, attrs, relationship }) => {\n arr.push([\n 'includeSelect',\n formatSelect(relationship.model, attrs, `${name}.`)\n ]);\n\n if (relationship.type === 'belongsTo') {\n arr.push([\n 'leftOuterJoin',\n [\n relationship.model.tableName,\n `${this.model.tableName}.${relationship.foreignKey}`,\n '=',\n `${relationship.model.tableName}.${relationship.model.primaryKey}`\n ]\n ]);\n } else if (relationship.type === 'hasOne') {\n arr.push([\n 'leftOuterJoin',\n [\n relationship.model.tableName,\n `${this.model.tableName}.${this.model.primaryKey}`,\n '=',\n `${relationship.model.tableName}.${relationship.foreignKey}`\n ]\n ]);\n }\n\n return arr;\n }, []);\n\n this.snapshots.push(...willInclude);\n }\n\n return this;\n }\n\n unscope(...scopes: Array<string>): this {\n if (scopes.length) {\n const keys = scopes.map(scope => {\n if (scope === 'order') {\n return 'orderByRaw';\n }\n\n return scope;\n });\n\n this.snapshots = this.snapshots.filter(([, , scope]) => {\n if (typeof scope === 'string') {\n return keys.indexOf(scope) < 0;\n }\n\n return true;\n });\n } else {\n this.snapshots = this.snapshots.filter(([, , scope]) => !scope);\n }\n\n return this;\n }\n\n override then<TResult1 = T, TResult2 = never>(\n onFulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n onRejected?: ((error: unknown) => TResult2 | PromiseLike<TResult2>) | null\n ): Promise<TResult1 | TResult2> {\n runQuery(this);\n return super.then(onFulfilled, onRejected);\n }\n\n override catch<TResult = never>(\n onRejected?: ((error: unknown) => TResult | PromiseLike<TResult>) | null\n ): Promise<T | TResult> {\n runQuery(this);\n return super.catch(onRejected);\n }\n\n static from(src: any): Query<unknown> {\n const { model, snapshots, collection, shouldCount, relationships } = src;\n\n const dest = Reflect.construct(this, [model]) as Query<unknown>;\n\n Object.assign(dest, {\n snapshots,\n collection,\n shouldCount,\n relationships\n });\n\n return dest;\n }\n}\n\nexport default Query;\nexport { RecordNotFoundError } from './errors';\n", "/**\n * @private\n */\nexport default function uniq<T>(src: T[], ...keys: string[]): T[] {\n const hasKeys = Boolean(keys.length);\n const valueAt = (obj: T, key: string): unknown =>\n (obj as unknown as Record<string, unknown>)[key];\n\n return src.filter((x, xIdx, arr) => {\n let lastIdx: number;\n\n if (hasKeys) {\n lastIdx = arr.findIndex(\n (y, yIdx) =>\n yIdx > xIdx || keys.every(key => valueAt(x, key) === valueAt(y, key))\n );\n } else {\n lastIdx = src.lastIndexOf(x);\n }\n\n return xIdx === lastIdx;\n });\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * `scopesFor` builds the dynamic scope-method machinery: each scope is a\n * variadic function forwarded to the model's scope statics via Reflect.apply,\n * so the argument list is genuinely untyped at this layer.\n */\nimport type Query from '../index';\n\nexport default function scopesFor<T>(target: Query<T>): PropertyDescriptorMap {\n return Object.keys(target.model.scopes).reduce<PropertyDescriptorMap>(\n (scopes, name) => ({\n ...scopes,\n [name]: {\n get() {\n const scope = function (...args: Array<any>) {\n const fn = Reflect.get(target.model, name);\n const { snapshots } = Reflect.apply(fn, target.model, args) as {\n snapshots: Array<Array<unknown>>;\n };\n\n Object.assign(target, {\n snapshots: [\n ...target.snapshots,\n ...snapshots.map(snapshot => [...snapshot, name])\n ]\n });\n\n return target;\n };\n\n Reflect.defineProperty(scope, 'name', {\n value: name,\n writable: false,\n enumerable: false,\n configurable: false\n });\n\n return scope;\n }\n }\n }),\n {}\n );\n}\n", "import { camelize } from 'inflection';\n\nimport type { ModelClass } from '../../interfaces';\n\n/**\n * @private\n */\nexport default function formatSelect(\n model: ModelClass,\n attrs: Array<string> = [],\n prefix: string = ''\n) {\n return attrs.map(attr => {\n const name = model.columnNameFor(attr) || 'undefined';\n\n return `${model.tableName}.${name} AS ${prefix}${camelize(name, true)}`;\n });\n}\n", "import createServerError from '../../../server/utils/create-server-error';\nimport stringify from '../../../../utils/stringify';\nimport type { ModelClass } from '../../interfaces';\n\nclass RecordNotFoundError extends Error {\n constructor({ name, primaryKey }: ModelClass, primaryKeyValue: unknown) {\n super(\n `Could not find ${name} with ${primaryKey} ${stringify(primaryKeyValue)}.`\n );\n }\n}\n\nexport default createServerError(RecordNotFoundError, 404);\n", "import type Query from '../index';\n\nexport const RUNNERS: WeakMap<\n Query<unknown>,\n () => Promise<void>\n> = new WeakMap();\n", "import isObject from '../../../../../utils/is-object';\nimport type Query from '../../index';\n\nexport default function getFindParam({\n isFind,\n snapshots,\n model: { tableName, primaryKey }\n}: Query<unknown>) {\n if (isFind) {\n const snapshot = snapshots.find(([method]) => method === 'where');\n\n if (snapshot) {\n const [, params] = snapshot;\n\n if (params && isObject(params)) {\n return Reflect.get(params, `${tableName}.${primaryKey}`);\n }\n }\n }\n\n return undefined;\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * The query runner assembles results from raw Knex rows and dynamically-built\n * related sub-queries (Reflect.construct/get/set over untyped column data), so\n * records, relationship descriptors and the constructed instances are genuinely\n * untyped at this layer.\n */\nimport { camelize, singularize } from 'inflection';\n\nimport type Model from '../../../model';\nimport type { ModelClass } from '../../../interfaces';\nimport entries from '../../../../../utils/entries';\nimport underscore from '../../../../../utils/underscore';\nimport promiseHash from '../../../../../utils/promise-hash';\n\n/**\n * @private\n */\nexport default async function buildResults<T extends Model>({\n model,\n records,\n relationships\n}: {\n model: ModelClass<T>;\n records: Promise<Array<Record<string, any>>>;\n relationships: Record<string, any>;\n}): Promise<Array<T>> {\n const results = await records;\n const pkPattern = new RegExp(`^.+\\\\.${model.primaryKey}$`);\n let related: Record<string, any> | undefined;\n\n if (!results.length) {\n return [];\n }\n\n if (Object.keys(relationships).length) {\n related = entries(relationships).reduce<Record<string, any>>(\n (obj, entry) => {\n const [name, relationship] = entry;\n let foreignKey = camelize(relationship.foreignKey, true);\n\n if (relationship.through) {\n const query = relationship.model.select(...relationship.attrs);\n\n const baseKey =\n `${relationship.through.tableName}.` +\n `${singularize(underscore(name))}_id`;\n\n foreignKey = `${relationship.through.tableName}.${relationship.foreignKey}`;\n\n query.snapshots.push(\n [\n 'select',\n [\n `${baseKey} as ${camelize(String(baseKey.split('.').pop()), true)}`,\n `${foreignKey} as ${camelize(String(foreignKey.split('.').pop()), true)}`\n ]\n ],\n [\n 'innerJoin',\n [\n relationship.through.tableName,\n `${relationship.model.tableName}.${relationship.model.primaryKey}`,\n '=',\n baseKey\n ]\n ],\n ['whereIn', [foreignKey, results.map(({ id }) => id)]]\n );\n\n return { ...obj, [name]: query };\n }\n\n return {\n ...obj,\n [name]: relationship.model.select(...relationship.attrs).where({\n [foreignKey]: results.map(({ id }) => id)\n })\n };\n },\n {}\n );\n\n related = await promiseHash(related);\n }\n\n return results.map(record => {\n if (related) {\n entries(related).forEach(\n ([name, relatedResults]: [string, Array<Model>]) => {\n const relationship = model.relationshipFor(name);\n\n if (relationship) {\n let { foreignKey } = relationship;\n\n foreignKey = camelize(foreignKey, true);\n\n Reflect.set(\n record,\n name,\n relatedResults.filter(({ rawColumnData }) => {\n const fk = Reflect.get(rawColumnData, foreignKey);\n const pk = Reflect.get(record, model.primaryKey);\n\n return fk === pk;\n })\n );\n }\n }\n );\n }\n\n // A left-joined relationship with no match comes back as a row of nulls.\n // Drop all of its columns, not just its primary key: otherwise a record\n // is built from the remaining nulls, and the model fills in its column\n // defaults \u2014 on Postgres the primary key becomes the literal\n // `nextval('<table>_id_seq'::regclass)`, i.e. a phantom related record.\n const missing = new Set(\n entries(record)\n .filter(([key, value]) => value == null && pkPattern.test(key))\n .map(([key]) => key.split('.')[0])\n );\n\n // An unmatched has-one is known to be absent, so its getter must not\n // query for it again (belongs-to already skips the query on a null key).\n const absent = Array.from(missing).filter(\n name => model.relationshipFor(name)?.type === 'hasOne'\n );\n\n const instance = Reflect.construct(model, [\n entries(record).reduce<Record<string, any>>((r, entry) => {\n let [key, value] = entry;\n\n if (key.indexOf('.') >= 0 && missing.has(key.split('.')[0])) {\n return r;\n } else if (key.indexOf('.') >= 0) {\n const [a, b] = key.split('.');\n let parent: Record<string, any> = r[a];\n\n if (!parent) {\n parent = {};\n }\n\n key = a;\n value = {\n ...parent,\n [b]: value\n };\n }\n\n return {\n ...r,\n [key]: value\n };\n }, {})\n ]);\n\n absent.forEach(name => instance.absentRelationships.add(name));\n instance.currentChangeSet.persist();\n\n return instance;\n });\n}\n", "import entries from './entries';\n\n/**\n * Resolves every value of an object, returning an object of the same shape with\n * each promise unwrapped.\n *\n * @private\n */\nexport default function promiseHash<T extends Record<string, unknown>>(\n promises: T\n): Promise<{ [K in keyof T]: Awaited<T[K]> }> {\n type Resolved = { [K in keyof T]: Awaited<T[K]> };\n\n if (Object.keys(promises).length) {\n return Promise.all(\n entries(promises).map(\n ([key, promise]) =>\n new Promise<Record<string, unknown>>((resolve, reject) => {\n const maybe = promise as Promise<unknown> | undefined;\n\n if (maybe && typeof maybe.then === 'function') {\n maybe.then(value => resolve({ [key]: value })).catch(reject);\n } else {\n resolve({ [key]: promise });\n }\n })\n )\n ).then(\n objects =>\n objects.reduce(\n (hash, object) => ({\n ...hash,\n ...object\n }),\n {}\n ) as Resolved\n );\n }\n\n return Promise.resolve({} as Resolved);\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * The runner drives Knex query builders (`model.table()` and the reduced\n * snapshot chain) whose types Lumen does not model; `records` and the reflected\n * method calls are genuinely untyped here.\n */\nimport { RecordNotFoundError } from '../errors';\nimport { sql } from '../../../logger';\nimport type Query from '../index';\n\nimport { RUNNERS } from './constants';\nimport getFindParam from './utils/get-find-param';\nimport buildResults from './utils/build-results';\n\n/**\n * @private\n */\nexport function createRunner(\n target: Query<unknown>,\n opts: {\n resolve?: (value: any) => void;\n reject?: (error: Error) => void;\n }\n): void {\n if (opts.resolve && opts.reject) {\n const { resolve, reject } = opts;\n let didRun = false;\n\n RUNNERS.set(target, async () => {\n if (didRun) {\n return;\n }\n\n didRun = true;\n\n // Any failure below (a rejected SQL query included) must reject the\n // Query. Without this it became an unhandled rejection and the awaiting\n // caller \u2014 e.g. a request being served \u2014 never settled.\n try {\n await run();\n } catch (err) {\n reject(err as Error);\n }\n });\n\n async function run() {\n let results;\n const {\n model,\n isFind,\n snapshots,\n collection,\n shouldCount,\n relationships\n } = target;\n\n if (!shouldCount && !snapshots.some(([name]) => name === 'select')) {\n target.select(...target.model.attributeNames);\n }\n\n const records: any = snapshots.reduce((query, snapshot) => {\n let [name, params] = snapshot;\n\n if (!shouldCount && name === 'includeSelect') {\n name = 'select';\n }\n\n const method = Reflect.get(query, name);\n\n if (!Array.isArray(params)) {\n params = [params];\n }\n\n return Reflect.apply(method, query, params);\n }, model.table() as any);\n\n if (model.store.debug) {\n records.on('query', () => {\n setImmediate(() => model.logger.debug(sql`${records.toString()}`));\n });\n }\n\n if (shouldCount) {\n let [{ countAll: count }] = await records;\n count = parseInt(count, 10);\n\n resolve(Number.isFinite(count) ? count : 0);\n } else {\n results = await buildResults({\n model,\n records,\n relationships\n });\n\n if (collection) {\n resolve(results);\n } else {\n const [result] = results;\n\n if (!result && isFind) {\n const err = new RecordNotFoundError(model, getFindParam(target));\n\n reject(err);\n }\n\n resolve(result);\n }\n }\n }\n }\n}\n\nexport function runQuery(target: Query<unknown>): void {\n const runner = RUNNERS.get(target);\n\n if (runner) {\n runner();\n }\n}\n", "export default function mapToObject<T>(\n source: Map<string, T>\n): Record<string, T> {\n return Array.from(source).reduce<Record<string, T>>(\n (obj, [key, value]) => ({\n ...obj,\n [String(key)]: value\n }),\n {}\n );\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * A ChangeSet stores a record's pending attribute and relationship values,\n * which are heterogeneous and dynamic (typed `any`/`Object` in the original\n * Flow). The `any` value type is what lets attribute getters/setters and the\n * relationship helpers round-trip those values.\n */\nimport type { Model } from '../index';\nimport entries from '../../../utils/entries';\nimport mapToObject from '../../../utils/map-to-object';\n\nclass ChangeSet extends Map<string, any> {\n declare isPersisted: boolean;\n\n constructor(data: Record<string, unknown> = {}) {\n super(entries(data));\n\n this.isPersisted = false;\n }\n\n override set(key: string, value: any): this {\n if (!this.isPersisted) {\n super.set(key, value);\n }\n\n return this;\n }\n\n persist(group?: Array<ChangeSet>): this {\n if (group) {\n group.forEach(changeSet => changeSet.unpersist());\n }\n\n this.isPersisted = true;\n\n return this;\n }\n\n unpersist(): this {\n this.isPersisted = false;\n return this;\n }\n\n applyTo(target: Model): ChangeSet {\n const instance = new ChangeSet(mapToObject(this));\n\n target.changeSets.unshift(instance);\n\n return instance;\n }\n}\n\nexport default ChangeSet;\n", "import { camelize } from 'inflection';\n\nimport type Model from '../model';\n\nimport { getHasOne, getHasMany, getBelongsTo } from './utils/getters';\nimport { setHasOne, setHasMany, setBelongsTo } from './utils/setters';\n\n/**\n * @private\n */\nexport function set(\n owner: Model,\n key: string,\n value?: Array<Model> | Model | null\n) {\n const opts = owner.constructor.relationshipFor(key);\n\n if (opts) {\n const { type } = opts;\n let { foreignKey } = opts;\n\n foreignKey = camelize(foreignKey, true);\n\n if (Array.isArray(value)) {\n if (type === 'hasMany') {\n setHasMany(owner, key, value, {\n ...opts,\n foreignKey\n });\n }\n } else if (type === 'hasOne') {\n setHasOne(owner, key, value, {\n ...opts,\n foreignKey\n });\n } else if (type === 'belongsTo') {\n setBelongsTo(owner, key, value, {\n ...opts,\n foreignKey\n });\n }\n }\n}\n\n/**\n * @private\n */\nexport async function get(\n owner: Model,\n key: string\n): Promise<Array<Model> | Model | null> {\n const opts = owner.constructor.relationshipFor(key);\n let value: Array<Model> | Model | null = null;\n\n if (opts) {\n const { type } = opts;\n let { foreignKey } = opts;\n\n value = owner.currentChangeSet.get(key);\n foreignKey = camelize(foreignKey, true);\n\n if (!value && owner.absentRelationships.has(key)) {\n value = null;\n } else if (!value) {\n switch (type) {\n case 'hasOne':\n value = await getHasOne(owner, {\n ...opts,\n foreignKey\n });\n break;\n\n case 'hasMany':\n value = await getHasMany(owner, {\n ...opts,\n foreignKey\n });\n break;\n\n case 'belongsTo':\n value = await getBelongsTo(owner, {\n ...opts,\n foreignKey\n });\n break;\n\n default:\n throw new Error(`Unknown relationship type '${type}'.`);\n }\n\n set(owner, key, value);\n }\n }\n\n return value;\n}\n\nexport { default as updateRelationship } from './utils/update-relationship';\nexport type { Relationship$opts } from './interfaces';\n", "import { camelize } from 'inflection';\n\nimport type Model from '../../model';\nimport type { Relationship$opts } from '../index';\n\n/**\n * @private\n */\nasync function getHasManyThrough(\n owner: Model,\n { model, inverse, through, foreignKey: baseKey }: Relationship$opts\n): Promise<Array<Model>> {\n const inverseOpts = model.relationshipFor(inverse);\n let value: Array<Model> = [];\n\n if (through && inverseOpts) {\n const foreignKey = camelize(inverseOpts.foreignKey, true);\n const records = await through.select(baseKey, foreignKey).where({\n [baseKey]: owner.getPrimaryKey()\n });\n\n if (records.length) {\n value = await model.where({\n [model.primaryKey]: records\n .map(record => Reflect.get(record, foreignKey))\n .filter(Boolean)\n });\n }\n }\n\n return value;\n}\n\n/**\n * @private\n */\nexport function getHasOne(\n owner: Model,\n { model, foreignKey }: Relationship$opts\n) {\n return model.first().where({\n [foreignKey]: owner.getPrimaryKey()\n });\n}\n\n/**\n * @private\n */\nexport function getHasMany(owner: Model, opts: Relationship$opts) {\n const { model, through, foreignKey } = opts;\n\n return through\n ? getHasManyThrough(owner, opts)\n : model.where({\n [foreignKey]: owner.getPrimaryKey()\n });\n}\n\n/**\n * @private\n */\nexport function getBelongsTo(\n owner: Model,\n { model, foreignKey }: Relationship$opts\n) {\n const foreignValue = Reflect.get(owner, foreignKey);\n\n return foreignValue ? model.find(foreignValue) : Promise.resolve(null);\n}\n", "import type Model from '../../model';\n\n/**\n * @private\n */\nfunction unassociateOne<T extends Model | null | undefined>(\n value: T,\n foreignKey: string\n): T {\n if (value) {\n Reflect.set(value, foreignKey, null);\n }\n\n return value;\n}\n\n/**\n * @private\n */\nexport default function unassociate<T extends Model>(\n value: Array<T>,\n foreignKey: string\n): Array<T> {\n return value.map(record => unassociateOne(record, foreignKey));\n}\n", "/**\n * @private\n */\nexport default function isNull(value: unknown): value is null {\n return value === null;\n}\n", "import isNull from '../../../../utils/is-null';\nimport type { ModelClass } from '../../interfaces';\n\nfunction validateOne(model: ModelClass, value: unknown) {\n return isNull(value) || model.isInstance(value);\n}\n\nexport default function validateType(model: ModelClass, value: unknown) {\n if (Array.isArray(value)) {\n return value.every(item => validateOne(model, item));\n }\n\n return validateOne(model, value);\n}\n", "import type Model from '../../model';\nimport type { ModelClass } from '../../interfaces';\nimport type { Relationship$opts } from '../index';\n\n/**\n * @private\n */\nexport function setHasManyInverse(\n owner: Model,\n value: Array<Model>,\n {\n inverse,\n foreignKey,\n inverseModel\n }: Relationship$opts & {\n inverseModel: ModelClass;\n }\n) {\n const primaryKey = Reflect.get(owner, owner.constructor.primaryKey);\n const { type: inverseType } = inverseModel.relationshipFor(inverse)!;\n\n for (const record of value) {\n let { currentChangeSet: changeSet } = record;\n\n if (owner !== changeSet.get(inverse)) {\n if (changeSet.isPersisted) {\n changeSet = changeSet.applyTo(record);\n }\n\n changeSet.set(inverse, owner);\n\n if (inverseType === 'belongsTo') {\n Reflect.set(record, foreignKey, primaryKey);\n }\n }\n }\n}\n\n/**\n * @private\n */\nexport function setHasOneInverse(\n owner: Model,\n value: Model | null | undefined,\n {\n inverse,\n foreignKey,\n inverseModel\n }: Relationship$opts & {\n inverseModel: ModelClass;\n }\n) {\n if (value) {\n const { type: inverseType } = inverseModel.relationshipFor(inverse)!;\n let inverseValue = value.currentChangeSet.get(inverse);\n\n if (inverseType === 'hasMany') {\n if (!Array.isArray(inverseValue)) {\n inverseValue = [];\n }\n\n if (!inverseValue.includes(owner)) {\n inverseValue.push(owner);\n }\n } else if (owner !== inverseValue) {\n inverseValue = owner;\n\n if (inverseType === 'belongsTo') {\n Reflect.set(value, foreignKey, inverseValue.getPrimaryKey());\n }\n }\n\n let { currentChangeSet: changeSet } = value;\n\n if (changeSet.isPersisted) {\n changeSet = changeSet.applyTo(value);\n }\n\n changeSet.set(inverse, inverseValue || null);\n }\n}\n", "import type Model from '../../model';\nimport type { Relationship$opts } from '../index';\n\nimport unassociate from './unassociate';\nimport validateType from './validate-type';\nimport { setHasOneInverse, setHasManyInverse } from './inverse-setters';\n\n/**\n * @private\n */\nexport function setHasMany(\n owner: Model,\n key: string,\n value: Array<Model>,\n { type, model, inverse, foreignKey }: Relationship$opts\n) {\n let { currentChangeSet: changeSet } = owner;\n\n if (validateType(model, value)) {\n let prevValue = changeSet.get(key);\n\n if (Array.isArray(prevValue)) {\n prevValue = unassociate(prevValue, foreignKey);\n\n if (Array.isArray(prevValue)) {\n prevValue\n .filter(\n prev =>\n !value.find(next => prev.getPrimaryKey() === next.getPrimaryKey())\n )\n .forEach(record => owner.prevAssociations.add(record));\n }\n }\n\n if (changeSet.isPersisted) {\n changeSet = changeSet.applyTo(owner);\n }\n\n changeSet.set(key, value);\n\n setHasManyInverse(owner, value, {\n type,\n model,\n inverse,\n foreignKey,\n inverseModel: model\n });\n }\n}\n\n/**\n * @private\n */\nexport function setHasOne(\n owner: Model,\n key: string,\n value: Model | null | undefined,\n { type, model, inverse, foreignKey }: Relationship$opts\n) {\n let valueToSet = value;\n\n if (value && typeof value === 'object' && !model.isInstance(value)) {\n valueToSet = Reflect.construct(model, [valueToSet]);\n }\n\n let { currentChangeSet: changeSet } = owner;\n\n if (valueToSet) {\n if (validateType(model, valueToSet)) {\n if (changeSet.isPersisted) {\n changeSet = changeSet.applyTo(owner);\n }\n\n changeSet.set(key, valueToSet);\n }\n } else {\n if (changeSet.isPersisted) {\n changeSet = changeSet.applyTo(owner);\n }\n\n changeSet.set(key, null);\n }\n\n setHasOneInverse(owner, valueToSet, {\n type,\n model,\n inverse,\n foreignKey,\n inverseModel: model\n });\n}\n\n/**\n * @private\n */\nexport function setBelongsTo(\n owner: Model,\n key: string,\n value: Model | null | undefined,\n { type, model, inverse, foreignKey }: Relationship$opts\n) {\n setHasOne(owner, key, value, {\n type,\n model,\n inverse,\n foreignKey\n });\n\n if (value) {\n Reflect.set(owner, foreignKey, Reflect.get(value, model.primaryKey));\n } else {\n Reflect.set(owner, foreignKey, null);\n }\n}\n", "import type Model from '../../model';\nimport type { Relationship$opts } from '../interfaces';\n\ntype Params = {\n record: Model;\n value: Model | null | undefined | Array<Model>;\n opts: Relationship$opts;\n trx: unknown;\n};\n\nfunction updateHasOne({ record, value, opts, trx }: Params): Array<unknown> {\n const recordPrimaryKey = record.getPrimaryKey();\n\n if (value) {\n if (value instanceof opts.model) {\n return [\n opts.model\n .table()\n .transacting(trx)\n .update(opts.foreignKey, null)\n .where(`${opts.model.tableName}.${opts.foreignKey}`, recordPrimaryKey)\n .whereNot(\n `${opts.model.tableName}.${opts.model.primaryKey}`,\n value.getPrimaryKey()\n ),\n opts.model\n .table()\n .transacting(trx)\n .update(opts.foreignKey, recordPrimaryKey)\n .where(\n `${opts.model.tableName}.${opts.model.primaryKey}`,\n value.getPrimaryKey()\n )\n ];\n }\n } else {\n return [\n opts.model\n .table()\n .transacting(trx)\n .update(opts.foreignKey, null)\n .where(`${opts.model.tableName}.${opts.foreignKey}`, recordPrimaryKey)\n ];\n }\n\n return [];\n}\n\nfunction updateHasMany({ record, value, opts, trx }: Params): Array<unknown> {\n const recordPrimaryKey = record.getPrimaryKey();\n\n if (Array.isArray(value) && value.length) {\n return [\n opts.model\n .table()\n .transacting(trx)\n .update(opts.foreignKey, null)\n .where(`${opts.model.tableName}.${opts.foreignKey}`, recordPrimaryKey)\n .whereNotIn(\n `${opts.model.tableName}.${opts.model.primaryKey}`,\n value.map(item => item.getPrimaryKey())\n ),\n opts.model\n .table()\n .transacting(trx)\n .update(opts.foreignKey, recordPrimaryKey)\n .whereIn(\n `${opts.model.tableName}.${opts.model.primaryKey}`,\n value.map(item => item.getPrimaryKey())\n )\n ];\n }\n\n return [\n opts.model\n .table()\n .transacting(trx)\n .update(opts.foreignKey, null)\n .where(`${opts.model.tableName}.${opts.foreignKey}`, recordPrimaryKey)\n ];\n}\n\nfunction updateBelongsTo({ record, value, opts, trx }: Params): Array<unknown> {\n if (value instanceof opts.model) {\n const inverseOpts = opts.model.relationshipFor(opts.inverse);\n const foreignKeyValue = value.getPrimaryKey();\n\n Reflect.set(record, opts.foreignKey, foreignKeyValue);\n\n if (inverseOpts && inverseOpts.type === 'hasOne') {\n return [\n record.constructor\n .table()\n .transacting(trx)\n .update(opts.foreignKey, null)\n .where(opts.foreignKey, foreignKeyValue)\n .whereNot(\n `${record.constructor.tableName}.${record.constructor.primaryKey}`,\n record.getPrimaryKey()\n )\n ];\n }\n }\n\n return [];\n}\n\n/**\n * @private\n */\nexport default function updateRelationship(\n record: Model,\n name: string,\n trx: unknown\n): Array<unknown> {\n const opts = record.constructor.relationshipFor(name);\n\n if (!opts) {\n const {\n constructor: { name: className }\n } = record;\n\n throw new Error(`Could not find relationship '${name} on '${className}`);\n }\n\n const { dirtyRelationships } = record;\n\n if (!dirtyRelationships.has(name)) {\n return [];\n }\n\n const value = dirtyRelationships.get(name) as\n Model | Array<Model> | null | undefined;\n\n switch (opts.type) {\n case 'hasOne':\n return updateHasOne({\n record,\n value,\n opts,\n trx\n });\n\n case 'hasMany':\n return updateHasMany({\n record,\n value,\n opts,\n trx\n });\n\n default:\n return updateBelongsTo({\n record,\n value,\n opts,\n trx\n });\n }\n}\n", "export default function hasOwnProperty(target: object, key: string): boolean {\n return Reflect.apply(Object.prototype.hasOwnProperty, target, [key]);\n}\n", "import hasOwnProperty from './has-own-property';\n\ntype ProxyGet<T extends object> = (\n target: T,\n key: string,\n receiver: unknown\n) => unknown;\n\n/**\n * @private\n */\nexport function trapGet<T extends object>(\n traps: Record<string, unknown>\n): ProxyGet<T> {\n return (target, key, receiver) => {\n if (key === 'unwrap') {\n return () => target;\n }\n\n if (hasOwnProperty(traps, key)) {\n const value = Reflect.get(traps, key);\n\n if (typeof value === 'function') {\n return value.bind(receiver, target);\n }\n\n return value;\n }\n\n return Reflect.get(target, key);\n };\n}\n", "import { trapGet } from '../../../utils/proxy';\nimport type { Model } from '../index';\nimport type { ModelClass } from '../interfaces';\n\nimport type { Transaction$ResultProxy } from './interfaces';\n\n/**\n * @private\n */\nexport function createStaticTransactionProxy<T extends ModelClass>(\n target: T,\n trx: unknown\n): T {\n return new Proxy(target, {\n get: trapGet({\n create(model: T, props: Record<string, unknown> = {}) {\n return model.create(props, trx);\n }\n })\n });\n}\n\n/**\n * @private\n */\nexport function createInstanceTransactionProxy<T extends Model>(\n target: T,\n trx: unknown\n): T {\n return new Proxy(target, {\n get: trapGet({\n save(model: T) {\n return model.save(trx);\n },\n\n update(model: T, props: Record<string, unknown> = {}) {\n return model.update(props, trx);\n },\n\n destroy(model: T) {\n return model.destroy(trx);\n }\n })\n });\n}\n\n/**\n * @private\n */\nexport function createTransactionResultProxy<\n T extends Model,\n U extends boolean\n>(record: T, didPersist: U): Transaction$ResultProxy<T, U> {\n return new Proxy(record, {\n get: trapGet({\n didPersist\n })\n }) as unknown as Transaction$ResultProxy<T, U>;\n}\n\nexport type { Transaction$ResultProxy } from './interfaces';\n", "/**\n * Returns a copy of `src` containing only `keys` whose values are defined.\n *\n * The result is `Partial<T>` rather than Flow's `T`: keys may be dropped, both\n * because the caller asked for a subset and because undefined values are\n * filtered out. The cast is confined to the return, where the dynamic key\n * access makes the shape unknowable to the compiler.\n *\n * @private\n */\nexport default function pick<T extends object>(\n src: T,\n ...keys: string[]\n): Partial<T> {\n return keys\n .map((key): [string, unknown] => [key, Reflect.get(src, key)])\n .filter(([, value]) => typeof value !== 'undefined')\n .reduce<Record<string, unknown>>(\n (result, [key, value]) => ({\n ...result,\n [key]: value\n }),\n {}\n ) as Partial<T>;\n}\n", "/**\n * @private\n */\nexport function map<K, V>(a: Map<K, V>, b: Map<K, V>): Map<K, V> {\n return Array.from(b).reduce((result, [key, value]) => {\n if (a.get(key) !== value) {\n result.set(key, value);\n }\n\n return result;\n }, new Map<K, V>());\n}\n", "import pick from '../../../../utils/pick';\nimport entries from '../../../../utils/entries';\nimport type Model from '../index';\n\n/**\n * @private\n */\nexport default function getColumns(record: Model, only?: Array<string>) {\n let columns: Record<string, unknown> = record.constructor.attributes;\n\n if (only) {\n columns = pick(columns, ...only) as Record<string, unknown>;\n }\n\n return entries(columns).reduce<Record<string, unknown>>(\n (obj, [key, col]) => ({\n ...obj,\n [(col as { columnName: string }).columnName]: Reflect.get(record, key)\n }),\n {}\n );\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * These build and run Knex insert/update/delete statements; the query builders\n * and the promises they return are not modeled by Lumen (they were `Object` in\n * Flow).\n */\nimport { sql } from '../../../logger';\nimport omit from '../../../../utils/omit';\nimport type Logger from '../../../logger';\nimport type Model from '../index';\n\nimport getColumns from './get-columns';\n\n/**\n * @private\n */\nexport function create(record: Model, trx: unknown): Array<any> {\n const timestamp = new Date();\n\n Object.assign(record, {\n createdAt: timestamp,\n updatedAt: timestamp\n });\n\n Object.assign(record.rawColumnData, {\n createdAt: timestamp,\n updatedAt: timestamp\n });\n\n const {\n constructor: { primaryKey }\n } = record;\n const columns = omit(getColumns(record), primaryKey);\n\n if (record.dirtyAttributes.has(primaryKey)) {\n columns[primaryKey] = record.getPrimaryKey();\n }\n\n return [\n record.constructor\n .table()\n .transacting(trx)\n .returning(record.constructor.primaryKey)\n .insert(columns)\n ];\n}\n\n/**\n * @private\n */\nexport function update(record: Model, trx: unknown): Array<any> {\n Reflect.set(record, 'updatedAt', new Date());\n\n return [\n record.constructor\n .table()\n .transacting(trx)\n .where(record.constructor.primaryKey, record.getPrimaryKey())\n .update(getColumns(record, Array.from(record.dirtyAttributes.keys())))\n ];\n}\n\n/**\n * @private\n */\nexport function destroy(record: Model, trx: unknown): Array<any> {\n return [\n record.constructor\n .table()\n .transacting(trx)\n .where(record.constructor.primaryKey, record.getPrimaryKey())\n .del()\n ];\n}\n\n/**\n * @private\n */\nexport function createRunner(\n logger: Logger,\n statements: Array<any>\n): (query: Array<any>) => Promise<Array<any>> {\n return query => {\n const promises = query.concat(statements);\n\n promises.forEach(promise => {\n promise.on('query', () => {\n setImmediate(() => {\n logger.debug(sql`${promise.toString()}`);\n });\n });\n });\n\n return Promise.all(promises);\n };\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * Class initialization is pure runtime metaprogramming: it reads each model's\n * user-declared static config (attributes from the DB schema, hasOne/hasMany/\n * belongsTo/hooks/scopes/validates), and installs accessors, relationship\n * descriptors and frozen metadata onto the class and its prototype via\n * Object.defineProperties/Reflect. The config values are genuinely untyped (as\n * they were `Object` in Flow).\n */\nimport { camelize, dasherize, pluralize, singularize } from 'inflection';\n\nimport { line } from '../../logger';\nimport { createAttribute } from '../attribute';\nimport {\n get as getRelationship,\n set as setRelationship\n} from '../relationship';\nimport entries from '../../../utils/entries';\nimport underscore from '../../../utils/underscore';\nimport type Logger from '../../logger';\nimport type Database from '../index';\nimport type { Model } from '../index';\nimport type { ModelClass } from '../interfaces';\n\nconst VALID_HOOKS = new Set([\n 'afterCreate',\n 'afterDestroy',\n 'afterSave',\n 'afterUpdate',\n 'afterValidation',\n 'beforeCreate',\n 'beforeDestroy',\n 'beforeSave',\n 'beforeUpdate',\n 'beforeValidation'\n]);\n\n/**\n * @private\n */\nfunction initializeProps(\n prototype: object,\n attributes: Record<string, any>,\n relationships: Record<string, any>\n) {\n Object.defineProperties(prototype, {\n ...entries(attributes).reduce<PropertyDescriptorMap>(\n (obj, [key, value]) => ({\n ...obj,\n [key]: createAttribute({\n key,\n ...value\n })\n }),\n {}\n ),\n\n ...Object.keys(relationships).reduce<PropertyDescriptorMap>(\n (obj, key) => ({\n ...obj,\n [key]: {\n get(this: Model) {\n return getRelationship(this, key);\n },\n set(this: Model, val: any) {\n setRelationship(this, key, val);\n }\n }\n }),\n {}\n )\n });\n}\n\n/**\n * @private\n */\nfunction initializeHooks({\n model,\n hooks,\n logger\n}: {\n model: ModelClass;\n hooks: Record<string, any>;\n logger: Logger;\n}) {\n return Object.freeze(\n entries(hooks).reduce<Record<string, any>>((obj, [key, value]) => {\n if (!VALID_HOOKS.has(key)) {\n logger.warn(line`\n Invalid hook '${key}' will not be added to Model '${model.name}'.\n Valid hooks are ${Array.from(VALID_HOOKS)\n .map(h => `'${h}'`)\n .join(', ')}.\n `);\n\n return obj;\n }\n\n return {\n ...obj,\n [key]: async (instance: Model, transaction: unknown) => {\n await Reflect.apply(value, model, [instance, transaction]);\n }\n };\n }, {})\n );\n}\n\n/**\n * @private\n */\nfunction initializeValidations(opts: {\n model: ModelClass;\n logger: Logger;\n validates: Record<string, any>;\n attributes: Record<string, any>;\n}) {\n const { model, logger, attributes } = opts;\n const attributeNames = Object.keys(attributes);\n let { validates } = opts;\n\n validates = entries(validates)\n .filter(([key, value]) => {\n let isValid = attributeNames.indexOf(key) >= 0;\n\n if (!isValid) {\n logger.warn(line`\n Invalid validation '${key}' will not be added to Model\n '${model.name}'. '${key}' is not an attribute of Model\n '${model.name}'.\n `);\n }\n\n if (typeof value !== 'function') {\n isValid = false;\n\n logger.warn(line`\n Invalid validation '${key}' will not be added to Model\n '${model.name}'. Validations must be a function.\n `);\n }\n\n return isValid;\n })\n .reduce<Record<string, any>>(\n (obj, [key, value]) => ({\n ...obj,\n [key]: value\n }),\n {}\n );\n\n return Object.freeze(validates);\n}\n\n/**\n * @private\n */\nexport default async function initializeClass<T extends ModelClass>({\n store,\n table,\n model\n}: {\n store: Database;\n table: T['table'];\n model: T;\n}): Promise<T> {\n let { hooks, scopes, validates } = model;\n const { logger } = store;\n const modelName = dasherize(underscore(model.name));\n const resourceName = pluralize(modelName);\n\n const attributes = entries(await table().columnInfo()).reduce<\n Record<string, any>\n >(\n (obj, [columnName, value]) => ({\n ...obj,\n [camelize(columnName, true)]: {\n ...(value as any),\n columnName,\n docName: dasherize(columnName)\n }\n }),\n {}\n );\n\n const belongsTo = entries(model.belongsTo || {}).reduce<Record<string, any>>(\n (obj, [relatedName, value]) => {\n const { inverse, model: relatedModel } = value as any;\n const relationship = {};\n\n Object.defineProperties(relationship, {\n model: {\n value: store.modelFor(relatedModel || relatedName),\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n inverse: {\n value: inverse,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n type: {\n value: 'belongsTo',\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n foreignKey: {\n value: `${underscore(relatedName)}_id`,\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n\n return {\n ...obj,\n [relatedName]: relationship\n };\n },\n {}\n );\n\n const hasOne = entries(model.hasOne || {}).reduce<Record<string, any>>(\n (obj, [relatedName, value]) => {\n const { inverse, model: relatedModel } = value as any;\n const relationship = {};\n\n Object.defineProperties(relationship, {\n model: {\n value: store.modelFor(relatedModel || relatedName),\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n inverse: {\n value: inverse,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n type: {\n value: 'hasOne',\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n foreignKey: {\n value: `${underscore(inverse)}_id`,\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n\n return {\n ...obj,\n [relatedName]: relationship\n };\n },\n {}\n );\n\n const hasMany = entries(model.hasMany || {}).reduce<Record<string, any>>(\n (hash, [relatedName, opts]) => {\n const { inverse } = opts as any;\n const relationship = {};\n let { through, model: relatedModel } = opts as any;\n let foreignKey;\n\n if (typeof relatedModel === 'string') {\n relatedModel = store.modelFor(relatedModel);\n } else {\n relatedModel = store.modelFor(relatedName);\n }\n\n if (typeof through === 'string') {\n through = store.modelFor(through);\n foreignKey = `${singularize(underscore(inverse))}_id`;\n } else {\n foreignKey = `${underscore(inverse)}_id`;\n }\n\n Object.defineProperties(relationship, {\n model: {\n value: relatedModel,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n inverse: {\n value: inverse,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n through: {\n value: through,\n writable: false,\n enumerable: Boolean(through),\n configurable: false\n },\n\n type: {\n value: 'hasMany',\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n foreignKey: {\n value: foreignKey,\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n\n return {\n ...hash,\n [relatedName]: relationship\n };\n },\n {}\n );\n\n Object.freeze(hasOne);\n Object.freeze(hasMany);\n Object.freeze(belongsTo);\n\n const relationships = Object.freeze({\n ...hasOne,\n ...hasMany,\n ...belongsTo\n });\n\n if (!hooks) {\n hooks = {};\n }\n\n if (!scopes) {\n scopes = {};\n }\n\n if (!validates) {\n validates = {};\n }\n\n Object.defineProperties(model, {\n store: {\n value: store,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n table: {\n value: table,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n logger: {\n value: logger,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n attributes: {\n value: Object.freeze(attributes),\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n attributeNames: {\n value: Object.freeze(Object.keys(attributes)),\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n hasOne: {\n value: hasOne,\n writable: false,\n enumerable: Boolean(Object.keys(hasOne).length),\n configurable: false\n },\n\n hasMany: {\n value: hasMany,\n writable: false,\n enumerable: Boolean(Object.keys(hasMany).length),\n configurable: false\n },\n\n belongsTo: {\n value: belongsTo,\n writable: false,\n enumerable: Boolean(Object.keys(belongsTo).length),\n configurable: false\n },\n\n relationships: {\n value: relationships,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n relationshipNames: {\n value: Object.freeze(Object.keys(relationships)),\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n hooks: {\n value: initializeHooks({\n model,\n hooks,\n logger\n }),\n writable: false,\n enumerable: Boolean(Object.keys(hooks).length),\n configurable: false\n },\n\n scopes: {\n value: scopes,\n writable: false,\n enumerable: Boolean(Object.keys(scopes).length),\n configurable: false\n },\n\n validates: {\n value: initializeValidations({\n model,\n logger,\n validates,\n attributes\n }),\n writable: false,\n enumerable: Boolean(Object.keys(validates).length),\n configurable: false\n },\n\n modelName: {\n value: modelName,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n resourceName: {\n value: resourceName,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n initialized: {\n value: true,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n ...Object.freeze(\n entries(scopes).reduce<PropertyDescriptorMap>(\n (obj, [name, scope]) => ({\n ...obj,\n [name]: {\n value: scope,\n writable: false,\n enumerable: false,\n configurable: false\n }\n }),\n {}\n )\n )\n });\n\n initializeProps(model.prototype, attributes, {\n ...hasOne,\n ...hasMany,\n ...belongsTo\n });\n\n Object.defineProperties(model.prototype, {\n modelName: {\n value: modelName,\n writable: false,\n enumerable: true,\n configurable: false\n },\n resourceName: {\n value: resourceName,\n writable: false,\n enumerable: true,\n configurable: false\n },\n isModelInstance: {\n value: true,\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n\n return model;\n}\n", "/**\n * @private\n */\nexport default function isUndefined(value: unknown): value is undefined {\n return typeof value === 'undefined';\n}\n", "import type Model from '../../model';\nimport type { Attribute$meta } from '../index';\nimport isNull from '../../../../utils/is-null';\nimport isUndefined from '../../../../utils/is-undefined';\n\nexport default function createGetter({\n key,\n defaultValue\n}: Attribute$meta): (this: Model) => unknown {\n return function getter(this: Model) {\n let value: unknown = this.currentChangeSet.get(key);\n\n if (isNull(value) || isUndefined(value)) {\n value = defaultValue;\n }\n\n return value;\n };\n}\n", "import type Model from '../../model';\nimport isNull from '../../../../utils/is-null';\nimport isUndefined from '../../../../utils/is-undefined';\nimport type { Attribute$meta } from '../index';\n\n/**\n * @private\n */\nexport default function createSetter({\n key,\n nullable,\n normalize,\n defaultValue\n}: Attribute$meta & {\n normalize: (value: unknown) => unknown;\n}): (this: Model, value?: unknown) => void {\n return function setter(this: Model, nextValue?: unknown) {\n if (!nullable) {\n if (isNull(nextValue) || isUndefined(nextValue)) {\n return;\n }\n }\n\n let { currentChangeSet: changeSet } = this;\n const valueToSet = normalize(nextValue);\n const currentValue = changeSet.get(key) || defaultValue;\n\n if (!changeSet.has(key) || valueToSet !== currentValue) {\n if (changeSet.isPersisted) {\n changeSet = changeSet.applyTo(this);\n }\n\n changeSet.set(key, valueToSet);\n }\n };\n}\n", "const BOOLEAN_TYPE = /^(?:boolean|tinyint)$/;\n\nexport default function createNormalizer(\n type: string\n): (value: unknown) => unknown {\n let normalizer: (value: unknown) => unknown = value => value;\n\n if (BOOLEAN_TYPE.test(type)) {\n normalizer = value => {\n let normalized = value;\n\n if (typeof value === 'string') {\n normalized = Number.parseInt(value, 10);\n }\n\n return Boolean(normalized);\n };\n } else if (type === 'datetime') {\n normalizer = value => {\n let normalized = value;\n\n if (typeof value === 'number') {\n normalized = new Date(value);\n }\n\n return normalized;\n };\n }\n\n return normalizer;\n}\n", "import createGetter from './utils/create-getter';\nimport createSetter from './utils/create-setter';\nimport createNormalizer from './utils/create-normalizer';\nimport type { Attribute$meta } from './interfaces';\n\n/**\n * @private\n */\nexport function createAttribute(opts: Attribute$meta): PropertyDescriptor {\n const normalize = createNormalizer(opts.type);\n const meta = {\n ...opts,\n normalize,\n defaultValue: normalize(opts.defaultValue)\n };\n\n return {\n get: createGetter(meta),\n set: createSetter(meta)\n };\n}\n\nexport type { Attribute$meta } from './interfaces';\n", "import { dasherize } from 'inflection';\n\nimport underscore from '../../../utils/underscore';\nimport type { Server$ErrorSource } from '../interfaces';\n\n/**\n * Member names as the client sees them \u2014 responses dasherize, so pointers do\n * too (`isPublic` -> `is-public`). Escaped per RFC 6901 for use in a pointer.\n *\n * @private\n */\nfunction memberName(key: string): string {\n return dasherize(underscore(key));\n}\n\nfunction escapePointer(segment: string): string {\n return segment.replace(/~/g, '~0').replace(/\\//g, '~1');\n}\n\n/**\n * Map an internal parameter path to a JSON:API error `source`. Paths under\n * `data` are request document members and become a JSON Pointer\n * (`data.attributes.isPublic` -> `/data/attributes/is-public`); anything else\n * is a query parameter (`page.size` -> `page[size]`).\n *\n * @private\n */\nexport default function sourceFor(path: string): Server$ErrorSource {\n const [root, ...rest] = path.split('.').filter(Boolean).map(memberName);\n\n if (!root) {\n return {};\n } else if (root === 'data') {\n return {\n pointer: `/${[root, ...rest].map(escapePointer).join('/')}`\n };\n }\n\n return {\n parameter: `${root}${rest.map(key => `[${key}]`).join('')}`\n };\n}\n", "import createServerError from '../../../server/utils/create-server-error';\nimport sourceFor from '../../../server/utils/source-for';\nimport type { Server$ErrorSource } from '../../../server';\n\n/**\n * A model validator (`static validates`) rejected an attribute. Answered with\n * 422 and a pointer to the attribute, which clients such as ember-data map to\n * field errors. The rejected value is deliberately not in the message: it\n * ends up in logs and may be a secret (e.g. a password).\n *\n * @private\n */\nclass ValidationError extends Error {\n declare key: string;\n\n declare source: Server$ErrorSource;\n\n constructor(key: string) {\n super(`Validation failed for ${key}.`);\n this.key = key;\n this.source = sourceFor(`data.attributes.${key}`);\n }\n}\n\nexport default createServerError(ValidationError, 422);\n", "import type { Validation$opts } from './interfaces';\n\n/**\n * @private\n */\nclass Validation<T> {\n declare key: string;\n\n declare value: T;\n\n declare validator: (value?: T) => boolean;\n\n constructor(opts: Validation$opts<T>) {\n Object.defineProperties(this, {\n key: {\n value: opts.key,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n value: {\n value: opts.value,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n validator: {\n value: opts.validator,\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n }\n\n isValid(): boolean {\n return this.validator(this.value);\n }\n}\n\nexport default Validation;\nexport { ValidationError } from './errors';\n", "import Validation, { ValidationError } from '../../validation';\nimport type { Model } from '../../index';\n\n/**\n * @private\n */\nexport default function validate(instance: Model): true {\n return Array.from(instance.dirtyAttributes)\n .map(([key, value]) => ({\n key,\n value,\n validator: Reflect.get(instance.constructor.validates, key) as (\n value?: unknown\n ) => boolean\n }))\n .filter(({ validator }) => validator)\n .map(props => new Validation(props))\n .reduce<true>((result, validation) => {\n if (!validation.isValid()) {\n throw new ValidationError(validation.key);\n }\n\n return result;\n }, true);\n}\n", "import { UNIQUE_CONSTRAINT, UNIQUE_CONSTRAINT_CODES } from '../../constants';\nimport { UniqueConstraintError } from '../../errors';\n\n/**\n * knex prefixes a failed statement's error message with the SQL (and its\n * bound values) as `<sql> - <driver message>`; keep only the driver message.\n *\n * @private\n */\nfunction driverMessage(message: string): string {\n const index = message.lastIndexOf(' - ');\n\n return index >= 0 ? message.slice(index + 3) : message;\n}\n\n/**\n * Map a database write error to the server error it should surface as.\n *\n * @private\n */\nexport default function processWriteError(err: unknown): unknown {\n if (!(err instanceof Error)) {\n return err;\n }\n\n const { code } = err as { code?: unknown };\n const { message } = err;\n\n if (\n UNIQUE_CONSTRAINT_CODES.has(String(code)) ||\n UNIQUE_CONSTRAINT.test(message)\n ) {\n return new UniqueConstraintError(driverMessage(message));\n }\n\n return err;\n}\n\n/**\n * `.catch()` handler for a write: rethrows the mapped error.\n *\n * @private\n */\nexport function rethrowWriteError(err: unknown): never {\n throw processWriteError(err);\n}\n", "import type Model from '../index';\nimport type { Model$Hook } from '../interfaces';\n\n/**\n * @private\n */\nexport default function runHooks(\n record: Model,\n trx: unknown,\n ...hooks: Array<Model$Hook | undefined>\n): Promise<unknown> {\n return hooks\n .filter((hook): hook is Model$Hook => Boolean(hook))\n .reduce<Promise<unknown>>(\n (prev, next) => prev.then(() => next(record, trx)),\n Promise.resolve()\n );\n}\n", "import type { Migration$Fn } from './interfaces';\n\n/**\n * @private\n */\nclass Migration<T extends object> {\n declare fn: Migration$Fn<T>;\n\n constructor(fn: Migration$Fn<T>) {\n this.fn = fn;\n }\n\n run(schema: T): T {\n return this.fn(schema);\n }\n}\n\nexport default Migration;\nexport { default as generateTimestamp } from './utils/generate-timestamp';\nexport type { Migration$Fn } from './interfaces';\n", "import { TYPE_ALIASES } from '../constants';\nimport type { Database$column } from '../interfaces';\n\n/**\n * @private\n */\nexport default function typeForColumn(\n column: Database$column\n): string | undefined {\n return TYPE_ALIASES.get(column.type);\n}\n", "import type { Knex } from 'knex';\n\nimport type Logger from '../logger';\n\nimport { ModelMissingError } from './errors';\nimport initialize from './initialize';\nimport normalizeModelName from './utils/normalize-model-name';\nimport type { Database$opts, ModelClass } from './interfaces';\n\n/**\n * @private\n */\nclass Database {\n declare path: string;\n\n declare debug: boolean;\n\n declare logger: Logger;\n\n declare config: Record<string, unknown>;\n\n declare schema: () => Knex.SchemaBuilder;\n\n declare connection: Knex;\n\n declare models: Map<string, ModelClass>;\n\n constructor(opts: Database$opts) {\n // Lumen databases construct asynchronously: `initialize` populates `this` and\n // resolves once the schema/migrations/models are ready, so `new Database()`\n // is awaited by callers. TS can't express a Promise-returning constructor,\n // so assert the instance type here.\n return initialize(this, opts) as unknown as Database;\n }\n\n modelFor(type: string): ModelClass {\n const model = this.models.get(normalizeModelName(type));\n\n if (!model) {\n throw new ModelMissingError(type);\n }\n\n return model;\n }\n}\n\nexport default Database;\nexport { default as Model } from './model';\nexport { default as Query } from './query';\nexport { default as Migration, generateTimestamp } from './migration';\nexport { default as connect } from './utils/connect';\nexport { default as typeForColumn } from './utils/type-for-column';\nexport { default as createMigrations } from './utils/create-migrations';\nexport { default as pendingMigrations } from './utils/pending-migrations';\n\nexport type { Database$opts, Database$config, ModelClass } from './interfaces';\n", "import { createServer } from 'http';\nimport type { Writable } from 'stream';\nimport type { IncomingMessage, Server as HTTPServer } from 'http';\n\nimport { tryCatchSync } from '../../utils/try-catch';\nimport type Logger from '../logger';\nimport type Router from '../router';\n\nimport { HAS_BODY } from './constants';\nimport { createRequest, parseRequest } from './request';\nimport { createResponse } from './response';\nimport { createResponder } from './responder';\nimport validateAccept from './utils/validate-accept';\nimport validateContentType from './utils/validate-content-type';\nimport setCORSHeaders from './utils/set-cors-headers';\nimport type { Request } from './request/interfaces';\nimport type { Response } from './response/interfaces';\nimport type { Server$opts, Server$cors } from './interfaces';\n\n/**\n * @private\n */\nclass Server {\n declare logger: Logger;\n\n declare router: Router;\n\n declare cors: Server$cors;\n\n declare instance: HTTPServer;\n\n constructor({ logger, router, cors }: Server$opts) {\n Object.defineProperties(this, {\n router: {\n value: router,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n logger: {\n value: logger,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n cors: {\n value: cors,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n instance: {\n value: createServer(this.receiveRequest),\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n }\n\n listen(port: number): void {\n this.instance.listen(port);\n }\n\n initializeRequest(req: IncomingMessage, res: Writable): [Request, Response] {\n const { logger, router, cors } = this;\n\n req.setEncoding('utf8');\n\n const response = createResponse(res, {\n logger\n });\n\n setCORSHeaders(response, cors);\n\n const request = createRequest(req, {\n logger,\n router\n });\n\n return [request, response];\n }\n\n validateRequest({ method, headers }: Request): true {\n let isValid = validateAccept(headers.get('accept'));\n\n if (HAS_BODY.test(method)) {\n isValid = validateContentType(headers.get('content-type'));\n }\n\n return isValid;\n }\n\n receiveRequest = (req: IncomingMessage, res: Writable): void => {\n const { logger } = this;\n const [request, response] = this.initializeRequest(req, res);\n const respond = createResponder(request, response);\n\n logger.request(request, response, {\n startTime: Date.now()\n });\n\n const isValid = tryCatchSync(() => this.validateRequest(request), respond);\n\n if (isValid) {\n parseRequest(request)\n .then(params => {\n const { route } = request;\n\n Object.assign(request, {\n params\n });\n\n if (route) {\n return route.visit(request, response);\n }\n\n return undefined;\n })\n .then(respond)\n .catch(err => {\n logger.error(err);\n respond(err);\n });\n }\n };\n}\n\nexport default Server;\nexport { REQUEST_METHODS, getDomain } from './request';\nexport { default as createServerError } from './utils/create-server-error';\n\nexport { default as sourceFor } from './utils/source-for';\n\nexport type { Server$config, Server$ErrorSource } from './interfaces';\n\nexport type {\n Request,\n Request$params,\n Request$method\n} from './request/interfaces';\n\nexport type { Response } from './response/interfaces';\n", "export const HAS_BODY = /^(POST|PATCH)$/;\n\nexport const STATUS_CODES = new Map([\n [100, 'Continue'],\n [101, 'Switching Protocols'],\n [102, 'Processing'],\n [200, 'OK'],\n [201, 'Created'],\n [202, 'Accepted'],\n [203, 'Non-Authoritative Information'],\n [204, 'No Content'],\n [205, 'Reset Content'],\n [206, 'Partial Content'],\n [207, 'Multi-Status'],\n [208, 'Already Reported'],\n [226, 'IM Used'],\n [300, 'Multiple Choices'],\n [301, 'Moved Permanently'],\n [302, 'Found'],\n [303, 'See Other'],\n [304, 'Not Modified'],\n [305, 'Use Proxy'],\n [307, 'Temporary Redirect'],\n [308, 'Permanent Redirect'],\n [400, 'Bad Request'],\n [401, 'Unauthorized'],\n [402, 'Payment Required'],\n [403, 'Forbidden'],\n [404, 'Not Found'],\n [405, 'Method Not Allowed'],\n [406, 'Not Acceptable'],\n [407, 'Proxy Authentication Required'],\n [408, 'Request Timeout'],\n [409, 'Conflict'],\n [410, 'Gone'],\n [411, 'Length Required'],\n [412, 'Precondition Failed'],\n [413, 'Payload Too Large'],\n [414, 'URI Too Long'],\n [415, 'Unsupported Media Type'],\n [416, 'Range Not Satisfiable'],\n [417, 'Expectation Failed'],\n [418, \"I'm a teapot\"],\n [421, 'Misdirected Request'],\n [422, 'Unprocessable Entity'],\n [423, 'Locked'],\n [424, 'Failed Dependency'],\n [425, 'Unordered Collection'],\n [426, 'Upgrade Required'],\n [428, 'Precondition Required'],\n [429, 'Too Many Requests'],\n [431, 'Request Header Fields Too Large'],\n [451, 'Unavailable For Legal Reasons'],\n [500, 'Internal Server Error'],\n [501, 'Not Implemented'],\n [502, 'Bad Gateway'],\n [503, 'Service Unavailable'],\n [504, 'Gateway Timeout'],\n [505, 'HTTP Version Not Supported'],\n [506, 'Variant Also Negotiates'],\n [507, 'Insufficient Storage'],\n [508, 'Loop Detected'],\n [509, 'Bandwidth Limit Exceeded'],\n [510, 'Not Extended'],\n [511, 'Network Authentication Required']\n]);\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * `createRequest` receives the raw Node `IncomingMessage` and mutates it in\n * place into the framework's `Request` shape; the parameter is genuinely\n * untyped at that boundary before the mutation completes.\n */\nimport { parse as parseURL } from 'url';\n\nimport entries from '../../../utils/entries';\n\nimport type { Request, Request$opts } from './interfaces';\n\n/**\n * @private\n */\nexport function createRequest(\n req: any,\n { logger, router }: Request$opts\n): Request {\n const url = { ...parseURL(req.url, true), params: [] };\n const headers: Map<string, string> = new Map(entries(req.headers));\n\n Object.assign(req, {\n url,\n logger,\n headers,\n params: {},\n method: headers.get('x-http-method-override') || req.method\n });\n\n const route = router.match(req);\n\n if (route) {\n Object.assign(req, {\n route,\n action: route.action,\n controller: route.controller\n });\n }\n\n return req;\n}\n\nexport { REQUEST_METHODS } from './constants';\n\nexport { parseRequest } from './parser';\nexport { default as getDomain } from './utils/get-domain';\n", "import type { Request$method } from './interfaces';\n\nexport const REQUEST_METHODS: Array<Request$method> = [\n 'GET',\n 'HEAD',\n 'POST',\n 'PATCH',\n 'DELETE',\n 'OPTIONS'\n];\n", "import entries from '../../../../../utils/entries';\n\nconst DELIMITER = /^(.+)\\[(.+)]$/g;\n\n/**\n * @private\n */\nexport default function parseNestedObject(\n source: Record<string, unknown>\n): Record<string, unknown> {\n return entries(source).reduce<Record<string, unknown>>(\n (result, [key, value]) => {\n if (DELIMITER.test(key)) {\n const parentKey = key.replace(DELIMITER, '$1');\n const parentValue = Reflect.get(result, parentKey);\n\n return {\n ...result,\n [parentKey]: {\n ...(parentValue || {}),\n [key.replace(DELIMITER, '$2')]: value\n }\n };\n }\n\n return {\n ...result,\n [key]: value\n };\n },\n {}\n );\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * Request query/body parsing coerces genuinely untyped input (nested arrays of\n * string values from the URL) into normalized param shapes; the `any` arrays\n * are confined to those raw-value positions.\n */\nimport { camelize } from 'inflection';\n\nimport { INT, NULL, BOOL, DATE, TRUE, BRACKETS } from '../constants';\nimport isNull from '../../../../../utils/is-null';\nimport entries from '../../../../../utils/entries';\nimport underscore from '../../../../../utils/underscore';\nimport { camelizeKeys } from '../../../../../utils/transform-keys';\nimport type { Request$method } from '../../interfaces';\n\n/**\n * @private\n */\nfunction makeArray(source: string | Array<string>): Array<string> {\n if (!Array.isArray(source)) {\n return source.includes(',') ? source.split(',') : [source];\n }\n\n return source;\n}\n\n/**\n * @private\n */\nfunction formatString(source: string, method: Request$method): unknown {\n if (method === 'GET') {\n if (source.indexOf(',') >= 0) {\n return source.split(',').map(str => camelize(underscore(str), true));\n } else if (INT.test(source)) {\n return Number.parseInt(source, 10);\n } else if (BOOL.test(source)) {\n return TRUE.test(source);\n } else if (NULL.test(source)) {\n return null;\n }\n }\n\n if (DATE.test(source)) {\n return new Date(source);\n }\n\n return source;\n}\n\n/**\n * @private\n */\nfunction formatObject(\n source: Record<string, unknown> | Array<any>,\n method: Request$method,\n formatter: (\n params: Record<string, unknown>,\n method: Request$method\n ) => Record<string, unknown>\n): Record<string, unknown> | Array<any> {\n if (Array.isArray(source)) {\n return source.map(value => {\n if (INT.test(value)) {\n return Number.parseInt(value, 10);\n }\n\n return value;\n });\n }\n\n return formatter(source, method);\n}\n\n/**\n * @private\n */\nexport function formatSort(sort: string): string {\n if (sort.startsWith('-')) {\n return `-${camelize(underscore(sort.substr(1)), true)}`;\n }\n\n return camelize(underscore(sort), true);\n}\n\n/**\n * @private\n */\nexport function formatFields(\n fields: Record<string, unknown>\n): Record<string, unknown> {\n return entries(fields).reduce<Record<string, unknown>>(\n (result, [key, value]) => ({\n ...result,\n [key]: makeArray(value as string | Array<string>)\n }),\n {}\n );\n}\n\n/**\n * @private\n */\nexport function formatInclude(include: string | Array<string>): Array<string> {\n return makeArray(include);\n}\n\n/**\n * @private\n */\nexport default function format(\n params: Record<string, unknown>,\n method: Request$method\n): Record<string, unknown> {\n const result = entries(params).reduce<Record<string, unknown>>(\n (obj, param) => {\n const [, value] = param;\n let [key] = param;\n\n key = key.replace(BRACKETS, '');\n\n switch (typeof value) {\n case 'object':\n return {\n ...obj,\n [key]: isNull(value)\n ? null\n : formatObject(\n value as Record<string, unknown> | Array<any>,\n method,\n format\n )\n };\n\n case 'string':\n return {\n ...obj,\n [key]: formatString(value, key === 'id' ? 'GET' : method)\n };\n\n default:\n return {\n ...obj,\n [key]: value\n };\n }\n },\n {}\n );\n\n return camelizeKeys(result, true);\n}\n", "export const INT = /^\\d+$/;\nexport const NULL = /^null$/;\nexport const BOOL = /^(?:true|false)$/;\nexport const DATE = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}(Z|\\+\\d{4})$/;\nexport const TRUE = /^true$/;\nexport const BRACKETS = /(?:\\[])/g;\n", "import { camelize, dasherize } from 'inflection';\n\nimport entries from './entries';\nimport underscore from './underscore';\n\ntype Transformer = (key: string) => string;\n\n/**\n * Rewrites an object's keys with `transformer`.\n *\n * Overloaded rather than Flow's `T -> T`, which was inaccurate: transforming\n * keys produces a differently-shaped object, so the object form returns\n * `Record<string, unknown>`. Arrays are passed through as a shallow copy (their\n * keys are not transformed), so they keep their element type.\n *\n * @private\n */\nexport function transformKeys<T>(\n source: T[],\n transformer: Transformer,\n deep?: boolean\n): T[];\nexport function transformKeys(\n source: object,\n transformer: Transformer,\n deep?: boolean\n): Record<string, unknown>;\nexport function transformKeys(\n source: object | unknown[],\n transformer: Transformer,\n deep: boolean = false\n): object | unknown[] {\n if (Array.isArray(source)) {\n return source.slice(0);\n } else if (source && typeof source === 'object') {\n return entries(source as Record<string, unknown>).reduce<\n Record<string, unknown>\n >((result, [key, value]) => {\n const recurse =\n deep &&\n value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n !(value instanceof Date);\n\n if (recurse) {\n return {\n ...result,\n [transformer(key)]: transformKeys(value as object, transformer, true)\n };\n }\n\n return {\n ...result,\n [transformer(key)]: value\n };\n }, {});\n }\n\n return {};\n}\n\n/**\n * @private\n */\nexport function camelizeKeys<T>(source: T[], deep?: boolean): T[];\nexport function camelizeKeys(\n source: object,\n deep?: boolean\n): Record<string, unknown>;\nexport function camelizeKeys(\n source: object | unknown[],\n deep?: boolean\n): object | unknown[] {\n return transformKeys(\n source as object,\n key => camelize(underscore(key), true),\n deep\n );\n}\n\n/**\n * @private\n */\nexport function dasherizeKeys<T>(source: T[], deep?: boolean): T[];\nexport function dasherizeKeys(\n source: object,\n deep?: boolean\n): Record<string, unknown>;\nexport function dasherizeKeys(\n source: object | unknown[],\n deep?: boolean\n): object | unknown[] {\n // NOTE: the Flow original passed a second `true` argument to `dasherize`,\n // which takes only one parameter \u2014 it was silently ignored, so dropping it\n // is behaviour-preserving.\n return transformKeys(\n source as object,\n key => dasherize(underscore(key)),\n deep\n );\n}\n\n/**\n * @private\n */\nexport function underscoreKeys<T>(source: T[], deep?: boolean): T[];\nexport function underscoreKeys(\n source: object,\n deep?: boolean\n): Record<string, unknown>;\nexport function underscoreKeys(\n source: object | unknown[],\n deep?: boolean\n): object | unknown[] {\n return transformKeys(source as object, key => underscore(key), deep);\n}\n", "import isObject from '../../../../../utils/is-object';\nimport type { Request } from '../../interfaces';\n\nimport parseNestedObject from './parse-nested-object';\nimport format, { formatSort, formatFields, formatInclude } from './format';\n\n/**\n * @private\n */\nexport default function parseRead({\n method,\n url: { query }\n}: Request): Record<string, unknown> {\n const { sort, fields, include, ...params } = parseNestedObject(query);\n\n if (sort) {\n params.sort = typeof sort === 'string' ? formatSort(sort) : sort;\n }\n\n if (fields) {\n params.fields = isObject(fields) ? formatFields(fields) : fields;\n }\n\n if (include) {\n params.include = formatInclude(include as string | Array<string>);\n }\n\n return format(params, method);\n}\n", "import createServerError from '../../../utils/create-server-error';\nimport { line } from '../../../../logger';\n\n/**\n * @private\n */\nclass MalformedRequestError extends SyntaxError {\n constructor() {\n super(line`\n There was an error parsing the request body. Please make sure that the\n request body is a valid JSON API document.\n `);\n }\n}\n\nexport default createServerError(MalformedRequestError, 400);\n", "import { MalformedRequestError } from '../errors';\nimport { tryCatchSync } from '../../../../../utils/try-catch';\nimport type { Request } from '../../interfaces';\n\nimport format from './format';\n\n/**\n * @private\n */\nexport default function parseWrite(\n req: Request\n): Promise<Record<string, unknown>> {\n return new Promise((resolve, reject) => {\n let body = '';\n const cleanUp = () => {\n req.removeAllListeners('end');\n req.removeAllListeners('data');\n req.removeAllListeners('error');\n };\n\n req.on('data', data => {\n body += data.toString();\n });\n\n req.once('end', () => {\n const parsed = tryCatchSync(() => JSON.parse(body));\n\n cleanUp();\n\n if (parsed) {\n resolve(format(parsed, req.method));\n } else {\n reject(new MalformedRequestError());\n }\n });\n\n req.once('error', err => {\n cleanUp();\n reject(err);\n });\n });\n}\n", "import type { Request } from '../interfaces';\n\nimport parseRead from './utils/parse-read';\nimport parseWrite from './utils/parse-write';\n\n/**\n * @private\n */\nexport function parseRequest(req: Request): Promise<Record<string, unknown>> {\n switch (req.method) {\n case 'POST':\n case 'PATCH':\n return parseWrite(req).then(params => ({\n ...parseRead(req),\n ...params\n }));\n\n default:\n return Promise.resolve(parseRead(req));\n }\n}\n", "import type { Request } from '../interfaces';\n\n/**\n * @private\n */\nexport default function getDomain({\n headers,\n\n connection: { encrypted }\n}: Request): string {\n return `http${encrypted ? 's' : ''}://${headers.get('host') || 'localhost'}`;\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * `createResponse` receives the raw Node response object and augments it in\n * place into the framework's `Response` shape; the parameter is genuinely\n * untyped at that boundary.\n */\nimport type { Response, Response$opts } from './interfaces';\n\n/**\n * @private\n */\nexport function createResponse(res: any, opts: Response$opts): Response {\n return Object.assign(res, opts, {\n stats: []\n });\n}\n", "export const VERSION = '1.0';\nexport const MIME_TYPE = 'application/vnd.api+json';\n", "import { MIME_TYPE } from '../constants';\nimport { line } from '../../logger';\nimport createServerError from '../../server/utils/create-server-error';\n\n/**\n * @private\n */\nclass NotAcceptableError extends TypeError {\n constructor(accept: string) {\n super(line`\n Every '${MIME_TYPE}' in Accept: '${accept}' has media type parameters,\n which are not supported. Try your request again with '${MIME_TYPE}'\n without parameters.\n `);\n }\n}\n\nexport default createServerError(NotAcceptableError, 406);\n", "import { MIME_TYPE } from '../constants';\nimport { line } from '../../logger';\nimport createServerError from '../../server/utils/create-server-error';\n\n/**\n * @private\n */\nclass UnsupportedMediaTypeError extends TypeError {\n constructor(contentType: string) {\n super(line`\n Media type parameters are not supported in Content-Type:\n '${contentType}'. Try your request again with Content-Type:\n '${MIME_TYPE}' without parameters.\n `);\n }\n}\n\nexport default createServerError(UnsupportedMediaTypeError, 415);\n", "import { MIME_TYPE } from '../constants';\nimport { line } from '../../logger';\nimport createServerError from '../../server/utils/create-server-error';\n\n/**\n * @private\n */\nclass InvalidContentTypeError extends TypeError {\n constructor(contentType: string = 'undefined') {\n super(line`\n Content-Type: '${contentType}' is not supported. Try your request again\n with Content-Type: '${MIME_TYPE}'.\n `);\n }\n}\n\nexport default createServerError(InvalidContentTypeError, 415);\n", "export type MediaType = {\n // `type/subtype`, lowercased \u2014 media types are case-insensitive.\n type: string;\n\n // Media type parameters as written (`name=value`), trimmed.\n params: Array<string>;\n};\n\nconst QUALITY = /^q\\s*=/i;\n\n/**\n * Split `value` on `delimiter`, ignoring delimiters inside quoted strings\n * (parameter values may be quoted and contain `,` or `;`).\n *\n * @private\n */\nfunction splitUnquoted(value: string, delimiter: string): Array<string> {\n const parts: Array<string> = [];\n let current = '';\n let quoted = false;\n let escaped = false;\n\n for (const char of value) {\n if (escaped) {\n escaped = false;\n } else if (quoted && char === '\\\\') {\n escaped = true;\n } else if (char === '\"') {\n quoted = !quoted;\n } else if (!quoted && char === delimiter) {\n parts.push(current);\n current = '';\n continue;\n }\n\n current += char;\n }\n\n return [...parts, current];\n}\n\n/**\n * Parse a single media type, e.g. a `Content-Type` header value.\n *\n * @private\n */\nexport function parseMediaType(value: string): MediaType {\n const [type = '', ...params] = splitUnquoted(value, ';').map(part =>\n part.trim()\n );\n\n return {\n type: type.toLowerCase(),\n params: params.filter(Boolean)\n };\n}\n\n/**\n * Parse an `Accept` header into its media ranges.\n *\n * Per RFC 7231 \u00A75.3.2 the `q` weight (and any accept-extension after it) is\n * not a media type parameter, so it is not reported in `params`.\n *\n * @private\n */\nexport function parseAccept(value: string): Array<MediaType> {\n return splitUnquoted(value, ',')\n .map(range => {\n const { type, params } = parseMediaType(range);\n const quality = params.findIndex(param => QUALITY.test(param));\n\n return {\n type,\n params: quality === -1 ? params : params.slice(0, quality)\n };\n })\n .filter(({ type }) => type.length > 0);\n}\n", "import { MIME_TYPE } from '../constants';\n\nimport { parseMediaType } from './media-type';\n\n/**\n * Whether a media type is the JSON:API media type, ignoring parameters.\n *\n * @private\n */\nexport default function isJSONAPI(value: string): boolean {\n return parseMediaType(value).type === MIME_TYPE;\n}\n", "import { parseMediaType } from './media-type';\n\n/**\n * Whether a media type (e.g. a `Content-Type` value) carries parameters.\n *\n * @private\n */\nexport default function hasMediaTypeParams(value: string): boolean {\n return parseMediaType(value).params.length > 0;\n}\n", "const isEnv = (value: string) => (): boolean => process.env.NODE_ENV === value;\n\nexport const isDevelopment: () => boolean = isEnv('development');\nexport const isProduction: () => boolean = isEnv('production');\nexport const isTest: () => boolean = isEnv('test');\n", "import { VERSION } from '../../../jsonapi';\nimport { STATUS_CODES } from '../../constants';\nimport * as env from '../../../../utils/env';\nimport type { JSONAPI$Document, JSONAPI$ErrorObject } from '../../../jsonapi';\n\n/**\n * @private\n */\nexport default function dataFor(\n status: number,\n err?: Error\n): string | JSONAPI$Document {\n if (status < 400 || status > 599) {\n return '';\n }\n\n const title = STATUS_CODES.get(status);\n const errData: JSONAPI$ErrorObject = {\n status: status.toString()\n };\n\n if (title) {\n errData.title = title;\n }\n\n // `source` only ever points into the client's own request, so unlike\n // `detail` it is safe to expose in every environment.\n const source = (err as { source?: JSONAPI$ErrorObject['source'] } | undefined)\n ?.source;\n\n if (source && (source.pointer || source.parameter)) {\n errData.source = source;\n }\n\n if (err && (env.isDevelopment() || /^\\[public\\]/gi.test(err.message))) {\n errData.detail = err.message.replace(/^\\[public\\]/gi, '');\n }\n\n return {\n errors: [errData],\n\n jsonapi: {\n version: VERSION\n }\n };\n}\n", "import { STATUS_CODES } from '../../constants';\nimport stringify from '../../../../utils/stringify';\n\nimport dataFor from './data-for';\n\n/**\n * @private\n */\nexport default function normalize(data?: unknown) {\n let normalized;\n let statusCode;\n\n switch (typeof data) {\n case 'boolean':\n if (data) {\n statusCode = 204;\n } else {\n statusCode = 401;\n normalized = dataFor(statusCode);\n }\n break;\n\n case 'number':\n if (STATUS_CODES.has(data)) {\n statusCode = data;\n } else {\n statusCode = 404;\n }\n normalized = dataFor(statusCode);\n break;\n\n case 'object':\n if (!data) {\n statusCode = 404;\n normalized = dataFor(statusCode);\n } else if (data instanceof Error) {\n statusCode =\n parseInt(String((data as { statusCode?: unknown }).statusCode), 10) ||\n 500;\n normalized = dataFor(statusCode, data);\n } else {\n normalized = data;\n }\n break;\n\n case 'undefined':\n statusCode = 404;\n normalized = dataFor(statusCode);\n break;\n\n default:\n normalized = data;\n }\n\n return {\n statusCode,\n data: stringify(normalized)\n };\n}\n", "import type { Response } from '../../index';\n\nexport default function hasContentType(res: Response) {\n let contentType = res.getHeader('Content-Type');\n\n if (!contentType) {\n contentType = res.getHeader('content-type');\n }\n\n return Boolean(contentType);\n}\n", "import { MIME_TYPE } from '../../jsonapi';\nimport type { Request, Response } from '../index';\n\nimport normalize from './utils/normalize';\nimport hasContentType from './utils/has-content-type';\n\n/**\n * @private\n */\nexport function createResponder(req: Request, res: Response) {\n return function respond(data?: unknown) {\n const normalized = normalize(data);\n\n if (normalized.statusCode) {\n Reflect.set(res, 'statusCode', normalized.statusCode);\n }\n\n if (res.statusCode !== 204 && !hasContentType(res)) {\n res.setHeader('Content-Type', MIME_TYPE);\n }\n\n res.end(normalized.data);\n };\n}\n", "import { MIME_TYPE, parseAccept, NotAcceptableError } from '../../jsonapi';\n\n/**\n * JSON:API 1.0: respond 406 if the Accept header contains the JSON:API media\n * type and *all* instances of it are modified with media type parameters.\n * An Accept header without the JSON:API media type is left alone.\n *\n * @private\n */\nexport default function validateAccept(accept?: string): true {\n if (accept) {\n const ranges = parseAccept(accept).filter(({ type }) => type === MIME_TYPE);\n\n if (ranges.length && ranges.every(({ params }) => params.length)) {\n throw new NotAcceptableError(accept);\n }\n }\n\n return true;\n}\n", "import {\n isJSONAPI,\n hasMediaTypeParams,\n InvalidContentTypeError,\n UnsupportedMediaTypeError\n} from '../../jsonapi';\n\n/**\n * JSON:API 1.0: respond 415 if the Content-Type is the JSON:API media type\n * with any media type parameters. A missing or different Content-Type is\n * also answered with 415, since that is the only type the server accepts.\n *\n * @private\n */\nexport default function validateContentType(contentType?: string): true {\n if (!contentType || !isJSONAPI(contentType)) {\n throw new InvalidContentTypeError(contentType);\n } else if (hasMediaTypeParams(contentType)) {\n throw new UnsupportedMediaTypeError(contentType);\n }\n\n return true;\n}\n", "import type { Response } from '../index';\nimport type { Server$cors } from '../interfaces';\n\nexport default function setCORSHeaders(\n res: Response,\n { origin, methods, headers, enabled }: Server$cors\n) {\n if (!enabled) {\n return;\n }\n\n if (origin) {\n res.setHeader('Access-Control-Allow-Origin', origin);\n }\n\n if (methods) {\n res.setHeader('Access-Control-Allow-Methods', methods.join());\n }\n\n if (headers) {\n res.setHeader('Access-Control-Allow-Headers', headers.join());\n }\n}\n", "import entries from './entries';\nimport isObject from './is-object';\n\nfunction hasOwnProperty(target: object, key: string): boolean {\n return Reflect.apply(Object.prototype.hasOwnProperty, target, [key]);\n}\n\n/**\n * @private\n */\nexport default function merge<T extends object, U extends object>(\n dest: T,\n source: U\n): T & U {\n return entries(source as Record<string, unknown>).reduce<\n Record<string, unknown>\n >(\n (result, [key, value]) => {\n if (hasOwnProperty(result, key) && isObject(value)) {\n const currentValue = Reflect.get(result, key);\n\n if (isObject(currentValue)) {\n return {\n ...result,\n [key]: merge(currentValue, value)\n };\n }\n }\n\n return {\n ...result,\n [key]: value\n };\n },\n { ...dest } as Record<string, unknown>\n ) as T & U;\n}\n", "import omit from '../../../utils/omit';\nimport entries from '../../../utils/entries';\nimport type { Model, ModelClass } from '../../database';\nimport type Serializer from '../../serializer';\nimport type { Request$params } from '../../server';\n\ntype Controller$query = {\n id?: number | string | Buffer;\n filter?: Record<string, unknown>;\n select: Array<string>;\n page?: number;\n limit?: number;\n sort?: [string, string];\n include: Record<string, Array<string>>;\n};\n\n/**\n * `serializerFor` resolves the Serializer an included resource is serialized\n * with \u2014 in the request's namespace (`Controller#serializerFor()`) \u2014 so its\n * attributes are the ones loaded. Defaults to the related model's root one.\n *\n * @private\n */\nexport default function paramsToQuery(\n model: ModelClass,\n { id, page, sort, filter, fields, include }: Request$params,\n serializerFor: (related: ModelClass) => Serializer<Model> = related =>\n related.serializer\n): Controller$query {\n const relationships = entries(model.relationships);\n const includedFields = omit(fields, model.resourceName);\n // Only the first segment of a nested path (`comments.user`) is loaded by this\n // query; the serializer loads deeper levels when it builds `included`.\n const included = include && include.map(path => path.split('.')[0]);\n\n let query: Controller$query = {\n id,\n filter,\n select: [\n model.primaryKey,\n ...(Reflect.get(fields, model.resourceName) as Array<string>)\n ],\n include: {}\n };\n\n if (page) {\n query = {\n ...query,\n page: page.number,\n limit: page.size\n };\n }\n\n if (sort) {\n if (sort.startsWith('-')) {\n query = {\n ...query,\n sort: [sort.substr(1), 'DESC']\n };\n } else {\n query = {\n ...query,\n sort: [sort, 'ASC']\n };\n }\n }\n\n const includedFieldsMap = entries(includedFields).reduce<\n Record<string, Array<string>>\n >((result, field) => {\n const [key] = field;\n const [, rawValue] = field;\n\n const [name, relationship] =\n relationships.find(\n ([, { model: related }]) => key === related.resourceName\n ) || [];\n\n if (!name || !relationship) {\n return result;\n }\n\n let value = rawValue as Array<string>;\n\n if (!value.includes(relationship.model.primaryKey)) {\n value = [relationship.model.primaryKey, ...value];\n }\n\n if (included && value.length === 1 && included.includes(name)) {\n value = [...value, ...serializerFor(relationship.model).attributes];\n } else if (!included && value.length > 1) {\n value = value.slice(0, 1);\n }\n\n return {\n ...result,\n [name]: value\n };\n }, {});\n\n return {\n ...query,\n include: includedFieldsMap\n };\n}\n", "import merge from '../../../utils/merge';\nimport type { Model, ModelClass, Query } from '../../database';\nimport type Serializer from '../../serializer';\nimport type { Request } from '../../server';\n\nimport paramsToQuery from './params-to-query';\n\n/**\n * @private\n */\nexport default function findOne<T extends Model>(\n model: ModelClass<T>,\n req: Request,\n serializerFor?: (model: ModelClass) => Serializer<Model>\n): Query<T> {\n const params = merge(req.defaultParams, req.params);\n const { id, select, include } = paramsToQuery(model, params, serializerFor);\n\n return model\n .find(id)\n .select(...select)\n .include(include);\n}\n", "import merge from '../../../utils/merge';\nimport type { Model, ModelClass, Query } from '../../database';\nimport type Serializer from '../../serializer';\nimport type { Request } from '../../server';\n\nimport paramsToQuery from './params-to-query';\n\n/**\n * @private\n */\nexport default function findMany<T extends Model>(\n model: ModelClass<T>,\n req: Request,\n serializerFor?: (model: ModelClass) => Serializer<Model>\n): Query<Array<Model>> {\n const params = merge(req.defaultParams, req.params);\n const { sort, page, limit, select, filter, include } = paramsToQuery(\n model,\n params,\n serializerFor\n );\n\n return model\n .select(...select)\n .include(include)\n .limit(limit)\n .page(page)\n .where(filter)\n .order(...(sort as [string, string]));\n}\n", "import entries from '../../../utils/entries';\nimport type { Model, ModelClass } from '../../database';\n\n/**\n * @private\n */\nexport default function resolveRelationships<T extends Model>(\n model: ModelClass<T>,\n relationships: Record<string, unknown> = {}\n): Record<string, unknown> {\n return entries(relationships).reduce<Record<string, unknown>>(\n (obj, [key, value]) => {\n let { data = null } = (value as { data?: unknown } | null) || {};\n\n if (data) {\n const opts = model.relationshipFor(key);\n\n if (opts) {\n const Related = opts.model as new (attrs: unknown) => Model;\n\n if (Array.isArray(data)) {\n data = data.map(item => Reflect.construct(Related, [item]));\n } else {\n data = Reflect.construct(Related, [data]);\n }\n }\n }\n\n return {\n ...obj,\n [key]: data\n };\n },\n {}\n );\n}\n", "import createServerError from '../../server/utils/create-server-error';\nimport sourceFor from '../../server/utils/source-for';\nimport stringify from '../../../utils/stringify';\nimport type { ModelClass } from '../../database';\nimport type { Server$ErrorSource } from '../../server';\n\n/**\n * JSON:API 1.0: \"A server MUST return 404 Not Found when processing a request\n * that references a related resource that does not exist.\"\n *\n * @private\n */\nclass RelatedRecordNotFoundError extends Error {\n declare source: Server$ErrorSource;\n\n constructor(\n { name, primaryKey }: ModelClass,\n primaryKeyValue: unknown,\n path: string\n ) {\n super(\n `Could not find ${name} with ${primaryKey} ${stringify(primaryKeyValue)}.`\n );\n this.source = sourceFor(path);\n }\n}\n\nexport default createServerError(RelatedRecordNotFoundError, 404);\n", "import entries from '../../../utils/entries';\nimport { RelatedRecordNotFoundError } from '../errors';\nimport type { Model, ModelClass } from '../../database';\n\n/**\n * Check that every resource referenced from `data.relationships` exists, so a\n * write cannot leave dangling linkage. One query per relationship.\n *\n * @private\n */\nexport default async function validateRelationships<T extends Model>(\n model: ModelClass<T>,\n relationships: Record<string, unknown> = {}\n): Promise<void> {\n await Promise.all(\n entries(relationships).map(async ([key, value]) => {\n const opts = model.relationshipFor(key);\n const { data = null } = (value as { data?: unknown } | null) || {};\n\n if (!opts || !data) {\n return;\n }\n\n const { model: related } = opts;\n const isMany = Array.isArray(data);\n const ids = (isMany ? data : [data]).map(item =>\n Reflect.get(Object(item), 'id')\n );\n\n if (!ids.length) {\n return;\n }\n\n const column = related.columnNameFor(related.primaryKey) || 'id';\n const rows: Array<Record<string, unknown>> = await related\n .table()\n // An item without an id matches nothing and is reported below; knex\n // rejects `undefined` bindings outright.\n .whereIn(\n `${related.tableName}.${column}`,\n ids.filter(id => id != null)\n )\n .select(`${related.tableName}.${column}`);\n\n // Request ids may arrive as strings (to-many items) or numbers (to-one,\n // coerced by parameter validation); rows come back typed by the driver.\n const found = new Set(rows.map(row => String(Reflect.get(row, column))));\n const missing = ids.findIndex(id => !found.has(String(id)));\n\n if (missing >= 0) {\n const path = `data.relationships.${key}.data`;\n\n throw new RelatedRecordNotFoundError(\n related,\n ids[missing],\n isMany ? `${path}.${missing}` : path\n );\n }\n })\n );\n}\n", "import type { Controller$builtIn } from './index';\n\nexport const BUILT_IN_ACTIONS: ReadonlyArray<Controller$builtIn> =\n Object.freeze(['show', 'index', 'create', 'update', 'destroy']);\n", "import { getDomain } from '../server';\nimport { freezeProps } from '../freezeable';\nimport type Serializer from '../serializer';\nimport type { Model, ModelClass, Query } from '../database';\nimport type { Request, Response } from '../server';\n\nimport findOne from './utils/find-one';\nimport findMany from './utils/find-many';\nimport resolveRelationships from './utils/resolve-relationships';\nimport validateRelationships from './utils/validate-relationships';\nimport type {\n Controller$opts,\n Controller$beforeAction,\n Controller$afterAction\n} from './interfaces';\n\n/**\n * ## Overview\n *\n * The Controller class is responsible for taking in requests from the outside\n * world and returning the appropriate response.\n *\n * Think of a Controller as a server at a restaurant. A client makes a request\n * to an application, that request is routed to the appropriate Controller and\n * then the Controller interprets the request and returns data relative to what\n * the client has request.\n *\n * #### Actions\n *\n * Controller actions are functions that call on a Controller in response to an\n * incoming HTTP request. The job of Controller actions are to return the data\n * that the Lumen Application will respond with.\n *\n * There is no special API for Controller actions. They are simply functions\n * that return a value. If an action returns a Query or Promise the resolved\n * value will be used rather than the immediate return value of the action.\n *\n * Below you will find a table showing the different types of responses you can\n * get from different action return values. Keep in mind, Lumen is agnostic to\n * whether or not the value is returned synchronously or resolved from a\n * Promise.\n *\n * | Return/Resolved Value | Response |\n * |------------------------------|--------------------------------------------|\n * | Array<Model> or Model | Serialized JSON String |\n * | Array or Object Literal | JSON String |\n * | String Literal | Plain Text |\n * | Number Literal | [HTTP Status Code](https://goo.gl/T2lMc7) |\n * | true | [204 No Content](https://goo.gl/GxKoqz) |\n * | false | [401 Unauthorized](https://goo.gl/60QqCW) |\n *\n * **Built-In Actions**\n *\n * Built-in actions refer to Controller actions that you get for free when\n * extending the Controller class (show, index, create, update, destroy). These\n * actions are highly optimized to load only the attributes and relationships\n * that are defined in the resolved Serializer for a Controller.\n *\n * If applicable, built-in actions support the following features described in\n * the [JSON API specification](http://jsonapi.org/):\n *\n * - [Sorting](http://jsonapi.org/format/#fetching-sorting)\n * - [Filtering](http://jsonapi.org/format/#fetching-filtering)\n * - [Pagination](http://jsonapi.org/format/#fetching-pagination)\n * - [Sparse Fieldsets](http://jsonapi.org/format/#fetching-sparse-fieldsets)\n * - [Including Related Resources](http://jsonapi.org/format/#fetching-includes)\n *\n * **Extending Built-In Actions**\n *\n * Considering the amount of functionality built-in actions provide, you will\n * rarely need to override the default behavior of a built-in action. In the\n * event that you do need to override a built-in action, you have the ability to\n * opt back into the built-in logic by calling the super class.\n *\n * Read actions such as index and show return a Query which allows us to chain\n * methods to the super call. In the following example we will extend the\n * default behavior of the index action to only match records that meet an\n * additional hard-coded set of conditions. We will still be able to use all of\n * the functionality that the built-in index action provides.\n *\n * ```javascript\n * // app/controllers/posts.js\n * import { Controller } from 'lumen-framework';\n *\n * class PostsController extends Controller {\n * index(request, response) {\n * return super.index(request, response).where({\n * isPublic: true\n * });\n * }\n * }\n *\n * export default PostsController;\n * ```\n *\n * **Custom Actions**\n *\n * Sometimes it is necessary to add a custom action to a Controller. Lumen allows\n * you to do so by adding an instance method to a Controller. In the following\n * example you will see how to add a custom action with the name `check` to a\n * Controller. We are implementing this action to use as a health check for the\n * application so we want to return the `Number` literal `204`.\n *\n * ```javascript\n * // app/controllers/health.js\n * import { Controller } from 'lumen-framework';\n *\n * class HealthController extends Controller {\n * async check() {\n * return 204;\n * }\n * }\n *\n * export default HealthController;\n * ```\n *\n * The example above is nice but we can make the code a bit more concise with an\n * Arrow `Function`.\n *\n * ```javascript\n * // app/controllers/health.js\n * import { Controller } from 'lumen-framework';\n *\n * class HealthController extends Controller {\n * check = async () => 204;\n * }\n *\n * export default HealthController;\n * ```\n *\n * Using an Arrow Function instead of a traditional method Controller can be\n * useful when immediately returning a value. However, there are a few downsides\n * to using an Arrow `Function` for a Controller action, such as not being able\n * to call the `super class`. This can be an issue if you are looking to extend\n * a built-in action.\n *\n * Another use case for a custom action could be to return a specific scope of\n * data from a `Model`. Let's implement\n * a custom `drafts` route on a `PostsController`.\n *\n * ```javascript\n * // app/controllers/posts.js\n * import { Controller } from 'lumen-framework';\n * import Post from 'app/models/posts';\n *\n * class PostsController extends Controller {\n * drafts() {\n * return Post.where({\n * isPublic: false\n * });\n * }\n * }\n *\n * export default PostsController;\n * ```\n *\n * While the example above works, we would have to implement all the custom\n * logic that we get for free with built-in actions. Since we aren't getting too\n * crazy with our custom action we can likely just call the `index` action and\n * chain a `.where()` to it.\n *\n * ```javascript\n * // app/controllers/posts.js\n * import { Controller } from 'lumen-framework';\n *\n * class PostsController extends Controller {\n * drafts(request, response) {\n * return this.index(request, response).where({\n * isPublic: false\n * });\n * }\n * }\n *\n * export default PostsController;\n * ```\n *\n * Now we can sort, filter, and paginate our custom `drafts` route!\n *\n * #### Middleware\n *\n * Middleware can be a very powerful tool in many Node.js server frameworks. Lumen\n * is no exception. Middleware can be used to execute logic before or after a\n * Controller action is executed.\n *\n * There are two hooks where you can execute middleware functions,\n * `beforeAction` and `afterAction`. Functions added to the `beforeAction` hook\n * will execute before the Controller action and functions added to the\n * `afterAction` hook will be executed after the `Controller` action.\n *\n * **Context**\n *\n * Middleware functions will be bound to the Controller they are added to upon\n * the start of an Application.\n *\n * Due to the lexical binding of arrow functions, if you need to use the `this`\n * keyword within a middleware function, declare the middleware function using\n * the `function` keyword and not as an arrow function.\n *\n * **Scoping Middleware**\n *\n * Middleware is scoped by Controller and includes a parent Controller's\n * middleware recursively until the parent Controller is the root\n * `ApplicationController`. This allows you to implement custom logic that can\n * be executed for resources, namespaces, or an entire Application.\n *\n * Let's say we want to require authentication for every route in our\n * Application. All we have to do is move our authentication middleware function\n * from the example above to the `ApplicationController`.\n *\n * ```javascript\n * // app/controllers/application.js\n * import { Controller } from 'lumen-framework';\n *\n * class ApplicationController extends Controller {\n * beforeAction = [\n * async function authenticate(request) {\n * if (!request.currentUser) {\n * // 401 Unauthorized\n * return false;\n * }\n * }\n * ];\n * }\n *\n * export default ApplicationController;\n * ```\n *\n * **Execuation Order**\n *\n * Understanding the execution order of middleware functions and a `Controller`\n * action is essential to productivity with Lumen. Depending on what you use case\n * is, you may want your function to execute at different times in the\n * `request` / `response` cycle.\n *\n * 1. Parent `Controller` `beforeAction` hooks\n * 2. `Controller` `beforeAction` hooks\n * 3. `Controller` Action\n * 4. `Controller` `afterAction` hooks\n * 5. Parent `Controller` `afterAction` hooks\n *\n * **Modules**\n *\n * It is considered a best practice to define your middleware functions in\n * separate file and export them for use throughout an Application. Typically\n * this is done within an `app/middleware` directory.\n *\n * ```javascript\n * // app/middleware/authenticate.js\n * export default async function authenticate(request) {\n * if (!request.currentUser) {\n * // 401 Unauthorized\n * return false;\n * }\n * }\n * ```\n *\n * This keeps the Controller code clean, easier to read, and easier to modify.\n *\n * ```javascript\n * // app/controllers/application.js\n * import { Controller } from 'lumen-framework';\n * import authenticate from 'app/middleware/authenticate';\n *\n * class ApplicationController extends Controller {\n * beforeAction = [\n * authenticate\n * ];\n * }\n *\n * export default ApplicationController;\n * ```\n *\n * @class Controller\n * @public\n */\nclass Controller {\n /**\n * An array of custom query parameter keys that are allowed to reach a\n * Controller instance from an incoming `HTTP` request.\n *\n * For security reasons, query parameters passed to Controller actions from an\n * incoming request other than sort, filter, and page must have their key\n * whitelisted.\n *\n * ```javascript\n * class UsersController extends Controller {\n * // Allow the following custom query parameters to be used for this\n * // Controller's actions.\n * query = [\n * 'cache'\n * ];\n * }\n * ```\n *\n * @property query\n * @type {Array}\n * @default []\n * @public\n */\n query: Array<string> = [];\n\n /**\n * An array of sort query parameter values that are allowed to reach a\n * Controller instance from an incoming `HTTP` request.\n *\n * If you do not override this property all of the attributes specified in the\n * Serializer that represents a Controller's resource. If the Serializer\n * cannot be resolved, this property will default to an empty array.\n *\n * @property sort\n * @type {Array}\n * @default []\n * @public\n */\n sort: Array<string> = [];\n\n /**\n * An array of filter query parameter keys that are allowed to reach a\n * Controller instance from an incoming `HTTP` request.\n *\n * If you do not override this property all of the attributes specified in the\n * Serializer that represents a Controller's resource. If the Serializer\n * cannot be resolved, this property will default to an empty array.\n *\n * @property filter\n * @type {Array}\n * @default []\n * @public\n */\n filter: Array<string> = [];\n\n /**\n * An array of parameter keys that are allowed to reach a Controller instance\n * from an incoming `POST` or `PATCH` request body.\n *\n * If you do not override this property all of the attributes specified in the\n * Serializer that represents a Controller's resource. If the Serializer\n * cannot be resolved, this property will default to an empty array.\n *\n * @property params\n * @type {Array}\n * @default []\n * @public\n */\n params: Array<string> = [];\n\n /**\n * Functions to execute on each request handled by a `Controller` before the\n * `Controller` action is executed.\n *\n * Functions added to the `beforeAction` hook behave similarly to `Controller`\n * actions, however, they are expected to return `undefined`. If a middleware\n * function returns a value other than `undefined` the `request` / `response`\n * cycle will end before remaining middleware and/or Controller actions are\n * executed. This makes the `beforeAction` hook a very powerful tool for\n * dealing with many common tasks, such as authentication.\n *\n * Functions called from the `beforeAction` hook will have `request` and\n * `response` objects passed as arguments.\n *\n * **Example:**\n *\n * ```javascript\n * import { Controller } from 'lumen-framework';\n *\n * const UNSAFE_METHODS = /(?:POST|PATCH|DELETE)/i;\n *\n * function isAdmin(user) {\n * if (user) {\n * return user.isAdmin;\n * }\n *\n * return false;\n * }\n *\n * async function authentication(request) {\n * const { method, currentUser } = request;\n * const isUnsafe = UNSAFE_METHODS.test(method);\n *\n * if (isUnsafe && !isAdmin(currentUser)) {\n * return false; // 401 Unauthorized if the current user is not an admin.\n * }\n * }\n *\n * class PostsController extends Controller {\n * beforeAction = [\n * authentication\n * ];\n * }\n *\n * export default PostsController;\n * ```\n *\n * @property beforeAction\n * @type {Array}\n * @default []\n * @public\n */\n beforeAction: Array<Controller$beforeAction> = [];\n\n /**\n * Functions to execute on each request handled by a `Controller` after the\n * `Controller` action is executed.\n *\n * Functions called from the `afterAction` hook will have `request` and\n * `response` objects passed as arguments as well as a third `payload`\n * argument. The `payload` argument is a reference to the resolved data of\n * the Controller action that was called within the current `request` /\n * `response` cycle. You need to explicitly return this `payload` in order for\n * the afterAction to resolve with it's data. If you return a modified value\n * from a function added to the `afterAction` hook, that value will be used\n * instead of the resolved data from the preceding Controller action.\n * Subsequent hooks called from an `afterAction` hook will will use the value\n * returned or resolved from the preceding hook. This makes `afterAction` a\n * great place to modify the data you are sending back to the client.\n *\n * **Example:**\n *\n * ```javascript\n * import { Controller } from 'lumen-framework';\n *\n * async function addCopyright(request, response, payload) {\n * const { action } = request;\n *\n * if (payload && action !== preflight) {\n * return {\n * ...payload,\n * meta: {\n * copyright: '2016 (c) Postlight'\n * }\n * };\n * }\n *\n * return payload;\n * }\n *\n * class ApplicationController extends Controller {\n * afterAction = [\n * addCopyright\n * ];\n * }\n *\n * export default ApplicationController;\n * ```\n *\n * @property afterAction\n * @type {Array}\n * @default []\n * @public\n */\n afterAction: Array<Controller$afterAction> = [];\n\n /**\n * The default amount of items to include per each response of the index\n * action if a `?page[size]` query parameter is not specified.\n *\n * @property defaultPerPage\n * @type {Number}\n * @default 25\n * @public\n */\n defaultPerPage: number = 25;\n\n /**\n * How many relationships deep an `?include` path may go on this\n * controller's routes. `comments.reactions.user` is 3 levels deep; with `1`\n * only direct relationships (`comments`) can be included. Paths deeper than\n * this are rejected with `400 Bad Request`.\n *\n * Set it on `ApplicationController` to change it for the whole app, or on a\n * single controller to override it there.\n *\n * ```javascript\n * class ApplicationController extends Controller {\n * maxIncludeDepth = 2;\n * }\n * ```\n *\n * Every allowed path is enumerated up front from the serializers'\n * relationships, and each nested level costs its own queries per request, so\n * keep this small.\n *\n * @property maxIncludeDepth\n * @type {Number}\n * @default 3\n * @public\n */\n maxIncludeDepth: number = 3;\n\n /**\n * Whether a namespace may fall back to the root Serializer of a type it has\n * no Serializer for. Read from a namespace's `ApplicationController` and\n * applies to the whole namespace.\n *\n * By default `app/controllers/admin/comments.js` without an\n * `app/serializers/admin/comments.js` \u2014 or an included type without one \u2014\n * is serialized by the root Serializer, with every attribute and\n * relationship it declares. For a namespace that must only expose what it\n * declares itself, turn the fallback off:\n *\n * ```javascript\n * // app/controllers/admin/application.js\n * class AdminApplicationController extends ApplicationController {\n * serializerFallback = false;\n * }\n * ```\n *\n * The application then refuses to boot while any type the namespace can\n * serialize or `include` (down to each controller's `maxIncludeDepth`) has\n * no Serializer in that namespace, listing each missing one.\n *\n * @property serializerFallback\n * @type {Boolean}\n * @default true\n * @public\n */\n serializerFallback: boolean = true;\n\n /**\n * The Serializer to serialize (and validate, and load) related resources of\n * this Controller's responses with: the related model's Serializer in this\n * Controller's namespace, falling back to the root one.\n *\n * Always this Controller's namespace \u2014 not its Serializer's, which is the\n * root one when the namespace has no Serializer for this resource.\n *\n * @method serializerFor\n * @private\n */\n serializerFor(model: ModelClass): Serializer<Model> {\n const { serializer, namespace } = this;\n\n return serializer\n ? serializer.serializerFor(model, namespace)\n : model.serializer;\n }\n\n /**\n * The resolved Model for a Controller instance.\n *\n * @property model\n * @type {Model}\n * @private\n */\n declare model: ModelClass<Model>;\n\n /**\n * A reference to the root Controller for the namespace that a Controller\n * instance is a member of.\n *\n * @property parent\n * @type {?Controller}\n * @private\n */\n declare parent: Controller | null;\n\n /**\n * The namespace that a Controller instance is a member of.\n *\n * @property namespace\n * @type {String}\n * @private\n */\n declare namespace: string;\n\n /**\n * The resolved Serializer for a Controller instance.\n *\n * @property serializer\n * @type {Serializer}\n * @private\n */\n declare serializer: Serializer<Model>;\n\n /**\n * A Map instance containing a reference to all the Controller within an\n * Application instance.\n *\n * @property controllers\n * @type {Map}\n * @private\n */\n declare controllers: Map<string, Controller>;\n\n /**\n * A boolean value representing whether or not a Controller instance has a\n * Model.\n *\n * @property hasModel\n * @type {Boolean}\n * @private\n */\n declare hasModel: boolean;\n\n /**\n * A boolean value representing whether or not a Controller instance is within\n * a namespace.\n *\n * @property hasNamespace\n * @type {Boolean}\n * @private\n */\n declare hasNamespace: boolean;\n\n /**\n * A boolean value representing whether or not a Controller instance has a\n * Serializer.\n *\n * @property hasSerializer\n * @type {Boolean}\n * @private\n */\n declare hasSerializer: boolean;\n\n constructor({ model, namespace, serializer }: Controller$opts) {\n Object.assign(this, {\n model,\n namespace,\n serializer,\n hasModel: Boolean(model),\n hasNamespace: Boolean(namespace),\n hasSerializer: Boolean(serializer)\n });\n\n freezeProps(this, true, 'model', 'namespace', 'serializer');\n\n freezeProps(this, false, 'hasModel', 'hasNamespace', 'hasSerializer');\n }\n\n /**\n * This method supports filtering, sorting, pagination, including\n * relationships, and sparse fieldsets via query parameters. For more\n * information, see the [fetching resources](https://goo.gl/q7FVgZ) section of\n * the JSON API specification.\n *\n * @method index\n * @param {Request} request - The request object.\n * @param {Response} response - The response object.\n * @return {Promise} Resolves with an array of Model instances.\n * @public\n */\n index(req: Request): Query<Array<Model>> {\n return findMany(this.model, req, related => this.serializerFor(related));\n }\n\n /**\n * This method supports including relationships, and sparse fieldsets via\n * query parameters. For more information, see the [fetching resources](\n * https://goo.gl/q7FVgZ) section of the JSON API specification.\n *\n * @method show\n * @param {Request} request - The request object.\n * @param {Response} response - The response object.\n * @return {Promise} Resolves with a Model instance with the id equal to the\n * id url parameter.\n * @public\n */\n show(req: Request): Query<Model> {\n return findOne(this.model, req, related => this.serializerFor(related));\n }\n\n /**\n * Create and return a single Model instance that the Controller instance\n * represents. For more information, see the [creating resources](\n * https://goo.gl/4Obc9t) section of the JSON API specification.\n *\n * @method create\n * @param {Request} request - The request object.\n * @param {Response} response - The response object.\n * @return {Promise} Resolves with the newly created Model instance.\n * @public\n */\n async create(req: Request, res: Response): Promise<Model> {\n const { model } = this;\n\n const {\n url: { pathname },\n params: {\n data: { attributes, relationships }\n }\n } = req;\n\n await validateRelationships(model, relationships);\n\n const record = await model.create({\n ...attributes,\n ...resolveRelationships(model, relationships)\n });\n\n res.setHeader(\n 'Location',\n `${getDomain(req) + pathname}/${record.getPrimaryKey()}`\n );\n\n Reflect.set(res, 'statusCode', 201);\n\n return record.unwrap();\n }\n\n /**\n * Update and return a single Model instance that the Controller instance\n * represents. For more information, see the [updating resources](\n * https://goo.gl/o2ZdOR)section of the JSON API specification.\n *\n * @method update\n * @param {Request} request - The request object.\n * @param {Response} response - The response object.\n * @return {Promise} Resolves with the updated Model if changes occur.\n * Resolves with the number `204` if no changes occur.\n * @public\n */\n update(req: Request): Promise<number | Model> {\n const { model } = this;\n\n return findOne(model, req, related => this.serializerFor(related))\n .then(async record => {\n const {\n params: {\n data: { attributes, relationships }\n }\n } = req;\n\n await validateRelationships(model, relationships);\n\n return record.update({\n ...attributes,\n ...resolveRelationships(model, relationships)\n });\n })\n .then(record => {\n if (record.didPersist) {\n return record.unwrap();\n }\n\n return 204;\n });\n }\n\n /**\n * Destroy a single Model instance that the Controller instance represents.\n * For more information, see the [deleting resources](https://goo.gl/nUZn8t)\n * section of the JSON API specification.\n *\n * @method destroy\n * @param {Request} request - The request object.\n * @param {Response} response - The response object.\n * @return {Promise} Resolves with the number `204`.\n * @public\n */\n destroy(req: Request): Promise<number> {\n return findOne(this.model, req, related => this.serializerFor(related))\n .then(record => record.destroy())\n .then(() => 204);\n }\n\n /**\n * Respond to HEAD or OPTIONS requests.\n *\n * @method preflight\n * @param {Request} request - The request object.\n * @param {Response} response - The response object.\n * @return {Promise} Resolves with the number `204`.\n * @public\n */\n preflight(): Promise<number> {\n return Promise.resolve(204);\n }\n}\n\nexport default Controller;\nexport { BUILT_IN_ACTIONS } from './constants';\n\nexport type {\n Controller$opts,\n Controller$builtIn,\n Controller$beforeAction,\n Controller$afterAction\n} from './interfaces';\n", "import { posix } from 'path';\n\nimport { dasherize } from 'inflection';\n\nimport { VERSION } from '../jsonapi';\nimport { freezeProps } from '../freezeable';\nimport closestAncestor from '../loader/resolver/utils/closest-ancestor';\nimport type { Bundle$Namespace } from '../loader';\nimport underscore from '../../utils/underscore';\nimport promiseHash from '../../utils/promise-hash';\nimport { dasherizeKeys } from '../../utils/transform-keys';\nimport type { Model, ModelClass } from '../database';\nimport type {\n JSONAPI$Document,\n JSONAPI$DocumentLinks,\n JSONAPI$ResourceObject,\n JSONAPI$RelationshipObject\n} from '../jsonapi';\n\nimport type { Serializer$opts } from './interfaces';\nimport loadLinkage from './utils/load-linkage';\nimport type { Linkage } from './utils/load-linkage';\nimport { createIncludeTree } from './utils/include-tree';\nimport type { IncludeTree } from './utils/include-tree';\n\n/**\n * ## Overview\n *\n * The Serializer class is used to describe which attributes and relationships\n * to include for a particular resource.\n *\n * The attributes and relationships you declare in a Serializer will determine\n * the attributes and relationships that will be included in the response from\n * the resource that the Serializer represents.\n *\n * #### Attributes\n *\n * You can add attributes to your serializer using an array assigned to the\n * class property `attributes` like the example below.\n *\n * ```javascript\n * class UsersSerializer extends Serializer {\n * attributes = [\n * 'name',\n * 'email',\n * 'username',\n * 'createdAt',\n * 'updatedAt'\n * ];\n * }\n * ```\n *\n * Since the attributes required for a resource are declared ahead of time in a\n * Serializer, Lumen will optimize SQL queries for the resource to only include\n * what the Serializer needs to build the response.\n *\n * ```javascript\n * import { Serializer } from 'lumen-framework';\n *\n * class PostsSerializer extends Serializer {\n * attributes = [\n * 'body',\n * 'title',\n * 'createdAt'\n * ];\n * }\n *\n * export default PostsSerializer;\n * ```\n *\n * The Serializer above would result in resources returned from the `/posts`\n * endpoint to only include the `body`, `title`, and `createdAt` attributes. If\n * we wanted include an additional attribute such as `isPublic`, we would have\n * to add `'isPublic'` to the `attributes` property.\n *\n * ```javascript\n * import { Serializer } from 'lumen-framework';\n *\n * class PostsSerializer extends Serializer {\n * attributes = [\n * 'body',\n * 'title',\n * 'isPublic',\n * 'createdAt'\n * ];\n * }\n *\n * export default PostsSerializer;\n * ```\n *\n * #### Associations\n *\n * Similar to `attributes` you can declare associations by adding relationship\n * names to either the `hasOne` or `hasMany` property arrays on a Serializer.\n *\n * Serializers are not concerned with ownership when it comes to associations,\n * so both `hasOne` and `belongsTo` associations can be specified in the\n * `hasOne` array property.\n *\n * ```javascript\n * import { Model } from 'lumen-framework';\n *\n * class Post extends Model {\n * static hasOne = {\n * image: {\n * inverse: 'post'\n * }\n * };\n *\n * static hasMany = {\n * tags: {\n * inverse: 'posts',\n * through: 'categorization'\n * },\n *\n * comments: {\n * inverse: 'post'\n * }\n * };\n *\n * static belongsTo = {\n * user: {\n * inverse: 'posts'\n * }\n * };\n * }\n *\n * export default Post;\n * ```\n *\n * To include the `user` and `image` associations in the response returned from\n * the `/posts` endpoint, we must specify both associations in the `hasOne`\n * property array of the Serializer.\n *\n * ```javascript\n * import { Serializer } from 'lumen-framework';\n *\n * class PostsSerializer extends Serializer {\n * hasOne = [\n * 'user',\n * 'image'\n * ];\n * }\n *\n * export default PostsSerializer;\n * ```\n *\n * If we wanted to also include the `tags` and `comments` in the response, we\n * have to add a `hasMany` array property containing `'tags'` and `'comments'`.\n *\n * ```javascript\n * import { Serializer } from 'lumen-framework';\n *\n * class PostsSerializer extends Serializer {\n * hasOne = [\n * 'user',\n * 'image'\n * ];\n *\n * hasMany = [\n * 'tags',\n * 'comments'\n * ];\n * }\n *\n * export default PostsSerializer;\n * ```\n *\n * You no longer need to specify that `tags` is a many to many relationship\n * using the `Categorization` model as a join table.\n *\n * #### Including Related Resources\n *\n * When requesting related resources for an endpoint, the included resource will\n * follow the serialization rules defined by the included resources Serializer.\n *\n * If we request that the `posts` association is included from the `/users`\n * endpoint, we will only get the `attributes` that the `PostsSerializer` has\n * defined even though the response is processed by the `UsersSerializer`.\n * The same goes for relationships: each included resource carries the\n * `relationships` its own Serializer declares in `hasOne` and `hasMany`.\n *\n * Included resources follow the request's namespace: from `/admin/posts`,\n * included comments are serialized by `AdminCommentsSerializer` when it\n * exists and by `CommentsSerializer` otherwise (the same fallback a\n * namespaced Controller uses), and their links point into `/admin`.\n *\n * Relationship paths may be nested, e.g. `/posts?include=comments.user`, up\n * to the controller's `maxIncludeDepth` (3 by default). The intermediate\n * resources (the comments) are included along with the leaves (their users).\n *\n * #### Sparse Fieldsets\n *\n * When a request specifies the fields that it would like included in the\n * response, the fields **MUST** be declared in the `attributes` property array\n * of the resources Serializer, or they will be ignored.\n *\n * #### Namespaces\n *\n * When using namespaces, you are not required to have a Serializer for each\n * resource as long as a Serializer for the given resource can be resolved\n * upstream.\n *\n * For example, if you have a `posts` resource and you decide to implement an\n * admin namespace, you only need to export an `AdminPostsSerializer` from\n * `app/serializers/admin/posts.js` if you want to specify different attributes\n * or relationships than the `PostsSerializer` exported from\n * `app/serializers/posts.js`.\n *\n * In the event that you do want to specify different attributes or\n * relationships that the `PostsSerializer` exported from\n * `app/serializers/posts.js`, you are not required to extend `PostsSerializer`.\n *\n * ```javascript\n * import { Serializer } from 'lumen-framework';\n *\n * class PostsSerializer extends Serializer {\n * attributes = [\n * 'body',\n * 'title',\n * 'createdAt'\n * ];\n *\n * hasOne = [\n * 'user',\n * 'image'\n * ];\n *\n * hasMany = [\n * 'tags',\n * 'comments'\n * ];\n * }\n *\n * export default PostsSerializer;\n * ```\n *\n * To add the `isPublic` attribute to the response payload of requests to a\n * `/admin/posts` endpoint we can do either of the following examples:\n *\n * ```javascript\n * // app/serializers/admin/posts.js\n * import PostsSerializer from 'app/serializers/posts';\n *\n * class AdminPostsSerializer extends PostsSerializer {\n * attributes = [\n * 'body',\n * 'title',\n * 'isPublic',\n * 'createdAt'\n * ];\n * }\n *\n * export default AdminPostsSerializer;\n * ```\n *\n * OR\n *\n * ```javascript\n * // app/serializers/admin/posts.js\n * import { Serializer } from 'lumen-framework';\n *\n * class AdminPostsSerializer extends Serializer {\n * attributes = [\n * 'body',\n * 'title',\n * 'isPublic',\n * 'createdAt'\n * ];\n *\n * hasOne = [\n * 'user',\n * 'image'\n * ];\n *\n * hasMany = [\n * 'tags',\n * 'comments'\n * ];\n * }\n *\n * export default AdminPostsSerializer;\n * ```\n *\n * Even with inheritance, the examples above are a tad repetitive. We can\n * improve this code by exporting constants from `app/serializers/posts.js`.\n *\n * ```javascript\n * import { Serializer } from 'lumen-framework';\n *\n * export const HAS_ONE = [\n * 'user',\n * 'image'\n * ];\n *\n * export const HAS_MANY = [\n * 'tags',\n * 'comments'\n * ];\n *\n * export const ATTRIBUTES = [\n * 'body',\n * 'title',\n * 'createdAt'\n * ];\n *\n * class PostsSerializer extends Serializer {\n * hasOne = HAS_ONE;\n * hasMany = HAS_MANY;\n * attributes = ATTRIBUTES;\n * }\n *\n * export default PostsSerializer;\n * ```\n *\n * If we choose to use inheritance, our code can look like this:\n *\n * ```javascript\n * // app/serializers/admin/posts.js\n * import PostsSerializer, { ATTRIBUTES } from 'app/serializers/posts';\n *\n * class AdminPostsSerializer extends PostsSerializer {\n * attributes = [\n * ...ATTRIBUTES,\n * 'isPublic'\n * ];\n * }\n *\n * export default AdminPostsSerializer;\n * ```\n *\n * If we choose not use inheritance, our code can look like this:\n *\n * ```javascript\n * // app/serializers/admin/posts.js\n * import { Serializer } from 'lumen-framework';\n * import { HAS_ONE, HAS_MANY, ATTRIBUTES } from 'app/serializers/posts';\n *\n * class AdminPostsSerializer extends PostsSerializer {\n * hasOne = HAS_ONE;\n * hasMany = HAS_MANY;\n *\n * attributes = [\n * ...ATTRIBUTES,\n * 'isPublic'\n * ];\n * }\n *\n * export default AdminPostsSerializer;\n * ```\n *\n * @class Serializer\n * @public\n */\nclass Serializer<T extends Model> {\n /**\n * An Array of the `hasOne` or `belongsTo` relationships on a Serializer\n * instance's Model to include in the\n * `relationships` resource object of a serialized payload.\n *\n * ```javascript\n * class PostsSerializer extends Serializer {\n * hasOne = [\n * 'user'\n * ];\n * }\n * ```\n *\n * @property hasOne\n * @type {Array}\n * @default []\n * @public\n */\n hasOne: Array<string> = [];\n\n /**\n * An Array of the `hasMany` relationships on a Serializer instance's Model to\n * include in the `relationships` resource object of a serialized payload.\n *\n * ```javscript\n * class PostsSerializer extends Serializer {\n * hasMany = [\n * 'comments'\n * ];\n * }\n * ```\n *\n * @property hasMany\n * @type {Array}\n * @default []\n * @public\n */\n hasMany: Array<string> = [];\n\n /**\n * An array of the `attributes` on a Serializer instance's Model to include in\n * the `attributes` resource object of a serialized payload.\n *\n * ```javscript\n * class PostsSerializer extends Serializer {\n * attributes = [\n * 'body',\n * 'title'\n * ];\n * }\n * ```\n *\n * @property attributes\n * @type {Array}\n * @default []\n * @public\n */\n attributes: Array<string> = [];\n\n /**\n * The resolved Model that a Serializer instance represents.\n *\n * @property model\n * @type {Model}\n * @private\n */\n declare model: ModelClass<T>;\n\n /**\n * A reference to the root Serializer for the namespace that a Serializer\n * instance is a member of.\n *\n * @property parent\n * @type {?Serializer}\n * @private\n */\n declare parent: Serializer<Model> | null;\n\n /**\n * The namespace that a Serializer instance is a member of.\n *\n * @property namespace\n * @type {String}\n * @private\n */\n declare namespace: string;\n\n /**\n * Every Serializer of the application, keyed by namespaced path (`posts`,\n * `admin/posts`). Attached once all of them are built, and used by\n * `serializerFor()` to serialize related resources in this Serializer's\n * namespace.\n *\n * @property serializers\n * @type {Map}\n * @private\n */\n declare serializers?: Bundle$Namespace<Serializer<Model>>;\n\n constructor({ model, parent, namespace }: Serializer$opts<T>) {\n Object.assign(this, {\n model,\n parent,\n namespace\n });\n\n freezeProps(this, true, 'model', 'parent', 'namespace');\n }\n\n /**\n * Transform an array of Model instances or a single Model instance into a\n * [JSON API](http://jsonapi.org) document object.\n *\n * @method format\n *\n * @param {Object} options - An options object used for building the\n * returned [JSON API](http://jsonapi.org) document object.\n *\n * @param {Model|Array} options.data - The Model instance or array of\n * Model instances to transform into the returned [JSON API](\n * http://jsonapi.org) document object.\n *\n * @param {Object} options.links - An object containing links to include in\n * the top level links object of the returned [JSON API](http://jsonapi.org)\n * document object.\n *\n * @param {String} options.domain - A string used to build links included in\n * the resource and relationship objects in the returned [JSON API](\n * http://jsonapi.org) document object.\n *\n * @param {Array} options.include - An array of relationship paths (e.g.\n * `'comments'` or `'comments.user'`) whose resources should be added to the\n * top level included object of the returned [JSON API](http://jsonapi.org)\n * document object. Intermediate resources of a nested path are included too.\n *\n * @param {String} options.namespace - The namespace of the request, i.e. of\n * the Controller handling it. Every link in the document is built in it, and\n * included resources are serialized by their Serializer in it (falling back\n * to the root). Defaults to this Serializer's namespace \u2014 which is the root\n * one when a namespaced Controller has no Serializer of its own, so the\n * Controller passes its namespace explicitly.\n *\n * @return {Promise} Resolves with a [JSON API](http://jsonapi.org) document\n * object.\n *\n * @private\n */\n async format({\n data,\n links,\n domain,\n include,\n namespace = this.namespace\n }: {\n data: T | Array<T>;\n links: JSONAPI$DocumentLinks;\n domain: string;\n include: Array<string>;\n namespace?: string;\n }): Promise<JSONAPI$Document> {\n const tree = createIncludeTree(include);\n const related = new Map<string, Array<Model>>();\n const included = new Map<string, JSONAPI$ResourceObject>();\n const names = Array.from(tree.keys());\n let primary: Array<JSONAPI$ResourceObject>;\n let serialized: Record<string, unknown>;\n\n if (Array.isArray(data)) {\n primary = await Promise.all(\n data.map(item =>\n this.formatOne({\n item,\n domain,\n related,\n namespace,\n include: names\n })\n )\n );\n\n serialized = { data: primary };\n } else {\n const resource = await this.formatOne({\n domain,\n related,\n namespace,\n item: data,\n include: names,\n links: false\n });\n\n primary = [resource];\n serialized = { data: resource };\n }\n\n // Walk the include tree in request order, so `included` is deterministic.\n for (const [name, children] of tree) {\n const opts = this.model.relationshipFor(name);\n const records = related.get(name);\n\n if (opts && records) {\n await this.addIncluded({\n domain,\n records,\n included,\n namespace,\n model: opts.model,\n tree: children\n });\n }\n }\n\n // A compound document must not repeat a primary resource in `included`.\n primary.forEach(resource => {\n included.delete(resourceKey(resource));\n });\n\n if (included.size) {\n serialized = {\n ...serialized,\n included: Array.from(included.values())\n };\n }\n\n // The document is assembled from dynamic model data; its pieces are typed\n // structurally above, so assert the fully-built JSON:API shape here.\n return {\n ...serialized,\n links,\n\n jsonapi: {\n version: VERSION\n }\n } as JSONAPI$Document;\n }\n\n /**\n * Transform a single Model instance into a [JSON API](http://jsonapi.org)\n * resource object.\n *\n * Relationships are serialized in one of two ways. By default each one is\n * read from the Model instance (for primary data the query has already\n * loaded them). When `linkage` is given \u2014 as it is for included resources,\n * whose relationships are batch-loaded by `addIncluded()` \u2014 the resource\n * linkage is built from it instead, without touching the database.\n *\n * @method formatOne\n *\n * @param {Object} options - An options object used for building the returned\n * [JSON API](http://jsonapi.org) resource object.\n *\n * @param {Model} options.item - The Model instance to transform into the\n * returned [JSON API](http://jsonapi.org) resource object.\n *\n * @param {Object} options.links - An object containing links to include in\n * the top level links object of the returned [JSON API](http://jsonapi.org)\n * resource object.\n *\n * @param {String} options.domain - A string used to build links included in\n * the top level links object or relationship links objects in the returned\n * [JSON API](http://jsonapi.org) resource object.\n *\n * @param {Array} options.include - An array of the relationship keys whose\n * related records should be collected into `options.related`.\n *\n * @param {Map} options.related - Collects, per relationship key in\n * `options.include`, the related Model instances that belong in the top\n * level included object of a [JSON API](http://jsonapi.org) document object.\n *\n * @param {Object} options.linkage - Pre-loaded resource linkage (related\n * primary keys per relationship key) to serialize relationships from.\n *\n * @param {String} options.namespace - The namespace to build links in.\n * Defaults to this Serializer's; included resources pass the namespace of\n * the request, so every link in a document points into the same namespace.\n *\n * @return {Promise} Resolves with a [JSON API](http://jsonapi.org) resource\n * object.\n *\n * @private\n */\n async formatOne({\n item,\n links,\n domain,\n include = [],\n related,\n linkage,\n namespace = this.namespace\n }: {\n item: T;\n links?: boolean;\n domain: string;\n include?: Array<string>;\n related?: Map<string, Array<Model>>;\n linkage?: Linkage;\n namespace?: string;\n }): Promise<JSONAPI$ResourceObject> {\n const { resourceName: type } = item;\n const id = String(item.getPrimaryKey());\n const names = [...this.hasOne, ...this.hasMany];\n let relationships: Record<string, JSONAPI$RelationshipObject>;\n\n const attributes = dasherizeKeys(\n item.getAttributes(\n ...Object.keys(item.rawColumnData).filter(key =>\n this.attributes.includes(key)\n )\n )\n );\n\n const serialized: JSONAPI$ResourceObject = {\n id,\n type,\n attributes: attributes as JSONAPI$ResourceObject['attributes']\n };\n\n if (linkage) {\n relationships = names.reduce<Record<string, JSONAPI$RelationshipObject>>(\n (hash, name) => ({\n ...hash,\n [dasherize(underscore(name))]: this.formatLinkage(\n domain,\n this.model.relationshipFor(name)?.model.resourceName,\n linkage[name],\n namespace\n )\n }),\n {}\n );\n } else {\n const collect = (name: string, records: Array<Model>) => {\n if (related && include.includes(name)) {\n related.set(name, [...(related.get(name) || []), ...records]);\n }\n };\n\n relationships = (await promiseHash(\n names.reduce<Record<string, unknown>>(\n (hash, name) => ({\n ...hash,\n\n [dasherize(underscore(name))]: (async () => {\n const value = (await Reflect.get(item, name)) as\n Model | Array<Model> | null | undefined;\n\n if (Array.isArray(value)) {\n collect(name, value);\n\n return {\n data: value.map(\n relatedItem =>\n this.formatRelationship(relatedItem, domain, namespace)\n .data\n )\n };\n } else if (value && (value as { id?: unknown }).id != null) {\n collect(name, [value]);\n\n return this.formatRelationship(value, domain, namespace);\n }\n\n return {\n data: null\n };\n })()\n }),\n {}\n )\n )) as Record<string, JSONAPI$RelationshipObject>;\n }\n\n if (Object.keys(relationships).length) {\n serialized.relationships = relationships;\n }\n\n if (links || typeof links !== 'boolean') {\n serialized.links = {\n self: this.linkFor(domain, type, id, namespace)\n };\n }\n\n return serialized;\n }\n\n /**\n * Transform a single Model instance into a [JSON API](http://jsonapi.org)\n * relationship object.\n *\n * @method formatRelationship\n *\n * @param {Model} item - The Model instance to transform into the returned\n * [JSON API](http://jsonapi.org) relationship object.\n *\n * @param {String} domain - A string used to build links included in the\n * returned [JSON API](http://jsonapi.org) relationship object.\n *\n * @return {Object} A [JSON API](http://jsonapi.org) relationship object.\n *\n * @private\n */\n formatRelationship(\n item: Model,\n domain: string,\n namespace: string = this.namespace\n ): JSONAPI$RelationshipObject {\n return this.formatLinkage(\n domain,\n item.resourceName,\n String(item.getPrimaryKey()),\n namespace\n );\n }\n\n /**\n * Build a [JSON API](http://jsonapi.org) relationship object from resource\n * linkage, in the same shape `formatRelationship()` produces from Model\n * instances: to-one relationships carry a `links` object, to-many ones only\n * `data`, and a missing to-one relationship is `{ data: null }`.\n *\n * @method formatLinkage\n * @private\n */\n formatLinkage(\n domain: string,\n type: string | undefined,\n linkage: Array<string> | string | null | undefined,\n namespace: string = this.namespace\n ): JSONAPI$RelationshipObject {\n if (Array.isArray(linkage)) {\n return {\n data: type ? linkage.map(id => ({ id, type })) : []\n };\n }\n\n if (linkage == null || !type) {\n return {\n data: null\n };\n }\n\n return {\n data: {\n id: linkage,\n type\n },\n links: {\n self: this.linkFor(domain, type, linkage, namespace)\n }\n };\n }\n\n /**\n * Add `records` (instances of `model`) to `included` as resource objects,\n * then recurse into the relationships named in `tree`. Each is serialized by\n * `model`'s Serializer in this Serializer's namespace (`serializerFor()`), so\n * `/admin/posts?include=comments` uses `AdminCommentsSerializer` when there\n * is one and `CommentsSerializer` otherwise. The relationships of every level\n * are batch-loaded with one query per relationship, not one per record.\n *\n * @method addIncluded\n * @private\n */\n async addIncluded({\n model,\n records,\n tree,\n domain,\n included,\n namespace\n }: {\n model: ModelClass;\n records: Array<Model>;\n tree: IncludeTree;\n domain: string;\n included: Map<string, JSONAPI$ResourceObject>;\n namespace: string;\n }): Promise<void> {\n // Resolved in the request's namespace at every level \u2014 never in that of\n // whichever (possibly root, fallback) Serializer serialized the parent.\n const serializer = this.serializerFor(model, namespace);\n const unique = Array.from(\n new Map(records.map(record => [record.getPrimaryKey(), record])).values()\n );\n\n if (!unique.length) {\n return;\n }\n\n const names = [...serializer.hasOne, ...serializer.hasMany];\n const linkage = await loadLinkage(model, unique, names);\n\n for (const item of unique) {\n const id = String(item.getPrimaryKey());\n const key = resourceKey({ id, type: item.resourceName });\n\n // Reached through more than one path: the first serialization wins, the\n // linkage is identical either way.\n if (!included.has(key)) {\n included.set(\n key,\n await serializer.formatOne({\n item,\n domain,\n linkage: linkage.get(id),\n namespace\n })\n );\n }\n }\n\n for (const [name, children] of tree) {\n const opts = model.relationshipFor(name);\n\n if (!opts || !names.includes(name)) {\n continue;\n }\n\n const { model: next } = opts;\n const ids = new Set<string>();\n\n linkage.forEach(({ [name]: value }) => {\n (Array.isArray(value) ? value : [value]).forEach(relatedId => {\n if (relatedId != null) {\n ids.add(relatedId);\n }\n });\n });\n\n if (ids.size) {\n // Load exactly the attributes the included resource will serialize.\n const attributes = this.serializerFor(\n next,\n namespace\n ).attributes.filter(attr => next.attributeNames.includes(attr));\n\n const nextRecords = await next\n .select(next.primaryKey, ...attributes)\n .where({ [next.primaryKey]: Array.from(ids) });\n\n await this.addIncluded({\n domain,\n included,\n namespace,\n model: next,\n records: nextRecords,\n tree: children\n });\n }\n }\n }\n\n /**\n * Resolve the Serializer for `model` in `namespace` (this Serializer's by\n * default), the way a namespaced Controller resolves its own:\n * `admin/comments` if it exists, otherwise the closest ancestor namespace's,\n * down to the root `comments` Serializer. Falls back to `model.serializer`\n * when this Serializer was not created by an application (e.g. in\n * isolation).\n *\n * Pass the request's namespace when there is one: a Serializer's own\n * namespace is the root one whenever it is a namespaced Controller's\n * fallback.\n *\n * @method serializerFor\n * @private\n */\n serializerFor(\n model: ModelClass,\n namespace: string = this.namespace\n ): Serializer<Model> {\n const { serializers } = this;\n\n if (serializers) {\n const key = posix.join(namespace || '.', model.resourceName);\n const serializer =\n serializers.get(key) || closestAncestor(serializers, key);\n\n if (serializer) {\n return serializer;\n }\n }\n\n return model.serializer;\n }\n\n /**\n * @private\n */\n linkFor(\n domain: string,\n type: string,\n id: string,\n namespace: string = this.namespace\n ): string {\n if (namespace) {\n return `${domain}/${namespace}/${type}/${id}`;\n }\n\n return `${domain}/${type}/${id}`;\n }\n}\n\n/**\n * @private\n */\nfunction resourceKey({ id, type }: { id: string; type: string }): string {\n return `${type}:${id}`;\n}\n\nexport default Serializer;\n", "import { posix } from 'path';\n\nimport type { Bundle$Namespace } from '../../index';\n\nexport default function closestAncestor<T>(\n source: Bundle$Namespace<T>,\n key: string\n): T | undefined {\n const name = posix.basename(key);\n let namespace = posix.dirname(key);\n\n if (namespace === '.') {\n return source.get(name);\n }\n\n namespace = posix.dirname(namespace);\n\n const ancestor = source.get(posix.join(namespace, name));\n\n if (ancestor) {\n return ancestor;\n }\n\n return closestAncestor(source, posix.join(posix.dirname(namespace), name));\n}\n", "import { camelize } from 'inflection';\n\nimport type { Model, ModelClass } from '../../database';\n\n/**\n * The resource linkage of one record: the primary key(s) of the records each\n * named relationship points to \u2014 an array for has-many, otherwise a single id\n * or `null`.\n *\n * @private\n */\nexport type Linkage = Record<string, Array<string> | string | null>;\n\nconst valueOf = (record: Model, key: string): unknown =>\n Reflect.get(record, key);\n\nconst toId = (value: unknown): string | null =>\n value == null ? null : String(value);\n\n/**\n * Batch-load the resource linkage of the relationships `names` for every one of\n * `records` (all instances of `model`), keyed by each record's primary key.\n *\n * This is what lets included resources carry `relationships` without an N+1:\n * it issues at most one query per relationship \u2014 and a single query for all\n * belongs-to relationships, whose foreign keys live on `model` itself \u2014 however\n * many records there are. The queries mirror the lazy relationship getters in\n * `database/relationship/utils/getters.ts`, which remain the source of truth.\n *\n * @private\n */\nexport default async function loadLinkage(\n model: ModelClass,\n records: Array<Model>,\n names: Array<string>\n): Promise<Map<string, Linkage>> {\n const ids = Array.from(\n new Set(records.map(record => record.getPrimaryKey()))\n );\n const linkage = new Map<string, Linkage>();\n const belongsTo: Array<[string, string, ModelClass]> = [];\n const queries: Array<Promise<void>> = [];\n\n ids.forEach(id => {\n linkage.set(\n String(id),\n names.reduce<Linkage>((result, name) => {\n const opts = model.relationshipFor(name);\n\n result[name] = opts && opts.type === 'hasMany' ? [] : null;\n return result;\n }, {})\n );\n });\n\n if (!ids.length) {\n return linkage;\n }\n\n // Append `relatedId` to the linkage of the owner identified by `ownerId`.\n const link = (ownerId: unknown, name: string, relatedId: unknown) => {\n const owner = linkage.get(String(ownerId));\n const id = toId(relatedId);\n\n if (!owner || id === null) {\n return;\n }\n\n const current = owner[name];\n\n if (Array.isArray(current)) {\n // A join model can hold the same pair twice; like the getters (which\n // query `WHERE id IN (...)`), each related record is linked once.\n if (!current.includes(id)) {\n current.push(id);\n }\n } else if (current === null) {\n // has-one: like `getHasOne()`, the lowest primary key wins.\n owner[name] = id;\n }\n };\n\n names.forEach(name => {\n const opts = model.relationshipFor(name);\n\n if (!opts) {\n return;\n }\n\n const { type, through, model: related } = opts;\n const foreignKey = camelize(opts.foreignKey, true);\n\n if (type === 'belongsTo') {\n belongsTo.push([name, foreignKey, related]);\n } else if (through) {\n // Mirrors `getHasManyThrough()`: the join model holds a key pointing at\n // the owner (`foreignKey`) and one pointing at the related record (the\n // inverse relationship's foreign key).\n const inverse = related.relationshipFor(opts.inverse);\n\n if (!inverse) {\n return;\n }\n\n const relatedKey = camelize(inverse.foreignKey, true);\n\n queries.push(\n (async () => {\n const rows = await through\n .select(foreignKey, relatedKey)\n .where({ [foreignKey]: ids });\n\n rows.forEach(row => {\n link(valueOf(row, foreignKey), name, valueOf(row, relatedKey));\n });\n })()\n );\n } else {\n // has-one and has-many: the foreign key lives on the related model.\n queries.push(\n (async () => {\n const rows = await related\n .select(related.primaryKey, foreignKey)\n .where({ [foreignKey]: ids })\n .order(related.primaryKey, 'ASC');\n\n rows.forEach(row => {\n link(valueOf(row, foreignKey), name, row.getPrimaryKey());\n });\n })()\n );\n }\n });\n\n if (belongsTo.length) {\n queries.push(\n (async () => {\n const rows = await model\n .select(model.primaryKey, ...belongsTo.map(([, key]) => key))\n .where({ [model.primaryKey]: ids });\n\n rows.forEach(row => {\n belongsTo.forEach(([name, key]) => {\n link(row.getPrimaryKey(), name, valueOf(row, key));\n });\n });\n\n await dropDangling(linkage, belongsTo);\n })()\n );\n }\n\n await Promise.all(queries);\n\n return linkage;\n}\n\n/**\n * A foreign key can outlive the record it points to (no FK constraint, or a\n * row deleted out from under it). Resolve belongs-to linkage to `null` then,\n * like the primary query's join does \u2014 rather than linking a resource that\n * does not exist. One query per distinct related model.\n *\n * @private\n */\nasync function dropDangling(\n linkage: Map<string, Linkage>,\n belongsTo: Array<[string, string, ModelClass]>\n): Promise<void> {\n const wanted = new Map<ModelClass, Set<string>>();\n\n belongsTo.forEach(([name, , related]) => {\n const ids = wanted.get(related) || new Set<string>();\n\n linkage.forEach(({ [name]: id }) => {\n if (typeof id === 'string') {\n ids.add(id);\n }\n });\n\n wanted.set(related, ids);\n });\n\n const existing = new Map<ModelClass, Set<string>>();\n\n await Promise.all(\n Array.from(wanted, async ([related, ids]) => {\n if (!ids.size) {\n existing.set(related, ids);\n return;\n }\n\n const rows = await related\n .select(related.primaryKey)\n .where({ [related.primaryKey]: Array.from(ids) });\n\n existing.set(\n related,\n new Set(rows.map(row => String(row.getPrimaryKey())))\n );\n })\n );\n\n belongsTo.forEach(([name, , related]) => {\n const found = existing.get(related);\n\n linkage.forEach(owner => {\n const id = owner[name];\n\n if (typeof id === 'string' && !found?.has(id)) {\n owner[name] = null;\n }\n });\n });\n}\n", "import type { Model, ModelClass } from '../../database';\nimport type Serializer from '../index';\n\n/**\n * A parsed `include` parameter: each relationship name maps to the tree of\n * relationships to include from the records it points to.\n *\n * @private\n */\nexport type IncludeTree = Map<string, IncludeTree>;\n\n/**\n * Parse relationship paths (`['comments', 'comments.user', 'user']`) into an\n * include tree. Every prefix of a path is part of the tree, because JSON:API\n * requires the intermediate resources of a multi-part path to be included\n * along with its leaves (`comments.user` includes the comments too).\n *\n * @private\n */\nexport function createIncludeTree(paths: Array<string> = []): IncludeTree {\n const tree: IncludeTree = new Map();\n\n paths.forEach(path => {\n path\n .split('.')\n .filter(Boolean)\n .reduce((node, name) => {\n let child = node.get(name);\n\n if (!child) {\n child = new Map();\n node.set(name, child);\n }\n\n return child;\n }, tree);\n });\n\n return tree;\n}\n\n/**\n * Enumerate every include path available from `names` (relationships of\n * `model`), down to `depth` levels. Each level continues with the relationships\n * declared by the related model's serializer as `serializerFor` resolves it \u2014\n * the same one its included resources are serialized with (namespaced, with a\n * fallback to the root). Used to build the allowed values of the `include`\n * parameter.\n *\n * @private\n */\nexport function enumerateIncludePaths(\n model: ModelClass,\n names: Array<string>,\n depth: number,\n serializerFor: (\n model: ModelClass\n ) => Serializer<Model> | undefined = related => related.serializer\n): Array<string> {\n if (depth < 1) {\n return [];\n }\n\n return names.reduce<Array<string>>((paths, name) => {\n const opts = model.relationshipFor(name);\n\n if (!opts) {\n return paths;\n }\n\n const { model: related } = opts;\n const serializer = serializerFor(related);\n\n if (!serializer) {\n return [...paths, name];\n }\n\n const { hasOne, hasMany } = serializer;\n\n return [\n ...paths,\n name,\n ...enumerateIncludePaths(\n related,\n [...hasOne, ...hasMany],\n depth - 1,\n serializerFor\n ).map(path => `${name}.${path}`)\n ];\n }, []);\n}\n", "import { NODE_ENV } from '../../constants';\n\nimport type { Config } from './interfaces';\n\nexport function createDefaultConfig(): Config {\n const isTestENV = NODE_ENV === 'test';\n const isProdENV = NODE_ENV === 'production';\n\n return {\n server: {\n cors: {\n enabled: false\n }\n },\n logging: {\n level: isProdENV ? 'INFO' : 'DEBUG',\n format: isProdENV ? 'json' : 'text',\n enabled: !isTestENV,\n\n filter: {\n params: []\n }\n }\n };\n}\n\nexport type { Config } from './interfaces';\n", "/**\n * @private\n */\nexport default function normalizeName(str: string): string {\n let name = str;\n\n if (name.startsWith('/')) {\n name = name.substr(1);\n }\n\n if (name.endsWith('/')) {\n name = name.substr(0, name.length - 1);\n }\n\n return name;\n}\n", "/**\n * @private\n */\nexport default function normalizePath(str: string): string {\n let path = str;\n\n if (!path.startsWith('/')) {\n path = `/${path}`;\n }\n\n if (path.endsWith('/')) {\n path = path.substr(0, path.length - 1);\n }\n\n return path;\n}\n", "import { FreezeableSet, freezeProps } from '../../freezeable';\nimport type Controller from '../../controller';\nimport type { Route, Router$Namespace } from '../index';\n\nimport normalizeName from './utils/normalize-name';\nimport normalizePath from './utils/normalize-path';\nimport type { Namespace$opts } from './interfaces';\n\n/**\n * @private\n */\nclass Namespace extends FreezeableSet<Route | Router$Namespace> {\n declare name: string;\n\n declare path: string;\n\n declare isRoot: boolean;\n\n declare namespace: Router$Namespace;\n\n declare controller: Controller;\n\n declare controllers: Map<string, Controller>;\n\n constructor({\n name,\n path,\n namespace,\n controller,\n controllers\n }: Namespace$opts) {\n super();\n\n Object.assign(this, {\n controller,\n controllers,\n name: normalizeName(name),\n path: normalizePath(path),\n isRoot: path === '/',\n namespace: namespace || this\n });\n\n freezeProps(this, true, 'name', 'path', 'controller', 'namespace');\n\n freezeProps(this, false, 'isRoot', 'controllers');\n }\n}\n\nexport default Namespace;\n\nexport { default as normalizeName } from './utils/normalize-name';\nexport { default as normalizePath } from './utils/normalize-path';\n\nexport type { Namespace$opts } from './interfaces';\n", "import entries from './entries';\n\n/**\n * A replacement for querystring.stringify that supports nested objects.\n *\n * @private\n */\nexport default function createQueryString(\n src: Record<string, unknown>,\n prop?: string\n): string {\n return entries(src).reduce((str, [key, value], index) => {\n let result = str;\n\n if (index > 0) {\n result += '&';\n }\n\n if (prop) {\n result += `${\n prop + encodeURIComponent('[') + key + encodeURIComponent(']')\n }=`;\n } else {\n result += `${key}=`;\n }\n\n if (value && typeof value === 'object') {\n if (Array.isArray(value)) {\n result += value.map(item => encodeURIComponent(String(item))).join();\n } else {\n result =\n result.substr(0, result.length - (key.length + 1)) +\n createQueryString(value as Record<string, unknown>, key);\n }\n } else if (!value && typeof value !== 'number') {\n result += 'null';\n } else {\n result += encodeURIComponent(String(value));\n }\n\n return result;\n }, '');\n}\n", "import omit from '../../../../../utils/omit';\nimport merge from '../../../../../utils/merge';\nimport createQueryString from '../../../../../utils/create-query-string';\nimport type { Request$params } from '../../../../server';\nimport type { JSONAPI$DocumentLinks } from '../../../../jsonapi';\n\nfunction createLinkTemplate({\n total,\n params,\n domain,\n pathname,\n defaultPerPage\n}: {\n total: number;\n params: Request$params;\n domain: string;\n pathname: string;\n defaultPerPage: number;\n}) {\n const { page: { size = defaultPerPage } = {} } = params;\n const baseURL = `${domain}${pathname}`;\n const queryURL = `${baseURL}?`;\n const baseParams = omit(params, 'page');\n const lastPageNum = total > 0 ? Math.ceil(total / size) : 1;\n\n if (size && size !== defaultPerPage) {\n baseParams.page = { size };\n }\n\n const hasParams = Object.keys(baseParams).length;\n\n return function linkTemplate(\n pageNum: number | 'first' | 'last'\n ): string | null {\n let normalized: number;\n\n switch (pageNum) {\n case 'first':\n normalized = 1;\n break;\n\n case 'last':\n normalized = lastPageNum;\n break;\n\n default:\n normalized = pageNum;\n }\n\n if (normalized < 1 || normalized > lastPageNum) {\n return null;\n } else if (normalized > 1) {\n const paramsForPage = merge(baseParams, {\n page: {\n number: normalized\n }\n });\n\n return (\n queryURL + createQueryString(paramsForPage as Record<string, unknown>)\n );\n }\n\n return hasParams\n ? queryURL + createQueryString(baseParams as Record<string, unknown>)\n : baseURL;\n };\n}\n\n/**\n * @private\n */\nexport default function createPageLinks(opts: {\n total: number;\n params: Request$params;\n domain: string;\n pathname: string;\n defaultPerPage: number;\n}): JSONAPI$DocumentLinks {\n const { page: { number = 1 } = {} } = opts.params;\n const linkForPage = createLinkTemplate(opts);\n\n return {\n self: linkForPage(number),\n first: linkForPage('first'),\n last: linkForPage('last'),\n prev: linkForPage(number - 1),\n next: linkForPage(number + 1)\n };\n}\n", "import { Query } from '../../../../database';\nimport { getDomain } from '../../../../server';\nimport type { Request, Response } from '../../../../server';\nimport createPageLinks from '../utils/create-page-links';\nimport type { Action } from '../interfaces';\n\n/**\n * @private\n */\nexport default function resource(action: Action<unknown>): Action<unknown> {\n const resourceAction = async function (req: Request, res: Response) {\n const {\n route: { action: actionName }\n } = req;\n const result = action(req, res);\n let links = {};\n let data;\n let total;\n\n if (actionName === 'index' && result instanceof Query) {\n [data, total] = await Promise.all([result, Query.from(result).count()]);\n } else {\n data = await result;\n }\n\n if (Array.isArray(data) || (data && data.isModelInstance)) {\n const domain = getDomain(req);\n\n const {\n params,\n url: { path, pathname },\n route: {\n controller: { namespace, serializer, defaultPerPage }\n }\n } = req;\n\n const include = params.include || [];\n\n if (actionName === 'index') {\n links = createPageLinks({\n params,\n domain,\n pathname,\n defaultPerPage,\n total: total || 0\n });\n } else if (actionName !== 'index' && namespace) {\n links = {\n self: domain.replace(`/${namespace}`, '') + path\n };\n } else if (actionName !== 'index' && !namespace) {\n links = {\n self: domain + path\n };\n }\n\n return serializer.format({\n data,\n links,\n domain,\n include,\n // The request's namespace, not the serializer's: a namespaced\n // controller without its own serializer is given the root one.\n namespace\n });\n }\n\n return data;\n };\n\n Reflect.defineProperty(resourceAction, 'name', {\n value: action.name\n });\n\n return resourceAction;\n}\n", "export const FINAL_HANDLER = '__FINAL_HANDLER__';\n", "import type { Request } from '../../../../server';\n\n/**\n * @private\n */\nexport default function getActionName({ route: { action } }: Request): string {\n return action;\n}\n", "import type { Request } from '../../../../server';\n\n/**\n * @private\n */\nexport default function getControllerName({\n route: {\n controller: {\n constructor: { name }\n }\n }\n}: Request): string {\n return name;\n}\n", "import { FINAL_HANDLER } from '../constants';\nimport getActionName from '../utils/get-action-name';\nimport getControllerName from '../utils/get-controller-name';\nimport type { Request, Response } from '../../../../server';\nimport type { Action } from '../interfaces';\n\n/**\n * @private\n */\nexport default function trackPerf<T, U extends Action<T>>(\n action: U\n): Action<T> {\n const trackedAction = async function (\n req: Request,\n res: Response,\n data?: unknown\n ) {\n const start = Date.now();\n const result = await action(req, res, data);\n let { name } = action;\n let type = 'middleware';\n\n if (name === FINAL_HANDLER) {\n type = 'action';\n name = getActionName(req);\n } else if (!name) {\n name = 'anonymous';\n }\n\n res.stats.push({\n type,\n name,\n duration: Date.now() - start,\n controller: getControllerName(req)\n });\n\n return result;\n };\n\n Reflect.defineProperty(trackedAction, 'name', {\n value: action.name\n });\n\n return trackedAction;\n}\n", "import type Controller from '../../../controller';\n\nimport resource from './enhancers/resource';\nimport trackPerf from './enhancers/track-perf';\nimport type { Action } from './interfaces';\n\n/**\n * @private\n */\nexport function createAction(\n type: string,\n action: Action<unknown>,\n controller: Controller\n): Array<Action<unknown>> {\n let fn = action.bind(controller);\n\n if (type !== 'custom' && controller.hasModel && controller.hasSerializer) {\n fn = resource(fn);\n }\n\n const handlers: Array<Action<unknown>> = [\n ...controller.beforeAction,\n\n function __FINAL_HANDLER__(req, res) {\n return fn(req, res);\n },\n ...controller.afterAction\n ];\n\n return handlers.map(trackPerf);\n}\n\nexport { FINAL_HANDLER } from './constants';\nexport { default as createPageLinks } from './utils/create-page-links';\n\nexport type { Action } from './interfaces';\n", "import { line } from '../../../../logger';\nimport createServerError from '../../../../server/utils/create-server-error';\nimport sourceFor from '../../../../server/utils/source-for';\nimport type { Server$ErrorSource } from '../../../../server';\nimport type { ParameterLike } from '../index';\n\n/**\n * @private\n */\nclass ParameterTypeError extends TypeError {\n declare source: Server$ErrorSource;\n\n constructor(param: ParameterLike, actual: string) {\n const { type, path } = param;\n\n super(line`\n Expected type '${type || 'undefined'}' for parameter '${path}' but got\n '${actual}'.\n `);\n this.source = sourceFor(path);\n }\n}\n\nexport default createServerError(ParameterTypeError, 400);\n", "import { line } from '../../../../logger';\nimport createServerError from '../../../../server/utils/create-server-error';\nimport sourceFor from '../../../../server/utils/source-for';\nimport type { Server$ErrorSource } from '../../../../server';\nimport type { ParameterLike } from '../index';\n\n/**\n * @private\n */\nclass ParameterValueError extends TypeError {\n declare source: Server$ErrorSource;\n\n constructor(param: ParameterLike, actual: unknown) {\n super(line`\n Expected value for parameter '${param.path}' to be one of\n [${param.size ? Array.from(param.values()).join(', ') : ''}] but got\n ${String(actual)}.\n `);\n this.source = sourceFor(param.path);\n }\n}\n\nexport default createServerError(ParameterValueError, 400);\n", "import createServerError from '../../../../server/utils/create-server-error';\nimport sourceFor from '../../../../server/utils/source-for';\nimport type { Server$ErrorSource } from '../../../../server';\n\n/**\n * @private\n */\nclass InvalidParameterError extends TypeError {\n declare source: Server$ErrorSource;\n\n constructor(path: string) {\n super(`'${path}' is not a valid parameter for this resource.`);\n this.source = sourceFor(path);\n }\n}\n\nexport default createServerError(InvalidParameterError, 400);\n", "import createServerError from '../../../../server/utils/create-server-error';\nimport sourceFor from '../../../../server/utils/source-for';\nimport { line } from '../../../../logger';\nimport type { Server$ErrorSource } from '../../../../server';\n\n/**\n * @private\n */\nclass ResourceMismatchError extends TypeError {\n declare source: Server$ErrorSource;\n\n constructor(path: string, expected: unknown, actual: unknown) {\n let normalized = actual;\n\n if (typeof normalized === 'string') {\n normalized = `'${String(normalized)}'`;\n }\n\n super(line`\n Expected '${String(expected)}' for parameter '${path}' but got\n ${String(normalized)}.\n `);\n this.source = sourceFor(path);\n }\n}\n\nexport default createServerError(ResourceMismatchError, 409);\n", "import createServerError from '../../../../server/utils/create-server-error';\nimport sourceFor from '../../../../server/utils/source-for';\nimport type { Server$ErrorSource } from '../../../../server';\n\n/**\n * @private\n */\nclass ParameterRequiredError extends TypeError {\n declare source: Server$ErrorSource;\n\n constructor(path: string) {\n super(`Missing required parameter '${path}'.`);\n this.source = sourceFor(path);\n }\n}\n\nexport default createServerError(ParameterRequiredError, 400);\n", "import createServerError from '../../../../server/utils/create-server-error';\nimport sourceFor from '../../../../server/utils/source-for';\nimport type { Server$ErrorSource } from '../../../../server';\n\n/**\n * JSON:API 1.0: \"A server MUST return 403 Forbidden in response to an\n * unsupported request to create a resource with a client-generated ID.\"\n *\n * @private\n */\nclass ClientGeneratedIdError extends TypeError {\n declare source: Server$ErrorSource;\n\n constructor() {\n super('Client-generated IDs are not supported for this resource.');\n this.source = sourceFor('data.id');\n }\n}\n\nexport default createServerError(ClientGeneratedIdError, 403);\n", "import createServerError from '../../../../server/utils/create-server-error';\nimport sourceFor from '../../../../server/utils/source-for';\nimport type { Server$ErrorSource } from '../../../../server';\n\n/**\n * JSON:API 1.0: \"A server MUST return 403 Forbidden in response to an\n * unsupported request to update a resource or relationship.\" Used for members\n * the model knows about but the controller does not accept (`params`).\n *\n * @private\n */\nclass ForbiddenParameterError extends TypeError {\n declare source: Server$ErrorSource;\n\n constructor(path: string) {\n super(`Setting '${path}' is not supported for this resource.`);\n this.source = sourceFor(path);\n }\n}\n\nexport default createServerError(ForbiddenParameterError, 403);\n", "import createServerError from '../../../../server/utils/create-server-error';\nimport sourceFor from '../../../../server/utils/source-for';\nimport type { Server$ErrorSource } from '../../../../server';\nimport type { ParameterLike } from '../index';\n\n/**\n * @private\n */\nclass ParameterNotNullableError extends TypeError {\n declare source: Server$ErrorSource;\n\n constructor({ path }: ParameterLike) {\n super(`Parameter '${path}' is not nullable.`);\n this.source = sourceFor(path);\n }\n}\n\nexport default createServerError(ParameterNotNullableError, 400);\n", "/**\n * @private\n */\nexport default function isBuffer(value: unknown): value is Buffer {\n return value instanceof Buffer;\n}\n", "import ParameterTypeError from '../errors/parameter-type-error';\nimport ParameterNotNullableError from '../errors/parameter-not-nullable-error';\nimport isNull from '../../../../../utils/is-null';\nimport isObject from '../../../../../utils/is-object';\nimport isBuffer from '../../../../../utils/is-buffer';\nimport type { Parameter, ParameterGroup } from '../index';\n\n/**\n * @private\n */\nexport default function validateType(\n param: Parameter | ParameterGroup,\n value: unknown\n): true {\n const { type, required } = param;\n const valueIsNull = isNull(value);\n\n if (required && valueIsNull) {\n throw new ParameterNotNullableError(param);\n } else if (valueIsNull || !type) {\n return true;\n }\n\n const valueType = typeof value;\n let isValid = true;\n\n switch (type) {\n case 'array':\n isValid = Array.isArray(value);\n break;\n\n case 'buffer':\n isValid = isBuffer(value);\n break;\n\n case 'object':\n isValid = isObject(value) || isNull(value);\n break;\n\n case 'date':\n isValid = value instanceof Date;\n break;\n\n default:\n isValid = type === valueType;\n }\n\n if (!isValid) {\n throw new ParameterTypeError(param, valueType);\n }\n\n return true;\n}\n", "import { ParameterRequiredError } from '../../errors';\nimport type ParameterGroup from '../index';\n\n/**\n * @private\n */\nexport default function hasRequiredParams(\n group: ParameterGroup,\n params: Record<string, unknown>\n): boolean {\n for (const [key, { path, required }] of group) {\n if (required && !Reflect.has(params, key)) {\n throw new ParameterRequiredError(path);\n }\n }\n\n return true;\n}\n", "import { FreezeableMap } from '../../../../freezeable';\nimport { InvalidParameterError } from '../errors';\nimport isNull from '../../../../../utils/is-null';\nimport entries from '../../../../../utils/entries';\nimport validateType from '../utils/validate-type';\nimport type { ParameterLike, ParameterLike$opts } from '../index';\n\nimport hasRequiredParams from './utils/has-required-params';\n\n/**\n * @private\n */\nclass ParameterGroup extends FreezeableMap<string, ParameterLike> {\n declare type: string;\n\n declare path: string;\n\n declare required: boolean;\n\n declare sanitize: boolean;\n\n constructor(\n contents: Array<[string, ParameterLike]>,\n { path, required, sanitize }: ParameterLike$opts\n ) {\n super(contents);\n\n Object.assign(this, {\n path,\n type: 'object',\n required: Boolean(required),\n sanitize: Boolean(sanitize)\n });\n\n this.freeze();\n }\n\n validate<V>(params: V): V {\n const validated = {};\n\n if (isNull(params)) {\n return params;\n }\n\n if (\n validateType(this, params) &&\n hasRequiredParams(this, params as Record<string, unknown>)\n ) {\n const { sanitize } = this;\n let { path } = this;\n\n if (path.length) {\n path = `${path}.`;\n }\n\n for (const [key, value] of entries(params as Record<string, unknown>)) {\n const match = this.get(key);\n\n if (match) {\n Reflect.set(validated, key, match.validate(value));\n } else if (!match && !sanitize) {\n throw new InvalidParameterError(`${path}${key}`);\n }\n }\n }\n\n return validated as V;\n }\n}\n\nexport default ParameterGroup;\n", "import isNull from '../../../../../../utils/is-null';\nimport { ParameterValueError, ResourceMismatchError } from '../../errors';\nimport type Parameter from '../index';\n\n/**\n * @private\n */\nfunction validateOne<V>(param: Parameter, value: V): V {\n if (!param.required && isNull(value)) {\n return value;\n }\n\n if (!param.has(value)) {\n let expected;\n\n switch (param.path) {\n case 'data.type':\n [expected] = Array.from(param.values());\n throw new ResourceMismatchError(param.path, expected, value);\n\n default:\n throw new ParameterValueError(param, value);\n }\n }\n\n return value;\n}\n\n/**\n * @private\n */\nexport default function validateValue<V>(param: Parameter, value: V): V {\n if (Array.isArray(value)) {\n if (param.sanitize) {\n return value.filter(item => param.has(item)) as V;\n }\n\n for (const item of value) {\n validateOne(param, item);\n }\n } else {\n validateOne(param, value);\n }\n\n return value;\n}\n", "import { FreezeableSet } from '../../../../freezeable';\nimport validateType from '../utils/validate-type';\n\nimport validateValue from './utils/validate-value';\nimport type { Parameter$opts } from './interfaces';\n\n/**\n * @private\n */\nclass Parameter extends FreezeableSet<unknown> {\n declare path: string;\n\n declare type: string;\n\n declare required: boolean;\n\n declare sanitize: boolean;\n\n /**\n * Whether the parameter only accepts the given `values`. A parameter built\n * without `values` accepts any value of its type; one built with `values`\n * accepts only those \u2014 so an empty list accepts nothing. (Both used to look\n * alike as an empty set, which let e.g. `?include=anything` through on a\n * serializer without relationships, where JSON:API requires a 400.)\n */\n declare restricted: boolean;\n\n constructor({ path, type, values, required, sanitize }: Parameter$opts) {\n super(values);\n\n Object.assign(this, {\n path,\n type,\n required: Boolean(required),\n sanitize: Boolean(sanitize),\n restricted: values !== undefined\n });\n\n this.freeze();\n }\n\n validate<V>(value: V): V {\n validateType(this, value);\n\n if (this.restricted) {\n return validateValue(this, value);\n }\n\n return value;\n }\n}\n\nexport default Parameter;\n", "import Parameter from '../parameter';\nimport type { ParameterLike } from '../interfaces';\n\n/**\n * @private\n */\nexport default function getURLParams(\n dynamicSegments: Array<string>\n): Array<[string, ParameterLike]> {\n return dynamicSegments.map((param): [string, ParameterLike] => [\n param,\n new Parameter({\n path: param,\n required: true\n })\n ]);\n}\n", "import { ForbiddenParameterError } from '../errors';\n\nimport Parameter from './index';\n\n/**\n * A member the resource has but the controller does not accept. Any value for\n * it is rejected with 403 rather than the 400 an unknown member gets.\n *\n * @private\n */\nclass ForbiddenParameter extends Parameter {\n constructor(path: string) {\n super({ path });\n }\n\n override validate<V>(): V {\n throw new ForbiddenParameterError(this.path);\n }\n}\n\nexport default ForbiddenParameter;\n", "import Parameter from '../parameter';\nimport ForbiddenParameter from '../parameter/forbidden-parameter';\nimport ParameterGroup from '../parameter-group';\nimport isNull from '../../../../../utils/is-null';\nimport { typeForColumn } from '../../../../database';\nimport type Controller from '../../../../controller';\nimport type { ParameterLike } from '../interfaces';\n\n/**\n * @private\n */\nfunction getIDParam({ model }: Controller): [string, ParameterLike] {\n const primaryKeyColumn = model.columnFor(model.primaryKey);\n let primaryKeyType: string | undefined = 'number';\n\n if (primaryKeyColumn) {\n primaryKeyType = typeForColumn(primaryKeyColumn);\n }\n\n return [\n 'id',\n new Parameter({\n type: primaryKeyType,\n path: 'data.id',\n required: true\n })\n ];\n}\n\n/**\n * @private\n */\nfunction getTypeParam({ model }: Controller): [string, ParameterLike] {\n return [\n 'type',\n new Parameter({\n type: 'string',\n path: 'data.type',\n values: [model.resourceName],\n required: true\n })\n ];\n}\n\n/**\n * @private\n */\nfunction getAttributesParam(\n { model, params }: Controller,\n method: 'PATCH' | 'POST'\n): [string, ParameterLike] {\n return [\n 'attributes',\n new ParameterGroup(\n params.reduce<Array<[string, ParameterLike]>>((group, param) => {\n const col = model.columnFor(param);\n\n if (col) {\n const type = typeForColumn(col);\n const path = `data.attributes.${param}`;\n const required =\n method !== 'PATCH' && !col.nullable && isNull(col.defaultValue);\n\n return [...group, [param, new Parameter({ type, path, required })]];\n }\n\n return group;\n }, []),\n {\n path: 'data.attributes',\n sanitize: true\n }\n )\n ];\n}\n\n/**\n * @private\n */\nfunction getRelationshipsParam({\n model,\n params\n}: Controller): [string, ParameterLike] {\n // Relationships the model has but the controller does not accept get a 403\n // (unsupported update) instead of the 400 an unknown member gets.\n const forbidden = Object.keys(model.relationships)\n .filter(key => !params.includes(key))\n .map((key): [string, ParameterLike] => [\n key,\n new ForbiddenParameter(`data.relationships.${key}`)\n ]);\n\n return [\n 'relationships',\n new ParameterGroup(\n [\n ...params.reduce<Array<[string, ParameterLike]>>((group, param) => {\n const path = `data.relationships.${param}`;\n const opts = model.relationshipFor(param);\n\n if (!opts) {\n return group;\n }\n\n if (opts.type === 'hasMany') {\n return [\n ...group,\n\n [\n param,\n new ParameterGroup(\n [\n [\n 'data',\n new Parameter({\n type: 'array',\n path: `${path}.data`,\n required: true\n })\n ]\n ],\n {\n path\n }\n )\n ]\n ];\n }\n\n const primaryKeyColumn = opts.model.columnFor(opts.model.primaryKey);\n let primaryKeyType: string | undefined = 'number';\n\n if (primaryKeyColumn) {\n primaryKeyType = typeForColumn(primaryKeyColumn);\n }\n\n return [\n ...group,\n\n [\n param,\n new ParameterGroup(\n [\n [\n 'data',\n new ParameterGroup(\n [\n [\n 'id',\n new Parameter({\n type: primaryKeyType,\n path: `${path}.data.id`,\n required: true\n })\n ],\n\n [\n 'type',\n new Parameter({\n type: 'string',\n path: `${path}.data.type`,\n values: [opts.model.resourceName],\n required: true\n })\n ]\n ],\n {\n type: 'array',\n path: `${path}.data`,\n required: true\n }\n )\n ]\n ],\n {\n path\n }\n )\n ]\n ];\n }, []),\n ...forbidden\n ],\n {\n path: 'data.relationships'\n }\n )\n ];\n}\n\n/**\n * @private\n */\nexport default function getDataParams(\n controller: Controller,\n method: 'PATCH' | 'POST',\n includeID: boolean\n): [string, ParameterLike] {\n let params = [getTypeParam(controller)];\n\n if (controller.hasModel) {\n params = [\n getAttributesParam(controller, method),\n getRelationshipsParam(controller),\n ...params\n ];\n\n if (includeID) {\n params = [getIDParam(controller), ...params];\n }\n }\n\n return [\n 'data',\n new ParameterGroup(params, {\n path: 'data',\n required: true\n })\n ];\n}\n", "import type Controller from '../../../../controller';\n\n/**\n * @private\n */\nexport default function getDefaultMemberParams({\n model,\n serializer: { hasOne, hasMany, attributes }\n}: Controller): Record<string, unknown> {\n return {\n fields: {\n [model.resourceName]: attributes,\n ...[...hasOne, ...hasMany].reduce<Record<string, unknown>>(\n (include, key) => {\n const opts = model.relationshipFor(key);\n\n if (!opts || model === opts.model) {\n return include;\n }\n\n return {\n ...include,\n [opts.model.resourceName]: [opts.model.primaryKey]\n };\n },\n {}\n )\n }\n };\n}\n", "import type Controller from '../../../../controller';\n\nimport getDefaultMemberParams from './get-default-member-params';\n\n/**\n * @private\n */\nfunction getDefaultCollectionParams(\n controller: Controller\n): Record<string, unknown> {\n return {\n ...getDefaultMemberParams(controller),\n filter: {},\n sort: 'createdAt',\n page: {\n size: controller.defaultPerPage,\n number: 1\n }\n };\n}\n\nexport default getDefaultCollectionParams;\n", "import Parameter from '../parameter';\nimport ParameterGroup from '../parameter-group';\nimport type Controller from '../../../../controller';\nimport type { ParameterLike } from '../interfaces';\nimport { enumerateIncludePaths } from '../../../../serializer/utils/include-tree';\n\n/**\n * @private\n */\nfunction getPageParam(): [string, ParameterLike] {\n return [\n 'page',\n new ParameterGroup(\n [\n ['size', new Parameter({ path: 'page.size', type: 'number' })],\n ['number', new Parameter({ path: 'page.number', type: 'number' })]\n ],\n {\n path: 'page'\n }\n )\n ];\n}\n\n/**\n * @private\n */\nfunction getSortParam({ sort }: Controller): [string, ParameterLike] {\n return [\n 'sort',\n new Parameter({\n path: 'sort',\n type: 'string',\n\n values: [...sort, ...sort.map(value => `-${value}`)]\n })\n ];\n}\n\n/**\n * @private\n */\nfunction getFilterParam({ filter }: Controller): [string, ParameterLike] {\n return [\n 'filter',\n new ParameterGroup(\n filter.map(param => [\n param,\n new Parameter({\n path: `filter.${param}`\n })\n ]),\n {\n path: 'filter'\n }\n )\n ];\n}\n\n/**\n * @private\n */\nfunction getFieldsParam(controller: Controller): [string, ParameterLike] {\n const { model, serializer } = controller;\n const { hasOne, hasMany, attributes } = serializer;\n const relationships = [...hasOne, ...hasMany];\n\n return [\n 'fields',\n new ParameterGroup(\n [\n [\n model.resourceName,\n new Parameter({\n path: `fields.${model.resourceName}`,\n type: 'array',\n values: attributes,\n sanitize: true\n })\n ],\n ...relationships.reduce<Array<[string, ParameterLike]>>(\n (result, relationship) => {\n const opts = model.relationshipFor(relationship);\n\n if (opts) {\n return [\n ...result,\n\n [\n opts.model.resourceName,\n new Parameter({\n path: `fields.${opts.model.resourceName}`,\n type: 'array',\n sanitize: true,\n\n values: [\n opts.model.primaryKey,\n ...controller.serializerFor(opts.model).attributes\n ]\n })\n ]\n ];\n }\n\n return result;\n },\n []\n )\n ],\n {\n path: 'fields',\n sanitize: true\n }\n )\n ];\n}\n\n/**\n * @private\n */\nfunction getIncludeParam(controller: Controller): [string, ParameterLike] {\n const { model, maxIncludeDepth, serializer } = controller;\n const { hasOne, hasMany } = serializer;\n const relationships = [...hasOne, ...hasMany];\n\n return [\n 'include',\n new Parameter({\n path: 'include',\n type: 'array',\n // Every top level name stays allowed (as before), plus the nested paths\n // (`comments.user`) reachable through each related serializer in the\n // controller's namespace (at every level, even below a root fallback\n // serializer), down to the controller's `maxIncludeDepth`.\n values: Array.from(\n new Set([\n ...relationships,\n ...enumerateIncludePaths(\n model,\n relationships,\n maxIncludeDepth,\n related => controller.serializerFor(related)\n )\n ])\n )\n })\n ];\n}\n\n/**\n * @private\n */\nexport function getCustomParams({\n query\n}: Controller): Array<[string, ParameterLike]> {\n return query.map((param): [string, ParameterLike] => [\n param,\n new Parameter({\n path: param\n })\n ]);\n}\n\n/**\n * @private\n */\nexport function getMemberQueryParams(\n controller: Controller\n): Array<[string, ParameterLike]> {\n if (controller.hasModel) {\n return [\n getFieldsParam(controller),\n getIncludeParam(controller),\n ...getCustomParams(controller)\n ];\n }\n\n return getCustomParams(controller);\n}\n\n/**\n * @private\n */\nexport function getCollectionQueryParams(\n controller: Controller\n): Array<[string, ParameterLike]> {\n if (controller.hasModel) {\n return [\n getPageParam(),\n getSortParam(controller),\n getFilterParam(controller),\n getFieldsParam(controller),\n getIncludeParam(controller),\n ...getCustomParams(controller)\n ];\n }\n\n return getCustomParams(controller);\n}\n", "import { ClientGeneratedIdError } from '../errors';\n\n/**\n * Reject `data.id` on a create request before the parameter tree runs, so it\n * is answered with 403 (unsupported client-generated ID) rather than the 400\n * an unknown member gets.\n *\n * @private\n */\nexport default function validateClientId(params: Record<string, unknown>) {\n const { data } = params;\n\n if (data && typeof data === 'object' && Reflect.has(data, 'id')) {\n throw new ClientGeneratedIdError();\n }\n\n return true;\n}\n", "import { ResourceMismatchError } from '../errors';\nimport type { Request } from '../../../../server';\n\n/**\n * @private\n */\nexport default function validateResourceId({\n params: {\n id,\n data: { id: resourceId }\n }\n}: Request): true {\n if (id !== resourceId) {\n throw new ResourceMismatchError('data.id', String(id), String(resourceId));\n }\n\n return true;\n}\n", "import type Controller from '../../../controller';\n\nimport ParameterGroup from './parameter-group';\nimport getURLParams from './utils/get-url-params';\nimport getDataParams from './utils/get-data-params';\nimport getDefaultMemberParams from './utils/get-default-member-params';\nimport getDefaultCollectionParams from './utils/get-default-collection-params';\nimport type { Params$opts } from './interfaces';\nimport {\n getMemberQueryParams,\n getCollectionQueryParams,\n getCustomParams\n} from './utils/get-query-params';\n\n/**\n * @private\n */\nexport function paramsFor({\n type,\n method,\n controller,\n dynamicSegments\n}: Params$opts) {\n let params = getURLParams(dynamicSegments);\n\n if (type === 'member') {\n params = [...params, ...getMemberQueryParams(controller)];\n\n if (method === 'POST' || method === 'PATCH') {\n params = [...params, getDataParams(controller, method, true)];\n }\n } else if (type === 'collection') {\n params = [...params, ...getCollectionQueryParams(controller)];\n\n if (method === 'POST' || method === 'PATCH') {\n params = [...params, getDataParams(controller, method, false)];\n }\n } else if (type === 'custom') {\n params = [...params, ...getCustomParams(controller)];\n }\n\n return new ParameterGroup(params, {\n path: '',\n required: true\n });\n}\n\n/**\n * @private\n */\nexport function defaultParamsFor({\n type,\n controller\n}: {\n type: string;\n controller: Controller;\n}): Record<string, unknown> {\n const { hasModel } = controller;\n\n if (hasModel && type === 'member') {\n return getDefaultMemberParams(controller);\n } else if (hasModel && type === 'collection') {\n return getDefaultCollectionParams(controller);\n }\n\n return {};\n}\n\nexport { default as validateClientId } from './utils/validate-client-id';\nexport { default as validateResourceId } from './utils/validate-resource-id';\n\nexport type { ParameterLike, ParameterLike$opts } from './interfaces';\nexport type { default as Parameter } from './parameter';\nexport type { default as ParameterGroup } from './parameter-group';\n", "/**\n * @private\n */\nexport default function getStaticPath(\n path: string,\n dynamicSegments: Array<string>\n): string {\n let staticPath = path;\n\n if (dynamicSegments.length) {\n const pattern = new RegExp(`(${dynamicSegments.join('|')})`, 'g');\n\n staticPath = path.replace(pattern, 'dynamic');\n }\n\n return staticPath;\n}\n", "export const DYNAMIC_PATTERN = /(:\\w+)/g;\n", "import { DYNAMIC_PATTERN } from '../constants';\nimport insert from '../../../../utils/insert';\n\n/**\n * @private\n */\nexport default function getDynamicSegments(path: string): Array<string> {\n const matches = path.match(DYNAMIC_PATTERN) || [];\n const dynamicSegments: Array<string> = new Array(matches.length);\n\n insert(\n dynamicSegments,\n matches.map(part => part.substr(1))\n );\n Object.freeze(dynamicSegments);\n\n return dynamicSegments;\n}\n", "import { FreezeableSet, freezeProps, deepFreezeProps } from '../../freezeable';\nimport type Controller from '../../controller';\nimport type { Request, Response, Request$method } from '../../server';\n\nimport { FINAL_HANDLER, createAction } from './action';\nimport {\n paramsFor,\n defaultParamsFor,\n validateClientId,\n validateResourceId\n} from './params';\nimport getStaticPath from './utils/get-static-path';\nimport getDynamicSegments from './utils/get-dynamic-segments';\nimport type { Action } from './action';\nimport type { ParameterGroup } from './params';\nimport type { Route$opts } from './interfaces';\n\n/**\n * @private\n */\nclass Route extends FreezeableSet<Action<unknown>> {\n declare type: string;\n\n declare path: string;\n\n declare action: string;\n\n declare params: ParameterGroup;\n\n declare method: Request$method;\n\n declare controller: Controller;\n\n declare staticPath: string;\n\n declare defaultParams: Record<string, unknown>;\n\n declare dynamicSegments: Array<string>;\n\n constructor({ type, path, action, method, controller }: Route$opts) {\n const dynamicSegments = getDynamicSegments(path);\n\n if (action && controller) {\n const handler = Reflect.get(controller, action);\n\n if (typeof handler === 'function') {\n const params = paramsFor({\n type,\n method,\n controller,\n dynamicSegments\n });\n\n const staticPath = getStaticPath(path, dynamicSegments);\n\n const defaultParams = defaultParamsFor({\n type,\n controller\n });\n\n super(createAction(type, handler, controller));\n\n Object.assign(this, {\n type,\n path,\n params,\n action,\n method,\n controller,\n staticPath,\n defaultParams,\n dynamicSegments\n });\n\n freezeProps(this, true, 'type', 'path');\n\n freezeProps(\n this,\n false,\n 'action',\n 'params',\n 'method',\n 'controller',\n 'staticPath'\n );\n\n deepFreezeProps(this, false, 'defaultParams', 'dynamicSegments');\n } else {\n const {\n constructor: { name: controllerName }\n } = controller;\n\n throw new TypeError(\n `Handler for ${controllerName}#${action} is not a function.`\n );\n }\n } else {\n throw new TypeError(\n 'Arguments `controller` and `action` must not be undefined'\n );\n }\n\n this.freeze();\n }\n\n parseParams(params: Array<string>): Record<string, number> {\n return params.reduce<Record<string, number>>((result, value, idx) => {\n const key = this.dynamicSegments[idx];\n\n if (key) {\n return {\n ...result,\n [key]: Number.parseInt(value, 10)\n };\n }\n\n return result;\n }, {});\n }\n\n async execHandlers(req: Request, res: Response): Promise<unknown> {\n let calledFinal = false;\n let data: unknown;\n\n for (const handler of this) {\n data = await handler(req, res, data);\n\n if (handler.name === FINAL_HANDLER) {\n calledFinal = true;\n }\n\n if (!calledFinal && typeof data !== 'undefined') {\n break;\n }\n }\n\n return data;\n }\n\n async visit(req: Request, res: Response): Promise<unknown> {\n const { defaultParams } = this;\n let params = {\n ...req.params,\n ...this.parseParams(req.url.params)\n };\n\n if (this.action === 'create' && req.method === 'POST') {\n validateClientId(params);\n }\n\n if (req.method !== 'OPTIONS') {\n params = this.params.validate(params);\n }\n\n Object.assign(req, {\n params,\n defaultParams\n });\n\n if (this.type === 'member' && req.method === 'PATCH') {\n validateResourceId(req);\n }\n\n return this.execHandlers(req, res);\n }\n}\n\nexport default Route;\nexport { DYNAMIC_PATTERN } from './constants';\n\nexport type { Action } from './action';\nexport type { Route$opts, Route$type } from './interfaces';\n", "import { BUILT_IN_ACTIONS, type Controller$builtIn } from '../../../controller';\n\n/**\n * @private\n */\nexport default function normalizeOnly(\n only: Array<Controller$builtIn>\n): Array<Controller$builtIn> {\n return only.filter(action => BUILT_IN_ACTIONS.indexOf(action) >= 0);\n}\n", "import Namespace from '../namespace';\nimport { FreezeableSet } from '../../freezeable';\nimport type { Controller$builtIn } from '../../controller';\n\nimport normalizeOnly from './utils/normalize-only';\nimport type { Resource$opts } from './interfaces';\n\n/**\n * @private\n */\nclass Resource extends Namespace {\n declare only: FreezeableSet<Controller$builtIn>;\n\n constructor({ only, ...opts }: Resource$opts) {\n super(opts);\n\n Reflect.defineProperty(this, 'only', {\n value: new FreezeableSet(normalizeOnly(only)),\n writable: false,\n enumerable: false,\n configurable: false\n });\n\n this.only.freeze();\n }\n}\n\nexport default Resource;\n\nexport type { Resource$opts } from './interfaces';\n", "/**\n * @private\n */\nclass ControllerMissingError extends ReferenceError {\n constructor(resource: string) {\n super(`Could not resolve controller by name '${resource}'`);\n }\n}\n\nexport default ControllerMissingError;\n", "import { Route } from '../../../index';\nimport { normalizeName, normalizePath } from '../../../namespace';\nimport type { Request$method } from '../../../../server';\nimport type { Router$Namespace, Route$type } from '../../../index';\n\n/**\n * @private\n */\nexport default function createDefinition({\n type,\n method,\n namespace\n}: {\n type: Route$type;\n method: Request$method;\n namespace: Router$Namespace;\n}) {\n return function define(name: string, action: string = normalizeName(name)) {\n const normalized = normalizeName(name);\n const { controller } = namespace;\n let { path } = namespace;\n\n if (type === 'member') {\n path += `/:id/${normalized}`;\n } else {\n path += `/${normalized}`;\n }\n\n path = normalizePath(path);\n\n const opts = {\n type,\n path,\n action,\n method,\n controller\n };\n\n namespace\n .add(new Route(opts))\n .add(\n new Route({\n ...opts,\n type: 'custom',\n method: 'HEAD',\n action: 'preflight'\n })\n )\n .add(\n new Route({\n ...opts,\n type: 'custom',\n method: 'OPTIONS',\n action: 'preflight'\n })\n );\n };\n}\n", "import { REQUEST_METHODS } from '../../../../server';\nimport type { Route$type, Router$Namespace } from '../../../index';\n\nimport createDefinition from './create-definition';\n\ntype DefinitionFn = (name: string, action?: string) => void;\n\n/**\n * @private\n */\nexport default function createDefinitionGroup<T extends Router$Namespace>(\n type: Route$type,\n namespace: T\n): Record<string, DefinitionFn> {\n return REQUEST_METHODS.reduce<Record<string, DefinitionFn>>(\n (methods, method) => ({\n ...methods,\n [method.toLowerCase()]: createDefinition({\n type,\n method,\n namespace\n })\n }),\n {}\n );\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * Normalizes the overloaded `resource(name, opts?, builder?)` argument forms\n * the public route DSL accepts. The input tuple is genuinely untyped until this\n * function resolves it into the structured `[opts, builder]` return shape.\n */\nimport {\n BUILT_IN_ACTIONS,\n type Controller$builtIn\n} from '../../../../controller';\n\n/**\n * @private\n */\nexport default function normalizeResourceArgs(args: Array<any>): [\n {\n name: string;\n path: string;\n only: Array<Controller$builtIn>;\n },\n () => void\n] {\n const [name] = args;\n let [, opts, builder] = args;\n\n if (!opts) {\n opts = {\n path: '',\n only: undefined\n };\n }\n\n if (typeof opts === 'function') {\n builder = opts;\n opts = {\n path: '',\n only: undefined\n };\n }\n\n if (typeof builder !== 'function') {\n builder = () => undefined;\n }\n\n opts = {\n ...opts,\n name\n };\n\n if (!opts.path) {\n opts = {\n ...opts,\n path: `/${name}`\n };\n }\n\n if (!opts.only) {\n opts = {\n ...opts,\n only: [...BUILT_IN_ACTIONS]\n };\n }\n\n return [opts, builder];\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * This is the route-definition DSL. `DefinitionContext` collects handler\n * methods with genuinely heterogeneous signatures behind a single index\n * signature, and `resource(...args)` accepts the untyped variadic argument\n * forms the public `resource()` route helper supports; both are normalized at\n * the boundary (see normalize-resource-args). Precise typing here would require\n * full variadic modeling for no real safety gain in internal code.\n */\nimport Resource from '../../resource';\nimport Namespace from '../../namespace';\nimport K from '../../../../utils/k';\nimport type { Router$Namespace } from '../../index';\nimport type { Router$DefinitionBuilder } from '../interfaces';\nimport ControllerMissingError from '../../../../errors/controller-missing-error';\n\nimport createDefinitionGroup from './utils/create-definition-group';\nimport normalizeResourceArgs from './utils/normalize-resource-args';\n\nexport type DefinitionContext = {\n [key: string]: (...args: Array<any>) => unknown;\n};\n\n/**\n * @private\n */\nexport function contextFor(build: Router$DefinitionBuilder<Router$Namespace>) {\n return {\n create(namespace: Router$Namespace): DefinitionContext {\n let context: DefinitionContext = {\n member: K,\n resource: K,\n namespace: K,\n collection: K,\n ...createDefinitionGroup('custom', namespace)\n };\n\n if (namespace instanceof Resource) {\n context = {\n ...context,\n\n member(builder: () => void) {\n const childCtx = createDefinitionGroup('member', namespace);\n\n Reflect.apply(builder, childCtx, []);\n },\n\n collection(builder: () => void) {\n const childCtx = createDefinitionGroup('collection', namespace);\n\n Reflect.apply(builder, childCtx, []);\n }\n };\n } else {\n context = {\n ...context,\n\n namespace(name: string, builder?: () => void) {\n const { isRoot, controllers } = namespace;\n let { path } = namespace;\n\n path = isRoot ? `/${name}` : `${path}/${name}`;\n\n const controllerKey = `${path.substr(1)}/application`;\n const controller = controllers.get(controllerKey);\n\n if (!controller) {\n throw new ControllerMissingError(controllerKey);\n }\n\n const child = new Namespace({\n name,\n path,\n namespace,\n controller,\n controllers\n });\n\n build(builder, child);\n namespace.add(child);\n },\n\n resource(...args: Array<any>) {\n const { controllers } = namespace;\n const [opts, builder] = normalizeResourceArgs(args);\n let path;\n\n if (namespace.isRoot) {\n path = opts.path;\n } else {\n path = namespace.path + opts.path;\n }\n\n const controllerKey = path\n .split('/')\n .filter(Boolean)\n .reduce<Array<string>>(\n (arr, str, index, parts) => [\n ...arr,\n index === parts.length - 1 ? opts.name : str\n ],\n []\n )\n .join('/');\n\n const controller = controllers.get(controllerKey);\n\n if (!controller) {\n throw new ControllerMissingError(controllerKey);\n }\n\n const child = new Resource({\n ...opts,\n path,\n namespace,\n controller,\n controllers\n });\n\n build(builder, child);\n namespace.add(child);\n }\n };\n }\n\n return context;\n }\n };\n}\n", "import Route from '../route';\nimport Resource from '../resource';\nimport type Router from '../index';\nimport type { Router$Namespace } from '../index';\n\nimport { contextFor } from './context';\nimport type { DefinitionContext } from './context';\n\n/**\n * @private\n */\nexport function build<T extends Router$Namespace>(\n builder: (() => void) | undefined,\n namespace: T\n): T {\n const context = contextFor(build).create(namespace);\n\n if (namespace instanceof Resource) {\n const { only } = namespace;\n\n context.member(function member(this: DefinitionContext) {\n if (only.has('show')) {\n this.get('/', 'show');\n }\n\n if (only.has('update')) {\n this.patch('/', 'update');\n }\n\n if (only.has('destroy')) {\n this.delete('/', 'destroy');\n }\n });\n\n context.collection(function collection(this: DefinitionContext) {\n if (only.has('index')) {\n this.get('/', 'index');\n }\n\n if (only.has('create')) {\n this.post('/', 'create');\n }\n });\n }\n\n if (builder) {\n Reflect.apply(builder, context, []);\n }\n\n return namespace;\n}\n\n/**\n * @private\n */\nexport function define<T extends Router$Namespace>(router: Router, parent: T) {\n parent.forEach(child => {\n if (child instanceof Route) {\n const { method, staticPath } = child;\n\n router.set(`${method}:${staticPath}`, child);\n } else {\n define(router, child);\n }\n });\n}\n", "import type Controller from '../../controller';\n\n/**\n * @private\n */\nexport default function createReplacer(\n controllers: Map<string, Controller>\n): RegExp {\n const names = Array.from(controllers)\n .map(([, controller]) => {\n const { model, namespace } = controller;\n\n if (model) {\n return model.resourceName;\n }\n\n let {\n constructor: { name }\n } = controller;\n\n name = name.replace(/controller/gi, '').toLowerCase();\n\n return namespace\n .split('/')\n .reduce((str, part) => str.replace(new RegExp(part, 'ig'), ''), name);\n })\n .filter((str, idx, arr) => idx === arr.lastIndexOf(str))\n .join('|');\n\n return new RegExp(`(${names})/(\\\\d+)`, 'ig');\n}\n", "import { FreezeableMap } from '../freezeable';\nimport type { Request } from '../server';\n\nimport Namespace from './namespace';\nimport Route, { DYNAMIC_PATTERN } from './route';\nimport { build, define } from './definitions';\nimport createReplacer from './utils/create-replacer';\nimport type { Router$opts } from './interfaces';\n\n/**\n * @private\n */\nclass Router extends FreezeableMap<string, Route> {\n declare replacer: RegExp;\n\n constructor({ routes, controller, controllers }: Router$opts) {\n const definitions = build(\n routes,\n new Namespace({\n controller,\n controllers,\n path: '/',\n name: 'root'\n })\n );\n\n super();\n define(this, definitions);\n\n Reflect.defineProperty(this, 'replacer', {\n value: createReplacer(controllers),\n writable: false,\n enumerable: false,\n configurable: false\n });\n\n this.freeze();\n }\n\n match({ method, url }: Request): void | Route {\n const params: Array<string> = [];\n const staticPath = url.pathname.replace(this.replacer, (str, g1, g2) => {\n params.push(g2);\n return `${g1}/:dynamic`;\n });\n\n Reflect.set(url, 'params', params);\n\n return this.get(`${method}:${staticPath}`);\n }\n}\n\nexport default Router;\nexport { Route, DYNAMIC_PATTERN };\n\nexport type { Router$Namespace } from './interfaces';\nexport type { Resource$opts } from './resource';\nexport type { Namespace$opts } from './namespace';\nexport type { Action, Route$opts, Route$type } from './route';\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * Loads a compiled app bundle (a manifest of user modules keyed by name) and\n * normalizes it into namespaced maps; the module values are genuinely untyped\n * app code (as they were `Object`/`any` in Flow).\n */\nimport { join as joinPath } from 'path';\n\nimport { Migration } from '../../database';\nimport { FreezeableMap } from '../../freezeable';\nimport { createDefaultConfig } from '../../config';\nimport merge from '../../../utils/merge';\nimport chain from '../../../utils/chain';\nimport entries from '../../../utils/entries';\n\nimport formatKey from './format-key';\n\nconst SUFFIX_PATTERN = /^.+(Controller|Down|Serializer|Up)/;\n\ntype Bundle = {\n config: Record<string, any>;\n controllers: FreezeableMap<string, any>;\n migrations: FreezeableMap<string, any>;\n models: FreezeableMap<string, any>;\n serializers: FreezeableMap<string, any>;\n};\n\n/**\n * @private\n */\nfunction normalize(manifest: Record<string, any>): Bundle {\n return entries(manifest).reduce<Bundle>(\n (obj, [key, value]) => {\n if (SUFFIX_PATTERN.test(key)) {\n const suffix = key.replace(SUFFIX_PATTERN, '$1');\n const stripSuffix = (source: string) => source.replace(suffix, '');\n\n switch (suffix) {\n case 'Controller':\n obj.controllers.set(formatKey(key, stripSuffix), value);\n break;\n\n case 'Serializer':\n obj.serializers.set(formatKey(key, stripSuffix), value);\n break;\n\n case 'Up':\n case 'Down':\n obj.migrations.set(\n formatKey(key),\n Reflect.construct(Migration, [value])\n );\n break;\n\n default:\n break;\n }\n } else {\n switch (key) {\n case 'Application':\n case 'routes':\n case 'seed':\n Reflect.set(obj, formatKey(key), value);\n break;\n\n case 'config':\n Reflect.set(obj, 'config', {\n ...merge(createDefaultConfig(), {\n ...obj.config,\n ...value\n })\n });\n break;\n\n case 'database':\n Reflect.set(obj, 'config', {\n ...obj.config,\n database: value\n });\n break;\n\n default:\n obj.models.set(formatKey(key), value);\n break;\n }\n }\n\n return obj;\n },\n {\n config: {},\n controllers: new FreezeableMap(),\n migrations: new FreezeableMap(),\n models: new FreezeableMap(),\n serializers: new FreezeableMap()\n }\n );\n}\n\n/**\n * @private\n */\nexport default function bundleFor(path: string): FreezeableMap<string, any> {\n const manifest: Record<string, any> = Reflect.apply(require, null, [\n joinPath(path, 'dist', 'bundle')\n ]);\n\n return chain(manifest)\n .pipe(normalize)\n .pipe(entries)\n .pipe(pairs => new FreezeableMap<string, any>(pairs))\n .value()\n .freeze();\n}\n", "import { dasherize } from 'inflection';\n\nimport chain from '../../../utils/chain';\nimport underscore from '../../../utils/underscore';\n\nconst NAMESPACE_DELIMITER = /\\$-/g;\n\n/**\n * @private\n */\nexport default function formatKey(\n key: string,\n formatter?: (source: string) => string\n) {\n return chain(key)\n .pipe(str => {\n if (formatter) {\n return formatter(str);\n }\n\n return str;\n })\n .pipe(underscore)\n .pipe(dasherize)\n .pipe(str => str.replace(NAMESPACE_DELIMITER, '/'))\n .value();\n}\n", "import { posix } from 'path';\n\nimport type { Bundle$Namespace } from '../../index';\n\nexport default function closestChild<T>(\n source: Bundle$Namespace<T>,\n key: string\n): T | undefined {\n const [[, result] = []] = Array.from(source)\n .map(([path, value]): [string, T] => [posix.basename(path), value])\n .filter(([resource]) => key === resource);\n\n return result;\n}\n", "import { FreezeableMap } from '../../freezeable';\nimport type { Bundle$Namespace, Bundle$NamespaceGroup } from '../index';\n\n/**\n * @private\n */\nexport function resolve<T>(\n group: Bundle$Namespace<T>\n): Bundle$NamespaceGroup<T> {\n return Array.from(group)\n .map(([key, value]): [string, T, string] => {\n const parts = key.split('/');\n const namespace = parts.slice(0, Math.max(parts.length - 1, 0)).join('/');\n\n if (namespace) {\n return [key.substr(namespace.length + 1), value, namespace];\n }\n\n return [key, value, 'root'];\n })\n .reduce<Bundle$NamespaceGroup<T>>((map, [key, value, namespace]) => {\n let nsValue = map.get(namespace);\n\n if (!nsValue) {\n nsValue = new FreezeableMap();\n }\n\n return map.set(namespace, nsValue.set(key, value));\n }, new FreezeableMap());\n}\n\nexport { default as closestAncestor } from './utils/closest-ancestor';\nexport { default as closestChild } from './utils/closest-child';\n", "import { posix } from 'path';\n\nimport type { Builder$Construct, Builder$ParentBuilder } from '../interfaces';\nimport type { Builder$NamespaceMeta } from '../interfaces';\n\nimport sortByNamespace from './sort-by-namespace';\n\nexport default function createParentBuilder<T>(\n construct: Builder$Construct<T>\n): Builder$ParentBuilder<T> {\n return target =>\n Array.from(target)\n .sort(sortByNamespace)\n .reduce<Array<Builder$NamespaceMeta<T>>>((result, [key, value]) => {\n const parentClass = value.get('application') || null;\n let parent: T | null = null;\n\n if (parentClass) {\n let grandparent: T | null = null;\n\n if (key !== 'root') {\n const found = result.find(namespace => {\n const dirname = posix.dirname(key);\n\n if (namespace.key === 'root') {\n return dirname === '.';\n }\n\n return dirname === namespace.key;\n });\n\n if (found) {\n grandparent = found.parent;\n }\n }\n\n parent = construct(`${key}/application`, parentClass, grandparent);\n }\n\n return [\n ...result,\n {\n key,\n value,\n parent\n }\n ];\n }, []);\n}\n", "import type { Bundle$Namespace } from '../../index';\n\n/**\n * @private\n */\nexport default function sortByNamespace<T>(\n [a]: [string, Bundle$Namespace<T>],\n [b]: [string, Bundle$Namespace<T>]\n): number {\n if (a === 'root') {\n return -1;\n } else if (b === 'root') {\n return 1;\n }\n\n return Math.min(Math.max(a.length - b.length, -1), 1);\n}\n", "import type { Builder$Construct, Builder$ChildrenBuilder } from '../interfaces';\n\nexport default function createChildrenBuilder<T>(\n construct: Builder$Construct<T>\n): Builder$ChildrenBuilder<T> {\n return target =>\n target.map(({ key, value, parent }) =>\n Array.from(value).map(([name, constructor]): [string, T] => {\n const normalized = key === 'root' ? name : `${key}/${name}`;\n\n if (parent && normalized.endsWith('application')) {\n return [normalized, parent];\n }\n\n return [normalized, construct(normalized, constructor, parent)];\n })\n );\n}\n", "import { FreezeableMap } from '../../freezeable';\nimport { resolve } from '../resolver';\nimport chain from '../../../utils/chain';\nimport type { Bundle$Namespace } from '../index';\n\nimport createParentBuilder from './utils/create-parent-builder';\nimport createChildrenBuilder from './utils/create-children-builder';\nimport type { Builder$Class, Builder$Construct } from './interfaces';\n\n/**\n * @private\n */\nexport function build<T>(\n group: Bundle$Namespace<Builder$Class<T>>,\n construct: Builder$Construct<T>\n): Bundle$Namespace<T> {\n return chain(group)\n .pipe(resolve)\n .pipe(createParentBuilder(construct))\n .pipe(createChildrenBuilder(construct))\n .pipe(arr =>\n arr.reduce<Array<[string, T]>>(\n (result, value) => [...result, ...value],\n []\n )\n )\n .pipe(pairs => new FreezeableMap(pairs))\n .value();\n}\n", "import bundleFor from './utils/bundle-for';\nimport type { Loader } from './interfaces';\n\n/**\n * @private\n */\nexport function createLoader(path: string): Loader {\n let bundle: ReturnType<typeof bundleFor> | undefined;\n\n return function load(type) {\n if (!bundle) {\n bundle = bundleFor(path);\n }\n\n return bundle.get(type);\n };\n}\n\nexport { build } from './builder';\nexport { closestAncestor, closestChild } from './resolver';\n\nexport type {\n Loader,\n Bundle$Namespace,\n Bundle$NamespaceGroup\n} from './interfaces';\n", "/**\n * @private\n */\nexport default function normalizePort(port?: string | number): number {\n switch (typeof port) {\n case 'string':\n return Number.parseInt(port, 10);\n\n case 'number':\n return Math.abs(port);\n\n default:\n return 4000;\n }\n}\n", "import { posix } from 'path';\n\nimport { deepFreezeProps } from '../../freezeable';\nimport { closestAncestor } from '../../loader';\nimport { tryCatchSync } from '../../../utils/try-catch';\nimport type Database from '../../database';\nimport type { Model, ModelClass } from '../../database';\nimport type Controller from '../../controller';\nimport type Serializer from '../../serializer';\nimport type { Bundle$Namespace } from '../../loader';\nimport type { Application$Class } from '../index';\n\nexport default function createController<T extends Controller>(\n constructor: Application$Class<T>,\n opts: {\n key: string;\n store: Database;\n parent?: Controller | null;\n serializers: Bundle$Namespace<Serializer<Model>>;\n }\n): T {\n const { key, store, serializers } = opts;\n const namespace = posix.dirname(key).replace('.', '');\n let { parent } = opts;\n let model: ModelClass | null | undefined = tryCatchSync(() =>\n store.modelFor(posix.basename(key))\n );\n let serializer = serializers.get(key);\n\n if (!model) {\n model = null;\n }\n\n if (!parent) {\n parent = null;\n }\n\n if (!serializer) {\n serializer = closestAncestor(serializers, key);\n }\n\n const instance: T = Reflect.construct(constructor, [\n {\n model,\n namespace,\n serializer\n }\n ]);\n\n if (serializer) {\n if (!instance.filter.length) {\n instance.filter = [...serializer.attributes];\n }\n\n if (!instance.sort.length) {\n instance.sort = [...serializer.attributes];\n }\n }\n\n if (parent) {\n instance.beforeAction = [\n ...parent.beforeAction.map(fn => fn.bind(parent)),\n ...instance.beforeAction.map(fn => fn.bind(instance))\n ];\n\n instance.afterAction = [\n ...instance.afterAction.map(fn => fn.bind(instance)),\n ...parent.afterAction.map(fn => fn.bind(parent))\n ];\n }\n\n Reflect.defineProperty(instance, 'parent', {\n value: parent,\n writable: false,\n enumerable: true,\n configurable: false\n });\n\n return deepFreezeProps(\n instance,\n true,\n 'query',\n 'sort',\n 'filter',\n 'params',\n 'beforeAction',\n 'afterAction'\n );\n}\n", "import { posix } from 'path';\n\nimport { deepFreezeProps } from '../../freezeable';\nimport { tryCatchSync } from '../../../utils/try-catch';\nimport type Serializer from '../../serializer';\nimport type { Model, ModelClass } from '../../database';\nimport type { Application$Class, Application$factoryOpts } from '../index';\n\nexport default function createSerializer<T extends Serializer<Model>>(\n constructor: Application$Class<T>,\n opts: Application$factoryOpts<T>\n): T {\n const { key, store } = opts;\n const namespace = posix.dirname(key).replace('.', '');\n let { parent } = opts;\n let model: ModelClass | null | undefined = tryCatchSync(() =>\n store.modelFor(posix.basename(key))\n );\n\n if (!model) {\n model = null;\n }\n\n if (!parent) {\n parent = null;\n }\n\n const instance: T = Reflect.construct(constructor, [\n {\n model,\n parent,\n namespace\n }\n ]);\n\n Reflect.defineProperty(instance, 'parent', {\n value: parent,\n writable: false,\n enumerable: true,\n configurable: false\n });\n\n return deepFreezeProps(instance, true, 'hasOne', 'hasMany', 'attributes');\n}\n", "import { posix } from 'path';\n\nimport NamespacedSerializerMissingError from '../../../errors/namespaced-serializer-missing-error';\nimport type Controller from '../../controller';\nimport type Serializer from '../../serializer';\nimport type { Model, ModelClass } from '../../database';\nimport type { Bundle$Namespace } from '../../loader';\n\n// How many relationships away from a controller's own resource `via` is:\n// `admin/comments` is 0, `admin/posts?include=comments` is 1.\nconst distance = (via: string): number => {\n const [, include] = via.split('?include=');\n\n return include ? include.split('.').length : 0;\n};\n\n/**\n * Enforce `serializerFallback = false`: for every namespace whose\n * ApplicationController sets it, each type its controllers can serialize \u2014 the\n * resource itself, and everything reachable through `include` (and so\n * `fields`) down to the controller's `maxIncludeDepth` \u2014 must have a\n * Serializer in exactly that namespace. Throws listing every gap, so a missing\n * serializer fails the boot instead of silently falling back to the root one.\n *\n * @private\n */\nexport default function validateNamespacedSerializers(\n controllers: Bundle$Namespace<Controller> | Map<string, Controller>,\n serializers:\n Bundle$Namespace<Serializer<Model>> | Map<string, Serializer<Model>>\n): void {\n const missing = new Map<string, string>();\n\n controllers.forEach((controller, key) => {\n const { namespace, model } = controller;\n\n if (!namespace || !model) {\n return;\n }\n\n const application = controllers.get(posix.join(namespace, 'application'));\n\n if (!application || application.serializerFallback !== false) {\n return;\n }\n\n const require = (type: string, via: string) => {\n const serializerKey = posix.join(namespace, type);\n const serializer = serializers.get(serializerKey);\n\n // Report the most direct way a type is reached: by its own controller,\n // else through the shortest include path of any controller.\n if (!serializer) {\n const known = missing.get(serializerKey);\n\n if (known === undefined || distance(via) < distance(known)) {\n missing.set(serializerKey, via);\n }\n }\n\n return serializer;\n };\n\n const own = require(model.resourceName, key);\n\n if (!own) {\n return;\n }\n\n // Breadth-first, so each gap is reported through its shortest include\n // path. Direct relationships are always includable (and\n // `fields`-selectable), even with a `maxIncludeDepth` below 1.\n const depth = Math.max(controller.maxIncludeDepth, 1);\n let level: Array<[ModelClass, Serializer<Model>, Array<string>]> = [\n [model, own, []]\n ];\n\n for (let current = 1; current <= depth && level.length; current += 1) {\n const next: typeof level = [];\n\n level.forEach(([parent, serializer, path]) => {\n [...serializer.hasOne, ...serializer.hasMany].forEach(name => {\n const opts = parent.relationshipFor(name);\n\n if (!opts) {\n return;\n }\n\n const nextPath = [...path, name];\n const related = require(opts.model\n .resourceName, `${key}?include=${nextPath.join('.')}`);\n\n if (related) {\n next.push([opts.model, related, nextPath]);\n }\n });\n });\n\n level = next;\n }\n });\n\n if (missing.size) {\n throw new NamespacedSerializerMissingError(missing);\n }\n}\n", "/**\n * Thrown at boot when a namespace that opted out of serializer fallback\n * (`serializerFallback = false` on its ApplicationController) can reach a type\n * that has no Serializer in that namespace.\n *\n * @private\n */\nclass NamespacedSerializerMissingError extends ReferenceError {\n /**\n * @param missing - Each missing serializer key (`admin/comments`) with an\n * example of how it is reached (`admin/posts?include=comments`).\n */\n constructor(missing: Map<string, string>) {\n const lines = Array.from(missing)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, via]) => ` - ${key} (reached from ${via})`);\n\n super(\n [\n 'Missing namespaced serializers. These namespaces set ' +\n '`serializerFallback = false`, so every type their controllers ' +\n 'can serialize or include needs a serializer of its own:',\n ...lines\n ].join('\\n')\n );\n }\n}\n\nexport default NamespacedSerializerMissingError;\n", "import { LUMEN_CONSOLE } from '../../constants';\nimport Database from '../database';\nimport Logger from '../logger';\nimport Router from '../router';\nimport Server from '../server';\nimport { build, createLoader, closestChild } from '../loader';\nimport { freezeProps, deepFreezeProps } from '../freezeable';\nimport ControllerMissingError from '../../errors/controller-missing-error';\n\nimport normalizePort from './utils/normalize-port';\nimport createController from './utils/create-controller';\nimport createSerializer from './utils/create-serializer';\nimport validateNamespacedSerializers from './utils/validate-namespaced-serializers';\n\nimport type Controller from '../controller';\nimport type Serializer from '../serializer';\nimport type { Model, ModelClass } from '../database';\nimport type Application from './index';\nimport type { Application$opts } from './index';\n\n/**\n * @private\n */\nexport default async function initialize<T extends Application>(\n app: T,\n { path, port, logging, database, server: serverConfig }: Application$opts\n): Promise<T> {\n const load = createLoader(path);\n const routes = load('routes');\n const models = load('models');\n const logger = new Logger(logging);\n const normalizedPort = normalizePort(port);\n\n const store = await new Database({\n path,\n models,\n logger,\n config: database,\n checkMigrations: true\n });\n\n const serializers = build<Serializer<Model>>(\n load('serializers'),\n (key, value, parent) =>\n createSerializer(value, {\n key,\n store,\n parent\n })\n );\n\n // Lets a Serializer resolve related resources' Serializers in its own\n // namespace (`Serializer#serializerFor()`), as Controllers do.\n serializers.forEach((serializer: Serializer<Model>) => {\n Reflect.defineProperty(serializer, 'serializers', {\n value: serializers,\n writable: false,\n enumerable: false,\n configurable: false\n });\n });\n\n models.forEach((model: ModelClass) => {\n Reflect.defineProperty(model, 'serializer', {\n value: closestChild(serializers, model.resourceName),\n writable: false,\n enumerable: false,\n configurable: false\n });\n });\n\n const controllers = build<Controller>(\n load('controllers'),\n (key, value, parent) =>\n createController(value, {\n key,\n store,\n parent,\n serializers\n })\n );\n\n controllers.forEach((controller: Controller) => {\n Reflect.defineProperty(controller, 'controllers', {\n value: controllers,\n writable: true,\n enumerable: false,\n configurable: false\n });\n });\n\n validateNamespacedSerializers(controllers, serializers);\n\n const ApplicationController = controllers.get('application');\n\n if (!ApplicationController) {\n throw new ControllerMissingError('application');\n }\n\n const router = new Router({\n routes,\n controllers,\n controller: ApplicationController\n });\n\n const server = new Server({\n router,\n logger,\n ...serverConfig\n });\n\n if (!LUMEN_CONSOLE) {\n server.instance.listen(normalizedPort).once('listening', () => {\n if (typeof process.send === 'function') {\n process.send('ready');\n } else {\n // 'ready' is a custom lifecycle event, not one of Process's typed\n // emit overloads.\n (process as NodeJS.EventEmitter).emit('ready');\n }\n });\n }\n\n Object.assign(app, {\n logger,\n models,\n controllers,\n serializers\n });\n\n deepFreezeProps(app, true, 'logger', 'models', 'controllers', 'serializers');\n\n Object.assign(app, {\n path,\n store,\n router,\n server,\n port: normalizedPort\n });\n\n freezeProps(app, false, 'path', 'port', 'store', 'router', 'server');\n\n Object.freeze(app);\n\n return app;\n}\n", "import { createDefaultConfig } from '../config';\nimport merge from '../../utils/merge';\nimport type Logger from '../logger';\nimport type Router from '../router';\nimport type Server from '../server';\nimport type Controller from '../controller';\nimport type Serializer from '../serializer';\nimport type Database from '../database';\nimport type { Model, ModelClass } from '../database';\nimport type { FreezeableMap } from '../freezeable';\n\nimport initialize from './initialize';\nimport type { Application$opts } from './interfaces';\n\n/**\n * @class Application\n * @public\n */\nclass Application {\n /**\n * The path of `Application` instance.\n *\n * @property path\n * @type {String}\n * @public\n */\n declare path: string;\n\n /**\n * The port that an `Application` instance is listening for incomming HTTP\n * requests.\n *\n * @property port\n * @type {Number}\n * @public\n */\n declare port: number;\n\n /**\n * A reference to the `Database` instance.\n *\n * @property store\n * @type {Database}\n * @private\n */\n declare store: Database;\n\n /**\n * A reference to the `Logger` instance.\n *\n * @property logger\n * @type {Logger}\n * @private\n */\n declare logger: Logger;\n\n /**\n * A reference to the `Router` instance.\n *\n * @property router\n * @type {Router}\n * @private\n */\n declare router: Router;\n\n /**\n * A reference to the `Server` instance.\n *\n * @property server\n * @type {Server}\n * @private\n */\n declare server: Server;\n\n /**\n * A map containing each `Model` class.\n *\n * @property models\n * @type {Map}\n * @private\n */\n declare models: FreezeableMap<string, ModelClass>;\n\n /**\n * A map containing each `Controller` instance.\n *\n * @property controllers\n * @type {Map}\n * @private\n */\n declare controllers: FreezeableMap<string, Controller>;\n\n /**\n * A map containing each `Serializer` instance.\n *\n * @property serializers\n * @type {Map}\n * @private\n */\n declare serializers: FreezeableMap<string, Serializer<Model>>;\n\n /**\n * @method constructor\n * @param {Object} config\n * @return {Promise}\n * @public\n */\n constructor(opts: Application$opts) {\n // Applications construct asynchronously (see Database/Watcher); `new\n // Application()` resolves to the ready instance, and TS cannot type a\n // Promise-returning constructor.\n return initialize(\n this,\n merge(createDefaultConfig(), opts)\n ) as unknown as Application;\n }\n}\n\nexport default Application;\nexport type {\n Application$opts,\n Application$Class,\n Application$factoryOpts\n} from './interfaces';\n", "import type { Response } from '../../server';\n\n/**\n * Create a Proxy that will trap typical node middleware callback invocations\n * and route them to the appropriate Promise callback (resolve or reject).\n *\n * @private\n */\nexport default function createResponseProxy(\n res: Response,\n resolve: (result: unknown) => void\n): Response {\n return new Proxy(res, {\n get(target, key) {\n switch (key) {\n case 'end':\n case 'send':\n case 'json':\n return resolve;\n\n default:\n return Reflect.get(target, key);\n }\n }\n });\n}\n", "import type { Action } from '../router';\nimport type { Request, Response } from '../server';\n\nimport createResponseProxy from './utils/create-response-proxy';\n\n/**\n * Convert traditional node HTTP server middleware into a lumen compatible\n * function for use in Controller#beforeAction.\n *\n * @module lumen-framework\n * @namespace Lumen\n * @function lumenify\n */\nexport default function lumenify(\n middleware: (req: Request, res: Response, next: (err?: Error) => void) => void\n): Action<unknown> {\n const result = function (req: Request, res: Response) {\n return new Promise<unknown>((resolve, reject) => {\n Reflect.apply(middleware, null, [\n req,\n createResponseProxy(res, resolve),\n (err?: Error) => {\n if (err && err instanceof Error) {\n reject(err);\n } else {\n resolve(undefined);\n }\n }\n ]);\n });\n };\n\n Reflect.defineProperty(result, 'name', {\n value: middleware.name\n });\n\n return result;\n}\n"],
5
- "mappings": "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",
6
- "names": ["yellow", "format", "format", "yellow", "yellow", "stat", "format", "yellow", "green", "yellow", "yellow", "green", "Client", "resolve", "resolve", "initialize", "pluralize", "camelize", "camelize", "singularize", "resolve", "camelize", "singularize", "resolve", "resolve", "camelize", "camelize", "camelize", "camelize", "createRunner", "camelize", "dasherize", "singularize", "normalize", "normalize", "dasherize", "camelize", "singularize", "dasherize", "dasherize", "initialize", "createRunner", "resolve", "pluralize", "initialize", "camelize", "camelize", "dasherize", "camelize", "dasherize", "camelize", "resolve", "hasOwnProperty", "posix", "dasherize", "camelize", "resource", "dasherize", "posix", "validateType", "validateType", "validateOne", "validateType", "resource", "define", "build", "joinPath", "dasherize", "dasherize", "normalize", "joinPath", "posix", "resource", "map", "posix", "posix", "build", "posix", "posix", "posix", "posix", "posix", "posix", "require", "initialize", "build", "initialize", "resolve", "resolve"]
3
+ "sources": ["../src/utils/chalk.ts", "../src/packages/database/constants.ts", "../src/constants.ts", "../src/utils/k.ts", "../src/packages/freezeable/constants.ts", "../src/utils/insert.ts", "../src/utils/is-object.ts", "../src/packages/freezeable/utils/freeze.ts", "../src/packages/freezeable/utils/is-frozen.ts", "../src/packages/freezeable/map/index.ts", "../src/packages/freezeable/set/index.ts", "../src/packages/logger/constants.ts", "../src/packages/logger/errors/invalid-config-error.ts", "../src/packages/logger/writer/index.ts", "../src/packages/logger/utils/error-name.ts", "../src/utils/entries.ts", "../src/utils/omit.ts", "../src/packages/logger/writer/constants.ts", "../src/packages/logger/writer/utils/format-message.ts", "../src/utils/stringify.ts", "../src/packages/template/utils/insert-values.ts", "../src/packages/logger/utils/line.ts", "../src/packages/logger/request-logger/templates.ts", "../src/packages/logger/request-logger/utils/filter-params.ts", "../src/packages/logger/request-logger/utils/params-for.ts", "../src/packages/logger/request-logger/utils/log-text.ts", "../src/packages/logger/request-logger/utils/log-json.ts", "../src/packages/logger/request-logger/index.ts", "../src/packages/logger/index.ts", "../src/packages/database/errors/invalid-driver-error.ts", "../src/packages/database/errors/model-missing-error.ts", "../src/packages/database/errors/migrations-pending-error.ts", "../src/packages/server/utils/create-server-error.ts", "../src/packages/database/errors/unique-constraint-error.ts", "../src/packages/database/errors/config-missing-error.ts", "../src/packages/database/errors/relationship-config-error.ts", "../src/packages/database/initialize.ts", "../src/packages/database/utils/connect.ts", "../src/packages/database/utils/create-migrations.ts", "../src/packages/fs/index.ts", "../src/packages/fs/watcher/index.ts", "../src/packages/fs/watcher/initialize.ts", "../src/utils/try-catch.ts", "../src/packages/fs/utils/create-resolver.ts", "../src/utils/chain.ts", "../src/packages/database/utils/pending-migrations.ts", "../src/packages/database/utils/validate-relationships.ts", "../src/packages/database/utils/normalize-model-name.ts", "../src/utils/compose.ts", "../src/utils/underscore.ts", "../src/packages/database/model/index.ts", "../src/packages/database/query/index.ts", "../src/utils/uniq.ts", "../src/packages/database/query/utils/scopes-for.ts", "../src/packages/database/query/utils/format-select.ts", "../src/packages/database/query/errors/record-not-found-error.ts", "../src/packages/database/query/runner/constants.ts", "../src/packages/database/query/runner/utils/get-find-param.ts", "../src/packages/database/query/runner/utils/build-results.ts", "../src/utils/promise-hash.ts", "../src/packages/database/query/runner/index.ts", "../src/utils/map-to-object.ts", "../src/packages/database/change-set/index.ts", "../src/packages/database/relationship/index.ts", "../src/packages/database/relationship/utils/getters.ts", "../src/packages/database/model/utils/attribute.ts", "../src/packages/database/relationship/utils/unassociate.ts", "../src/utils/is-null.ts", "../src/packages/database/relationship/utils/validate-type.ts", "../src/packages/database/relationship/utils/inverse-setters.ts", "../src/packages/database/relationship/utils/setters.ts", "../src/packages/database/relationship/utils/update-relationship.ts", "../src/utils/proxy.ts", "../src/packages/database/transaction/index.ts", "../src/utils/pick.ts", "../src/utils/diff.ts", "../src/packages/database/model/utils/get-columns.ts", "../src/packages/database/model/utils/persistence.ts", "../src/packages/database/model/initialize-class.ts", "../src/utils/is-undefined.ts", "../src/packages/database/attribute/utils/create-getter.ts", "../src/packages/database/attribute/utils/create-setter.ts", "../src/packages/database/attribute/utils/create-normalizer.ts", "../src/packages/database/attribute/index.ts", "../src/packages/server/utils/source-for.ts", "../src/packages/database/validation/errors/validation-error.ts", "../src/packages/database/validation/index.ts", "../src/packages/server/errors/error-list.ts", "../src/packages/database/model/utils/validate.ts", "../src/packages/database/model/utils/process-write-error.ts", "../src/packages/database/model/utils/run-hooks.ts", "../src/packages/database/migration/index.ts", "../src/packages/database/utils/type-for-column.ts", "../src/packages/database/utils/primary-key-type.ts", "../src/packages/database/index.ts", "../src/packages/controller/index.ts", "../src/packages/server/index.ts", "../src/packages/server/constants.ts", "../src/packages/server/request/index.ts", "../src/packages/server/request/constants.ts", "../src/packages/server/request/parser/utils/parse-nested-object.ts", "../src/packages/server/request/parser/utils/format.ts", "../src/packages/server/request/parser/constants.ts", "../src/utils/transform-keys.ts", "../src/packages/server/request/parser/utils/parse-read.ts", "../src/packages/server/request/parser/errors/malformed-request-error.ts", "../src/packages/server/request/parser/utils/normalize-document.ts", "../src/packages/server/request/parser/utils/parse-write.ts", "../src/packages/server/request/parser/index.ts", "../src/packages/server/request/utils/get-domain.ts", "../src/packages/server/response/index.ts", "../src/packages/server/utils/status-for-error.ts", "../src/packages/jsonapi/constants.ts", "../src/packages/jsonapi/errors/not-acceptable-error.ts", "../src/packages/jsonapi/errors/unsupported-media-type-error.ts", "../src/packages/jsonapi/errors/invalid-content-type-error.ts", "../src/packages/jsonapi/utils/media-type.ts", "../src/packages/jsonapi/utils/is-jsonapi.ts", "../src/packages/jsonapi/utils/has-media-type-params.ts", "../src/utils/env.ts", "../src/packages/server/responder/utils/data-for.ts", "../src/packages/server/responder/utils/normalize.ts", "../src/packages/server/responder/utils/has-content-type.ts", "../src/packages/server/responder/utils/content-type-for.ts", "../src/packages/server/responder/index.ts", "../src/packages/server/errors/method-not-allowed-error.ts", "../src/packages/server/utils/validate-accept.ts", "../src/packages/server/utils/validate-content-type.ts", "../src/packages/server/utils/set-cors-headers.ts", "../src/packages/server/utils/request-id-for.ts", "../src/packages/server/utils/client-ip-for.ts", "../src/utils/merge.ts", "../src/packages/controller/utils/params-to-query.ts", "../src/packages/controller/utils/find-one.ts", "../src/packages/controller/utils/find-many.ts", "../src/packages/controller/utils/resolve-relationships.ts", "../src/packages/controller/errors/related-record-not-found-error.ts", "../src/packages/controller/visibility/errors.ts", "../src/packages/controller/visibility/index.ts", "../src/packages/controller/utils/validate-relationships.ts", "../src/packages/controller/constants.ts", "../src/packages/serializer/index.ts", "../src/packages/loader/resolver/utils/closest-ancestor.ts", "../src/packages/serializer/utils/load-linkage.ts", "../src/packages/serializer/utils/include-tree.ts", "../src/packages/config/index.ts", "../src/packages/application/initialize.ts", "../src/packages/router/namespace/utils/normalize-name.ts", "../src/packages/router/namespace/utils/normalize-path.ts", "../src/packages/router/namespace/index.ts", "../src/packages/router/route/action/utils/create-page-links.ts", "../src/packages/router/route/action/enhancers/resource.ts", "../src/packages/router/route/action/constants.ts", "../src/packages/router/route/action/utils/get-action-name.ts", "../src/packages/router/route/action/utils/get-controller-name.ts", "../src/packages/router/route/action/enhancers/track-perf.ts", "../src/packages/router/route/action/index.ts", "../src/packages/router/route/params/errors/parameter-type-error.ts", "../src/packages/router/route/params/errors/parameter-value-error.ts", "../src/packages/router/route/params/errors/invalid-parameter-error.ts", "../src/packages/router/route/params/errors/resource-mismatch-error.ts", "../src/packages/router/route/params/errors/parameter-required-error.ts", "../src/packages/router/route/params/errors/client-generated-id-error.ts", "../src/packages/router/route/params/errors/parameter-range-error.ts", "../src/packages/router/route/params/errors/forbidden-parameter-error.ts", "../src/packages/router/route/params/errors/parameter-not-nullable-error.ts", "../src/utils/is-buffer.ts", "../src/packages/router/route/params/utils/validate-type.ts", "../src/packages/router/route/params/parameter/utils/validate-range.ts", "../src/packages/router/route/params/parameter/utils/validate-value.ts", "../src/packages/router/route/params/parameter/index.ts", "../src/packages/router/route/params/parameter/ignored-parameter.ts", "../src/packages/router/route/params/parameter-group/utils/missing-params.ts", "../src/packages/router/route/params/parameter-group/index.ts", "../src/packages/router/route/params/utils/get-url-params.ts", "../src/packages/router/route/params/parameter/forbidden-parameter.ts", "../src/packages/router/route/params/utils/parse-column-value.ts", "../src/packages/router/route/params/utils/get-data-params.ts", "../src/packages/router/route/params/utils/get-default-member-params.ts", "../src/packages/router/route/params/utils/get-default-collection-params.ts", "../src/packages/router/route/params/utils/get-query-params.ts", "../src/packages/router/route/params/utils/validate-client-id.ts", "../src/packages/router/route/params/utils/validate-resource-id.ts", "../src/packages/router/route/params/index.ts", "../src/packages/router/route/constants.ts", "../src/packages/router/route/utils/get-static-path.ts", "../src/packages/router/route/utils/get-dynamic-segments.ts", "../src/packages/router/route/index.ts", "../src/packages/router/definitions/index.ts", "../src/packages/router/resource/utils/normalize-only.ts", "../src/packages/router/resource/index.ts", "../src/errors/controller-missing-error.ts", "../src/packages/router/definitions/context/utils/create-definition.ts", "../src/packages/router/definitions/context/utils/create-definition-group.ts", "../src/packages/router/definitions/context/utils/normalize-resource-args.ts", "../src/packages/router/definitions/context/index.ts", "../src/packages/router/utils/create-replacer.ts", "../src/packages/router/index.ts", "../src/packages/loader/utils/bundle-for.ts", "../src/packages/loader/utils/format-key.ts", "../src/packages/loader/resolver/utils/closest-child.ts", "../src/packages/loader/resolver/index.ts", "../src/packages/loader/builder/utils/create-parent-builder.ts", "../src/packages/loader/builder/utils/sort-by-namespace.ts", "../src/packages/loader/builder/utils/create-children-builder.ts", "../src/packages/loader/builder/index.ts", "../src/packages/loader/index.ts", "../src/packages/application/utils/normalize-port.ts", "../src/packages/application/utils/create-controller.ts", "../src/packages/application/utils/create-serializer.ts", "../src/packages/application/utils/validate-namespaced-serializers.ts", "../src/errors/namespaced-serializer-missing-error.ts", "../src/packages/application/utils/validate-links-only.ts", "../src/errors/links-only-error.ts", "../src/errors/unknown-attribute-error.ts", "../src/packages/application/utils/validate-attributes.ts", "../src/errors/reserved-field-name-error.ts", "../src/packages/application/utils/validate-reserved-names.ts", "../src/packages/application/utils/resolve-visibility.ts", "../src/packages/application/utils/restrict-open-namespaces.ts", "../src/packages/application/utils/warn-query-param-names.ts", "../src/packages/application/index.ts", "../src/packages/lumenify/utils/create-response-proxy.ts", "../src/packages/lumenify/index.ts"],
4
+ "sourcesContent": ["import { Chalk } from 'chalk';\n\n/**\n * The framework's chalk instance \u2014 equivalent to chalk's default export, which\n * is itself a `Chalk` built without options (same colour-level detection).\n *\n * Built from the *named* `Chalk` export on purpose. chalk is ESM-only from v5\n * on, and the app compiler re-bundles `dist/index.mjs` to CommonJS. Importing\n * from an ES module, esbuild gives a default import Node's CommonJS semantics\n * (the whole `require()` result), and `require()` of an ES module returns its\n * namespace \u2014 so `import chalk from 'chalk'` would make `chalk.yellow`\n * undefined inside an app. Named imports resolve correctly either way. An\n * ESLint rule keeps the default import out of `src/`.\n *\n * @private\n */\nconst chalk = new Chalk();\n\nexport default chalk;\n", "// Driver error codes and messages for a unique-constraint violation: pg\n// (`23505`, \"duplicate key value violates unique constraint\"), mysql\n// (`ER_DUP_ENTRY`), sqlite (\"UNIQUE constraint failed\") and mssql\n// (\"Violation of UNIQUE KEY constraint\"). No `g` flag \u2014 `.test()` on a\n// global regex is stateful and would miss every other match.\nexport const UNIQUE_CONSTRAINT_CODES = new Set(['23505', 'ER_DUP_ENTRY']);\nexport const UNIQUE_CONSTRAINT = /unique(\\s+key)?\\s+constraint|duplicate key/i;\n\n// The SQLite client. (`sqlite3`, node-sqlite3, is unmaintained since its\n// 6.0.0; `InvalidDriverError` says how to switch.)\nexport const SQLITE_DRIVER = 'better-sqlite3';\n\n// knex 3 clients Lumen accepts.\nexport const VALID_DRIVERS = ['pg', SQLITE_DRIVER, 'mssql', 'mysql', 'mysql2'];\n\nexport const TYPE_ALIASES = new Map([\n ['enu', 'array'],\n ['enum', 'array'],\n\n ['json', 'object'],\n ['jsonb', 'object'],\n\n ['binary', 'buffer'],\n\n ['bool', 'boolean'],\n ['boolean', 'boolean'],\n\n ['time', 'date'],\n ['date', 'date'],\n ['datetime', 'date'],\n\n ['text', 'string'],\n ['uuid', 'string'],\n ['string', 'string'],\n ['varchar', 'string'],\n\n ['int', 'number'],\n ['float', 'number'],\n ['integer', 'number'],\n ['decimal', 'number'],\n ['floating', 'number'],\n ['bigInteger', 'number']\n]);\n", "import { platform } from 'os';\n\nconst { env: ENV } = process;\n\nexport const CWD = process.cwd();\n\n// NOTE: the Flow original derived this via a `cluster.worker.pid` check, but\n// Node's `Worker` has no `pid` property \u2014 the pid lives at\n// `worker.process.pid` \u2014 so `typeof worker.pid === 'number'` was always false\n// and the branch never ran. It was a no-op either way: inside a worker process\n// `worker.process.pid` *is* `process.pid`. Simplified rather than preserving\n// dead code; behaviour is unchanged.\nexport const PID = process.pid;\n\n// `ENV.PORT` is `string | undefined`; `parseInt(undefined)` yields NaN, which\n// the `||` below turns into the default.\nexport const PORT = parseInt(ENV.PORT ?? '', 10) || 4000;\nexport const NODE_ENV = ENV.NODE_ENV || 'development';\nexport const DATABASE_URL = ENV.DATABASE_URL;\nexport const LUMEN_CONSOLE = ENV.LUMEN_CONSOLE || false;\nexport const PLATFORM = platform();\n", "/**\n * A utility function that always returns `this` based on it's current\n * context.\n *\n * A common use case for the K function is a default parameter for optional\n * callback functions or general function arguments.\n *\n * @private\n */\nexport default function K(this: unknown): unknown {\n return this;\n}\n", "export const FREEZER = new WeakSet<object>();\n", "/**\n * @private\n */\nexport default function insert<T, U extends T[]>(target: U, items: T[]): U {\n for (let i = 0; i < items.length; i += 1) {\n target.splice(i, 1, items[i]);\n }\n\n return target;\n}\n", "/**\n * Determine wether or not a value is an Object.\n *\n * @example\n * const a = null;\n * const b = [];\n * const c = {};\n *\n * console.log(typeof a, typeof b, typeof c);\n * // => 'object', 'object', 'object' \uD83D\uDC4E\n *\n * console.log(isObject(a), isObject(b), isObject(c));\n * // => false, false, true \uD83D\uDC4D\n *\n * @private\n */\nexport default function isObject(\n value: unknown\n): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n", "import { FREEZER } from '../constants';\nimport insert from '../../../utils/insert';\nimport isObject from '../../../utils/is-object';\n\n/**\n * Anything exposing a `freeze` method \u2014 in practice FreezeableMap/FreezeableSet.\n *\n * @internal\n */\ninterface Freezeable {\n freeze(deep?: boolean): unknown;\n}\n\nfunction isFreezeable(value: unknown): value is Freezeable {\n return Boolean(value) && typeof (value as Freezeable).freeze === 'function';\n}\n\n/** @internal */\nexport default function freeze<T extends object>(value: T): T {\n FREEZER.add(value);\n return value;\n}\n\n/** @internal */\nexport function freezeArray<T>(target: T[]): readonly T[] {\n const result = insert(new Array<T>(target.length), target);\n\n return Object.freeze(result);\n}\n\n/** @internal */\nexport function freezeValue<T>(value: T): T {\n if (isFreezeable(value)) {\n return Object.freeze(value).freeze(true) as T;\n } else if (isObject(value)) {\n return Object.freeze(value) as T;\n }\n\n return value;\n}\n\n/** @internal */\nexport function freezeProps<T extends object>(\n target: T,\n makePublic: boolean,\n ...props: string[]\n): T {\n Object.defineProperties(\n target,\n props.reduce<PropertyDescriptorMap>(\n (obj, key) => ({\n ...obj,\n [key]: {\n value: (target as Record<string, unknown>)[key],\n writable: false,\n enumerable: makePublic,\n configurable: false\n }\n }),\n {}\n )\n );\n\n return target;\n}\n\n/** @internal */\nexport function deepFreezeProps<T extends object>(\n target: T,\n makePublic: boolean,\n ...props: string[]\n): T {\n Object.defineProperties(\n target,\n props.reduce<PropertyDescriptorMap>((obj, key) => {\n let value = (target as Record<string, unknown>)[key];\n\n if (Array.isArray(value)) {\n value = freezeArray(value);\n } else {\n value = freezeValue(value);\n }\n\n return {\n ...obj,\n [key]: {\n value,\n writable: false,\n enumerable: makePublic,\n configurable: false\n }\n };\n }, {})\n );\n\n return target;\n}\n", "import { FREEZER } from '../constants';\n\n/** @internal */\nexport default function isFrozen(value: unknown): boolean {\n // `WeakSet#has` returns false for non-objects rather than throwing, so this\n // keeps the original behaviour of accepting any value.\n return FREEZER.has(value as object);\n}\n", "import freeze from '../utils/freeze';\nimport isFrozen from '../utils/is-frozen';\n\n/** @internal */\nclass FreezeableMap<K, V> extends Map<K, V> {\n override set(key: K, value: V): this {\n if (!this.isFrozen()) {\n super.set(key, value);\n }\n\n return this;\n }\n\n override clear(): void {\n if (!this.isFrozen()) {\n super.clear();\n }\n }\n\n override delete(key: K): boolean {\n return this.isFrozen() ? false : super.delete(key);\n }\n\n freeze(deep?: boolean): this {\n if (deep) {\n this.forEach(Object.freeze);\n }\n\n return freeze(this);\n }\n\n isFrozen(): boolean {\n return isFrozen(this);\n }\n}\n\nexport default FreezeableMap;\n", "import freeze from '../utils/freeze';\nimport isFrozen from '../utils/is-frozen';\n\n/** @internal */\nclass FreezeableSet<T> extends Set<T> {\n override add(value: T): this {\n if (!this.isFrozen()) {\n super.add(value);\n }\n\n return this;\n }\n\n override clear(): void {\n if (!this.isFrozen()) {\n super.clear();\n }\n }\n\n override delete(value: T): boolean {\n return this.isFrozen() ? false : super.delete(value);\n }\n\n freeze(deep?: boolean): this {\n if (deep) {\n this.forEach(Object.freeze);\n }\n\n return freeze(this);\n }\n\n isFrozen(): boolean {\n return isFrozen(this);\n }\n}\n\nexport default FreezeableSet;\n", "import { FreezeableMap, FreezeableSet } from '../freezeable';\n\nimport type { LogLevel, LogFormat } from './interfaces';\n\nexport const DEBUG = 'DEBUG';\nexport const INFO = 'INFO';\nexport const WARN = 'WARN';\nexport const ERROR = 'ERROR';\n\nexport const FORMATS: FreezeableSet<LogFormat> = new FreezeableSet<LogFormat>([\n 'text',\n 'json'\n]);\n\nFORMATS.freeze();\n\nexport const LEVELS: FreezeableMap<LogLevel, number> = new FreezeableMap<\n LogLevel,\n number\n>([\n [DEBUG, 0],\n [INFO, 1],\n [WARN, 2],\n [ERROR, 3]\n]);\n\nLEVELS.freeze();\n", "/** @internal */\nclass InvalidConfigError extends Error {\n constructor(key: string, value: unknown, allowed: Iterable<string>) {\n super(\n `Invalid logging.${key} ${JSON.stringify(value)}; expected one of: ` +\n `${Array.from(allowed).join(', ')}.`\n );\n }\n}\n\nexport default InvalidConfigError;\n", "import { WriteStream } from 'tty';\n\nimport chalk from '../../../utils/chalk';\nimport { WARN, ERROR } from '../constants';\nimport errorName from '../utils/error-name';\nimport omit from '../../../utils/omit';\nimport type { LogFormat } from '../interfaces';\n\nimport { STDOUT, STDERR } from './constants';\nimport formatMessage from './utils/format-message';\nimport type { LogWriter } from './interfaces';\n\n/**\n * A logged message that is itself an object carrying its own `message` field,\n * which the JSON writer hoists to the top level.\n */\nfunction isMessageObject(value: unknown): value is { message?: unknown } {\n return Boolean(value) && typeof value === 'object';\n}\n\n/**\n * The text format's handle on a request id: its first 8 characters, enough\n * to find the request's other lines (a UUID's first block) without the full\n * 36. The JSON format logs it whole.\n */\nfunction shortRequestId(context?: Record<string, unknown>): string {\n const id = context?.requestId;\n\n return typeof id === 'string' && id ? `[${id.slice(0, 8)}]` : '';\n}\n\n/** @internal */\nexport function createWriter(\n format: LogFormat,\n { timestamps = true }: { timestamps?: boolean } = {}\n): LogWriter {\n return function write(data) {\n const { level, context, timestamp, ...etc } = data;\n let { message } = etc;\n let output: unknown;\n\n if (format === 'json') {\n if (message instanceof Error) {\n // `stack` and `name` are not own enumerable properties, so spreading\n // the error alone would drop them \u2014 and with them where it came from.\n output = {\n timestamp,\n level,\n ...context,\n message: message.message,\n name: errorName(message),\n ...omit(message, 'message'),\n stack: message.stack\n };\n } else if (isMessageObject(message) && message.message) {\n output = {\n timestamp,\n level,\n ...context,\n message: message.message,\n ...omit(message, 'message')\n };\n } else {\n // The Flow original spread `...etc` here too, but `etc` is just\n // `{ message }` \u2014 already listed with the same value \u2014 so the spread\n // only re-wrote it. Dropping it keeps the identical key order and\n // values.\n output = {\n timestamp,\n level,\n ...context,\n message\n };\n }\n\n output = formatMessage(output, 'json');\n } else {\n let columns = 0;\n\n if (process.stdout instanceof WriteStream) {\n columns = process.stdout.columns;\n }\n\n message = formatMessage(message, 'text');\n\n // Colour is lost off a terminal, so the level is spelled out: an ERROR\n // has to stand out in a plain log viewer too.\n let label = level.padEnd(5);\n\n switch (level) {\n case WARN:\n label = chalk.yellow(label);\n break;\n\n case ERROR:\n label = chalk.red(label);\n break;\n\n default:\n label = chalk.dim(label);\n break;\n }\n\n const prefix = [\n timestamps ? chalk.dim(`[${timestamp}]`) : '',\n label,\n shortRequestId(context)\n ]\n .filter(Boolean)\n .join(' ');\n\n // The rule separates multi-line entries in a terminal; piped output\n // (Docker, an IDE console) has no width, so it gets one line per entry\n // instead of a rule-less blank block.\n output = columns\n ? `${prefix} ${message}\\n\\n${chalk.dim('-').repeat(columns)}\\n`\n : `${prefix} ${message}`;\n }\n\n if (STDOUT.test(level)) {\n process.stdout.write(`${output}\\n`);\n } else if (STDERR.test(level)) {\n process.stderr.write(`${output}\\n`);\n }\n };\n}\n", "/**\n * An error's name for the logs. Error subclasses rarely set `name`, so it is\n * the generic `Error` for nearly all of them; their class name says more.\n *\n * @internal\n */\nexport default function errorName(err: unknown): string {\n if (!(err instanceof Error)) {\n return 'Error';\n }\n\n return err.name === 'Error' ? err.constructor.name : err.name;\n}\n", "/**\n * @private\n */\nexport default function entries<T>(\n source: Record<string, T>\n): Array<[string, T]> {\n return Object.entries(source);\n}\n", "import entries from './entries';\n\n/**\n * Returns a copy of `src` without `omitted` keys.\n *\n * Typed as `Partial<T>` rather than Flow's `T`, since the omitted keys are by\n * definition absent from the result.\n *\n * @private\n */\nexport default function omit<T extends object>(\n src: T,\n ...omitted: string[]\n): Partial<T> {\n return entries(src as Record<string, unknown>)\n .filter(([key]) => omitted.indexOf(key) < 0)\n .reduce<Record<string, unknown>>(\n (result, [key, value]) => ({\n ...result,\n [key]: value\n }),\n {}\n ) as Partial<T>;\n}\n", "export const STDOUT = /^(DEBUG|INFO)$/;\nexport const STDERR = /^(WARN|ERROR)$/;\n", "import { stripVTControlCharacters } from 'util';\n\nimport stringify from '../../../../utils/stringify';\nimport type { LogFormat } from '../../interfaces';\n\n/**\n * Returns `string | undefined` because `Error#stack` is optional \u2014 the Flow\n * original had the same behaviour, it just did not say so.\n *\n * `data` is required here; Flow allowed it to be declared optional ahead of a\n * required parameter, which TypeScript does not (and every caller passes both).\n */\nexport default function formatMessage(\n data: unknown,\n format: LogFormat\n): string | undefined {\n if (data instanceof Error) {\n return data.stack;\n } else if (format === 'json') {\n return stripVTControlCharacters(stringify(data));\n }\n\n return stringify(data, 2);\n}\n", "import isObject from './is-object';\n\n/**\n * @private\n */\nexport default function stringify(value?: unknown, spaces?: number): string {\n if (isObject(value) || Array.isArray(value)) {\n return JSON.stringify(value, null, spaces);\n }\n\n return String(value);\n}\n", "/**\n * @private\n */\nexport default function insertValues(\n strings: readonly string[],\n ...values: unknown[]\n): string {\n if (values.length) {\n return strings.reduce((result, part, idx): string => {\n const raw: unknown = values[idx];\n let value = '';\n\n if (\n raw &&\n typeof (raw as { toString?: unknown }).toString === 'function'\n ) {\n value = (raw as { toString(): string }).toString();\n }\n\n return result + part + value;\n }, '');\n }\n\n return strings.join('');\n}\n", "import { insertValues } from '../../template';\n\n/** @internal */\nexport default function line(\n strings: readonly string[],\n ...values: unknown[]\n): string {\n return insertValues(strings, ...values)\n .replace(/(\\r\\n|\\n|\\r|)/gm, '')\n .replace(/\\s+/g, ' ')\n .trim();\n}\n", "import chalk from '../../../utils/chalk';\nimport line from '../utils/line';\n\nimport type { RequestLoggerTemplateData } from './interfaces';\n\n/** @internal */\nfunction countDigits(num: number) {\n const digits = Math.floor(Math.log10(num) + 1);\n\n return digits > 0 && Number.isFinite(digits) ? digits : 1;\n}\n\n/** @internal */\nfunction pad(startTime: number, endTime: number, duration: number) {\n const maxLength = countDigits(endTime - startTime);\n\n return ' '.repeat(maxLength - countDigits(duration)) + duration;\n}\n\n/**\n * ` by PostsController#index`, or nothing when no route matched (it used to\n * read `by null`).\n *\n * @internal\n */\nfunction handledBy(route: RequestLoggerTemplateData['route']) {\n if (!route) {\n return '';\n }\n\n const { controller, action } = route;\n\n return ` by ${chalk.yellow(controller.constructor.name)}#${chalk.blue(action)}`;\n}\n\n/** @internal */\nexport const debugTemplate = ({\n path,\n stats,\n route,\n method,\n params,\n colorStr,\n startTime,\n endTime,\n statusCode,\n statusMessage,\n remoteAddress\n}: RequestLoggerTemplateData) => `\\\n${line`\n Processed ${chalk.cyan(`${method}`)} \"${path}\" from ${remoteAddress}\n with ${colorStr(`${statusCode}`)}\n ${colorStr(`${statusMessage}`)}${handledBy(route)}\n`}\n\n${chalk.magenta('Params')}\n\n${JSON.stringify(params, null, 2)}\n\n${chalk.magenta('Stats')}\n\n${stats\n .map(stat => {\n const { type, duration, controller } = stat;\n let { name } = stat;\n\n name = chalk.blue(name);\n\n if (type === 'action') {\n name = `${chalk.yellow(controller)}#${name}`;\n }\n\n return `${pad(startTime, endTime, duration)} ms ${name}`;\n })\n .join('\\n')}\n${pad(\n startTime,\n endTime,\n stats.reduce((total, { duration }) => total + duration, 0)\n)} ms Total\n${(endTime - startTime).toString()} ms Actual\\\n`;\n\n/** @internal */\nexport const infoTemplate = ({\n path,\n route,\n method,\n params,\n colorStr,\n startTime,\n endTime,\n statusCode,\n statusMessage,\n remoteAddress\n}: RequestLoggerTemplateData) =>\n // Built directly rather than with `line`, which would also collapse runs\n // of spaces inside param values.\n [\n chalk.cyan(method),\n path,\n colorStr(`${statusCode} ${statusMessage}`),\n `in ${endTime - startTime} ms${handledBy(route)}`,\n remoteAddress ? `from ${remoteAddress}` : '',\n Object.keys(params).length ? JSON.stringify(params) : ''\n ]\n .filter(Boolean)\n .join(' ');\n", "import entries from '../../../../utils/entries';\n\n/**\n * Always filtered, on top of the app's `logging.filter.params`, so a missing\n * config never leaks credentials into the logs.\n *\n * @internal\n */\nexport const FILTERED_PARAMS: readonly string[] = [\n 'password',\n 'secret',\n 'token'\n];\n\nconst FILTERED = '[FILTERED]';\n\n/**\n * A key is filtered when it contains a filtered name, ignoring case \u2014 so\n * `password` also covers `passwordConfirmation` and `new-password`.\n *\n * @internal\n */\nfunction isFiltered(key: string, filtered: readonly string[]): boolean {\n const name = key.toLowerCase();\n\n return filtered.some(item => name.includes(item.toLowerCase()));\n}\n\n/** @internal */\nfunction filterValue(value: unknown, filtered: readonly string[]): unknown {\n if (Array.isArray(value)) {\n return value.map(item => filterValue(item, filtered));\n }\n\n if (value && typeof value === 'object') {\n return filterKeys(value as Record<string, unknown>, filtered);\n }\n\n return value;\n}\n\n/** @internal */\nfunction filterKeys(\n params: Record<string, unknown>,\n filtered: readonly string[]\n): Record<string, unknown> {\n return entries(params).reduce<Record<string, unknown>>(\n (result, [key, value]) => {\n result[key] = isFiltered(key, filtered)\n ? FILTERED\n : filterValue(value, filtered);\n\n return result;\n },\n {}\n );\n}\n\n/** @internal */\nexport default function filterParams(\n params: Record<string, unknown>,\n ...filtered: string[]\n): Record<string, unknown> {\n return filterKeys(params, [...FILTERED_PARAMS, ...filtered]);\n}\n", "import omit from '../../../../utils/omit';\nimport type Logger from '../../index';\nimport type { Request } from '../../../server';\n\nimport filterParams from './filter-params';\n\n/**\n * The top-level members of a JSON:API document \u2014 where a request body's\n * params live. Query params cannot share these names: the spec reserves\n * all-lowercase names for its own parameters, none of which are these.\n *\n * @internal\n */\nconst DOCUMENT_MEMBERS = [\n 'data',\n 'meta',\n 'included',\n 'links',\n 'jsonapi',\n 'errors'\n] as const;\n\n/**\n * The params a request is logged with: filtered, and without the body unless\n * the logger's `requestBody` is on.\n *\n * @internal\n */\nexport default function paramsFor(\n logger: Logger,\n req: Request\n): Record<string, unknown> {\n let params = req.params as unknown as Record<string, unknown>;\n\n if (!logger.requestBody) {\n params = omit(params, ...DOCUMENT_MEMBERS);\n }\n\n return filterParams(params, ...logger.filter.params);\n}\n", "import chalk from '../../../../utils/chalk';\nimport { DEBUG } from '../../constants';\nimport { infoTemplate, debugTemplate } from '../templates';\nimport type Logger from '../../index';\nimport type { Request, Response } from '../../../server';\n\nimport paramsFor from './params-for';\n\n/** @internal */\nexport default function logText(\n logger: Logger,\n {\n startTime,\n request: req,\n response: res\n }: {\n request: Request;\n response: Response;\n startTime: number;\n }\n): void {\n res.once('finish', () => {\n const endTime = Date.now();\n\n const {\n id: requestId,\n ip: remoteAddress,\n route,\n method,\n\n // `pathname`, not `path`: the query string would bypass the param filter;\n // query params are logged, filtered, under `params`.\n url: { pathname: path }\n } = req;\n\n const { stats, statusCode, statusMessage } = res;\n const params = paramsFor(logger, req);\n const statusColor = statusCode >= 200 && statusCode < 400 ? 'green' : 'red';\n\n let colorStr: (source: string) => string = chalk[statusColor];\n\n if (typeof colorStr === 'undefined') {\n colorStr = (str: string) => str;\n }\n\n const templateData = {\n path,\n stats,\n route,\n method,\n params,\n colorStr,\n startTime,\n endTime,\n statusCode: statusCode.toString(),\n statusMessage,\n remoteAddress\n };\n\n const context = { requestId };\n\n if (logger.level === DEBUG) {\n logger.debug(debugTemplate(templateData), context);\n } else {\n logger.info(infoTemplate(templateData), context);\n }\n });\n}\n", "import type Logger from '../../index';\nimport type { Request, Response } from '../../../server';\n\nimport paramsFor from './params-for';\n\nconst MESSAGE = 'Processed Request';\n\n/** @internal */\nexport default function logJSON(\n logger: Logger,\n {\n startTime,\n request: req,\n response: res\n }: {\n startTime: number;\n request: Request;\n response: Response;\n }\n): void {\n res.once('finish', () => {\n const {\n id: requestId,\n ip: remoteAddress,\n route,\n method,\n headers,\n httpVersion,\n\n // `pathname`, not `path`: the query string would bypass the param filter;\n // query params are logged, filtered, under `params`.\n url: { pathname: path }\n } = req;\n\n const { statusCode: status } = res;\n const userAgent = headers.get('user-agent');\n const protocol = `HTTP/${httpVersion}`;\n\n logger.info(\n {\n message: MESSAGE,\n\n method,\n path,\n status,\n durationMs: Date.now() - startTime,\n controller: route?.controller.constructor.name,\n action: route?.action,\n params: paramsFor(logger, req),\n protocol,\n userAgent,\n remoteAddress\n },\n { requestId }\n );\n });\n}\n", "import type Logger from '../index';\n\nimport logText from './utils/log-text';\nimport logJSON from './utils/log-json';\nimport type { RequestLoggerFn } from './interfaces';\n\n/** @internal */\nexport function createRequestLogger(logger: Logger): RequestLoggerFn {\n return function request(req, res, { startTime }: { startTime: number }) {\n if (logger.format === 'json') {\n logJSON(logger, {\n startTime,\n request: req,\n response: res\n });\n } else {\n logText(logger, {\n startTime,\n request: req,\n response: res\n });\n }\n };\n}\n", "import { LUMEN_CONSOLE } from '../../constants';\nimport K from '../../utils/k';\n\nimport { FORMATS, LEVELS } from './constants';\nimport InvalidConfigError from './errors/invalid-config-error';\nimport { createWriter } from './writer';\nimport { createRequestLogger } from './request-logger';\nimport type { LogWriter } from './writer/interfaces';\nimport type { RequestLoggerFn } from './request-logger/interfaces';\nimport type {\n LoggerConfig,\n LogFormat,\n LogLevel,\n LogFunction,\n LogFilter\n} from './interfaces';\n\n/**\n * The application's logger, configured by the `logging` section of\n * `config/environments/<environment>.js` ({@link LoggerConfig}). Actions and\n * hooks reach it as `request.logger`, models as `Model.logger`.\n *\n * It logs every request, server errors, and \u2014 with the database's `debug` on \u2014\n * SQL, and has a method per level for the app's own messages. See the\n * [logging guide](https://github.com/nickschot/lux/blob/main/docs/guides/logging.md).\n */\nclass Logger {\n /** The least severe level written: `DEBUG`, `INFO`, `WARN` or `ERROR`. */\n declare level: LogLevel;\n\n /** `text`, lines for people, or `json`, one object per line. */\n declare format: LogFormat;\n\n /**\n * Parameters to keep out of the logs. A parameter whose name contains\n * `password`, `secret` or `token`, or a name listed in `filter.params`,\n * ignoring case, is logged as `[FILTERED]` \u2014 in the body, the query string\n * and inside arrays:\n *\n * ```javascript\n * // config/environments/production.js\n * export default {\n * logging: {\n * // \u2026\n * filter: { params: ['email'] } // also filters `recoveryEmail`\n * }\n * };\n * ```\n */\n declare filter: LogFilter;\n\n /** Whether anything is logged; off in the test environment. */\n declare enabled: boolean;\n\n /**\n * Whether the request log includes the request body \u2014 the JSON:API document\n * of a `POST` or `PATCH`. Off unless enabled, and off by default in\n * production: a body is large and full of user data. Query and route params\n * are always logged (filtered).\n */\n declare requestBody: boolean;\n\n /**\n * Whether the text format stamps each line with the time. Turn it off where\n * the platform already does \u2014 Heroku prefixes every line with its own \u2014 to\n * avoid two timestamps per line. The JSON format always includes it.\n */\n declare timestamps: boolean;\n\n /**\n * Log a message at `DEBUG`.\n *\n * `context` adds fields to the line: top-level fields in JSON, left out of\n * text. Pass the request's id to tie the message to its request:\n *\n * ```javascript\n * request.logger.debug('Cache miss', { requestId: request.id });\n * ```\n */\n declare debug: LogFunction;\n\n /**\n * Log a message at `INFO`.\n *\n * `context` adds fields to the line: top-level fields in JSON, left out of\n * text. Pass the request's id to tie the message to its request:\n *\n * ```javascript\n * request.logger.info('Synced posts', { requestId: request.id });\n * ```\n */\n declare info: LogFunction;\n\n /**\n * Log a message at `WARN`.\n *\n * `context` adds fields to the line: top-level fields in JSON, left out of\n * text. Pass the request's id to tie the message to its request:\n *\n * ```javascript\n * request.logger.warn('Slow upstream', { requestId: request.id });\n * ```\n */\n declare warn: LogFunction;\n\n /**\n * Log a message, or an error with its stack, at `ERROR`.\n *\n * `context` adds fields to the line: top-level fields in JSON, left out of\n * text. Pass the request's id to tie the message to its request:\n *\n * ```javascript\n * request.logger.error('Sync failed', { requestId: request.id });\n * ```\n */\n declare error: LogFunction;\n\n /** @internal */\n declare request: RequestLoggerFn;\n\n constructor({\n level,\n format,\n filter,\n enabled,\n requestBody = false,\n timestamps = true\n }: LoggerConfig) {\n let write: LogWriter = K;\n let request: RequestLoggerFn = K;\n\n // A disabled logger never writes, so only an enabled one needs these \u2014\n // and must have them right: a typo used to fall back to DEBUG silently,\n // which in production meant SQL with its bound values in the logs.\n if (enabled) {\n if (!LEVELS.has(level)) {\n throw new InvalidConfigError('level', level, LEVELS.keys());\n }\n\n if (!FORMATS.has(format)) {\n throw new InvalidConfigError('format', format, FORMATS);\n }\n }\n\n if (!LUMEN_CONSOLE && enabled) {\n write = createWriter(format, { timestamps });\n request = createRequestLogger(this);\n }\n\n Object.defineProperties(this, {\n level: {\n value: level,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n format: {\n value: format,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n filter: {\n value: filter,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n enabled: {\n value: Boolean(enabled),\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n requestBody: {\n value: Boolean(requestBody),\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n timestamps: {\n value: Boolean(timestamps),\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n request: {\n value: request,\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n\n const levelNum = LEVELS.get(level) || 0;\n\n LEVELS.forEach((val, key: LogLevel) => {\n Object.defineProperty(this, key.toLowerCase(), {\n writable: false,\n enumerable: false,\n configurable: false,\n\n value:\n val >= levelNum\n ? (message?: unknown, context?: Record<string, unknown>) => {\n write({\n message,\n context,\n level: key,\n timestamp: this.getTimestamp()\n });\n }\n : K\n });\n });\n }\n\n /**\n * @returns The current time as an ISO8601 string.\n * @internal\n */\n getTimestamp() {\n return new Date().toISOString();\n }\n}\n\nexport default Logger;\nexport { default as line } from './utils/line';\nexport { default as errorName } from './utils/error-name';\n\nexport type {\n LoggerConfig,\n LogFilter,\n LogFormat,\n LogFunction,\n LogLevel\n} from './interfaces';\n", "import chalk from '../../../utils/chalk';\nimport { SQLITE_DRIVER, VALID_DRIVERS } from '../constants';\nimport { line } from '../../logger';\n\n/** @internal */\nclass InvalidDriverError extends Error {\n constructor(driver: string) {\n super(\n driver === 'sqlite3'\n ? line`\n The database driver ${chalk.yellow('sqlite3')} is no longer\n supported: it is unmaintained. Set ${chalk.green(\n `driver: '${SQLITE_DRIVER}'`\n )} in ./config/database.js, and replace the sqlite3 dependency with\n ${chalk.green(SQLITE_DRIVER)}. The database files stay the same.\n `\n : line`\n Invalid database driver ${chalk.yellow(driver)} in\n ./config/database.js. Please use one of the following database\n drivers: ${VALID_DRIVERS.map(str => chalk.green(str)).join(', ')}.\n `\n );\n }\n}\n\nexport default InvalidDriverError;\n", "/** @internal */\nclass ModelMissingError extends Error {\n constructor(name: string) {\n super(`Could not resolve model by name '${name}'`);\n }\n}\n\nexport default ModelMissingError;\n", "import chalk from '../../../utils/chalk';\nimport { line } from '../../logger';\n\n/** @internal */\nclass MigrationsPendingError extends Error {\n constructor(migrations: Array<string> = []) {\n const pending = migrations\n .map(str => chalk.yellow(str.substr(0, str.length - 3)))\n .join(', ');\n\n super(line`\n The following migrations are pending ${pending}.\n Please run ${chalk.green('lumen db:migrate')} before starting your application.\n `);\n }\n}\n\nexport default MigrationsPendingError;\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * `createServerError` wraps an arbitrary error class whose constructor accepts\n * arbitrary arguments; `new (...args: any[])` is required so that error classes\n * with any constructor signature remain assignable to `Constructor<T>`.\n */\nimport type { ServerError } from '../interfaces';\n\ntype Constructor<T> = new (...args: Array<any>) => T;\n\n/**\n * `Target`, answered with `statusCode`. `isPublic` marks a client error whose\n * message only describes the request \u2014 echoed input and declared names, never\n * stored data, SQL or internals \u2014 so it is the error's `detail` in every\n * environment. Leave it off for anything that passes on another message (a\n * database driver's, say).\n *\n * @internal\n */\nexport default function createServerError<T extends object>(\n Target: Constructor<T>,\n statusCode: number,\n { isPublic = false }: { isPublic?: boolean } = {}\n): Constructor<T & ServerError> {\n const StatusError = class extends (Target as Constructor<object>) {\n declare statusCode: number;\n\n declare isPublic: boolean;\n\n constructor(...args: Array<unknown>) {\n super(...args);\n this.statusCode = statusCode;\n this.isPublic = isPublic;\n }\n };\n\n Object.defineProperty(StatusError, 'name', {\n value: Target.name\n });\n\n return StatusError as unknown as Constructor<T & ServerError>;\n}\n", "import createServerError from '../../server/utils/create-server-error';\n\nclass UniqueConstraintError extends Error {}\n\nexport default createServerError(UniqueConstraintError, 409);\n", "class ConfigMissingError extends Error {\n constructor(environment: string) {\n super(`Database config not found for environment ${environment}.`);\n }\n}\n\nexport default ConfigMissingError;\n", "/**\n * Thrown at boot when relationships are declared in a way that cannot work,\n * listing every problem.\n *\n * @internal\n */\nclass RelationshipConfigError extends TypeError {\n constructor(problems: Array<string>) {\n super(\n [\n 'Invalid relationships. Each must name its `inverse`: the ' +\n 'relationship on the related model that points back:',\n ...problems.sort().map(problem => ` - ${problem}`)\n ].join('\\n')\n );\n }\n}\n\nexport default RelationshipConfigError;\n", "import cluster from 'cluster';\n\nimport { NODE_ENV } from '../../constants';\n\nimport { ConfigMissingError, MigrationsPendingError } from './errors';\nimport connect from './utils/connect';\nimport createMigrations from './utils/create-migrations';\nimport pendingMigrations from './utils/pending-migrations';\nimport validateRelationships from './utils/validate-relationships';\nimport type Database from './index';\nimport type { DatabaseOptions } from './index';\n\n/** @internal */\nexport default async function initialize<T extends Database>(\n instance: T,\n opts: DatabaseOptions\n): Promise<T> {\n const {\n path,\n models,\n logger,\n checkMigrations,\n checkRelationships = true\n } = opts;\n const config = opts.config[NODE_ENV];\n\n if (!config) {\n throw new ConfigMissingError(NODE_ENV);\n }\n\n const { debug = NODE_ENV === 'development' } = config;\n\n Object.defineProperties(instance, {\n path: {\n value: path,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n debug: {\n value: debug,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n models: {\n value: models,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n logger: {\n value: logger,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n config: {\n value: config,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n schema: {\n value: () => instance.connection.schema,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n connection: {\n value: connect(path, config),\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n\n if (cluster.isMaster || (cluster.worker && cluster.worker.id === 1)) {\n await createMigrations(instance.schema);\n\n if (checkMigrations) {\n const pending = await pendingMigrations(path, () =>\n instance.connection('migrations')\n );\n\n if (pending.length) {\n throw new MigrationsPendingError(pending);\n }\n }\n }\n\n await Promise.all(\n Array.from(models.values()).map(model =>\n model.initialize(instance, () => instance.connection(model.tableName))\n )\n );\n\n // Every model is initialized: relationships can be checked against both\n // of their sides.\n if (checkRelationships) {\n validateRelationships(models.values());\n }\n\n return instance;\n}\n", "import { join as joinPath } from 'path';\n\nimport type { Knex } from 'knex';\n\nimport { NODE_ENV, DATABASE_URL } from '../../../constants';\nimport { SQLITE_DRIVER, VALID_DRIVERS } from '../constants';\nimport { InvalidDriverError } from '../errors';\nimport type { DatabaseEnvironmentConfig } from '../interfaces';\n\n/**\n * The knex `connection` for an environment's database config.\n *\n * A URL \u2014 `DATABASE_URL`, else the environment's `url` \u2014 gives the host,\n * credentials and database, and replaces those settings. `ssl` from the\n * config still applies on top of it (for `pg` and `mysql2`, which take the\n * URL as `connectionString` / `uri` next to their other options), so an app\n * on a platform that sets `DATABASE_URL` can configure TLS in\n * `config/database.js`. A TLS setting written in the URL itself\n * (`?sslmode=\u2026` for `pg`, `?ssl=\u2026` for `mysql2`) takes precedence: the\n * drivers apply what they parse from the URL last.\n *\n * @internal\n */\nexport function connectionFor(\n path: string,\n config: DatabaseEnvironmentConfig,\n databaseUrl: string | undefined = DATABASE_URL\n): string | Record<string, unknown> {\n const { host, socket, driver, database, username, password, port, ssl, url } =\n config;\n const connectionUrl = databaseUrl || url;\n\n if (connectionUrl) {\n if (driver === SQLITE_DRIVER || ssl === undefined) {\n return connectionUrl;\n }\n\n return driver === 'pg'\n ? { connectionString: connectionUrl, ssl }\n : { uri: connectionUrl, ssl };\n }\n\n return {\n host,\n database,\n password,\n port,\n ssl,\n user: username,\n socketPath: socket,\n filename:\n driver === SQLITE_DRIVER\n ? joinPath(path, 'db', `${database || 'default'}_${NODE_ENV}.sqlite`)\n : undefined\n };\n}\n\n/** @internal */\nexport default function connect(\n path: string,\n config: DatabaseEnvironmentConfig\n): Knex {\n let { pool } = config;\n\n const { driver } = config;\n\n if (VALID_DRIVERS.indexOf(driver) < 0) {\n throw new InvalidDriverError(driver);\n }\n\n const usingSQLite = driver === SQLITE_DRIVER;\n\n if (usingSQLite) {\n // One connection, whatever `pool` says. better-sqlite3 is synchronous: a\n // connection waiting on another's lock blocks the event loop, so the one\n // holding it can never finish, and the wait fails (\"database is locked\").\n // With one connection, writes queue in the pool instead.\n pool = { min: 1, max: 1 };\n } else if (pool && typeof pool === 'number') {\n pool = {\n min: pool > 1 ? 2 : 1,\n max: pool\n };\n }\n\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const knex = require(joinPath(path, 'node_modules', 'knex'));\n\n return knex({\n pool,\n connection: connectionFor(path, config),\n debug: false,\n client: driver,\n useNullAsDefault: usingSQLite\n });\n}\n", "import type Database from '../index';\n\n/** @internal */\nexport default async function createMigrations(\n schema: Database['schema']\n): Promise<boolean> {\n const hasTable: boolean = await schema().hasTable('migrations');\n\n if (!hasTable) {\n await schema().createTable('migrations', table => {\n table.string('version', 16).primary();\n });\n }\n\n return true;\n}\n", "import fs from 'fs';\nimport { join as joinPath, resolve as resolvePath } from 'path';\nimport type { Stats } from 'fs';\n\nimport Watcher from './watcher';\nimport createResolver from './utils/create-resolver';\nimport createPathRemover from './utils/create-path-remover';\nimport type { ReadOptions, WriteOptions } from './interfaces';\n\nexport { default as rmrf } from './utils/rmrf';\nexport { default as exists } from './utils/exists';\nexport { default as isJSFile } from './utils/is-js-file';\nexport { default as parsePath } from './utils/parse-path';\n\nexport type { ParsedPath } from './interfaces';\n\n/**\n * @private\n */\nexport function watch(path: string): Promise<Watcher> {\n return new Watcher(path) as unknown as Promise<Watcher>;\n}\n\n/**\n * @private\n */\nexport function stat(path: string): Promise<Stats> {\n return new Promise((resolve, reject) => {\n fs.stat(path, createResolver(resolve, reject));\n });\n}\n\n/**\n * @private\n */\nexport function mkdir(path: string, mode: number = 511): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n fs.mkdir(path, mode, createResolver(resolve, reject));\n });\n}\n\n/**\n * @private\n */\nexport function mkdirRec(path: string, mode: number = 511): Promise<void> {\n const parent = resolvePath(path, '..');\n\n return stat(parent)\n .catch(err => {\n if (err.code === 'ENOENT') {\n return mkdirRec(parent, mode);\n }\n\n return Promise.reject(err);\n })\n .then(() => mkdir(path, mode))\n .catch(err => {\n if (err.code !== 'EEXIST') {\n return Promise.reject(err);\n }\n\n return Promise.resolve();\n });\n}\n\n/**\n * @private\n */\nexport function rmdir(path: string): Promise<void> {\n return new Promise((resolve, reject) => {\n fs.rmdir(path, createResolver(resolve, reject));\n });\n}\n\n/**\n * @private\n */\nexport function readdir(\n path: string,\n // opts is accepted for signature parity with readdirRec but unused here.\n opts?: ReadOptions // eslint-disable-line @typescript-eslint/no-unused-vars\n): Promise<Array<string>> {\n return new Promise((resolve, reject) => {\n fs.readdir(path, createResolver(resolve, reject));\n });\n}\n\n/**\n * @private\n */\nexport function readdirRec(\n path: string,\n opts?: ReadOptions\n): Promise<Array<string>> {\n const stripPath = createPathRemover(path);\n\n return readdir(path, opts)\n .then(files =>\n Promise.all(\n files.map(file => {\n const filePath = joinPath(path, file);\n\n return Promise.all([filePath, stat(filePath)]);\n })\n )\n )\n .then(files =>\n Promise.all(\n files.map(([file, stats]) =>\n Promise.all([file, stats.isDirectory() ? readdirRec(file) : []])\n )\n )\n )\n .then(files =>\n files.reduce<Array<string>>((arr, [file, children]) => {\n const basename = stripPath(file);\n\n return [\n ...arr,\n basename,\n ...children.map(child => joinPath(basename, stripPath(child)))\n ];\n }, [])\n );\n}\n\n/**\n * @private\n */\nexport function readFile(\n path: string,\n opts?: ReadOptions\n): Promise<string | Buffer> {\n return new Promise((resolve, reject) => {\n fs.readFile(\n path,\n (typeof opts === 'object' ? opts : {}) as fs.ObjectEncodingOptions,\n createResolver(resolve, reject)\n );\n });\n}\n\n/**\n * @private\n */\nexport function writeFile(\n path: string,\n data: string | Buffer,\n opts?: WriteOptions\n): Promise<void> {\n return new Promise((resolve, reject) => {\n fs.writeFile(\n path,\n data,\n (opts || {}) as fs.WriteFileOptions,\n createResolver(resolve, reject)\n );\n });\n}\n\n/**\n * @private\n */\nexport function appendFile(\n path: string,\n data: string | Buffer,\n opts?: WriteOptions\n): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n fs.appendFile(\n path,\n data,\n (typeof opts === 'object' ? opts : {}) as fs.WriteFileOptions,\n createResolver(resolve, reject)\n );\n });\n}\n\n/**\n * @private\n */\nexport function unlink(path: string): Promise<void> {\n return new Promise((resolve, reject) => {\n fs.unlink(path, createResolver(resolve, reject));\n });\n}\n", "import EventEmitter from 'events';\nimport type { FSWatcher } from 'fs';\n\nimport { Client } from 'fb-watchman';\n\nimport initialize from './initialize';\n\n/**\n * @private\n */\nclass Watcher extends EventEmitter {\n declare path: string;\n\n declare client: Client | FSWatcher;\n\n constructor(path: string, useWatchman: boolean = true) {\n super();\n // Watchers initialize asynchronously; `initialize` populates `this` and\n // resolves once the watchman/native watcher is wired up, so `new Watcher()`\n // is awaited by callers. TS can't type a Promise-returning constructor.\n return initialize(this, path, useWatchman) as unknown as Watcher;\n }\n\n destroy() {\n const { client } = this;\n\n if (client instanceof Client) {\n client.end();\n } else {\n client.close();\n }\n }\n}\n\nexport default Watcher;\n", "import { join as joinPath } from 'path';\nimport { watch as nativeWatch } from 'fs';\nimport type { FSWatcher } from 'fs';\n\nimport { Client } from 'fb-watchman';\n\nimport exec from '../../../utils/exec';\nimport tryCatch from '../../../utils/try-catch';\nimport isJSFile from '../utils/is-js-file';\nimport { freezeProps } from '../../freezeable';\n\nimport type Watcher from './index';\n\nconst SUBSCRIPTION_NAME = 'lumen-watcher';\n\n/**\n * @private\n */\nfunction fallback(instance: Watcher, path: string): FSWatcher {\n return nativeWatch(\n path,\n {\n recursive: true\n },\n (type, name) => {\n if (typeof name === 'string' && isJSFile(name)) {\n instance.emit('change', [{ name, type }]);\n }\n }\n );\n}\n\n/**\n * @private\n */\nfunction setupWatchmen(instance: Watcher, path: string): Promise<Client> {\n return new Promise((resolve, reject) => {\n const client = new Client();\n\n client.capabilityCheck({}, capabilityErr => {\n if (capabilityErr) {\n reject(capabilityErr);\n return;\n }\n\n client.command(\n ['watch-project', path],\n (watchErr, { watch, relative_path: relativePath } = {}) => {\n if (watchErr) {\n reject(watchErr);\n return;\n }\n\n client.command(['clock', watch], (clockErr, { clock: since }) => {\n if (clockErr) {\n reject(clockErr);\n return;\n }\n\n client.command(\n [\n 'subscribe',\n watch,\n SUBSCRIPTION_NAME,\n {\n since,\n relative_root: relativePath,\n\n fields: ['name', 'size', 'exists', 'type'],\n\n expression: ['allof', ['match', '*.js']]\n }\n ],\n subscribeErr => {\n if (subscribeErr) {\n reject(subscribeErr);\n return;\n }\n\n client.on('subscription', ({ files, subscription }) => {\n if (subscription === SUBSCRIPTION_NAME) {\n instance.emit('change', files);\n }\n });\n\n resolve(client);\n }\n );\n });\n }\n );\n });\n });\n}\n\n/**\n * @private\n */\nexport default async function initialize<T extends Watcher>(\n instance: T,\n path: string,\n useWatchman: boolean\n): Promise<T> {\n const appPath = joinPath(path, 'app');\n let client;\n\n if (useWatchman) {\n await tryCatch(async () => {\n await exec('which watchman');\n client = await setupWatchmen(instance, appPath);\n });\n }\n\n Object.assign(instance, {\n path: appPath,\n client: client || fallback(instance, appPath)\n });\n\n freezeProps(instance, true, 'path', 'client');\n\n return instance;\n}\n", "/**\n * The default `rescue`: swallow the error and yield `undefined`.\n *\n * This is deliberately not `K` \u2014 `K` returns `this`, which is the global\n * object when the bundle runs in sloppy mode (`lumen --use-weak`), so a failed\n * lookup like `store.modelFor()` would come back truthy.\n *\n * @private\n */\nconst noop = (): undefined => undefined;\n\n/**\n * A utility function used for wrapping async code that would otherwise need a\n * try-catch block.\n *\n * V8 deoptimizes functions when running into try-catch catch due to the\n * unpredictable nature of the code. The `tryCatch` utility function is a way\n * to \"have your cake and eat it too\". Since the inner function (`fn`) will not\n * become deoptimized by V8 for including a standard try-catch block, we don't\n * have to sacrifice as much perf for error handling expensive computations.\n *\n * The `tryCatch` utility is also very useful when you want to perform a noop\n * when an error is thrown as the catch argument (`rescue`) is optional unlike\n * a traditional try-catch block.\n *\n * @example\n * tryCatch(() => {\n * const n = Math.floor(Math.random() * 6);\n *\n * if (n >= 4) {\n * throw new Error('You lose!');\n * } else {\n * return Promise.resolve(n);\n * }\n * }, err => {\n * console.error(err);\n * }).then(luckyNumber => {\n * console.log(`Your lucky number is ${luckyNumber}.`);\n * });\n *\n * @private\n */\nexport default async function tryCatch<T>(\n fn: () => Promise<T>,\n rescue: (err: unknown) => unknown = noop\n): Promise<T | undefined> {\n let result: T | undefined;\n\n try {\n result = await fn();\n } catch (err) {\n // `rescue` is a caller-supplied handler with no contract on its return\n // value; when it returns something meaningful it stands in for `fn`'s.\n result = (await rescue(err)) as T | undefined;\n }\n\n return result;\n}\n\n/**\n * A syncronous implementation of the `tryCatch` utility.\n *\n * @example\n * const luckyNumber = tryCatchSync(() => {\n * const n = Math.floor(Math.random() * 6);\n *\n * if (n >= 4) {\n * throw new Error('You lose!');\n * } else {\n * return n;\n * }\n * }, err => {\n * console.error(err);\n * });\n *\n * if (luckyNumber) {\n * console.log(`Your lucky number is ${luckyNumber}.`);\n * }\n *\n * @private\n */\nexport function tryCatchSync<T>(\n fn: () => T,\n rescue: (err: unknown) => unknown = noop\n): T | undefined {\n let result: T | undefined;\n\n try {\n result = fn();\n } catch (err) {\n result = rescue(err) as T | undefined;\n }\n\n return result;\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * Adapts Node's error-first callbacks to Promise settlers; the resolved data\n * varies by fs operation (Stats, string[], Buffer, void), so it is `any` at\n * this adapter boundary.\n */\n\n/**\n * @private\n */\nexport default function createResolver(\n resolve: (data: any) => void,\n reject: (err: Error) => void\n): (err: Error | null, ...args: Array<any>) => void {\n return function fsResolver(err: Error | null, ...args: Array<any>) {\n const [data] = args;\n\n if (err) {\n reject(err);\n return;\n }\n\n resolve(args.length > 1 ? args : data);\n };\n}\n", "import type { Chain } from '../interfaces';\n\n/**\n * @private\n */\nexport default function chain<T>(source: T): Chain<T> {\n return {\n pipe<U>(handler: (value: T) => U): Chain<U> {\n return chain(handler(source));\n },\n\n value(): T {\n return source;\n },\n\n construct<U>(constructor: new (value: T) => U): Chain<U> {\n return chain(new constructor(source));\n }\n };\n}\n", "import { readdir } from '../../fs';\n\n/** @internal */\nexport default async function pendingMigrations(\n appPath: string,\n table: () => any // eslint-disable-line @typescript-eslint/no-explicit-any\n): Promise<Array<string>> {\n const migrations: Array<string> = await readdir(`${appPath}/db/migrate`);\n const versions: Array<string> = await table()\n .select()\n .then((data: Array<{ version: string }>) =>\n data.map(({ version }) => version)\n );\n\n return migrations.filter(\n migration => versions.indexOf(migration.replace(/^(\\d{16})-.+$/g, '$1')) < 0\n );\n}\n", "import { camelize } from 'inflection';\n\nimport { RelationshipConfigError } from '../errors';\nimport type { ModelClass } from '../interfaces';\nimport type { RelationshipOptions } from '../relationship';\n\n/**\n * Whether `inverse`, a relationship of `related`, is a valid counterpart of\n * `opts`, declared on `model`.\n */\nfunction pairs(\n model: ModelClass,\n opts: RelationshipOptions,\n inverse: RelationshipOptions\n): string | null {\n // A join model's `belongsTo` names the many-to-many relationship that goes\n // through it (`Categorization.post` \u2192 `Post.tags`).\n const viaJoin = inverse.through === model;\n\n if (inverse.model !== model && !viaJoin) {\n return `points at ${inverse.model.name}, not ${model.name}`;\n }\n\n if (opts.through) {\n if (inverse.type !== 'hasMany' || inverse.through !== opts.through) {\n return `is not a hasMany through ${opts.through.name}`;\n }\n } else if (opts.type === 'belongsTo') {\n if (inverse.type === 'belongsTo') {\n return 'is a belongsTo too; one side must be a hasOne or hasMany';\n }\n } else if (!viaJoin && inverse.type !== 'belongsTo') {\n return `is a ${inverse.type}; the other side of a ${opts.type} must be a belongsTo`;\n }\n\n return null;\n}\n\n/**\n * The model whose table holds `opts`'s foreign key, and so must have it as a\n * column.\n */\nfunction keyHolder(model: ModelClass, opts: RelationshipOptions): ModelClass {\n if (opts.through) {\n return opts.through;\n }\n\n return opts.type === 'belongsTo' ? model : opts.model;\n}\n\n/**\n * Check every relationship of `models`, once all of them are initialized:\n * its `inverse` must name a relationship on the related model that points\n * back (or, for a join model, the many-to-many relationship through it), of\n * a kind that pairs with it, and its foreign key must be a column where it\n * is expected. A mistake used to surface only on the first write that set\n * the relationship, as an unrelated-looking `500`. Throws listing every\n * problem.\n *\n * @internal\n */\nexport default function validateRelationships(\n models: Iterable<ModelClass>\n): void {\n const problems: Array<string> = [];\n\n for (const model of models) {\n for (const name of model.relationshipNames) {\n const opts = model.relationshipFor(name);\n\n if (!opts) {\n continue;\n }\n\n const { type, inverse, model: related, foreignKey } = opts;\n const where = `${model.name}.${type}.${name}`;\n\n if (!inverse) {\n problems.push(`${where} has no \\`inverse\\``);\n continue;\n }\n\n const inverseOpts = related.relationshipFor(inverse);\n\n if (!inverseOpts) {\n const names = related.relationshipNames.join(', ') || 'none';\n\n problems.push(\n `${where} has inverse '${inverse}', but ${related.name} has no ` +\n `relationship '${inverse}' (it has: ${names})`\n );\n continue;\n }\n\n const mismatch = pairs(model, opts, inverseOpts);\n\n if (mismatch) {\n problems.push(\n `${where} has inverse '${inverse}', but ` +\n `${related.name}.${inverseOpts.type}.${inverse} ${mismatch}`\n );\n continue;\n }\n\n // Both sides of a belongsTo name the same column (a hasOne/hasMany\n // without its own `foreignKey` takes the belongsTo's).\n if (\n !opts.through &&\n !inverseOpts.through &&\n inverseOpts.foreignKey !== foreignKey\n ) {\n problems.push(\n `${where} has foreign key \\`${foreignKey}\\`, but ` +\n `${related.name}.${inverseOpts.type}.${inverse} has ` +\n `\\`${inverseOpts.foreignKey}\\`; both sides must name the same ` +\n 'column'\n );\n continue;\n }\n\n const holder = keyHolder(model, opts);\n const column = camelize(foreignKey, true);\n\n if (!holder.attributeNames.includes(column)) {\n problems.push(\n `${where} needs the foreign key column \\`${foreignKey}\\` on ` +\n `\\`${holder.tableName}\\`, which has no such column`\n );\n }\n }\n }\n\n if (problems.length) {\n throw new RelationshipConfigError(problems);\n }\n}\n", "import { dasherize, singularize } from 'inflection';\n\nimport { compose } from '../../../utils/compose';\nimport underscore from '../../../utils/underscore';\n\n/** @internal */\nexport default compose(singularize, dasherize, underscore);\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * The intermediate stages of a composed pipeline are genuinely untyped: only\n * the pipeline's input and output are knowable without full variadic typing,\n * which would cost far more than it buys for an internal helper. The `any`s\n * are confined to those intermediate positions \u2014 the exported signatures keep\n * precise `T` -> `U` types.\n */\n\n/**\n * A single stage of a composed pipeline.\n *\n * @private\n */\ntype Stage = (value: any) => any;\n\n/**\n * @private\n */\nexport function tap<T>(input: T): T {\n console.log(input);\n return input;\n}\n\n/**\n * @private\n */\nexport function compose<T, U>(\n main: (input: any) => U,\n ...etc: Stage[]\n): (input: T) => U {\n return input => main(etc.reduceRight<any>((value, fn) => fn(value), input));\n}\n\n/**\n * @private\n */\nexport function composeAsync<T, U>(\n main: (input: any) => Promise<U>,\n ...etc: Stage[]\n): (input: T | Promise<T>) => Promise<U> {\n return input =>\n etc\n .reduceRight<Promise<any>>(\n (value, fn) => Promise.resolve(value).then(fn),\n Promise.resolve(input)\n )\n .then(main);\n}\n", "import { underscore as _ } from 'inflection';\n\n/**\n * @private\n */\nexport default function underscore(\n source: string = '',\n upper: boolean = false\n): string {\n return _(source, upper).replace(/-/g, '_');\n}\n", "import { pluralize } from 'inflection';\n\nimport Query from '../query';\nimport ChangeSet from '../change-set';\nimport { updateRelationship } from '../relationship';\nimport {\n createTransactionResultProxy,\n createStaticTransactionProxy,\n createInstanceTransactionProxy\n} from '../transaction';\nimport pick from '../../../utils/pick';\nimport underscore from '../../../utils/underscore';\nimport { compose } from '../../../utils/compose';\nimport { map as diffMap } from '../../../utils/diff';\nimport mapToObject from '../../../utils/map-to-object';\nimport type Logger from '../../logger';\nimport type Database from '../../database';\nimport type Serializer from '../../serializer';\n\nimport type { RelationshipOptions } from '../relationship';\nimport type { ModelClass, DatabaseColumn } from '../interfaces';\nimport type { TransactionResult } from '../transaction';\n\nimport { create, update, destroy, createRunner } from './utils/persistence';\nimport initializeClass from './initialize-class';\nimport validate from './utils/validate';\nimport { rethrowWriteError } from './utils/process-write-error';\nimport runHooks from './utils/run-hooks';\nimport { readAttribute, writeAttribute } from './utils/attribute';\nimport type { ModelHooks } from './interfaces';\n\n/**\n * The base class of an app's models. A model is one database table: its\n * attributes are the table's columns, read when the app boots, and the class\n * declares the rest as statics \u2014 relationships (`hasOne`, `hasMany`,\n * `belongsTo`), `validates`, `hooks` and `scopes`.\n *\n * ```javascript\n * import { Model } from 'lumen-framework';\n *\n * class Post extends Model {\n * static belongsTo = {\n * user: { inverse: 'posts' }\n * };\n * }\n *\n * export default Post;\n * ```\n *\n * Relationships are checked when the app boots: each `inverse` must name a\n * relationship on the related model that points back, of a kind that pairs\n * with it, and each foreign key must be a column. A mistake fails the boot,\n * naming the relationship.\n *\n * The static query methods (`find`, `where`, `first`, \u2026) start a\n * {@link Query}; `create`, and `update`, `save` and `destroy` on a record,\n * write. See the\n * [models guide](https://github.com/nickschot/lux/blob/main/docs/guides/models.md).\n */\nclass Model {\n /**\n * The record's model class, typed with its statics\n * (`this.constructor.primaryKey`, `.relationshipFor`, \u2026).\n */\n declare ['constructor']: ModelClass;\n\n /**\n * The model's table name; the same as the static {@link Model.tableName}.\n */\n declare tableName: string;\n\n /**\n * The model's name (`post`); the same as the static\n * {@link Model.modelName}.\n */\n declare modelName: string;\n\n /**\n * The resource type the model is served as (`posts`); the same as the\n * static {@link Model.resourceName}.\n */\n declare resourceName: string;\n\n /**\n * When the record was created, if the table has a `created_at` column.\n */\n declare createdAt: Date;\n\n /**\n * When the record was last updated, if the table has an `updated_at`\n * column.\n */\n declare updatedAt: Date;\n\n /** @internal */\n declare initialized: boolean;\n\n /** @internal */\n declare rawColumnData: Record<string, unknown>;\n\n /** @internal */\n declare isModelInstance: boolean;\n\n /** @internal */\n declare prevAssociations: Set<Model>;\n\n /**\n * Names of `hasOne` relationships that were eager-loaded (joined) and found\n * to have no related record. Lets the relationship getter answer `null`\n * without a per-record query. Kept outside of the change sets so it never\n * counts as a change to the record.\n *\n * @internal\n */\n declare absentRelationships: Set<string>;\n\n /** @internal */\n declare changeSets: Array<ChangeSet>;\n\n /**\n * The model's to-one relationships whose foreign key is on the *other*\n * table, by name. Each names its `inverse`, the relationship on the other\n * model that points back:\n *\n * ```javascript\n * class User extends Model {\n * static hasOne = {\n * profile: { inverse: 'user' } // profiles.user_id\n * };\n * }\n *\n * class Profile extends Model {\n * static belongsTo = {\n * user: { inverse: 'profile' }\n * };\n * }\n * ```\n *\n * The foreign key is on the other table: its inverse `belongsTo`'s, which\n * is `<inverse>_id` unless that declares a `foreignKey`. Set `model` when\n * the related model's name differs from the relationship's\n * (`avatar: { inverse: 'owner', model: 'image' }`).\n */\n declare static hasOne: Record<string, unknown>;\n\n /**\n * The model's to-many relationships, by name. Each names its `inverse`, the\n * relationship on the other model that points back:\n *\n * ```javascript\n * class Author extends Model {\n * static hasMany = {\n * books: { inverse: 'author' } // books.author_id\n * };\n * }\n *\n * class Book extends Model {\n * static belongsTo = {\n * author: { inverse: 'books' }\n * };\n * }\n * ```\n *\n * The foreign key is on the other table: its inverse `belongsTo`'s, which\n * is `<inverse>_id` unless that declares a `foreignKey`. Set `model` when\n * the related model's name differs from the relationship's\n * (`publications: { inverse: 'author', model: 'book' }`).\n *\n * A many-to-many relationship goes `through` a join model, which\n * `belongsTo` both sides; each side's `inverse` names the other side's\n * relationship:\n *\n * ```javascript\n * class Post extends Model {\n * static hasMany = {\n * tags: { inverse: 'posts', through: 'categorization' }\n * };\n * }\n *\n * class Tag extends Model {\n * static hasMany = {\n * posts: { inverse: 'tags', through: 'categorization' }\n * };\n * }\n *\n * class Categorization extends Model {\n * static belongsTo = {\n * post: { inverse: 'tags' },\n * tag: { inverse: 'posts' }\n * };\n * }\n * ```\n */\n declare static hasMany: Record<string, unknown>;\n\n /**\n * The model's to-one relationships whose foreign key is on *this* table,\n * by name. Each names its `inverse`, the relationship on the other model\n * that points back:\n *\n * ```javascript\n * class Book extends Model {\n * static belongsTo = {\n * author: { inverse: 'books' } // books.author_id\n * };\n * }\n *\n * class Author extends Model {\n * static hasMany = {\n * books: { inverse: 'author' }\n * };\n * }\n * ```\n *\n * The foreign key is `<name>_id` on this table, and is also an attribute\n * (`book.authorId`), so the relationship can be set by id as well as by\n * record. Set `model` when the related model's name differs from the\n * relationship's, and `foreignKey` for a column named otherwise:\n *\n * ```javascript\n * class Book extends Model {\n * static belongsTo = {\n * writer: { inverse: 'books', model: 'author', foreignKey: 'written_by' }\n * };\n * }\n * ```\n *\n * The `hasOne` or `hasMany` on the other side uses the same column without\n * declaring it.\n */\n declare static belongsTo: Record<string, unknown>;\n\n /**\n * Validators for the model's attributes, by attribute name. Each takes the\n * value and returns whether it is valid; they run before every create and\n * update, after the `beforeValidation` hooks.\n *\n * ```javascript\n * import { isEmail } from 'validator';\n *\n * class User extends Model {\n * static validates = {\n * email: isEmail,\n * username: value => /^\\w{2,30}$/.test(value)\n * };\n * }\n * ```\n *\n * A value that fails throws a `ValidationError`, which the API answers\n * with `422 Unprocessable Entity` and a pointer to the attribute. Lumen\n * ships no validators of its own; use plain functions or a package such as\n * [validator](https://www.npmjs.com/package/validator).\n */\n declare static validates: Record<string, unknown>;\n\n /**\n * Named, reusable query conditions. Each scope becomes a method on the\n * model and on its queries, with `this` the query it is called on, and\n * chains like the built-in methods:\n *\n * ```javascript\n * class Post extends Model {\n * static scopes = {\n * isPublic() {\n * return this.where({ isPublic: true });\n * },\n *\n * byUser(user) {\n * return this.where({ userId: user.id });\n * }\n * };\n * }\n *\n * const posts = await Post.byUser(user).isPublic().page(2);\n * ```\n *\n * {@link Query.unscope} removes a scope from a query again.\n *\n * A scope narrows only the queries it is called on, and knows nothing of\n * the request. Calling `isPublic()` in a controller's `index` hides private\n * posts from that listing alone: `show`, relationship linkage, `include` and\n * the relationships of a write still reach them, and `unscope('isPublic')`\n * undoes it. To hide records from every request in a namespace, use the\n * scope in a controller visibility rule instead\n * ({@link Controller.visibility}), which Lumen applies to every query it\n * issues for the request and `unscope()` cannot remove.\n */\n declare static scopes: Record<string, unknown>;\n\n /**\n * Functions that run at points of a record's life, by name.\n *\n * | Creating | Updating | Deleting |\n * |---|---|---|\n * | `beforeValidation` | `beforeValidation` | `beforeDestroy` |\n * | `afterValidation` | `afterValidation` | `afterDestroy` |\n * | `beforeCreate` | `beforeUpdate` | |\n * | `beforeSave` | `beforeSave` | |\n * | `afterCreate` | `afterUpdate` | |\n * | `afterSave` | `afterSave` | |\n *\n * A hook is called with the record and the write's transaction,\n * `(record, trx)`, and may be async. Everything it does through the record\n * \u2014 reading a relationship, `update`, `save`, `destroy`, `reload` \u2014 runs in\n * that transaction. Pass the transaction on for queries on other models,\n * with `Model.transacting(trx)`. Then they see what the write has done so\n * far, and are rolled back with it if a later step fails:\n *\n * ```javascript\n * class Comment extends Model {\n * static hooks = {\n * async afterCreate(comment, trx) {\n * const post = await comment.post;\n *\n * await Notification.transacting(trx).create({\n * recipientId: post.userId,\n * message: `New comment on \"${post.title}\"`\n * });\n * }\n * };\n * }\n * ```\n *\n * The record a hook receives is a proxy of the instance being written:\n * attributes read and assign as usual, but compare records by\n * {@link Model.getPrimaryKey}, not `===`.\n */\n declare static hooks: ModelHooks;\n\n /**\n * The application's logger.\n */\n declare static logger: Logger;\n\n /**\n * The model's table: the pluralized, underscored class name (`BlogPost` \u2192\n * `blog_posts`), unless the model sets it.\n */\n declare static tableName: string;\n\n /**\n * The model's name, singular and dasherized (`blog-post`).\n */\n declare static modelName: string;\n\n /**\n * The resource type the model is served as, plural and dasherized\n * (`blog-posts`).\n */\n declare static resourceName: string;\n\n /**\n * The primary key column.\n */\n static primaryKey: string = 'id';\n\n /** @internal */\n declare static table: () => unknown;\n\n /** @internal */\n declare static store: Database;\n\n /** @internal */\n declare static initialized: boolean;\n\n /** @internal */\n declare static serializer: Serializer<Model>;\n\n /** @internal */\n declare static attributes: Record<string, unknown>;\n\n /** @internal */\n declare static attributeNames: Array<string>;\n\n /** @internal */\n declare static relationships: Record<string, RelationshipOptions>;\n\n /** @internal */\n declare static relationshipNames: Array<string>;\n\n /**\n * Build a record without saving it; {@link Model.create} builds and saves\n * one. `attrs` may hold attributes and relationships.\n */\n constructor(attrs: Record<string, unknown> = {}, initialize: boolean = true) {\n Object.defineProperties(this, {\n changeSets: {\n value: [new ChangeSet()],\n writable: false,\n enumerable: false,\n configurable: false\n },\n rawColumnData: {\n value: attrs,\n writable: false,\n enumerable: false,\n configurable: false\n },\n prevAssociations: {\n value: new Set(),\n writable: false,\n enumerable: false,\n configurable: false\n },\n absentRelationships: {\n value: new Set(),\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n\n const {\n constructor: { attributeNames, relationshipNames }\n } = this;\n const props = pick(attrs, ...attributeNames.concat(relationshipNames));\n\n Object.assign(this, props);\n\n if (initialize) {\n Object.defineProperty(this, 'initialized', {\n value: true,\n writable: false,\n enumerable: false,\n configurable: false\n });\n }\n\n return this;\n }\n\n /**\n * Whether the record has never been saved.\n *\n * ```javascript\n * new Post({ title: 'Draft' }).isNew; // => true\n *\n * const post = await Post.create({ title: 'Draft' });\n * post.isNew; // => false\n * ```\n */\n get isNew(): boolean {\n return !this.persistedChangeSet;\n }\n\n /**\n * Whether the record has changes that aren't saved.\n *\n * ```javascript\n * const post = await Post.find(1);\n * post.isDirty; // => false\n *\n * post.title = 'Renamed';\n * post.isDirty; // => true\n *\n * await post.save();\n * post.isDirty; // => false\n * ```\n */\n get isDirty(): boolean {\n return Boolean(this.dirtyProperties.size);\n }\n\n /**\n * Whether the record is saved and has no unsaved changes: neither\n * {@link Model.isNew} nor {@link Model.isDirty}.\n */\n get persisted(): boolean {\n return !this.isNew && !this.isDirty;\n }\n\n /**\n * The attributes changed since the record was last saved, with their new\n * values.\n *\n * ```javascript\n * if (user.dirtyAttributes.has('password')) {\n * user.password = await hash(user.password);\n * }\n * ```\n */\n get dirtyAttributes(): Map<string, unknown> {\n const {\n dirtyProperties,\n constructor: { relationshipNames }\n } = this;\n\n Array.from(dirtyProperties.keys()).forEach(key => {\n if (relationshipNames.indexOf(key) >= 0) {\n dirtyProperties.delete(key);\n }\n });\n\n return dirtyProperties;\n }\n\n /**\n * The relationships changed since the record was last saved, with their new\n * values.\n */\n get dirtyRelationships(): Map<string, unknown> {\n const {\n dirtyProperties,\n constructor: { attributeNames }\n } = this;\n\n Array.from(dirtyProperties.keys()).forEach(key => {\n if (attributeNames.indexOf(key) >= 0) {\n dirtyProperties.delete(key);\n }\n });\n\n return dirtyProperties;\n }\n\n /** @internal */\n get dirtyProperties(): Map<string, unknown> {\n const { currentChangeSet, persistedChangeSet } = this;\n\n if (!persistedChangeSet) {\n return new Map(currentChangeSet);\n }\n\n return diffMap(persistedChangeSet, currentChangeSet);\n }\n\n /** @internal */\n get currentChangeSet(): ChangeSet {\n return this.changeSets[0];\n }\n\n /** @internal */\n get persistedChangeSet(): ChangeSet | undefined {\n return this.changeSets.find(({ isPersisted }) => isPersisted);\n }\n\n /**\n * Bind the record to a transaction you started with\n * {@link Model.transaction}: `save`, `update`, `destroy`, `reload` and\n * relationship reads on the returned record run in `trx`, and so do the\n * related records those reads return.\n *\n * ```javascript\n * await Post.transaction(async trx => {\n * await post.transacting(trx).update({ isPublic: true });\n * await user.transacting(trx).update({ isActive: true });\n * });\n * ```\n *\n * Model hooks receive their record bound already.\n *\n * @param trx - The transaction.\n * @returns A proxy of the record that uses `trx`.\n */\n transacting(trx: unknown): this {\n return createInstanceTransactionProxy(this, trx);\n }\n\n /**\n * Run `fn` in a new transaction; the same as {@link Model.transaction} on\n * the record's model.\n *\n * @param fn - Called with the transaction. It commits when the promise `fn`\n * returns resolves, and rolls back when it rejects.\n * @returns Resolves with what `fn` resolved with.\n */\n transaction<T>(fn: (...args: Array<unknown>) => Promise<T>): Promise<T> {\n return this.constructor.transaction(fn);\n }\n\n /**\n * Save the changes made by assigning to the record.\n *\n * ```javascript\n * const post = await Post.find(1);\n *\n * post.title = 'Renamed';\n * await post.save();\n * ```\n *\n * Validations and the update hooks run, in a transaction of their own unless\n * one is given.\n *\n * @param transaction - A transaction to run in, instead of a new one.\n * @returns Resolves with the record; its `didPersist` is `false` when\n * there was nothing to save.\n */\n save(transaction?: unknown): Promise<TransactionResult<this, boolean>> {\n return this.update(mapToObject(this.dirtyProperties), transaction);\n }\n\n /**\n * Assign `props` to the record and save it.\n *\n * ```javascript\n * const post = await Post.find(1);\n *\n * await post.update({ title: 'Renamed', isPublic: true });\n * ```\n *\n * Validations and the update hooks run, in a transaction of their own unless\n * one is given.\n *\n * @param props - Attributes and relationships to assign.\n * @param transaction - A transaction to run in, instead of a new one.\n * @returns Resolves with the record; its `didPersist` is `false` when nothing\n * changed.\n */\n update(\n props: Record<string, unknown> = {},\n transaction?: unknown\n ): Promise<TransactionResult<this, boolean>> {\n const run = async (trx: unknown) => {\n const {\n constructor: { hooks }\n } = this;\n let statements: Array<unknown> = [];\n let promise: Array<unknown> | Promise<Array<unknown>> = Promise.resolve(\n []\n );\n let hadDirtyAttrs = false;\n let hadDirtyAssoc = false;\n\n const associations = Object.keys(props).filter(key =>\n Boolean(this.constructor.relationshipFor(key))\n );\n\n Object.assign(this, props);\n\n if (associations.length) {\n hadDirtyAssoc = true;\n\n for (const key of associations) {\n statements = [\n ...statements,\n ...(await updateRelationship(this, key, trx))\n ];\n }\n }\n\n if (this.isDirty) {\n hadDirtyAttrs = true;\n\n await runHooks(this, trx, hooks.beforeValidation);\n\n validate(this);\n\n await runHooks(\n this,\n trx,\n hooks.afterValidation,\n hooks.beforeUpdate,\n hooks.beforeSave\n );\n\n promise = update(this, trx);\n }\n\n await createRunner(this.constructor, statements)(await promise);\n\n this.prevAssociations.clear();\n this.currentChangeSet.persist(this.changeSets);\n\n if (hadDirtyAttrs) {\n await runHooks(this, trx, hooks.afterUpdate, hooks.afterSave);\n }\n\n return createTransactionResultProxy(this, hadDirtyAttrs || hadDirtyAssoc);\n };\n\n if (transaction) {\n return run(transaction).catch(rethrowWriteError);\n }\n\n return this.transaction(run).catch(rethrowWriteError);\n }\n\n /**\n * Delete the record, running the destroy hooks, in a transaction of its own\n * unless one is given.\n *\n * @param transaction - A transaction to run in, instead of a new one.\n * @returns Resolves with the record.\n */\n destroy(transaction?: unknown): Promise<TransactionResult<this, true>> {\n const run = async (trx: unknown) => {\n const {\n constructor: { hooks }\n } = this;\n\n await runHooks(this, trx, hooks.beforeDestroy);\n await createRunner(this.constructor, [])(await destroy(this, trx));\n await runHooks(this, trx, hooks.afterDestroy);\n\n return createTransactionResultProxy(this, true);\n };\n\n if (transaction) {\n return run(transaction);\n }\n\n return this.transaction(run);\n }\n\n /**\n * Fetch the record from the database again.\n *\n * @returns Resolves with a new instance of the record as stored (the record\n * itself if it was never saved).\n */\n reload(): Promise<Model> {\n if (this.isNew) {\n return Promise.resolve(this);\n }\n\n return this.constructor.find(this.getPrimaryKey());\n }\n\n /**\n * Discard the changes made since the record was last saved.\n *\n * @returns The record.\n */\n rollback(): this {\n const { persistedChangeSet } = this;\n\n if (persistedChangeSet && !this.currentChangeSet.isPersisted) {\n persistedChangeSet.applyTo(this).persist(this.changeSets);\n }\n\n return this;\n }\n\n /** @internal */\n getAttributes(...keys: Array<string>): Record<string, unknown> {\n return pick(this, ...keys);\n }\n\n /**\n * The record's primary key value. Compare records by it rather than by\n * identity: the record a hook receives is a proxy of the one being written.\n */\n getPrimaryKey(): number {\n return readAttribute(this, this.constructor.primaryKey) as number;\n }\n\n /**\n * Build a record from `props` and save it.\n *\n * ```javascript\n * const post = await Post.create({ title: 'Hello', user });\n * ```\n *\n * Validations and the create hooks run, in a transaction of their own unless\n * one is given.\n *\n * @param props - Attributes and relationships of the new record.\n * @param transaction - A transaction to run in, instead of a new one.\n * @returns Resolves with the new record.\n */\n static create(\n props: Record<string, unknown> = {},\n transaction?: unknown\n ): Promise<TransactionResult<Model, true>> {\n const run = async (trx: unknown) => {\n const { hooks, primaryKey } = this;\n const instance = new this(props, false);\n\n await runHooks(instance, trx, hooks.beforeValidation);\n\n validate(instance);\n\n await runHooks(\n instance,\n trx,\n hooks.afterValidation,\n hooks.beforeCreate,\n hooks.beforeSave\n );\n\n const runner = createRunner(this, []);\n const [[firstRow]] = await runner(await create(instance, trx));\n\n // `insert().returning(pk)` yields a scalar `[1]` on knex 0.16 but an\n // object `[{ id: 1 }]` on knex >= 1 (once `RETURNING` reached sqlite).\n // Normalize both so the primary key stays a scalar.\n const primaryKeyValue =\n firstRow !== null && typeof firstRow === 'object'\n ? (firstRow as Record<string, unknown>)[primaryKey]\n : firstRow;\n\n writeAttribute(instance, primaryKey, primaryKeyValue);\n instance.rawColumnData[primaryKey] = primaryKeyValue;\n\n let statements: Array<unknown> = [];\n const associations = Object.keys(props).filter(key =>\n Boolean(this.relationshipFor(key))\n );\n\n for (const key of associations) {\n statements = [\n ...statements,\n ...(await updateRelationship(instance, key, trx))\n ];\n }\n\n await Promise.all(statements);\n\n Object.defineProperty(instance, 'initialized', {\n value: true,\n writable: false,\n enumerable: false,\n configurable: false\n });\n\n instance.currentChangeSet.persist(instance.changeSets);\n\n await runHooks(instance, trx, hooks.afterCreate, hooks.afterSave);\n\n return createTransactionResultProxy(instance, true);\n };\n\n if (transaction) {\n return run(transaction).catch(rethrowWriteError);\n }\n\n return this.transaction(run).catch(rethrowWriteError);\n }\n\n /**\n * Bind the model to a transaction: `create`, and every query started from\n * the returned model \u2014 `find`, `where`, `first`, `count`, scopes and the\n * rest, with the queries that load their included relationships \u2014 run in\n * `trx`.\n *\n * ```javascript\n * await Post.transaction(async trx => {\n * const post = await Post.transacting(trx).create({ title: 'Hello' });\n * await Comment.transacting(trx).create({ postId: post.id });\n * });\n * ```\n *\n * A model hook reads through the transaction it is given, so it sees what the\n * write has done so far, and doesn't wait for a second connection while the\n * transaction holds one:\n *\n * ```javascript\n * static hooks = {\n * async afterCreate(comment, trx) {\n * const post = await Post.transacting(trx).find(comment.postId);\n * // \u2026\n * }\n * };\n * ```\n *\n * @param trx - The transaction.\n * @returns A proxy of the model that uses `trx`.\n */\n static transacting(trx: unknown): ModelClass {\n return createStaticTransactionProxy(this, trx);\n }\n\n /**\n * Run `fn` in a new transaction. Every write runs in a transaction of its\n * own; start one yourself to group several, and pass it on with\n * `transacting`:\n *\n * ```javascript\n * await Post.transaction(async trx => {\n * await Post.transacting(trx).create({ title: 'One' });\n * await Post.transacting(trx).create({ title: 'Two' });\n * });\n * ```\n *\n * @param fn - Called with the transaction. It commits when the promise `fn`\n * returns resolves, and rolls back when it rejects.\n * @returns Resolves with what `fn` resolved with.\n */\n static transaction<T>(\n fn: (...args: Array<unknown>) => Promise<T>\n ): Promise<T> {\n return new Promise((resolve, reject) => {\n const {\n store: { connection }\n } = this;\n let result: T;\n\n connection\n .transaction(trx => {\n fn(trx)\n .then(data => {\n result = data;\n return trx.commit();\n })\n .catch(trx.rollback);\n })\n .then(() => {\n resolve(result);\n })\n .catch(err => {\n reject(err);\n });\n });\n }\n\n /**\n * Every record. Starts a {@link Query}; see {@link Query.all}.\n */\n static all(): Query<Array<Model>> {\n return new Query(this).all();\n }\n\n /**\n * The record with primary key `primaryKey`; rejects with a\n * `RecordNotFoundError` (`404` through the API) if there is none. Starts a\n * {@link Query}; see {@link Query.find}.\n */\n static find(primaryKey: unknown): Query<Model> {\n return new Query(this).find(primaryKey);\n }\n\n /**\n * Page `num` of the records. Starts a {@link Query}; see {@link Query.page}.\n */\n static page(num: number): Query<Array<Model>> {\n return new Query(this).page(num);\n }\n\n /**\n * At most `amount` records. Starts a {@link Query}; see {@link Query.limit}.\n */\n static limit(amount: number): Query<Array<Model>> {\n return new Query(this).limit(amount);\n }\n\n /**\n * Skip `amount` records. Starts a {@link Query}; see {@link Query.offset}.\n */\n static offset(amount: number): Query<Array<Model>> {\n return new Query(this).offset(amount);\n }\n\n /**\n * The number of records. Starts a {@link Query}; see {@link Query.count}.\n */\n static count(): Query<number> {\n return new Query(this).count();\n }\n\n /**\n * The records sorted by `attr`. Starts a {@link Query}; see\n * {@link Query.order}.\n */\n static order(attr: string, direction?: string): Query<Array<Model>> {\n return new Query(this).order(attr, direction);\n }\n\n /**\n * The records matching `conditions`. Starts a {@link Query}; see\n * {@link Query.where}.\n */\n static where(conditions: Record<string, unknown>): Query<Array<Model>> {\n return new Query(this).where(conditions);\n }\n\n /**\n * The records with values within ranges. Starts a {@link Query}; see\n * {@link Query.whereBetween}.\n */\n static whereBetween(\n conditions: Record<string, unknown>\n ): Query<Array<Model>> {\n return new Query(this).whereBetween(conditions);\n }\n\n /**\n * The records matching a raw SQL condition. Starts a {@link Query}; see\n * {@link Query.whereRaw}.\n */\n static whereRaw(\n query: string,\n bindings: Array<unknown> = []\n ): Query<Array<Model>> {\n return new Query(this).whereRaw(query, bindings);\n }\n\n /**\n * The records not matching `conditions`. Starts a {@link Query}; see\n * {@link Query.not}.\n */\n static not(conditions: Record<string, unknown>): Query<Array<Model>> {\n return new Query(this).not(conditions);\n }\n\n /**\n * The first record. Starts a {@link Query}; see {@link Query.first}.\n */\n static first(): Query<Model> {\n return new Query(this).first();\n }\n\n /**\n * The last record. Starts a {@link Query}; see {@link Query.last}.\n */\n static last(): Query<Model> {\n return new Query(this).last();\n }\n\n /**\n * Only these attributes. Starts a {@link Query}; see {@link Query.select}.\n */\n static select(...params: Array<string>): Query<Array<Model>> {\n return new Query(this).select(...params);\n }\n\n /**\n * Unique values of these attributes. Starts a {@link Query}; see\n * {@link Query.distinct}.\n */\n static distinct(...params: Array<string>): Query<Array<Model>> {\n return new Query(this).distinct(...params);\n }\n\n /**\n * The records with these relationships loaded. Starts a {@link Query}; see\n * {@link Query.include}.\n */\n static include(\n ...relationships: Array<string | Record<string, unknown>>\n ): Query<Array<Model>> {\n return new Query(this).include(...relationships);\n }\n\n /**\n * The records without these scopes. Starts a {@link Query}; see\n * {@link Query.unscope}.\n */\n static unscope(...scopes: Array<string>): Query<Array<Model>> {\n return new Query(this).unscope(...scopes);\n }\n\n /**\n * Whether the model declares the scope `name` in {@link Model.scopes}.\n */\n static hasScope(name: string): boolean {\n return Boolean(this.scopes[name]);\n }\n\n /**\n * Whether `value` is a record of this model.\n */\n static isInstance(value: unknown): boolean {\n return value instanceof this;\n }\n\n /**\n * Bind the model's connection to the database and get inferred data from the\n * schema upon application boot.\n *\n * @param store - A reference of the applications database\n * instance.\n * @param table - A function that returns a knex query builder bound\n * to the model's table name.\n * @returns Resolves with the model class.\n * @internal\n */\n static initialize(\n store: Database,\n table: () => unknown\n ): Promise<ModelClass> {\n if (this.initialized) {\n return Promise.resolve(this);\n }\n\n if (!this.tableName) {\n const getTableName = compose(pluralize, underscore);\n const tableName = getTableName(this.name);\n\n Object.defineProperty(this, 'tableName', {\n value: tableName,\n writable: false,\n enumerable: true,\n configurable: false\n });\n\n Object.defineProperty(this.prototype, 'tableName', {\n value: tableName,\n writable: false,\n enumerable: false,\n configurable: false\n });\n }\n\n return initializeClass({\n store,\n table,\n model: this\n });\n }\n\n /** @internal */\n static columnFor(key: string): DatabaseColumn | undefined {\n return this.attributes[key] as DatabaseColumn | undefined;\n }\n\n /** @internal */\n static columnNameFor(key: string): string | undefined {\n const column = this.columnFor(key);\n\n return column ? column.columnName : undefined;\n }\n\n /** @internal */\n static relationshipFor(key: string): RelationshipOptions | undefined {\n // Own keys only: `relationships` is a plain object, so `constructor` or\n // `toString` would otherwise come back as a \"relationship\".\n return Object.hasOwn(this.relationships, key)\n ? this.relationships[key]\n : undefined;\n }\n}\n\nexport default Model;\nexport type { ModelHook, ModelHooks } from './interfaces';\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * `Query` is the chainable query builder. Its snapshot tuples (method name +\n * arbitrary Knex arguments), where/include condition objects, and the values it\n * ultimately resolves are genuinely dynamic; the original Flow typed them\n * `any`/`Object` for the same reason. The generic `T` still types what a query\n * resolves to for callers.\n */\nimport { camelize } from 'inflection';\n\nimport entries from '../../../utils/entries';\nimport uniq from '../../../utils/uniq';\nimport type { ModelClass } from '../interfaces';\n\nimport scopesFor from './utils/scopes-for';\nimport formatSelect from './utils/format-select';\nimport { runQuery, createRunner } from './runner';\n\n/**\n * The snapshots that narrow which rows match \u2014 the only ones `count()` keeps.\n * Every condition the query builder can push belongs here: dropping one makes\n * the count (and so the index action's page links) disagree with the rows.\n *\n * @internal\n */\nconst CONDITIONS = new Set([\n 'where',\n 'whereNot',\n 'whereIn',\n 'whereNotIn',\n 'whereNull',\n 'whereNotNull',\n 'whereBetween',\n 'whereNotBetween',\n 'whereRaw'\n]);\n\n/**\n * A knex query builder (e.g. `Model.table().select('user_id')`), used as a\n * subquery.\n *\n * @internal\n */\nfunction isSubquery(value: unknown): boolean {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as { toSQL?: unknown }).toSQL === 'function'\n );\n}\n\n/**\n * A lazily built database query. `Model.all()`, `Model.where()`,\n * `Model.find()` and the other static query methods start one; chain more\n * methods, and the model's scopes, onto it, and `await` it to run it:\n *\n * ```javascript\n * const posts = await Post.where({ isPublic: true })\n * .order('createdAt', 'DESC')\n * .include('user')\n * .page(2);\n * ```\n *\n * A query resolves with an array of records, or with one record after\n * {@link Query.find}, {@link Query.first} or {@link Query.last}, or with a\n * number after {@link Query.count}. A controller action may return a query\n * without awaiting it; Lumen runs it and serializes the result.\n */\nclass Query<T = any> extends Promise<T> {\n /** @internal */\n declare model: ModelClass;\n\n /** @internal */\n declare isFind: boolean;\n\n /** @internal */\n declare snapshots: Array<Array<any>>;\n\n /** @internal */\n declare collection: boolean;\n\n /** @internal */\n declare shouldCount: boolean;\n\n /** @internal */\n declare relationships: Record<string, any>;\n\n /** @internal */\n declare trx: unknown;\n\n constructor(model: ModelClass) {\n let resolve;\n let reject;\n\n super((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n createRunner(this, {\n resolve,\n reject\n });\n\n Object.defineProperties(this, {\n model: {\n value: model,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n collection: {\n value: true,\n writable: true,\n enumerable: false,\n configurable: false\n },\n\n snapshots: {\n value: [],\n writable: true,\n enumerable: false,\n configurable: false\n },\n\n shouldCount: {\n value: false,\n writable: true,\n enumerable: false,\n configurable: false\n },\n\n relationships: {\n value: {},\n writable: true,\n enumerable: false,\n configurable: false\n },\n\n trx: {\n value: null,\n writable: true,\n enumerable: false,\n configurable: false\n }\n });\n\n Object.defineProperties(this, scopesFor(this));\n }\n\n static override get [Symbol.species]() {\n return Promise;\n }\n\n /**\n * Run the query \u2014 and the queries that load its included relationships \u2014\n * in the transaction `trx`, so it sees the rows the transaction has written\n * and does not wait for another connection while the transaction holds\n * one. Model hooks receive the write's transaction for this:\n *\n * ```javascript\n * static hooks = {\n * async afterCreate(comment, trx) {\n * const post = await Post.transacting(trx).find(comment.postId);\n * // \u2026\n * }\n * };\n * ```\n *\n * `Model.transacting(trx)` starts a query that is already bound, as above;\n * this method binds one built another way.\n */\n transacting(trx: unknown): this {\n this.trx = trx;\n return this;\n }\n\n /**\n * Every record: adds no condition. `Model.all()` reads better than a bare\n * query.\n */\n all(): this {\n return this;\n }\n\n /**\n * The records that do *not* match `conditions`; the opposite of\n * {@link Query.where}, with the same conditions.\n *\n * ```javascript\n * await User.not({ name: 'Bob' });\n * await User.not({ deletedAt: null }); // deleted_at IS NOT NULL\n * ```\n */\n not(conditions: Record<string, any> = {}): this {\n return this.where(conditions, true);\n }\n\n /**\n * The record with primary key `primaryKey`. The query resolves with the\n * record, or rejects with a `RecordNotFoundError` \u2014 a `404` through the API \u2014\n * if there is none.\n *\n * ```javascript\n * const post = await Post.find(1);\n * ```\n */\n find(primaryKey: any): this {\n Object.assign(this, {\n isFind: true,\n collection: false\n });\n\n this.where({\n [this.model.primaryKey]: primaryKey\n });\n\n if (!this.shouldCount) {\n this.limit(1);\n }\n\n return this;\n }\n\n /**\n * Page `num` of the records, counting from 1. The page size is the query's\n * {@link Query.limit}, or 25.\n *\n * ```javascript\n * await Post.order('createdAt', 'DESC').limit(10).page(2); // records 11\u201320\n * ```\n */\n page(num?: number): this {\n if (this.shouldCount) {\n return this;\n }\n\n let limit: any = this.snapshots.find(([name]) => name === 'limit');\n\n if (limit) {\n [, limit] = limit;\n }\n\n if (typeof limit !== 'number') {\n limit = 25;\n }\n\n this.limit(limit);\n\n return this.offset(Math.max(parseInt(String(num), 10) - 1, 0) * limit);\n }\n\n /**\n * At most `amount` records.\n */\n limit(amount?: number): this {\n if (!this.shouldCount) {\n this.snapshots.push(['limit', amount]);\n }\n\n return this;\n }\n\n /**\n * Sort by the attribute `attr`, `'ASC'` (the default) or `'DESC'`. Ties are\n * broken by the primary key, so pages are stable. A later `order` replaces an\n * earlier one; an attribute the model doesn't have is ignored.\n *\n * ```javascript\n * await Post.order('createdAt', 'DESC');\n * ```\n */\n order(attr: string, direction: string = 'ASC'): this {\n if (!this.shouldCount) {\n const columnName = this.model.columnNameFor(attr);\n\n if (columnName) {\n this.snapshots = this.snapshots\n .filter(([method]) => method !== 'orderByRaw')\n .concat([\n [\n 'orderByRaw',\n uniq([columnName, this.model.primaryKey])\n .map(key => `${this.model.tableName}.${key} ${direction}`)\n .join(', ')\n ]\n ]);\n }\n }\n\n return this;\n }\n\n /**\n * The records matching every condition in `conditions`, an object of\n * attribute names (camelCase, as on records) and values:\n *\n * ```javascript\n * await Post.where({ userId: 1, isPublic: true });\n * await Post.where({ id: [1, 2, 3] }); // any of: id IN (1, 2, 3)\n * await Post.where({ publishedAt: null }); // published_at IS NULL\n * ```\n *\n * Names that aren't attributes of the model are ignored. Calls chain as\n * `AND`.\n *\n * @param not - Used by {@link Query.not}.\n */\n where(conditions: Record<string, any> = {}, not: boolean = false): this {\n const {\n model: { tableName }\n } = this;\n\n const where = entries(conditions).reduce<Record<string, any>>(\n (obj, condition) => {\n let [key, value] = condition;\n const columnName = this.model.columnNameFor(key);\n\n if (columnName) {\n key = `${tableName}.${columnName}`;\n\n if (typeof value === 'undefined') {\n value = null;\n }\n\n if (isSubquery(value)) {\n // `model.table().select(...)`: the column is one of its values.\n this.snapshots.push([not ? 'whereNotIn' : 'whereIn', [key, value]]);\n } else if (Array.isArray(value)) {\n if (value.length === 1) {\n return {\n ...obj,\n [key]: value[0]\n };\n }\n\n this.snapshots.push([not ? 'whereNotIn' : 'whereIn', [key, value]]);\n } else if (value === null) {\n this.snapshots.push([not ? 'whereNotNull' : 'whereNull', [key]]);\n } else {\n return {\n ...obj,\n [key]: value\n };\n }\n }\n\n return obj;\n },\n {}\n );\n\n if (Object.keys(where).length) {\n this.snapshots.push([not ? 'whereNot' : 'where', where]);\n }\n\n return this;\n }\n\n /**\n * The records whose attributes lie within ranges, inclusive:\n *\n * ```javascript\n * await Post.whereBetween({ createdAt: [lastWeek, now] });\n * ```\n *\n * @param not - `true` for the records *outside* the ranges.\n */\n whereBetween(conditions: Record<string, any>, not: boolean = false): this {\n const {\n model: { tableName }\n } = this;\n\n entries(conditions).forEach(condition => {\n let [key] = condition;\n const [, value] = condition;\n const columnName = this.model.columnNameFor(key);\n\n if (columnName) {\n key = `${tableName}.${columnName}`;\n\n if (Array.isArray(value)) {\n this.snapshots.push([\n `where${not ? 'NotBetween' : 'Between'}`,\n [key, value]\n ]);\n }\n }\n });\n\n return this;\n }\n\n /**\n * The records matching a raw SQL condition, with `?` placeholders for\n * `bindings`. Columns are snake_case here, as in the database:\n *\n * ```javascript\n * await Post.whereRaw('lower(title) LIKE ?', ['%lumen%']);\n * ```\n *\n * Never build `query` from user input; pass values as `bindings`.\n */\n whereRaw(query: string, bindings: Array<any> = []): this {\n this.snapshots.push(['whereRaw', [query, bindings]]);\n return this;\n }\n\n /**\n * Only the first record \u2014 by primary key, or by the query's\n * {@link Query.order} \u2014 instead of an array. Resolves with `undefined` when\n * nothing matches.\n */\n first(): this {\n if (!this.shouldCount) {\n const willSort = this.snapshots.some(\n ([method]) => method === 'orderByRaw'\n );\n\n this.collection = false;\n\n if (!willSort) {\n this.order(this.model.primaryKey, 'ASC');\n }\n\n this.limit(1);\n }\n\n return this;\n }\n\n /**\n * Only the last record \u2014 by primary key, or by the query's\n * {@link Query.order} \u2014 instead of an array. Resolves with `undefined` when\n * nothing matches.\n */\n last(): this {\n if (!this.shouldCount) {\n const willSort = this.snapshots.some(\n ([method]) => method === 'orderByRaw'\n );\n\n this.collection = false;\n\n if (!willSort) {\n this.order(this.model.primaryKey, 'DESC');\n }\n\n this.limit(1);\n }\n\n return this;\n }\n\n /**\n * The number of matching records, instead of the records. Only the query's\n * conditions count; `limit`, `page`, `order` and `include` are ignored.\n *\n * ```javascript\n * const total = await Post.where({ isPublic: true }).count();\n * ```\n */\n count(): Query<number> {\n Object.assign(this, {\n shouldCount: true,\n\n snapshots: [\n ['count', '* as countAll'],\n ...this.snapshots.filter(([name]) => CONDITIONS.has(name))\n ]\n });\n\n return this as unknown as Query<number>;\n }\n\n /**\n * Skip the first `amount` records.\n */\n offset(amount: number): this {\n if (!this.shouldCount) {\n this.snapshots.push(['offset', amount]);\n }\n\n return this;\n }\n\n /**\n * Load only these attributes. Include the primary key when you will use\n * the records for more than reading these values.\n *\n * ```javascript\n * await User.select('id', 'name');\n * ```\n */\n select(...attrs: Array<string>): this {\n if (!this.shouldCount) {\n this.snapshots.push(['select', formatSelect(this.model, attrs)]);\n }\n\n return this;\n }\n\n /**\n * Only unique combinations of these attributes.\n */\n distinct(...attrs: Array<string>): this {\n if (!this.shouldCount) {\n this.snapshots.push(['distinct', formatSelect(this.model, attrs)]);\n }\n\n return this.select();\n }\n\n /**\n * Load these relationships with the records, so reading them doesn't cost\n * a query per record:\n *\n * ```javascript\n * const posts = await Post.where({ isPublic: true }).include('user', 'tags');\n * ```\n *\n * Pass an object to load only some attributes of each:\n * `include({ user: ['name'] })`.\n */\n include(...relationships: Array<Record<string, any> | string>): this {\n let included: Array<any>;\n\n if (!this.shouldCount) {\n if (relationships.length === 1 && typeof relationships[0] === 'object') {\n included = entries(relationships[0]).reduce<Array<any>>(\n (arr, relationship) => {\n const [name] = relationship;\n const opts = this.model.relationshipFor(name);\n let [, attrs] = relationship;\n\n if (opts) {\n if (!attrs.length) {\n attrs = opts.model.attributeNames;\n }\n\n return [...arr, { name, attrs, relationship: opts }];\n }\n\n return arr;\n },\n []\n );\n } else {\n included = relationships.reduce<Array<any>>((arr, name) => {\n let str = name;\n\n if (typeof str !== 'string') {\n str = String(str);\n }\n\n const opts = this.model.relationshipFor(str);\n\n if (opts) {\n const attrs = opts.model.attributeNames;\n\n return [...arr, { attrs, name: str, relationship: opts }];\n }\n\n return arr;\n }, []);\n }\n\n const willInclude = included\n .filter(opts => {\n const { name, relationship } = opts;\n let { attrs } = opts;\n\n if (relationship.type === 'hasMany') {\n attrs = relationship.through\n ? attrs\n : [...attrs, camelize(relationship.foreignKey, true)];\n\n this.relationships[name] = {\n attrs,\n type: 'hasMany',\n model: relationship.model,\n inverse: relationship.inverse,\n through: relationship.through,\n foreignKey: relationship.foreignKey\n };\n\n return false;\n }\n\n return true;\n })\n .reduce<Array<any>>((arr, { name, attrs, relationship }) => {\n arr.push([\n 'includeSelect',\n formatSelect(relationship.model, attrs, `${name}.`)\n ]);\n\n if (relationship.type === 'belongsTo') {\n arr.push([\n 'leftOuterJoin',\n [\n relationship.model.tableName,\n `${this.model.tableName}.${relationship.foreignKey}`,\n '=',\n `${relationship.model.tableName}.${relationship.model.primaryKey}`\n ]\n ]);\n } else if (relationship.type === 'hasOne') {\n arr.push([\n 'leftOuterJoin',\n [\n relationship.model.tableName,\n `${this.model.tableName}.${this.model.primaryKey}`,\n '=',\n `${relationship.model.tableName}.${relationship.foreignKey}`\n ]\n ]);\n }\n\n return arr;\n }, []);\n\n this.snapshots.push(...willInclude);\n }\n\n return this;\n }\n\n /**\n * Remove scopes from the query \u2014 by name, or every scope when called\n * without arguments. `'order'` removes the sort order.\n *\n * ```javascript\n * await Post.isPublic().unscope('isPublic');\n * ```\n */\n unscope(...scopes: Array<string>): this {\n if (scopes.length) {\n const keys = scopes.map(scope => {\n if (scope === 'order') {\n return 'orderByRaw';\n }\n\n return scope;\n });\n\n this.snapshots = this.snapshots.filter(([, , scope]) => {\n if (typeof scope === 'string') {\n return keys.indexOf(scope) < 0;\n }\n\n return true;\n });\n } else {\n this.snapshots = this.snapshots.filter(([, , scope]) => !scope);\n }\n\n return this;\n }\n\n override then<TResult1 = T, TResult2 = never>(\n onFulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n onRejected?: ((error: unknown) => TResult2 | PromiseLike<TResult2>) | null\n ): Promise<TResult1 | TResult2> {\n runQuery(this);\n return super.then(onFulfilled, onRejected);\n }\n\n override catch<TResult = never>(\n onRejected?: ((error: unknown) => TResult | PromiseLike<TResult>) | null\n ): Promise<T | TResult> {\n runQuery(this);\n return super.catch(onRejected);\n }\n\n /** @internal */\n static from(src: any): Query<unknown> {\n const { model, snapshots, collection, shouldCount, relationships, trx } =\n src;\n\n const dest = new this(model) as Query<unknown>;\n\n Object.assign(dest, {\n snapshots,\n collection,\n shouldCount,\n relationships,\n trx: trx ?? null\n });\n\n return dest;\n }\n}\n\nexport default Query;\nexport { RecordNotFoundError } from './errors';\nexport { CONDITIONS };\n", "/**\n * @private\n */\nexport default function uniq<T>(src: T[], ...keys: string[]): T[] {\n const hasKeys = Boolean(keys.length);\n const valueAt = (obj: T, key: string): unknown =>\n (obj as unknown as Record<string, unknown>)[key];\n\n return src.filter((x, xIdx, arr) => {\n let lastIdx: number;\n\n if (hasKeys) {\n lastIdx = arr.findIndex(\n (y, yIdx) =>\n yIdx > xIdx || keys.every(key => valueAt(x, key) === valueAt(y, key))\n );\n } else {\n lastIdx = src.lastIndexOf(x);\n }\n\n return xIdx === lastIdx;\n });\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * `scopesFor` builds the dynamic scope-method machinery: each scope is a\n * variadic function forwarded to the model's scope statics via `apply`,\n * so the argument list is genuinely untyped at this layer.\n */\nimport type Query from '../index';\n\nexport default function scopesFor<T>(target: Query<T>): PropertyDescriptorMap {\n return Object.keys(target.model.scopes).reduce<PropertyDescriptorMap>(\n (scopes, name) => ({\n ...scopes,\n [name]: {\n get() {\n const scope = function (...args: Array<any>) {\n // Scopes are installed as statics on the model under their names.\n const fn = (\n target.model as unknown as Record<\n string,\n (...a: any[]) => unknown\n >\n )[name];\n const { snapshots } = fn.apply(target.model, args) as {\n snapshots: Array<Array<unknown>>;\n };\n\n Object.assign(target, {\n snapshots: [\n ...target.snapshots,\n ...snapshots.map(snapshot => [...snapshot, name])\n ]\n });\n\n return target;\n };\n\n Object.defineProperty(scope, 'name', {\n value: name,\n writable: false,\n enumerable: false,\n configurable: false\n });\n\n return scope;\n }\n }\n }),\n {}\n );\n}\n", "import { camelize } from 'inflection';\n\nimport type { ModelClass } from '../../interfaces';\n\n/** @internal */\nexport default function formatSelect(\n model: ModelClass,\n attrs: Array<string> = [],\n prefix: string = ''\n) {\n return attrs.map(attr => {\n const name = model.columnNameFor(attr) || 'undefined';\n\n return `${model.tableName}.${name} AS ${prefix}${camelize(name, true)}`;\n });\n}\n", "import createServerError from '../../../server/utils/create-server-error';\nimport stringify from '../../../../utils/stringify';\nimport type { ModelClass } from '../../interfaces';\n\nclass RecordNotFoundError extends Error {\n constructor({ name, primaryKey }: ModelClass, primaryKeyValue: unknown) {\n super(\n `Could not find ${name} with ${primaryKey} ${stringify(primaryKeyValue)}.`\n );\n }\n}\n\nexport default createServerError(RecordNotFoundError, 404, { isPublic: true });\n", "import type Query from '../index';\n\nexport const RUNNERS: WeakMap<\n Query<unknown>,\n () => Promise<void>\n> = new WeakMap();\n", "import isObject from '../../../../../utils/is-object';\nimport type Query from '../../index';\n\nexport default function getFindParam({\n isFind,\n snapshots,\n model: { tableName, primaryKey }\n}: Query<unknown>) {\n if (isFind) {\n const snapshot = snapshots.find(([method]) => method === 'where');\n\n if (snapshot) {\n const [, params] = snapshot;\n\n if (params && isObject(params)) {\n return params[`${tableName}.${primaryKey}`];\n }\n }\n }\n\n return undefined;\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * The query runner assembles results from raw Knex rows and dynamically-built\n * related sub-queries (dynamic key access over untyped column data), so\n * records, relationship descriptors and the constructed instances are genuinely\n * untyped at this layer.\n */\nimport { camelize, singularize } from 'inflection';\n\nimport type Model from '../../../model';\nimport type { ModelClass } from '../../../interfaces';\nimport entries from '../../../../../utils/entries';\nimport underscore from '../../../../../utils/underscore';\nimport promiseHash from '../../../../../utils/promise-hash';\n\n/** @internal */\nexport default async function buildResults<T extends Model>({\n model,\n records,\n relationships,\n trx = null\n}: {\n model: ModelClass<T>;\n records: Promise<Array<Record<string, any>>>;\n relationships: Record<string, any>;\n trx?: unknown;\n}): Promise<Array<T>> {\n const results = await records;\n const pkPattern = new RegExp(`^.+\\\\.${model.primaryKey}$`);\n let related: Record<string, any> | undefined;\n\n if (!results.length) {\n return [];\n }\n\n if (Object.keys(relationships).length) {\n related = entries(relationships).reduce<Record<string, any>>(\n (obj, entry) => {\n const [name, relationship] = entry;\n let foreignKey = camelize(relationship.foreignKey, true);\n\n if (relationship.through) {\n const query = relationship.model\n .select(...relationship.attrs)\n .transacting(trx);\n\n // The join table's key for the related side: the inverse's.\n const relatedKey =\n relationship.model.relationshipFor(relationship.inverse)\n ?.foreignKey ?? `${singularize(underscore(name))}_id`;\n const baseKey = `${relationship.through.tableName}.${relatedKey}`;\n\n foreignKey = `${relationship.through.tableName}.${relationship.foreignKey}`;\n\n query.snapshots.push(\n [\n 'select',\n [\n `${baseKey} as ${camelize(String(baseKey.split('.').pop()), true)}`,\n `${foreignKey} as ${camelize(String(foreignKey.split('.').pop()), true)}`\n ]\n ],\n [\n 'innerJoin',\n [\n relationship.through.tableName,\n `${relationship.model.tableName}.${relationship.model.primaryKey}`,\n '=',\n baseKey\n ]\n ],\n ['whereIn', [foreignKey, results.map(({ id }) => id)]]\n );\n\n return { ...obj, [name]: query };\n }\n\n return {\n ...obj,\n [name]: relationship.model\n .select(...relationship.attrs)\n .where({\n [foreignKey]: results.map(({ id }) => id)\n })\n .transacting(trx)\n };\n },\n {}\n );\n\n related = await promiseHash(related);\n }\n\n return results.map(record => {\n if (related) {\n entries(related).forEach(\n ([name, relatedResults]: [string, Array<Model>]) => {\n const relationship = model.relationshipFor(name);\n\n if (relationship) {\n let { foreignKey } = relationship;\n\n foreignKey = camelize(foreignKey, true);\n\n record[name] = relatedResults.filter(({ rawColumnData }) => {\n const fk = rawColumnData[foreignKey];\n const pk = record[model.primaryKey];\n\n return fk === pk;\n });\n }\n }\n );\n }\n\n // A left-joined relationship with no match comes back as a row of nulls.\n // Drop all of its columns, not just its primary key: otherwise a record\n // is built from the remaining nulls, and the model fills in its column\n // defaults \u2014 on Postgres the primary key becomes the literal\n // `nextval('<table>_id_seq'::regclass)`, i.e. a phantom related record.\n const missing = new Set(\n entries(record)\n .filter(([key, value]) => value == null && pkPattern.test(key))\n .map(([key]) => key.split('.')[0])\n );\n\n // An unmatched has-one is known to be absent, so its getter must not\n // query for it again (belongs-to already skips the query on a null key).\n const absent = Array.from(missing).filter(\n name => model.relationshipFor(name)?.type === 'hasOne'\n );\n\n const instance = new model(\n entries(record).reduce<Record<string, any>>((r, entry) => {\n let [key, value] = entry;\n\n if (key.indexOf('.') >= 0 && missing.has(key.split('.')[0])) {\n return r;\n } else if (key.indexOf('.') >= 0) {\n const [a, b] = key.split('.');\n let parent: Record<string, any> = r[a];\n\n if (!parent) {\n parent = {};\n }\n\n key = a;\n value = {\n ...parent,\n [b]: value\n };\n }\n\n return {\n ...r,\n [key]: value\n };\n }, {})\n );\n\n absent.forEach(name => instance.absentRelationships.add(name));\n instance.currentChangeSet.persist();\n\n return instance;\n });\n}\n", "import entries from './entries';\n\n/**\n * Resolves every value of an object, returning an object of the same shape with\n * each promise unwrapped.\n *\n * @private\n */\nexport default function promiseHash<T extends Record<string, unknown>>(\n promises: T\n): Promise<{ [K in keyof T]: Awaited<T[K]> }> {\n type Resolved = { [K in keyof T]: Awaited<T[K]> };\n\n if (Object.keys(promises).length) {\n return Promise.all(\n entries(promises).map(\n ([key, promise]) =>\n new Promise<Record<string, unknown>>((resolve, reject) => {\n const maybe = promise as Promise<unknown> | undefined;\n\n if (maybe && typeof maybe.then === 'function') {\n maybe.then(value => resolve({ [key]: value })).catch(reject);\n } else {\n resolve({ [key]: promise });\n }\n })\n )\n ).then(\n objects =>\n objects.reduce(\n (hash, object) => ({\n ...hash,\n ...object\n }),\n {}\n ) as Resolved\n );\n }\n\n return Promise.resolve({} as Resolved);\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * The runner drives Knex query builders (`model.table()` and the reduced\n * snapshot chain) whose types Lumen does not model; `records` and the reflected\n * method calls are genuinely untyped here.\n */\nimport { RecordNotFoundError } from '../errors';\nimport type Query from '../index';\n\nimport { RUNNERS } from './constants';\nimport getFindParam from './utils/get-find-param';\nimport buildResults from './utils/build-results';\n\n/**\n * The Knex builder a query's snapshots are applied to: the model's table, in\n * the query's transaction when it has one.\n */\nfunction base(model: Query<unknown>['model'], trx: unknown): any {\n const table = model.table() as any;\n\n return trx ? table.transacting(trx) : table;\n}\n\n/** @internal */\nexport function createRunner(\n target: Query<unknown>,\n opts: {\n resolve?: (value: any) => void;\n reject?: (error: Error) => void;\n }\n): void {\n if (opts.resolve && opts.reject) {\n const { resolve, reject } = opts;\n let didRun = false;\n\n RUNNERS.set(target, async () => {\n if (didRun) {\n return;\n }\n\n didRun = true;\n\n // Any failure below (a rejected SQL query included) must reject the\n // Query. Without this it became an unhandled rejection and the awaiting\n // caller \u2014 e.g. a request being served \u2014 never settled.\n try {\n await run();\n } catch (err) {\n reject(err as Error);\n }\n });\n\n async function run() {\n let results;\n const {\n model,\n isFind,\n snapshots,\n collection,\n shouldCount,\n relationships,\n trx\n } = target;\n\n if (!shouldCount && !snapshots.some(([name]) => name === 'select')) {\n target.select(...target.model.attributeNames);\n }\n\n const records: any = snapshots.reduce(\n (query, snapshot) => {\n let [name, params] = snapshot;\n\n if (!shouldCount && name === 'includeSelect') {\n name = 'select';\n }\n\n const method = query[name];\n\n if (!Array.isArray(params)) {\n params = [params];\n }\n\n return method.apply(query, params);\n },\n base(model, trx)\n );\n\n if (model.store.debug) {\n records.on('query', () => {\n setImmediate(() => model.logger.debug(records.toString()));\n });\n }\n\n if (shouldCount) {\n let [{ countAll: count }] = await records;\n count = parseInt(count, 10);\n\n resolve(Number.isFinite(count) ? count : 0);\n } else {\n results = await buildResults({\n model,\n records,\n relationships,\n trx\n });\n\n if (collection) {\n resolve(results);\n } else {\n const [result] = results;\n\n if (!result && isFind) {\n const err = new RecordNotFoundError(model, getFindParam(target));\n\n reject(err);\n }\n\n resolve(result);\n }\n }\n }\n }\n}\n\nexport function runQuery(target: Query<unknown>): void {\n const runner = RUNNERS.get(target);\n\n if (runner) {\n runner();\n }\n}\n", "export default function mapToObject<T>(\n source: Map<string, T>\n): Record<string, T> {\n return Array.from(source).reduce<Record<string, T>>(\n (obj, [key, value]) => ({\n ...obj,\n [String(key)]: value\n }),\n {}\n );\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * A ChangeSet stores a record's pending attribute and relationship values,\n * which are heterogeneous and dynamic (typed `any`/`Object` in the original\n * Flow). The `any` value type is what lets attribute getters/setters and the\n * relationship helpers round-trip those values.\n */\nimport type { Model } from '../index';\nimport entries from '../../../utils/entries';\nimport mapToObject from '../../../utils/map-to-object';\n\nclass ChangeSet extends Map<string, any> {\n declare isPersisted: boolean;\n\n constructor(data: Record<string, unknown> = {}) {\n super(entries(data));\n\n this.isPersisted = false;\n }\n\n override set(key: string, value: any): this {\n if (!this.isPersisted) {\n super.set(key, value);\n }\n\n return this;\n }\n\n persist(group?: Array<ChangeSet>): this {\n if (group) {\n group.forEach(changeSet => changeSet.unpersist());\n }\n\n this.isPersisted = true;\n\n return this;\n }\n\n unpersist(): this {\n this.isPersisted = false;\n return this;\n }\n\n applyTo(target: Model): ChangeSet {\n const instance = new ChangeSet(mapToObject(this));\n\n target.changeSets.unshift(instance);\n\n return instance;\n }\n}\n\nexport default ChangeSet;\n", "import { camelize } from 'inflection';\n\nimport type Model from '../model';\n\nimport { getHasOne, getHasMany, getBelongsTo } from './utils/getters';\nimport { setHasOne, setHasMany, setBelongsTo } from './utils/setters';\n\n/** @internal */\nexport function set(\n owner: Model,\n key: string,\n value?: Array<Model> | Model | null\n) {\n const opts = owner.constructor.relationshipFor(key);\n\n if (opts) {\n const { type } = opts;\n let { foreignKey } = opts;\n\n foreignKey = camelize(foreignKey, true);\n\n if (Array.isArray(value)) {\n if (type === 'hasMany') {\n setHasMany(owner, key, value, {\n ...opts,\n foreignKey\n });\n }\n } else if (type === 'hasOne') {\n setHasOne(owner, key, value, {\n ...opts,\n foreignKey\n });\n } else if (type === 'belongsTo') {\n setBelongsTo(owner, key, value, {\n ...opts,\n foreignKey\n });\n }\n }\n}\n\n/**\n * The value of `owner`'s relationship `key`: the loaded or assigned one, or\n * else read from the database \u2014 in `trx` when given.\n *\n * @internal\n */\nexport async function get(\n owner: Model,\n key: string,\n trx: unknown = null\n): Promise<Array<Model> | Model | null> {\n const opts = owner.constructor.relationshipFor(key);\n let value: Array<Model> | Model | null = null;\n\n if (opts) {\n const { type } = opts;\n let { foreignKey } = opts;\n\n value = owner.currentChangeSet.get(key);\n foreignKey = camelize(foreignKey, true);\n\n if (!value && owner.absentRelationships.has(key)) {\n value = null;\n } else if (!value) {\n switch (type) {\n case 'hasOne':\n value = await getHasOne(\n owner,\n {\n ...opts,\n foreignKey\n },\n trx\n );\n break;\n\n case 'hasMany':\n value = await getHasMany(\n owner,\n {\n ...opts,\n foreignKey\n },\n trx\n );\n break;\n\n case 'belongsTo':\n value = await getBelongsTo(\n owner,\n {\n ...opts,\n foreignKey\n },\n trx\n );\n break;\n\n default:\n throw new Error(`Unknown relationship type '${type}'.`);\n }\n\n set(owner, key, value);\n }\n }\n\n return value;\n}\n\nexport { default as updateRelationship } from './utils/update-relationship';\nexport type { RelationshipOptions } from './interfaces';\n", "import { camelize } from 'inflection';\n\nimport type Model from '../../model';\nimport type { RelationshipOptions } from '../index';\nimport { readAttribute } from '../../model/utils/attribute';\n\n/** @internal */\nasync function getHasManyThrough(\n owner: Model,\n { model, inverse, through, foreignKey: baseKey }: RelationshipOptions,\n trx: unknown\n): Promise<Array<Model>> {\n const inverseOpts = model.relationshipFor(inverse);\n let value: Array<Model> = [];\n\n if (through && inverseOpts) {\n const foreignKey = camelize(inverseOpts.foreignKey, true);\n const records = await through\n .select(baseKey, foreignKey)\n .where({\n [baseKey]: owner.getPrimaryKey()\n })\n .transacting(trx);\n\n if (records.length) {\n value = await model\n .where({\n [model.primaryKey]: records\n .map(record => readAttribute(record, foreignKey))\n .filter(Boolean)\n })\n .transacting(trx);\n }\n }\n\n return value;\n}\n\n/** @internal */\nexport function getHasOne(\n owner: Model,\n { model, foreignKey }: RelationshipOptions,\n trx: unknown = null\n) {\n return model\n .first()\n .where({\n [foreignKey]: owner.getPrimaryKey()\n })\n .transacting(trx);\n}\n\n/** @internal */\nexport function getHasMany(\n owner: Model,\n opts: RelationshipOptions,\n trx: unknown = null\n) {\n const { model, through, foreignKey } = opts;\n\n return through\n ? getHasManyThrough(owner, opts, trx)\n : model\n .where({\n [foreignKey]: owner.getPrimaryKey()\n })\n .transacting(trx);\n}\n\n/** @internal */\nexport function getBelongsTo(\n owner: Model,\n { model, foreignKey }: RelationshipOptions,\n trx: unknown = null\n) {\n const foreignValue = readAttribute(owner, foreignKey);\n\n return foreignValue\n ? model.find(foreignValue).transacting(trx)\n : Promise.resolve(null);\n}\n", "import type Model from '../index';\n\n// A model's attributes and relationships are installed as accessors from the\n// app's schema at runtime, so `Model` has no static type for them \u2014 and an index\n// signature would turn every typo on a model into a silent `unknown`. Dynamic\n// access by name goes through these two functions instead, which keep the one\n// cast it needs in one place.\n\n/**\n * Read an attribute (or relationship) of `record` by name.\n *\n * @internal\n */\nexport function readAttribute(record: Model, key: string): unknown {\n return (record as unknown as Record<string, unknown>)[key];\n}\n\n/**\n * Write an attribute (or relationship) of `record` by name. Unlike\n * `Reflect.set`, a failed write throws rather than returning `false`.\n *\n * @internal\n */\nexport function writeAttribute(record: Model, key: string, value: unknown) {\n (record as unknown as Record<string, unknown>)[key] = value;\n}\n", "import type Model from '../../model';\nimport { writeAttribute } from '../../model/utils/attribute';\n\n/** @internal */\nfunction unassociateOne<T extends Model | null | undefined>(\n value: T,\n foreignKey: string\n): T {\n if (value) {\n writeAttribute(value, foreignKey, null);\n }\n\n return value;\n}\n\n/** @internal */\nexport default function unassociate<T extends Model>(\n value: Array<T>,\n foreignKey: string\n): Array<T> {\n return value.map(record => unassociateOne(record, foreignKey));\n}\n", "/**\n * @private\n */\nexport default function isNull(value: unknown): value is null {\n return value === null;\n}\n", "import isNull from '../../../../utils/is-null';\nimport type { ModelClass } from '../../interfaces';\n\nfunction validateOne(model: ModelClass, value: unknown) {\n return isNull(value) || model.isInstance(value);\n}\n\nexport default function validateType(model: ModelClass, value: unknown) {\n if (Array.isArray(value)) {\n return value.every(item => validateOne(model, item));\n }\n\n return validateOne(model, value);\n}\n", "import type Model from '../../model';\nimport type { ModelClass } from '../../interfaces';\nimport type { RelationshipOptions } from '../index';\nimport { writeAttribute } from '../../model/utils/attribute';\n\n/** @internal */\nexport function setHasManyInverse(\n owner: Model,\n value: Array<Model>,\n {\n inverse,\n foreignKey,\n inverseModel\n }: RelationshipOptions & {\n inverseModel: ModelClass;\n }\n) {\n const primaryKey = owner.getPrimaryKey();\n const { type: inverseType } = inverseModel.relationshipFor(inverse)!;\n\n for (const record of value) {\n let { currentChangeSet: changeSet } = record;\n\n if (owner !== changeSet.get(inverse)) {\n if (changeSet.isPersisted) {\n changeSet = changeSet.applyTo(record);\n }\n\n changeSet.set(inverse, owner);\n\n if (inverseType === 'belongsTo') {\n writeAttribute(record, foreignKey, primaryKey);\n }\n }\n }\n}\n\n/** @internal */\nexport function setHasOneInverse(\n owner: Model,\n value: Model | null | undefined,\n {\n inverse,\n foreignKey,\n inverseModel\n }: RelationshipOptions & {\n inverseModel: ModelClass;\n }\n) {\n if (value) {\n const { type: inverseType } = inverseModel.relationshipFor(inverse)!;\n let inverseValue = value.currentChangeSet.get(inverse);\n\n if (inverseType === 'hasMany') {\n if (!Array.isArray(inverseValue)) {\n inverseValue = [];\n }\n\n if (!inverseValue.includes(owner)) {\n inverseValue.push(owner);\n }\n } else if (owner !== inverseValue) {\n inverseValue = owner;\n\n if (inverseType === 'belongsTo') {\n writeAttribute(value, foreignKey, inverseValue.getPrimaryKey());\n }\n }\n\n let { currentChangeSet: changeSet } = value;\n\n if (changeSet.isPersisted) {\n changeSet = changeSet.applyTo(value);\n }\n\n changeSet.set(inverse, inverseValue || null);\n }\n}\n", "import type Model from '../../model';\nimport type { RelationshipOptions } from '../index';\nimport { readAttribute, writeAttribute } from '../../model/utils/attribute';\n\nimport unassociate from './unassociate';\nimport validateType from './validate-type';\nimport { setHasOneInverse, setHasManyInverse } from './inverse-setters';\n\n/** @internal */\nexport function setHasMany(\n owner: Model,\n key: string,\n value: Array<Model>,\n { type, model, inverse, foreignKey }: RelationshipOptions\n) {\n let { currentChangeSet: changeSet } = owner;\n\n if (validateType(model, value)) {\n let prevValue = changeSet.get(key);\n\n if (Array.isArray(prevValue)) {\n prevValue = unassociate(prevValue, foreignKey);\n\n if (Array.isArray(prevValue)) {\n prevValue\n .filter(\n prev =>\n !value.find(next => prev.getPrimaryKey() === next.getPrimaryKey())\n )\n .forEach(record => owner.prevAssociations.add(record));\n }\n }\n\n if (changeSet.isPersisted) {\n changeSet = changeSet.applyTo(owner);\n }\n\n changeSet.set(key, value);\n\n setHasManyInverse(owner, value, {\n type,\n model,\n inverse,\n foreignKey,\n inverseModel: model\n });\n }\n}\n\n/** @internal */\nexport function setHasOne(\n owner: Model,\n key: string,\n value: Model | null | undefined,\n { type, model, inverse, foreignKey }: RelationshipOptions\n) {\n let valueToSet = value;\n\n // Despite its type, `value` may be a plain attributes object here.\n if (value && typeof value === 'object' && !model.isInstance(value)) {\n valueToSet = new model(value as unknown as Record<string, unknown>);\n }\n\n let { currentChangeSet: changeSet } = owner;\n\n if (valueToSet) {\n if (validateType(model, valueToSet)) {\n if (changeSet.isPersisted) {\n changeSet = changeSet.applyTo(owner);\n }\n\n changeSet.set(key, valueToSet);\n }\n } else {\n if (changeSet.isPersisted) {\n changeSet = changeSet.applyTo(owner);\n }\n\n changeSet.set(key, null);\n }\n\n setHasOneInverse(owner, valueToSet, {\n type,\n model,\n inverse,\n foreignKey,\n inverseModel: model\n });\n}\n\n/** @internal */\nexport function setBelongsTo(\n owner: Model,\n key: string,\n value: Model | null | undefined,\n { type, model, inverse, foreignKey }: RelationshipOptions\n) {\n setHasOne(owner, key, value, {\n type,\n model,\n inverse,\n foreignKey\n });\n\n if (value) {\n // Not `getPrimaryKey()`: `value` may still be a plain attributes object.\n writeAttribute(owner, foreignKey, readAttribute(value, model.primaryKey));\n } else {\n writeAttribute(owner, foreignKey, null);\n }\n}\n", "import { camelize } from 'inflection';\n\nimport type Model from '../../model';\nimport type { RelationshipOptions } from '../interfaces';\nimport { writeAttribute } from '../../model/utils/attribute';\n\ntype Params = {\n record: Model;\n value: Model | null | undefined | Array<Model>;\n opts: RelationshipOptions;\n trx: unknown;\n};\n\nfunction updateHasOne({ record, value, opts, trx }: Params): Array<unknown> {\n const recordPrimaryKey = record.getPrimaryKey();\n\n if (value) {\n if (value instanceof opts.model) {\n return [\n opts.model\n .table()\n .transacting(trx)\n .update(opts.foreignKey, null)\n .where(`${opts.model.tableName}.${opts.foreignKey}`, recordPrimaryKey)\n .whereNot(\n `${opts.model.tableName}.${opts.model.primaryKey}`,\n value.getPrimaryKey()\n ),\n opts.model\n .table()\n .transacting(trx)\n .update(opts.foreignKey, recordPrimaryKey)\n .where(\n `${opts.model.tableName}.${opts.model.primaryKey}`,\n value.getPrimaryKey()\n )\n ];\n }\n } else {\n return [\n opts.model\n .table()\n .transacting(trx)\n .update(opts.foreignKey, null)\n .where(`${opts.model.tableName}.${opts.foreignKey}`, recordPrimaryKey)\n ];\n }\n\n return [];\n}\n\nfunction updateHasMany({ record, value, opts, trx }: Params): Array<unknown> {\n const recordPrimaryKey = record.getPrimaryKey();\n\n if (Array.isArray(value) && value.length) {\n return [\n opts.model\n .table()\n .transacting(trx)\n .update(opts.foreignKey, null)\n .where(`${opts.model.tableName}.${opts.foreignKey}`, recordPrimaryKey)\n .whereNotIn(\n `${opts.model.tableName}.${opts.model.primaryKey}`,\n value.map(item => item.getPrimaryKey())\n ),\n opts.model\n .table()\n .transacting(trx)\n .update(opts.foreignKey, recordPrimaryKey)\n .whereIn(\n `${opts.model.tableName}.${opts.model.primaryKey}`,\n value.map(item => item.getPrimaryKey())\n )\n ];\n }\n\n return [\n opts.model\n .table()\n .transacting(trx)\n .update(opts.foreignKey, null)\n .where(`${opts.model.tableName}.${opts.foreignKey}`, recordPrimaryKey)\n ];\n}\n\n/**\n * Replace the join rows of a has-many-through relationship: delete the rows\n * linking `record` to anything not in `value`, and create the missing ones\n * through the join model (so its timestamps and hooks apply). Rows that stay\n * are left untouched. Runs in `trx` itself, since it has to read the existing\n * rows first.\n *\n * @internal\n */\nasync function updateHasManyThrough({\n record,\n value,\n opts,\n trx\n}: Params): Promise<Array<unknown>> {\n const { model, inverse, through, foreignKey: ownerKey } = opts;\n const inverseOpts = model.relationshipFor(inverse);\n\n if (!through || !inverseOpts) {\n return [];\n }\n\n const { foreignKey: relatedKey } = inverseOpts;\n const ownerId = record.getPrimaryKey();\n const ids = (Array.isArray(value) ? value : []).map(item =>\n item.getPrimaryKey()\n );\n\n await through\n .table()\n .transacting(trx)\n .where(ownerKey, ownerId)\n .whereNotIn(relatedKey, ids)\n .del();\n\n const existing = new Set(\n (\n await through\n .table()\n .transacting(trx)\n .select(relatedKey)\n .where(ownerKey, ownerId)\n ).map((row: Record<string, unknown>) => String(row[relatedKey]))\n );\n\n for (const id of ids) {\n if (!existing.has(String(id))) {\n existing.add(String(id));\n\n await through.create(\n {\n [camelize(ownerKey, true)]: ownerId,\n [camelize(relatedKey, true)]: id\n },\n trx\n );\n }\n }\n\n return [];\n}\n\nfunction updateBelongsTo({ record, value, opts, trx }: Params): Array<unknown> {\n if (value instanceof opts.model) {\n const inverseOpts = opts.model.relationshipFor(opts.inverse);\n const foreignKeyValue = value.getPrimaryKey();\n\n writeAttribute(record, opts.foreignKey, foreignKeyValue);\n\n if (inverseOpts && inverseOpts.type === 'hasOne') {\n return [\n record.constructor\n .table()\n .transacting(trx)\n .update(opts.foreignKey, null)\n .where(opts.foreignKey, foreignKeyValue)\n .whereNot(\n `${record.constructor.tableName}.${record.constructor.primaryKey}`,\n record.getPrimaryKey()\n )\n ];\n }\n }\n\n return [];\n}\n\n/**\n * The statements that persist the relationship `name` of `record`, if it\n * changed. A has-many-through relationship is written to its join table\n * before this resolves, and contributes no statements.\n *\n * @internal\n */\nexport default async function updateRelationship(\n record: Model,\n name: string,\n trx: unknown\n): Promise<Array<unknown>> {\n const opts = record.constructor.relationshipFor(name);\n\n if (!opts) {\n const {\n constructor: { name: className }\n } = record;\n\n throw new Error(`Could not find relationship '${name} on '${className}`);\n }\n\n const { dirtyRelationships } = record;\n\n if (!dirtyRelationships.has(name)) {\n return [];\n }\n\n const value = dirtyRelationships.get(name) as\n Model | Array<Model> | null | undefined;\n\n switch (opts.type) {\n case 'hasOne':\n return updateHasOne({\n record,\n value,\n opts,\n trx\n });\n\n case 'hasMany':\n if (opts.through) {\n return updateHasManyThrough({\n record,\n value,\n opts,\n trx\n });\n }\n\n return updateHasMany({\n record,\n value,\n opts,\n trx\n });\n\n default:\n return updateBelongsTo({\n record,\n value,\n opts,\n trx\n });\n }\n}\n", "type ProxyGet<T extends object> = (\n target: T,\n key: string,\n receiver: unknown\n) => unknown;\n\n/**\n * @private\n */\nexport function trapGet<T extends object>(\n traps: Record<string, unknown>\n): ProxyGet<T> {\n return (target, key, receiver) => {\n if (key === 'unwrap') {\n return () => target;\n }\n\n if (Object.hasOwn(traps, key)) {\n const value = traps[key];\n\n if (typeof value === 'function') {\n return value.bind(receiver, target);\n }\n\n return value;\n }\n\n // eslint-disable-next-line no-restricted-properties -- proxy forwarding\n return Reflect.get(target, key);\n };\n}\n", "import { trapGet } from '../../../utils/proxy';\nimport Query from '../query';\nimport { get as getRelationship } from '../relationship';\nimport type { Model } from '../index';\nimport type { ModelClass } from '../interfaces';\n\nimport type { TransactionResult } from './interfaces';\n\n/**\n * `target` with `create` writing in `trx`, and every static that starts a\n * query (`find`, `where`, `first`, a scope, \u2026) returning one that runs in it.\n *\n * @internal\n */\nexport function createStaticTransactionProxy<T extends ModelClass>(\n target: T,\n trx: unknown\n): T {\n const forward = trapGet<T>({\n create(model: T, props: Record<string, unknown> = {}) {\n return model.create(props, trx);\n }\n });\n\n // The proxy's target is an empty object inheriting from the model, not the\n // model: scopes are read-only, non-configurable statics, and a proxy may not\n // report a different value for such a property of its own target.\n return new Proxy(Object.create(target) as T, {\n get(_, key, receiver) {\n const model = target;\n const value = forward(model, key as string, receiver);\n\n if (key === 'create' || typeof value !== 'function') {\n return value;\n }\n\n return (...args: Array<unknown>) => {\n const result = (value as (...a: Array<unknown>) => unknown).apply(\n model,\n args\n );\n\n return result instanceof Query ? result.transacting(trx) : result;\n };\n }\n });\n}\n\n/** @internal */\nexport function createInstanceTransactionProxy<T extends Model>(\n target: T,\n trx: unknown\n): T {\n const forward = trapGet<T>({\n save(model: T) {\n return model.save(trx);\n },\n\n update(model: T, props: Record<string, unknown> = {}) {\n return model.update(props, trx);\n },\n\n destroy(model: T) {\n return model.destroy(trx);\n },\n\n reload(model: T) {\n return model.isNew\n ? Promise.resolve(model)\n : model.constructor.find(model.getPrimaryKey()).transacting(trx);\n }\n });\n\n return new Proxy(target, {\n get(model, key, receiver) {\n // A relationship read (`await comment.post`) runs in `trx` too, and the\n // records it yields are bound to it as well, so `(await comment.post)\n // .user` stays in the transaction. The relationships are accessors on\n // the prototype, so returning another value for them does not break a\n // proxy invariant.\n if (typeof key === 'string' && model.constructor.relationshipFor(key)) {\n return getRelationship(model, key, trx).then(value =>\n Array.isArray(value)\n ? value.map(record => createInstanceTransactionProxy(record, trx))\n : value && createInstanceTransactionProxy(value, trx)\n );\n }\n\n return forward(model, key as string, receiver);\n }\n });\n}\n\n/** @internal */\nexport function createTransactionResultProxy<\n T extends Model,\n U extends boolean\n>(record: T, didPersist: U): TransactionResult<T, U> {\n return new Proxy(record, {\n get: trapGet({\n didPersist\n })\n }) as unknown as TransactionResult<T, U>;\n}\n\nexport type { TransactionResult } from './interfaces';\n", "/**\n * Returns a copy of `src` containing only `keys` whose values are defined.\n *\n * The result is `Partial<T>` rather than Flow's `T`: keys may be dropped, both\n * because the caller asked for a subset and because undefined values are\n * filtered out. The casts are confined to the boundaries, where the dynamic\n * key access makes the shape unknowable to the compiler.\n *\n * @private\n */\nexport default function pick<T extends object>(\n src: T,\n ...keys: string[]\n): Partial<T> {\n const record = src as Record<string, unknown>;\n\n return keys\n .map((key): [string, unknown] => [key, record[key]])\n .filter(([, value]) => typeof value !== 'undefined')\n .reduce<Record<string, unknown>>(\n (result, [key, value]) => ({\n ...result,\n [key]: value\n }),\n {}\n ) as Partial<T>;\n}\n", "/**\n * @private\n */\nexport function map<K, V>(a: Map<K, V>, b: Map<K, V>): Map<K, V> {\n return Array.from(b).reduce((result, [key, value]) => {\n if (a.get(key) !== value) {\n result.set(key, value);\n }\n\n return result;\n }, new Map<K, V>());\n}\n", "import pick from '../../../../utils/pick';\nimport entries from '../../../../utils/entries';\nimport type Model from '../index';\nimport { readAttribute } from './attribute';\n\n/** @internal */\nexport default function getColumns(record: Model, only?: Array<string>) {\n let columns: Record<string, unknown> = record.constructor.attributes;\n\n if (only) {\n columns = pick(columns, ...only) as Record<string, unknown>;\n }\n\n return entries(columns).reduce<Record<string, unknown>>(\n (obj, [key, col]) => ({\n ...obj,\n [(col as { columnName: string }).columnName]: readAttribute(record, key)\n }),\n {}\n );\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * These build and run Knex insert/update/delete statements; the query builders\n * and the promises they return are not modeled by Lumen (they were `Object` in\n * Flow).\n */\nimport omit from '../../../../utils/omit';\nimport type Model from '../index';\n\nimport getColumns from './get-columns';\nimport { writeAttribute } from './attribute';\n\n/** @internal */\nexport function create(record: Model, trx: unknown): Array<any> {\n const timestamp = new Date();\n\n Object.assign(record, {\n createdAt: timestamp,\n updatedAt: timestamp\n });\n\n Object.assign(record.rawColumnData, {\n createdAt: timestamp,\n updatedAt: timestamp\n });\n\n const {\n constructor: { primaryKey }\n } = record;\n const columns = omit(getColumns(record), primaryKey);\n\n if (record.dirtyAttributes.has(primaryKey)) {\n columns[primaryKey] = record.getPrimaryKey();\n }\n\n return [\n record.constructor\n .table()\n .transacting(trx)\n .returning(record.constructor.primaryKey)\n .insert(columns)\n ];\n}\n\n/** @internal */\nexport function update(record: Model, trx: unknown): Array<any> {\n writeAttribute(record, 'updatedAt', new Date());\n\n return [\n record.constructor\n .table()\n .transacting(trx)\n .where(record.constructor.primaryKey, record.getPrimaryKey())\n .update(getColumns(record, Array.from(record.dirtyAttributes.keys())))\n ];\n}\n\n/** @internal */\nexport function destroy(record: Model, trx: unknown): Array<any> {\n return [\n record.constructor\n .table()\n .transacting(trx)\n .where(record.constructor.primaryKey, record.getPrimaryKey())\n .del()\n ];\n}\n\n/** @internal */\nexport function createRunner(\n { logger, store }: Pick<typeof Model, 'logger' | 'store'>,\n statements: Array<any>\n): (query: Array<any>) => Promise<Array<any>> {\n return query => {\n const promises = query.concat(statements);\n\n // Writes honour the database `debug` flag, as reads do: the logged SQL\n // has its values inlined.\n if (store.debug) {\n promises.forEach(promise => {\n promise.on('query', () => {\n setImmediate(() => {\n logger.debug(promise.toString());\n });\n });\n });\n }\n\n return Promise.all(promises);\n };\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * Class initialization is pure runtime metaprogramming: it reads each model's\n * user-declared static config (attributes from the DB schema, hasOne/hasMany/\n * belongsTo/hooks/scopes/validates), and installs accessors, relationship\n * descriptors and frozen metadata onto the class and its prototype via\n * Object.defineProperties/Reflect. The config values are genuinely untyped (as\n * they were `Object` in Flow).\n */\nimport { camelize, dasherize, pluralize, singularize } from 'inflection';\n\nimport { line } from '../../logger';\nimport { createAttribute } from '../attribute';\nimport {\n get as getRelationship,\n set as setRelationship\n} from '../relationship';\nimport entries from '../../../utils/entries';\nimport underscore from '../../../utils/underscore';\nimport type Logger from '../../logger';\nimport type Database from '../index';\nimport type { Model } from '../index';\nimport type { ModelClass } from '../interfaces';\n\n/**\n * The foreign key of a `hasOne` or non-through `hasMany` that does not\n * declare one: its inverse `belongsTo`'s, which may declare it, else\n * `<inverse>_id`. Models initialize concurrently, so `related.belongsTo` is\n * either still its declaration or already initialized; both carry a declared\n * `foreignKey`, and the default is the same.\n */\nexport function inverseForeignKey(\n related: ModelClass,\n inverse: string\n): string {\n const belongsTo: Record<string, any> = related.belongsTo || {};\n const declared = Object.hasOwn(belongsTo, inverse)\n ? belongsTo[inverse]?.foreignKey\n : undefined;\n\n return declared || `${underscore(inverse)}_id`;\n}\n\nconst VALID_HOOKS = new Set([\n 'afterCreate',\n 'afterDestroy',\n 'afterSave',\n 'afterUpdate',\n 'afterValidation',\n 'beforeCreate',\n 'beforeDestroy',\n 'beforeSave',\n 'beforeUpdate',\n 'beforeValidation'\n]);\n\n/** @internal */\nfunction initializeProps(\n prototype: object,\n attributes: Record<string, any>,\n relationships: Record<string, any>\n) {\n Object.defineProperties(prototype, {\n ...entries(attributes).reduce<PropertyDescriptorMap>(\n (obj, [key, value]) => ({\n ...obj,\n [key]: createAttribute({\n key,\n ...value\n })\n }),\n {}\n ),\n\n ...Object.keys(relationships).reduce<PropertyDescriptorMap>(\n (obj, key) => ({\n ...obj,\n [key]: {\n get(this: Model) {\n return getRelationship(this, key);\n },\n set(this: Model, val: any) {\n setRelationship(this, key, val);\n }\n }\n }),\n {}\n )\n });\n}\n\n/** @internal */\nfunction initializeHooks({\n model,\n hooks,\n logger\n}: {\n model: ModelClass;\n hooks: Record<string, any>;\n logger: Logger;\n}) {\n return Object.freeze(\n entries(hooks).reduce<Record<string, any>>((obj, [key, value]) => {\n if (!VALID_HOOKS.has(key)) {\n logger.warn(line`\n Invalid hook '${key}' will not be added to Model '${model.name}'.\n Valid hooks are ${Array.from(VALID_HOOKS)\n .map(h => `'${h}'`)\n .join(', ')}.\n `);\n\n return obj;\n }\n\n return {\n ...obj,\n [key]: async (instance: Model, transaction: unknown) => {\n await value.call(model, instance, transaction);\n }\n };\n }, {})\n );\n}\n\n/** @internal */\nfunction initializeValidations(opts: {\n model: ModelClass;\n logger: Logger;\n validates: Record<string, any>;\n attributes: Record<string, any>;\n}) {\n const { model, logger, attributes } = opts;\n const attributeNames = Object.keys(attributes);\n let { validates } = opts;\n\n validates = entries(validates)\n .filter(([key, value]) => {\n let isValid = attributeNames.indexOf(key) >= 0;\n\n if (!isValid) {\n logger.warn(line`\n Invalid validation '${key}' will not be added to Model\n '${model.name}'. '${key}' is not an attribute of Model\n '${model.name}'.\n `);\n }\n\n if (typeof value !== 'function') {\n isValid = false;\n\n logger.warn(line`\n Invalid validation '${key}' will not be added to Model\n '${model.name}'. Validations must be a function.\n `);\n }\n\n return isValid;\n })\n .reduce<Record<string, any>>(\n (obj, [key, value]) => ({\n ...obj,\n [key]: value\n }),\n {}\n );\n\n return Object.freeze(validates);\n}\n\n/** @internal */\nexport default async function initializeClass<T extends ModelClass>({\n store,\n table,\n model\n}: {\n store: Database;\n table: T['table'];\n model: T;\n}): Promise<T> {\n let { hooks, scopes, validates } = model;\n const { logger } = store;\n const modelName = dasherize(underscore(model.name));\n const resourceName = pluralize(modelName);\n\n const attributes = entries(await table().columnInfo()).reduce<\n Record<string, any>\n >(\n (obj, [columnName, value]) => ({\n ...obj,\n [camelize(columnName, true)]: {\n ...(value as any),\n columnName,\n docName: dasherize(columnName)\n }\n }),\n {}\n );\n\n const belongsTo = entries(model.belongsTo || {}).reduce<Record<string, any>>(\n (obj, [relatedName, value]) => {\n const { inverse, model: relatedModel, foreignKey } = value as any;\n const relationship = {};\n\n Object.defineProperties(relationship, {\n model: {\n value: store.modelFor(relatedModel || relatedName),\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n inverse: {\n value: inverse,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n type: {\n value: 'belongsTo',\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n foreignKey: {\n value: foreignKey || `${underscore(relatedName)}_id`,\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n\n return {\n ...obj,\n [relatedName]: relationship\n };\n },\n {}\n );\n\n const hasOne = entries(model.hasOne || {}).reduce<Record<string, any>>(\n (obj, [relatedName, value]) => {\n const { inverse, model: relatedModel, foreignKey } = value as any;\n const relationship = {};\n const target = store.modelFor(relatedModel || relatedName);\n\n Object.defineProperties(relationship, {\n model: {\n value: target,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n inverse: {\n value: inverse,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n type: {\n value: 'hasOne',\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n foreignKey: {\n value: foreignKey || inverseForeignKey(target, inverse),\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n\n return {\n ...obj,\n [relatedName]: relationship\n };\n },\n {}\n );\n\n const hasMany = entries(model.hasMany || {}).reduce<Record<string, any>>(\n (hash, [relatedName, opts]) => {\n const { inverse } = opts as any;\n const relationship = {};\n let { through, model: relatedModel } = opts as any;\n const { foreignKey: declared } = opts as any;\n let foreignKey: string;\n\n if (typeof relatedModel === 'string') {\n relatedModel = store.modelFor(relatedModel);\n } else {\n relatedModel = store.modelFor(relatedName);\n }\n\n const target = relatedModel;\n\n if (typeof through === 'string') {\n through = store.modelFor(through);\n foreignKey = declared || `${singularize(underscore(inverse))}_id`;\n } else {\n foreignKey = declared || inverseForeignKey(target, inverse);\n }\n\n Object.defineProperties(relationship, {\n model: {\n value: relatedModel,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n inverse: {\n value: inverse,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n through: {\n value: through,\n writable: false,\n enumerable: Boolean(through),\n configurable: false\n },\n\n type: {\n value: 'hasMany',\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n foreignKey: {\n value: foreignKey,\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n\n return {\n ...hash,\n [relatedName]: relationship\n };\n },\n {}\n );\n\n Object.freeze(hasOne);\n Object.freeze(hasMany);\n Object.freeze(belongsTo);\n\n const relationships = Object.freeze({\n ...hasOne,\n ...hasMany,\n ...belongsTo\n });\n\n if (!hooks) {\n hooks = {};\n }\n\n if (!scopes) {\n scopes = {};\n }\n\n if (!validates) {\n validates = {};\n }\n\n Object.defineProperties(model, {\n store: {\n value: store,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n table: {\n value: table,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n logger: {\n value: logger,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n attributes: {\n value: Object.freeze(attributes),\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n attributeNames: {\n value: Object.freeze(Object.keys(attributes)),\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n hasOne: {\n value: hasOne,\n writable: false,\n enumerable: Boolean(Object.keys(hasOne).length),\n configurable: false\n },\n\n hasMany: {\n value: hasMany,\n writable: false,\n enumerable: Boolean(Object.keys(hasMany).length),\n configurable: false\n },\n\n belongsTo: {\n value: belongsTo,\n writable: false,\n enumerable: Boolean(Object.keys(belongsTo).length),\n configurable: false\n },\n\n relationships: {\n value: relationships,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n relationshipNames: {\n value: Object.freeze(Object.keys(relationships)),\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n hooks: {\n value: initializeHooks({\n model,\n hooks,\n logger\n }),\n writable: false,\n enumerable: Boolean(Object.keys(hooks).length),\n configurable: false\n },\n\n scopes: {\n value: scopes,\n writable: false,\n enumerable: Boolean(Object.keys(scopes).length),\n configurable: false\n },\n\n validates: {\n value: initializeValidations({\n model,\n logger,\n validates,\n attributes\n }),\n writable: false,\n enumerable: Boolean(Object.keys(validates).length),\n configurable: false\n },\n\n modelName: {\n value: modelName,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n resourceName: {\n value: resourceName,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n initialized: {\n value: true,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n ...Object.freeze(\n entries(scopes).reduce<PropertyDescriptorMap>(\n (obj, [name, scope]) => ({\n ...obj,\n [name]: {\n value: scope,\n writable: false,\n enumerable: false,\n configurable: false\n }\n }),\n {}\n )\n )\n });\n\n initializeProps(model.prototype, attributes, {\n ...hasOne,\n ...hasMany,\n ...belongsTo\n });\n\n Object.defineProperties(model.prototype, {\n modelName: {\n value: modelName,\n writable: false,\n enumerable: true,\n configurable: false\n },\n resourceName: {\n value: resourceName,\n writable: false,\n enumerable: true,\n configurable: false\n },\n isModelInstance: {\n value: true,\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n\n return model;\n}\n", "/**\n * @private\n */\nexport default function isUndefined(value: unknown): value is undefined {\n return typeof value === 'undefined';\n}\n", "import type Model from '../../model';\nimport type { AttributeMeta } from '../index';\nimport isNull from '../../../../utils/is-null';\nimport isUndefined from '../../../../utils/is-undefined';\n\nexport default function createGetter({\n key,\n defaultValue\n}: AttributeMeta): (this: Model) => unknown {\n return function getter(this: Model) {\n let value: unknown = this.currentChangeSet.get(key);\n\n if (isNull(value) || isUndefined(value)) {\n value = defaultValue;\n }\n\n return value;\n };\n}\n", "import type Model from '../../model';\nimport isNull from '../../../../utils/is-null';\nimport isUndefined from '../../../../utils/is-undefined';\nimport type { AttributeMeta } from '../index';\n\n/** @internal */\nexport default function createSetter({\n key,\n nullable,\n normalize,\n defaultValue\n}: AttributeMeta & {\n normalize: (value: unknown) => unknown;\n}): (this: Model, value?: unknown) => void {\n return function setter(this: Model, nextValue?: unknown) {\n if (!nullable) {\n if (isNull(nextValue) || isUndefined(nextValue)) {\n return;\n }\n }\n\n let { currentChangeSet: changeSet } = this;\n const valueToSet = normalize(nextValue);\n const currentValue = changeSet.get(key) || defaultValue;\n\n if (!changeSet.has(key) || valueToSet !== currentValue) {\n if (changeSet.isPersisted) {\n changeSet = changeSet.applyTo(this);\n }\n\n changeSet.set(key, valueToSet);\n }\n };\n}\n", "const BOOLEAN_TYPE = /^(?:boolean|tinyint)$/;\n\nexport default function createNormalizer(\n type: string\n): (value: unknown) => unknown {\n let normalizer: (value: unknown) => unknown = value => value;\n\n if (BOOLEAN_TYPE.test(type)) {\n normalizer = value => {\n let normalized = value;\n\n if (typeof value === 'string') {\n normalized = Number.parseInt(value, 10);\n }\n\n return Boolean(normalized);\n };\n } else if (type === 'datetime') {\n normalizer = value => {\n let normalized = value;\n\n if (typeof value === 'number') {\n normalized = new Date(value);\n }\n\n return normalized;\n };\n }\n\n return normalizer;\n}\n", "import createGetter from './utils/create-getter';\nimport createSetter from './utils/create-setter';\nimport createNormalizer from './utils/create-normalizer';\nimport type { AttributeMeta } from './interfaces';\n\n/** @internal */\nexport function createAttribute(opts: AttributeMeta): PropertyDescriptor {\n const normalize = createNormalizer(opts.type);\n const meta = {\n ...opts,\n normalize,\n defaultValue: normalize(opts.defaultValue)\n };\n\n return {\n get: createGetter(meta),\n set: createSetter(meta)\n };\n}\n\nexport type { AttributeMeta } from './interfaces';\n", "import { dasherize } from 'inflection';\n\nimport underscore from '../../../utils/underscore';\nimport type { ServerErrorSource } from '../interfaces';\n\n/**\n * Member names as the client sees them \u2014 responses dasherize, so pointers do\n * too (`isPublic` -> `is-public`). Escaped per RFC 6901 for use in a pointer.\n *\n * @internal\n */\nfunction memberName(key: string): string {\n return dasherize(underscore(key));\n}\n\nfunction escapePointer(segment: string): string {\n return segment.replace(/~/g, '~0').replace(/\\//g, '~1');\n}\n\n/**\n * Map an internal parameter path to a JSON:API error `source`. Paths under\n * `data` are request document members and become a JSON Pointer\n * (`data.attributes.isPublic` -> `/data/attributes/is-public`); anything else\n * is a query parameter (`page.size` -> `page[size]`).\n *\n * @internal\n */\nexport default function sourceFor(path: string): ServerErrorSource {\n const [root, ...rest] = path.split('.').filter(Boolean).map(memberName);\n\n if (!root) {\n return {};\n } else if (root === 'data') {\n return {\n pointer: `/${[root, ...rest].map(escapePointer).join('/')}`\n };\n }\n\n return {\n parameter: `${root}${rest.map(key => `[${key}]`).join('')}`\n };\n}\n\n/**\n * A parameter path as the client writes it, for error messages: request\n * document members dasherized and dotted (`data.attributes.is-public`), query\n * parameters in brackets (`filter[created-at]`, `page[size]`).\n *\n * @internal\n */\nexport function nameFor(path: string): string {\n const [root, ...rest] = path.split('.').filter(Boolean).map(memberName);\n\n if (!root) {\n return '';\n } else if (root === 'data') {\n return [root, ...rest].join('.');\n }\n\n return `${root}${rest.map(key => `[${key}]`).join('')}`;\n}\n\n/**\n * A member name or relationship path as it appears in documents, keeping a\n * `sort` value's leading `-` (`-createdAt` -> `-created-at`,\n * `comments.user` stays dotted). Anything but a string is returned as is.\n *\n * @internal\n */\nexport function memberPathFor(value: unknown): unknown {\n if (typeof value !== 'string') {\n return value;\n }\n\n const descending = value.startsWith('-');\n const path = (descending ? value.slice(1) : value)\n .split('.')\n .map(memberName)\n .join('.');\n\n return descending ? `-${path}` : path;\n}\n", "import createServerError from '../../../server/utils/create-server-error';\nimport sourceFor from '../../../server/utils/source-for';\nimport type { ServerErrorSource } from '../../../server';\n\n/**\n * A model validator (`static validates`) rejected an attribute. Answered with\n * 422 and a pointer to the attribute, which clients such as ember-data map to\n * field errors. The rejected value is deliberately not in the message: it\n * ends up in logs and may be a secret (e.g. a password).\n *\n * @internal\n */\nclass ValidationError extends Error {\n declare key: string;\n\n declare source: ServerErrorSource;\n\n constructor(key: string) {\n super(`Validation failed for ${key}.`);\n this.key = key;\n this.source = sourceFor(`data.attributes.${key}`);\n }\n}\n\nexport default createServerError(ValidationError, 422, { isPublic: true });\n", "import type { ValidationOptions } from './interfaces';\n\n/** @internal */\nclass Validation<T> {\n declare key: string;\n\n declare value: T;\n\n declare validator: (value?: T) => boolean;\n\n constructor(opts: ValidationOptions<T>) {\n Object.defineProperties(this, {\n key: {\n value: opts.key,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n value: {\n value: opts.value,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n validator: {\n value: opts.validator,\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n }\n\n isValid(): boolean {\n return this.validator(this.value);\n }\n}\n\nexport default Validation;\nexport { ValidationError } from './errors';\n", "import type { ServerError } from '../interfaces';\n\n/** @internal */\nfunction isServerError(error: unknown): error is ServerError {\n return (\n error instanceof Error &&\n typeof (error as { statusCode?: unknown }).statusCode === 'number'\n );\n}\n\n/**\n * The status of a response reporting `errors`: theirs when they agree, else\n * the most generally applicable one \u2014 JSON:API 1.0: \"When a server encounters\n * multiple problems for a single request, the most generally applicable HTTP\n * error code SHOULD be used\" \u2014 `400` for client errors, `500` otherwise.\n *\n * @internal\n */\nfunction statusFor(errors: Array<ServerError>): number {\n const codes = new Set(errors.map(({ statusCode }) => statusCode));\n\n if (codes.size === 1) {\n return errors[0]!.statusCode;\n }\n\n return Array.from(codes).every(code => code >= 400 && code < 500) ? 400 : 500;\n}\n\n/**\n * Several problems with one request, reported together: each becomes its own\n * error object in the response's `errors`.\n *\n * @internal\n */\nclass ErrorList extends Error implements ServerError {\n declare errors: Array<ServerError>;\n\n declare statusCode: number;\n\n constructor(errors: Array<ServerError>) {\n const flat = errors.flatMap(error =>\n error instanceof ErrorList ? error.errors : [error]\n );\n\n super(flat.map(({ message }) => message).join('\\n'));\n\n this.errors = flat;\n this.statusCode = statusFor(flat);\n }\n\n /**\n * The error to throw for `errors`: the only one, or a list of them.\n */\n static from(errors: Array<ServerError>): ServerError {\n return errors.length === 1 ? errors[0]! : new ErrorList(errors);\n }\n}\n\n/**\n * Run each of `steps`, collecting the server errors (those with a\n * `statusCode`) they throw instead of stopping at the first; anything else\n * is a bug and is rethrown at once. Throws the collected errors, if any.\n *\n * @internal\n */\nexport function collectErrors(\n steps: Array<() => void>,\n errors: Array<ServerError> = []\n): void {\n steps.forEach(step => {\n try {\n step();\n } catch (error) {\n if (!isServerError(error)) {\n throw error;\n }\n\n errors.push(error);\n }\n });\n\n if (errors.length) {\n throw ErrorList.from(errors);\n }\n}\n\nexport default ErrorList;\n", "import Validation, { ValidationError } from '../../validation';\nimport ErrorList from '../../../server/errors/error-list';\nimport type { Model } from '../../index';\n\n/**\n * Run the model's validators over its dirty attributes. Every attribute that\n * fails is reported (one 422 error object each), not just the first.\n *\n * @internal\n */\nexport default function validate(instance: Model): true {\n const failed = Array.from(instance.dirtyAttributes)\n .map(([key, value]) => ({\n key,\n value,\n validator: instance.constructor.validates[key] as (\n value?: unknown\n ) => boolean\n }))\n .filter(({ validator }) => validator)\n .map(props => new Validation(props))\n .filter(validation => !validation.isValid())\n .map(({ key }) => new ValidationError(key));\n\n if (failed.length) {\n throw ErrorList.from(failed);\n }\n\n return true;\n}\n", "import { UNIQUE_CONSTRAINT, UNIQUE_CONSTRAINT_CODES } from '../../constants';\nimport { UniqueConstraintError } from '../../errors';\n\n/**\n * knex prefixes a failed statement's error message with the SQL (and its\n * bound values) as `<sql> - <driver message>`; keep only the driver message.\n *\n * @internal\n */\nfunction driverMessage(message: string): string {\n const index = message.lastIndexOf(' - ');\n\n return index >= 0 ? message.slice(index + 3) : message;\n}\n\n/**\n * Map a database write error to the server error it should surface as.\n *\n * @internal\n */\nexport default function processWriteError(err: unknown): unknown {\n if (!(err instanceof Error)) {\n return err;\n }\n\n const { code } = err as { code?: unknown };\n const { message } = err;\n\n if (\n UNIQUE_CONSTRAINT_CODES.has(String(code)) ||\n UNIQUE_CONSTRAINT.test(message)\n ) {\n return new UniqueConstraintError(driverMessage(message));\n }\n\n return err;\n}\n\n/**\n * `.catch()` handler for a write: rethrows the mapped error.\n *\n * @internal\n */\nexport function rethrowWriteError(err: unknown): never {\n throw processWriteError(err);\n}\n", "import { createInstanceTransactionProxy } from '../../transaction';\nimport type Model from '../index';\nimport type { ModelHook } from '../interfaces';\n\n/**\n * Run `hooks` in order. Each receives the record bound to the write's\n * transaction \u2014 so its relationship reads, `update`, `save` and `reload` join\n * it \u2014 and the transaction itself, for queries on other models.\n *\n * @internal\n */\nexport default function runHooks(\n target: Model,\n trx: unknown,\n ...hooks: Array<ModelHook | undefined>\n): Promise<unknown> {\n const record = trx ? createInstanceTransactionProxy(target, trx) : target;\n\n return hooks\n .filter((hook): hook is ModelHook => Boolean(hook))\n .reduce<Promise<unknown>>(\n (prev, next) => prev.then(() => next(record, trx)),\n Promise.resolve()\n );\n}\n", "import type { MigrationFn } from './interfaces';\n\n/** @internal */\nclass Migration<T extends object> {\n declare fn: MigrationFn<T>;\n\n constructor(fn: MigrationFn<T>) {\n this.fn = fn;\n }\n\n run(schema: T): T {\n return this.fn(schema);\n }\n}\n\nexport default Migration;\nexport { default as generateTimestamp } from './utils/generate-timestamp';\nexport type { MigrationFn } from './interfaces';\n", "import { TYPE_ALIASES } from '../constants';\nimport type { DatabaseColumn } from '../interfaces';\n\n/** @internal */\nexport default function typeForColumn(\n column: DatabaseColumn\n): string | undefined {\n return TYPE_ALIASES.get(column.type);\n}\n", "import type { ModelClass } from '../interfaces';\n\nimport typeForColumn from './type-for-column';\n\n// Numeric column types by name, for the ones `typeForColumn` has no alias for\n// (they differ per database: `bigint`, `smallint`, `serial`, `numeric`, \u2026).\nconst NUMERIC = /int|serial|numeric|decimal|float|double|real/i;\n\n/**\n * The type of `model`'s primary key column: `'number'` for an auto-increment\n * id, `'string'` for e.g. a uuid or `varchar` (PostgreSQL reports the latter\n * as `character varying`, which `typeForColumn` does not know). `'number'`\n * when the column is unknown.\n *\n * @internal\n */\nexport default function primaryKeyType(model: ModelClass): string {\n const column = model.columnFor(model.primaryKey);\n\n if (!column) {\n return 'number';\n }\n\n return (\n typeForColumn(column) || (NUMERIC.test(column.type) ? 'number' : 'string')\n );\n}\n", "import type { Knex } from 'knex';\n\nimport type Logger from '../logger';\n\nimport { ModelMissingError } from './errors';\nimport initialize from './initialize';\nimport normalizeModelName from './utils/normalize-model-name';\nimport type { DatabaseOptions, ModelClass } from './interfaces';\n\n/** @internal */\nclass Database {\n declare path: string;\n\n declare debug: boolean;\n\n declare logger: Logger;\n\n declare config: Record<string, unknown>;\n\n declare schema: () => Knex.SchemaBuilder;\n\n declare connection: Knex;\n\n declare models: Map<string, ModelClass>;\n\n constructor(opts: DatabaseOptions) {\n // Lumen databases construct asynchronously: `initialize` populates `this` and\n // resolves once the schema/migrations/models are ready, so `new Database()`\n // is awaited by callers. TS can't express a Promise-returning constructor,\n // so assert the instance type here.\n return initialize(this, opts) as unknown as Database;\n }\n\n modelFor(type: string): ModelClass {\n const model = this.models.get(normalizeModelName(type));\n\n if (!model) {\n throw new ModelMissingError(type);\n }\n\n return model;\n }\n}\n\nexport default Database;\nexport { default as Model } from './model';\nexport { default as Query } from './query';\nexport { readAttribute, writeAttribute } from './model/utils/attribute';\nexport { default as Migration, generateTimestamp } from './migration';\nexport { default as connect } from './utils/connect';\nexport { default as typeForColumn } from './utils/type-for-column';\nexport { default as primaryKeyType } from './utils/primary-key-type';\nexport { default as createMigrations } from './utils/create-migrations';\nexport { default as pendingMigrations } from './utils/pending-migrations';\n\nexport type {\n DatabaseOptions,\n DatabaseConfig,\n DatabaseEnvironmentConfig,\n DatabasePoolConfig,\n ModelClass\n} from './interfaces';\nexport type { ModelHook, ModelHooks } from './model/interfaces';\nexport type { RelationshipOptions } from './relationship/interfaces';\nexport type { TransactionResult } from './transaction/interfaces';\n", "import { camelize } from 'inflection';\nimport type { Knex } from 'knex';\n\nimport { getDomain } from '../server';\nimport merge from '../../utils/merge';\nimport { freezeProps } from '../freezeable';\nimport type Serializer from '../serializer';\nimport type { Model, ModelClass, Query } from '../database';\nimport type { Request, Response } from '../server';\n\nimport findOne from './utils/find-one';\nimport findMany from './utils/find-many';\nimport paramsToQuery from './utils/params-to-query';\nimport resolveRelationships from './utils/resolve-relationships';\nimport validateRelationships from './utils/validate-relationships';\nimport { scopeFor } from './visibility';\nimport type { Visibility } from './visibility';\nimport type {\n ControllerOptions,\n BeforeAction,\n AfterAction\n} from './interfaces';\n\n/**\n * The base class of an app's controllers. A controller handles the requests\n * for one resource; its built-in actions \u2014 `index`, `show`, `create`,\n * `update`, `destroy`, and the relationship endpoints' `showRelationship` and\n * `showRelated` \u2014 read and write records with sorting, filtering, paging,\n * `include` and sparse fieldsets, so a controller is mostly configuration:\n *\n * ```javascript\n * // app/controllers/posts.js\n * import { Controller } from 'lumen-framework';\n *\n * class PostsController extends Controller {\n * params = ['title', 'body', 'user'];\n * sort = ['title', 'createdAt'];\n * maxPerPage = 50;\n * }\n *\n * export default PostsController;\n * ```\n *\n * Override a built-in action, or add a custom one, with a method that takes\n * `(request, response)`. `index` and `show` return a {@link Query}, so an\n * override can narrow it and keep everything else:\n *\n * ```javascript\n * class PostsController extends Controller {\n * index(request, response) {\n * return super.index(request, response).where({ isPublic: true });\n * }\n * }\n * ```\n *\n * What an action returns becomes the response: a query, record or array of\n * records is serialized as a JSON:API document; another object or array is\n * sent as JSON, a string as the body; a number is that status, `true` a\n * `204 No Content`, `false` a `401 Unauthorized`, and `undefined` a\n * `404 Not Found`.\n *\n * A namespace's `ApplicationController` (`app/controllers/application.js`,\n * `app/controllers/admin/application.js`) holds what applies to the whole\n * namespace: its hooks run around every action in it, and it declares the\n * {@link Controller.visibility} rules and the settings\n * `rejectUnlistedAttributes`, `rejectUnlistedRelationships` and\n * `maxIncludeDepth` for every controller in it. See the\n * [controllers guide](https://github.com/nickschot/lux/blob/main/docs/guides/controllers.md).\n */\nclass Controller {\n /**\n * Query parameters an action may read beyond the JSON:API ones (`sort`,\n * `filter`, `page`, `include`, `fields`). Any other query parameter is a\n * `400 Bad Request`. A listed one arrives in `request.params`:\n *\n * ```javascript\n * class PostsController extends Controller {\n * query = ['search'];\n *\n * index(request, response) {\n * const { search } = request.params;\n * const posts = super.index(request, response);\n *\n * return search ? posts.where({ body: search }) : posts;\n * }\n * }\n * ```\n *\n * Name them with a character other than a\u2013z (`search-term`, `searchTerm`):\n * JSON:API reserves all-lowercase names for itself, and Lumen warns about\n * them at boot.\n */\n query: Array<string> = [];\n\n /**\n * The attributes `?sort=` accepts, each also with `-` for descending.\n * Defaults to every attribute the controller's serializer outputs; anything\n * else is a `400 Bad Request`. Each must be a column of the model's table,\n * or the app refuses to boot.\n */\n sort: Array<string> = [];\n\n /**\n * The attributes `?filter[\u2026]=` accepts. Defaults to every attribute the\n * controller's serializer outputs; anything else is a `400 Bad Request`.\n * Each must be a column of the model's table, or the app refuses to boot.\n */\n filter: Array<string> = [];\n\n /**\n * The attributes and relationships a `POST` or `PATCH` body may set.\n *\n * ```javascript\n * class PostsController extends Controller {\n * params = ['title', 'body', 'user'];\n * }\n * ```\n *\n * An attribute the model has but this list doesn't name is ignored (dropped\n * from `request.params`), so clients may send read-only attributes back; a\n * relationship like that is answered with `403 Forbidden`.\n * {@link Controller.rejectUnlistedAttributes} and\n * {@link Controller.rejectUnlistedRelationships} change either. A member the\n * model doesn't have at all is a `400 Bad Request`.\n */\n params: Array<string> = [];\n\n /**\n * Hooks that run before each action, called with `(request, response)`.\n * Returning nothing lets the request continue; returning anything else ends\n * it, with that value as the response (`false` \u2192 `401 Unauthorized`, a\n * number \u2192 that status):\n *\n * ```javascript\n * async function requireUser(request) {\n * if (!request.currentUser) {\n * return false;\n * }\n * }\n *\n * class PostsController extends Controller {\n * beforeAction = [requireUser];\n * }\n * ```\n *\n * The hooks of a namespace's `ApplicationController` run around every action\n * in the namespace, before the controller's own. Hooks run after the\n * request's parameters are validated, and are called with `this` as the\n * controller that declares them (use `function`, not an arrow function, to\n * read it).\n */\n beforeAction: Array<BeforeAction> = [];\n\n /**\n * Hooks that run after each action, called with\n * `(request, response, payload)`. `payload` is the action's result \u2014 for a\n * resource, the JSON:API document about to be sent. What a hook returns is\n * sent instead, and passed to the next hook, so return `payload` when\n * leaving it as it is:\n *\n * ```javascript\n * async function addVersion(request, response, payload) {\n * if (payload && payload.jsonapi) {\n * return { ...payload, meta: { ...payload.meta, apiVersion: '2' } };\n * }\n *\n * return payload;\n * }\n *\n * class ApplicationController extends Controller {\n * afterAction = [addVersion];\n * }\n * ```\n *\n * A namespace `ApplicationController`'s `afterAction` hooks run after the\n * controller's own.\n */\n afterAction: Array<AfterAction> = [];\n\n /**\n * The page size of `index` when the request gives no `?page[size]=`.\n */\n defaultPerPage: number = 25;\n\n /**\n * The largest `?page[size]=` `index` accepts. A larger one is a\n * `400 Bad Request`, as is a `page[size]` or `page[number]` below 1.\n */\n maxPerPage: number = 100;\n\n /**\n * Answer an attribute the model has but `params` does not list with\n * `403 Forbidden` (an unsupported update, per JSON:API) instead of ignoring\n * it. Off by default: clients like ember-data send every attribute back on\n * save, read-only ones (`createdAt`) included.\n *\n * Set on a namespace's `ApplicationController`, it applies to every\n * controller in the namespace (and in namespaces nested in it) that does not\n * set it itself \u2014 whatever class those controllers extend.\n *\n * @default false\n */\n declare rejectUnlistedAttributes: boolean;\n\n /**\n * Answer a relationship the model has but `params` does not list with\n * `403 Forbidden` (an unsupported update, per JSON:API). Turn it off to\n * ignore such relationships instead, for clients that send every\n * `belongsTo` back on save (ember-data). Like `rejectUnlistedAttributes`,\n * setting it on a namespace's `ApplicationController` sets it for the whole\n * namespace:\n *\n * ```javascript\n * class ApplicationController extends Controller {\n * rejectUnlistedRelationships = false;\n * }\n * ```\n *\n * @default true\n */\n declare rejectUnlistedRelationships: boolean;\n\n /**\n * How many relationships deep an `?include` path may go on this\n * controller's routes. `comments.reactions.user` is 3 levels deep; with `1`\n * only direct relationships (`comments`) can be included. Paths deeper than\n * this are rejected with `400 Bad Request`; `0` turns `?include` off.\n *\n * Set on a namespace's `ApplicationController`, it applies to every\n * controller in the namespace (and in namespaces nested in it) that does not\n * set it itself \u2014 whatever class those controllers extend.\n *\n * ```javascript\n * class ApplicationController extends Controller {\n * maxIncludeDepth = 2;\n * }\n * ```\n *\n * Every allowed path is enumerated up front from the serializers'\n * relationships, and each nested level costs its own queries per request, so\n * keep this small.\n *\n * In a namespace without {@link Controller.visibility} rules it defaults to\n * `0`: nothing there scopes the included records.\n *\n * @default 3\n */\n declare maxIncludeDepth: number;\n\n /**\n * Whether a namespace may fall back to the root Serializer of a type it has\n * no Serializer for. Read from a namespace's `ApplicationController` and\n * applies to the whole namespace.\n *\n * By default `app/controllers/admin/comments.js` without an\n * `app/serializers/admin/comments.js` \u2014 or an included type without one \u2014\n * is serialized by the root Serializer, with every attribute and\n * relationship it declares. For a namespace that must only expose what it\n * declares itself, turn the fallback off:\n *\n * ```javascript\n * // app/controllers/admin/application.js\n * class AdminApplicationController extends ApplicationController {\n * serializerFallback = false;\n * }\n * ```\n *\n * The application then refuses to boot while any type the namespace can\n * serialize or `include` (down to each controller's `maxIncludeDepth`) has\n * no Serializer in that namespace, listing each missing one.\n *\n * @default true\n */\n serializerFallback: boolean = true;\n\n /**\n * Which rows of each type a request may see, declared once per namespace on\n * its `ApplicationController`. Each rule receives a query of its type and\n * the request, and returns the query narrowed:\n *\n * ```javascript\n * // app/controllers/application.js\n * class ApplicationController extends Controller {\n * static visibility = {\n * posts: query => query.isPublic(),\n * comments: (query, { currentUser }) =>\n * query.where({ userId: currentUser.id })\n * };\n * }\n * ```\n *\n * Lumen applies the rule wherever it loads rows of that type for a request\n * in the namespace: `index` and its page links, `show`, `update` and\n * `destroy` (a hidden record is `404 Not Found`, like a missing one), every\n * relationship's resource linkage, `included` resources at any depth, and\n * the related records referenced by a `create` or `update` (a hidden one is\n * reported as not found). A to-one relationship to a hidden record is\n * serialized as `null`; a to-many one leaves it out.\n *\n * Rules must be synchronous and may only add conditions (`where`, `not`,\n * `whereBetween`, `whereRaw`, or model scopes built from them). Load what\n * a rule needs in a `beforeAction` hook and read it from the request.\n *\n * A nested namespace follows its parent namespace's rules unless its\n * `ApplicationController` declares its own \u2014 whether that class extends\n * `Controller` or the parent's `ApplicationController`, and also when the\n * namespace has no `ApplicationController`. Replace them, or build on them\n * through `super` in a class that extends the parent's:\n *\n * ```javascript\n * // app/controllers/admin/application.js\n * class AdminApplicationController extends Controller {\n * static visibility = {}; // admins see everything\n * }\n *\n * // app/controllers/members/application.js\n * class MembersApplicationController extends ApplicationController {\n * static visibility = { ...super.visibility, drafts: \u2026 };\n * }\n * ```\n *\n * Declaring `visibility` on any other controller is a boot error: types are\n * included across controllers, so a rule must hold for the whole\n * namespace.\n *\n * Rules do not apply to queries an application builds itself, such as a\n * custom action's `Post.where(...)` or a relationship read from a model\n * (`await post.comments`). Narrow those with `visible()`.\n *\n * **Visibility rules and model scopes**\n *\n * A model scope (`static scopes` on a Model, e.g. `Post.isPublic()`) is a\n * reusable piece of a query: it narrows the one query it is called on, and\n * only when application code calls it. A visibility rule is an access\n * policy: Lumen applies it to every query it issues for a request. The two\n * compose \u2014 a rule is usually written with a scope.\n *\n * | | Model scope | Visibility rule |\n * |-------------------|----------------------|-------------------------|\n * | Declared on | the Model | a namespace's |\n * | | | `ApplicationController` |\n * | Applied | where code calls it | to every query Lumen |\n * | | | issues for the request |\n * | Sees the request | no | yes |\n * | Per namespace | no | yes |\n * | May use | any query method | conditions only |\n * | `unscope()` | removes it | cannot remove it |\n *\n * Scoping a built-in action is not the same as hiding records. With\n *\n * ```javascript\n * class PostsController extends Controller {\n * index(request) {\n * return super.index(request).isPublic();\n * }\n * }\n * ```\n *\n * private posts are left out of `GET /posts`, but are still served by\n * `GET /posts/:id`, listed in the `posts` linkage of a user and in\n * `included` for `/users?include=posts`, linked from a comment's `post`,\n * and accepted as the `post` of a new comment. `posts: query =>\n * query.isPublic()` as a visibility rule closes every one of those paths.\n *\n * A namespace without rules, its own or a parent's, gets conservative\n * defaults: `maxIncludeDepth` is `0` (no includes), resources serve no\n * relationship or related endpoints unless they ask for them, and the app\n * warns at boot. `static visibility = {}` declares that a namespace may see\n * everything, and lifts them.\n */\n static visibility: Visibility = {};\n\n /**\n * Narrow `query` with the visibility rule for its type that applies to\n * `request`'s namespace, as the built-in actions do.\n *\n * ```javascript\n * class PostsController extends Controller {\n * drafts(request) {\n * return this.visible(Post.where({ isPublic: false }), request);\n * }\n * }\n * ```\n *\n * @param query - A query of any type.\n * @param request - The request object.\n * @returns The same query, narrowed.\n */\n visible<Q extends Query<unknown>>(query: Q, request: Request): Q {\n return scopeFor(this.visibility, request).apply(query);\n }\n\n /**\n * The Serializer to serialize (and validate the `fields` of) related\n * resources of this Controller's responses with: the related model's\n * Serializer in this Controller's namespace, falling back to the root one.\n *\n * Always this Controller's namespace \u2014 not its Serializer's, which is the\n * root one when the namespace has no Serializer for this resource.\n *\n * @internal\n */\n serializerFor(model: ModelClass): Serializer<Model> {\n const { serializer, namespace } = this;\n\n return serializer\n ? serializer.serializerFor(model, namespace)\n : model.serializer;\n }\n\n /**\n * The resolved Model for a Controller instance.\n *\n * @internal\n */\n declare model: ModelClass<Model>;\n\n /**\n * A reference to the root Controller for the namespace that a Controller\n * instance is a member of.\n *\n * @internal\n */\n declare parent: Controller | null;\n\n /**\n * The namespace that a Controller instance is a member of.\n *\n * @internal\n */\n declare namespace: string;\n\n /**\n * The resolved Serializer for a Controller instance.\n *\n * @internal\n */\n declare serializer: Serializer<Model>;\n\n /**\n * A Map instance containing a reference to all the Controller within an\n * Application instance.\n *\n * @internal\n */\n declare controllers: Map<string, Controller>;\n\n /**\n * The visibility rules of this Controller's namespace, resolved at boot\n * from the `static visibility` of the closest `ApplicationController`, from\n * its own namespace's up, that declares rules.\n *\n * @internal\n */\n declare visibility: Visibility;\n\n /**\n * Whether this Controller's namespace, or one it is nested in, declares\n * visibility rules \u2014 `static visibility = {}` included. Without any, the\n * namespace gets conservative defaults (see `restrictOpenNamespaces()`).\n * Resolved at boot.\n *\n * @internal\n */\n declare hasVisibilityRules: boolean;\n\n /**\n * A boolean value representing whether or not a Controller instance has a\n * Model.\n *\n * @internal\n */\n declare hasModel: boolean;\n\n /**\n * A boolean value representing whether or not a Controller instance is within\n * a namespace.\n *\n * @internal\n */\n declare hasNamespace: boolean;\n\n /**\n * A boolean value representing whether or not a Controller instance has a\n * Serializer.\n *\n * @internal\n */\n declare hasSerializer: boolean;\n\n constructor({ model, namespace, serializer }: ControllerOptions) {\n Object.assign(this, {\n model,\n namespace,\n serializer,\n // Replaced at boot with the namespace's rules (`resolveVisibility()`).\n visibility: (this.constructor as typeof Controller).visibility,\n hasModel: Boolean(model),\n hasNamespace: Boolean(namespace),\n hasSerializer: Boolean(serializer)\n });\n\n freezeProps(this, true, 'model', 'namespace', 'serializer');\n\n freezeProps(this, false, 'hasModel', 'hasNamespace', 'hasSerializer');\n }\n\n /**\n * `GET /posts`: the records, sorted, filtered and paged by the request's\n * query parameters, with its `include` and `fields`. Visibility rules apply.\n *\n * @param request - The request.\n * @param response - The response. Unused by the built-in action, but every\n * action is called with it, so an override can take it.\n * @returns A query of the page of records; narrow it in an override.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n index(request: Request, response?: Response): Query<Array<Model>> {\n return this.visible(findMany(this.model, request), request);\n }\n\n /**\n * `GET /posts/1`: the record with the route's id, with the request's\n * `include` and `fields`. Visibility rules apply; a record the request may\n * not see, like a missing one, is a `404 Not Found`.\n *\n * @param request - The request.\n * @param response - The response. Unused by the built-in action, but every\n * action is called with it, so an override can take it.\n * @returns A query of the record; narrow it in an override.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n show(request: Request, response?: Response): Query<Model> {\n return this.visible(findOne(this.model, request), request);\n }\n\n /**\n * `GET /posts/1/relationships/comments`, a relationship endpoint: resolves\n * the resource that owns the relationship (`request.route.relationship`),\n * whose resource linkage is the response.\n *\n * The resource is resolved through this controller's `show`, asking for its\n * primary key only, so whatever `show` enforces holds here too: an override\n * that narrows its query or rejects the request applies, and a resource the\n * request may not see is a `404 Not Found`. Hooks see the action\n * `showRelationship` (`request.route.type` is `relationship`).\n *\n * @param request - The request.\n * @param response - The response. Unused by the built-in action, but every\n * action is called with it, so an override can take it.\n * @returns A query of the owning record.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n showRelationship(request: Request, response?: Response): Query<Model> {\n const fields = { [this.model.resourceName]: [] };\n\n // The request as `show` would get it for this resource, selecting no\n // attributes: the route's own params are not `show`'s.\n return this.show(\n Object.create(request, {\n params: { value: { id: request.params.id, fields } },\n defaultParams: { value: { fields } }\n })\n );\n }\n\n /**\n * `GET /posts/1/comments`, a related endpoint: the resources the\n * relationship `request.route.relationship` of the record with the route's id\n * points to.\n *\n * The query parameters are those of the related type's controller: for a\n * to-many relationship they page, sort and filter like its `index`, for a\n * to-one one they include and select like its `show`. Visibility rules apply\n * to the related resources; the owning record is resolved with\n * {@link Controller.showRelationship} first, so one the request may not see\n * is a `404 Not Found`. Hooks see the action `showRelated`\n * (`request.route.type` is `related`).\n *\n * @param request - The request.\n * @param response - The response. Unused by the built-in action, but every\n * action is called with it, so an override can take it.\n * @returns A query of the related records (to-many), or of the related record\n * (to-one, resolving with `undefined` when there is none).\n */\n showRelated(\n request: Request,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n response?: Response\n ): Query<Array<Model>> | Query<Model> {\n const { model } = this;\n const {\n params: { id },\n route: { relationship = '' }\n } = request;\n const opts = model.relationshipFor(relationship);\n\n if (!opts) {\n throw new TypeError(`${model.name} has no relationship ${relationship}`);\n }\n\n const { type, through, model: related } = opts;\n let condition: Record<string, unknown>;\n\n // Each kind of relationship as a condition on the related table, so the\n // related ids are never loaded into memory (a to-many can be large).\n if (type === 'belongsTo') {\n condition = {\n [related.primaryKey]: (model.table() as Knex.QueryBuilder)\n .select(opts.foreignKey)\n .where(model.columnNameFor(model.primaryKey) as string, id)\n };\n } else if (through) {\n const inverse = related.relationshipFor(opts.inverse);\n\n condition = {\n [related.primaryKey]: (through.table() as Knex.QueryBuilder)\n .select(inverse?.foreignKey as string)\n .where(opts.foreignKey, id)\n };\n } else {\n condition = { [camelize(opts.foreignKey, true)]: id };\n }\n\n if (type === 'hasMany') {\n return this.visible(findMany(related, request).where(condition), request);\n }\n\n const { select } = paramsToQuery(\n related,\n merge(request.defaultParams, request.params)\n );\n\n return this.visible(\n related\n .select(...select)\n .where(condition)\n .first() as unknown as Query<Model>,\n request\n );\n }\n\n /**\n * `POST /posts`: creates a record from the request body's attributes and\n * relationships, after checking that every related record exists and is\n * visible (a `404 Not Found` otherwise). Answers `201 Created` with a\n * `Location` header.\n *\n * @param request - The request.\n * @param response - The response, for the status and `Location` header.\n * @returns Resolves with the new record.\n */\n async create(request: Request, response: Response): Promise<Model> {\n const { model } = this;\n\n const {\n url: { pathname },\n params: {\n data: { attributes, relationships }\n }\n } = request;\n\n await validateRelationships(\n model,\n relationships,\n scopeFor(this.visibility, request)\n );\n\n const record = await model.create({\n ...attributes,\n ...resolveRelationships(model, relationships)\n });\n\n response.setHeader(\n 'Location',\n `${getDomain(request) + pathname}/${record.getPrimaryKey()}`\n );\n\n response.statusCode = 201;\n\n return record.unwrap();\n }\n\n /**\n * `PATCH /posts/1`: updates the record with the route's id from the request\n * body, after checking that every related record exists and is visible.\n * A record the request may not see is a `404 Not Found`.\n *\n * @param request - The request.\n * @param response - The response. Unused by the built-in action, but every\n * action is called with it, so an override can take it.\n * @returns Resolves with the updated record, or with `204` (`204 No Content`)\n * when nothing changed.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n update(request: Request, response?: Response): Promise<number | Model> {\n const { model } = this;\n\n return this.visible(findOne(model, request), request)\n .then(async record => {\n const {\n params: {\n data: { attributes, relationships }\n }\n } = request;\n\n await validateRelationships(\n model,\n relationships,\n scopeFor(this.visibility, request)\n );\n\n return record.update({\n ...attributes,\n ...resolveRelationships(model, relationships)\n });\n })\n .then(record => {\n if (record.didPersist) {\n return record.unwrap();\n }\n\n return 204;\n });\n }\n\n /**\n * `DELETE /posts/1`: deletes the record with the route's id. A record the\n * request may not see is a `404 Not Found`.\n *\n * @param request - The request.\n * @param response - The response. Unused by the built-in action, but every\n * action is called with it, so an override can take it.\n * @returns Resolves with `204` (`204 No Content`).\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n destroy(request: Request, response?: Response): Promise<number> {\n return this.visible(findOne(this.model, request), request)\n .then(record => record.destroy())\n .then(() => 204);\n }\n\n /**\n * Answers `OPTIONS` requests: `204 No Content`, with the path's methods in\n * `Allow`.\n *\n * @param request - The request. Unused.\n * @param response - The response. Unused by the built-in action, but every\n * action is called with it, so an override can take it.\n * @returns Resolves with `204`.\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n preflight(request?: Request, response?: Response): Promise<number> {\n return Promise.resolve(204);\n }\n}\n\n/**\n * The defaults of the settings a controller inherits from its namespace's\n * `ApplicationController` (`NAMESPACE_SETTINGS`). They live on the prototype,\n * not in field initializers, so that only a controller that sets one has it\n * as an own property \u2014 which is how `createController` tells \"set here\" from\n * \"take the namespace's\".\n */\nObject.defineProperties(Controller.prototype, {\n rejectUnlistedAttributes: { value: false, writable: true },\n rejectUnlistedRelationships: { value: true, writable: true },\n maxIncludeDepth: { value: 3, writable: true }\n});\n\nexport default Controller;\nexport { BUILT_IN_ACTIONS, NAMESPACE_SETTINGS } from './constants';\n\nexport { Scope } from './visibility';\nexport type { Visibility } from './visibility';\nexport type {\n ControllerOptions,\n BuiltInAction,\n BeforeAction,\n AfterAction\n} from './interfaces';\n", "import { createServer } from 'http';\nimport type { Writable } from 'stream';\nimport type { IncomingMessage, Server as HTTPServer } from 'http';\n\nimport { tryCatchSync } from '../../utils/try-catch';\nimport { errorName } from '../logger';\nimport type Logger from '../logger';\nimport type Router from '../router';\n\nimport { HAS_BODY } from './constants';\nimport { createRequest, parseRequest } from './request';\nimport { createResponse } from './response';\nimport { createResponder } from './responder';\nimport MethodNotAllowedError from './errors/method-not-allowed-error';\nimport validateAccept from './utils/validate-accept';\nimport validateContentType from './utils/validate-content-type';\nimport setCORSHeaders from './utils/set-cors-headers';\nimport statusForError from './utils/status-for-error';\nimport requestIdFor from './utils/request-id-for';\nimport clientIpFor from './utils/client-ip-for';\nimport type { Request } from './request/interfaces';\nimport type { Response } from './response/interfaces';\nimport type { ServerOptions, CorsConfig } from './interfaces';\n\n/** @internal */\nclass Server {\n declare logger: Logger;\n\n declare router: Router;\n\n declare cors: CorsConfig;\n\n declare trustProxy: boolean;\n\n declare instance: HTTPServer;\n\n constructor({ logger, router, cors, trustProxy = false }: ServerOptions) {\n Object.defineProperties(this, {\n router: {\n value: router,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n logger: {\n value: logger,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n cors: {\n value: cors,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n trustProxy: {\n value: trustProxy,\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n instance: {\n value: createServer(this.receiveRequest),\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n }\n\n listen(port: number): void {\n this.instance.listen(port);\n }\n\n initializeRequest(req: IncomingMessage, res: Writable): [Request, Response] {\n const { logger, router, cors } = this;\n\n req.setEncoding('utf8');\n\n const response = createResponse(res, {\n logger\n });\n\n setCORSHeaders(response, cors);\n\n const request = createRequest(req, {\n logger,\n router\n });\n\n request.id = requestIdFor(request);\n request.ip = clientIpFor(request, this.trustProxy);\n response.setHeader('X-Request-Id', request.id);\n\n return [request, response];\n }\n\n validateRequest({ method, headers, route }: Request): true {\n let isValid = validateAccept(headers.get('accept'));\n\n if (HAS_BODY.test(method)) {\n isValid = validateContentType(headers.get('content-type'), {\n // A plain route takes any JSON body (see `parseRequest`).\n json: route?.type === 'custom'\n });\n }\n\n return isValid;\n }\n\n receiveRequest = (req: IncomingMessage, res: Writable): void => {\n const { logger } = this;\n const [request, response] = this.initializeRequest(req, res);\n const respond = createResponder(request, response);\n\n logger.request(request, response, {\n startTime: Date.now()\n });\n\n const isValid = tryCatchSync(() => this.validateRequest(request), respond);\n\n if (isValid) {\n parseRequest(request)\n .then(params => {\n const { route, method } = request;\n const allowed = this.router.methodsFor(request);\n\n Object.assign(request, {\n params\n });\n\n if (route) {\n if (method === 'OPTIONS') {\n response.setHeader('Allow', allowed.join(', '));\n }\n\n return route.visit(request, response);\n } else if (allowed.length) {\n response.setHeader('Allow', allowed.join(', '));\n throw new MethodNotAllowedError(method, allowed);\n }\n\n return undefined;\n })\n .then(respond)\n .catch(err => {\n // A 4xx is the client's mistake, already on the request line with\n // its status; only a 5xx is the server's, worth an ERROR and a stack.\n const context = { requestId: request.id };\n\n if (statusForError(err) >= 500) {\n logger.error(err, context);\n } else {\n logger.debug(`${errorName(err)}: ${err?.message}`, context);\n }\n\n respond(err);\n });\n }\n };\n}\n\nexport default Server;\nexport { REQUEST_METHODS, getDomain } from './request';\nexport { default as createServerError } from './utils/create-server-error';\n\nexport { default as sourceFor } from './utils/source-for';\nexport { default as ErrorList } from './errors/error-list';\n\nexport type {\n CorsConfig,\n ServerConfig,\n ServerError,\n ServerErrorSource\n} from './interfaces';\n\nexport type {\n Request,\n RequestParams,\n RequestMethod\n} from './request/interfaces';\n\nexport type { Response } from './response/interfaces';\n", "export const HAS_BODY = /^(POST|PATCH)$/;\n\nexport const STATUS_CODES = new Map([\n [100, 'Continue'],\n [101, 'Switching Protocols'],\n [102, 'Processing'],\n [200, 'OK'],\n [201, 'Created'],\n [202, 'Accepted'],\n [203, 'Non-Authoritative Information'],\n [204, 'No Content'],\n [205, 'Reset Content'],\n [206, 'Partial Content'],\n [207, 'Multi-Status'],\n [208, 'Already Reported'],\n [226, 'IM Used'],\n [300, 'Multiple Choices'],\n [301, 'Moved Permanently'],\n [302, 'Found'],\n [303, 'See Other'],\n [304, 'Not Modified'],\n [305, 'Use Proxy'],\n [307, 'Temporary Redirect'],\n [308, 'Permanent Redirect'],\n [400, 'Bad Request'],\n [401, 'Unauthorized'],\n [402, 'Payment Required'],\n [403, 'Forbidden'],\n [404, 'Not Found'],\n [405, 'Method Not Allowed'],\n [406, 'Not Acceptable'],\n [407, 'Proxy Authentication Required'],\n [408, 'Request Timeout'],\n [409, 'Conflict'],\n [410, 'Gone'],\n [411, 'Length Required'],\n [412, 'Precondition Failed'],\n [413, 'Payload Too Large'],\n [414, 'URI Too Long'],\n [415, 'Unsupported Media Type'],\n [416, 'Range Not Satisfiable'],\n [417, 'Expectation Failed'],\n [418, \"I'm a teapot\"],\n [421, 'Misdirected Request'],\n [422, 'Unprocessable Entity'],\n [423, 'Locked'],\n [424, 'Failed Dependency'],\n [425, 'Unordered Collection'],\n [426, 'Upgrade Required'],\n [428, 'Precondition Required'],\n [429, 'Too Many Requests'],\n [431, 'Request Header Fields Too Large'],\n [451, 'Unavailable For Legal Reasons'],\n [500, 'Internal Server Error'],\n [501, 'Not Implemented'],\n [502, 'Bad Gateway'],\n [503, 'Service Unavailable'],\n [504, 'Gateway Timeout'],\n [505, 'HTTP Version Not Supported'],\n [506, 'Variant Also Negotiates'],\n [507, 'Insufficient Storage'],\n [508, 'Loop Detected'],\n [509, 'Bandwidth Limit Exceeded'],\n [510, 'Not Extended'],\n [511, 'Network Authentication Required']\n]);\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * `createRequest` receives the raw Node `IncomingMessage` and mutates it in\n * place into the framework's `Request` shape; the parameter is genuinely\n * untyped at that boundary before the mutation completes.\n */\nimport { parse as parseURL } from 'url';\n\nimport entries from '../../../utils/entries';\n\nimport type { Request, RequestOptions } from './interfaces';\n\n/** @internal */\nexport function createRequest(\n req: any,\n { logger, router }: RequestOptions\n): Request {\n const url = { ...parseURL(req.url, true), params: [] };\n const headers: Map<string, string> = new Map(entries(req.headers));\n\n Object.assign(req, {\n url,\n logger,\n router,\n headers,\n params: {},\n method: headers.get('x-http-method-override') || req.method\n });\n\n const route = router.match(req);\n\n if (route) {\n Object.assign(req, {\n route,\n action: route.action,\n controller: route.controller\n });\n }\n\n return req;\n}\n\nexport { REQUEST_METHODS } from './constants';\n\nexport { parseRequest } from './parser';\nexport { default as getDomain } from './utils/get-domain';\n", "import type { RequestMethod } from './interfaces';\n\nexport const REQUEST_METHODS: Array<RequestMethod> = [\n 'GET',\n 'HEAD',\n 'POST',\n 'PATCH',\n 'DELETE',\n 'OPTIONS'\n];\n", "import entries from '../../../../../utils/entries';\n\n// Not global: `test()` on a global regex is stateful (`lastIndex`). Only the\n// `replace()` that follows every match, which resets it, kept that harmless.\nconst DELIMITER = /^(.+)\\[(.+)]$/;\n\n/** @internal */\nexport default function parseNestedObject(\n source: Record<string, unknown>\n): Record<string, unknown> {\n return entries(source).reduce<Record<string, unknown>>(\n (result, [key, value]) => {\n if (DELIMITER.test(key)) {\n const parentKey = key.replace(DELIMITER, '$1');\n const parentValue = result[parentKey];\n\n return {\n ...result,\n [parentKey]: {\n ...(parentValue || {}),\n [key.replace(DELIMITER, '$2')]: value\n }\n };\n }\n\n return {\n ...result,\n [key]: value\n };\n },\n {}\n );\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * Query parsing coerces genuinely untyped input (nested arrays of string\n * values from the URL) into normalized param shapes; the `any` arrays are\n * confined to those raw-value positions.\n */\nimport { camelize } from 'inflection';\n\nimport { INT, NULL, BOOL, DATE, TRUE, BRACKETS } from '../constants';\nimport isNull from '../../../../../utils/is-null';\nimport entries from '../../../../../utils/entries';\nimport underscore from '../../../../../utils/underscore';\nimport { camelizeKeys } from '../../../../../utils/transform-keys';\n\n/**\n * A member name as the client writes it (`created-at`) in its internal form\n * (`createdAt`).\n *\n * @internal\n */\nfunction memberName(name: string): string {\n return camelize(underscore(name), true);\n}\n\n/** @internal */\nfunction makeArray(source: string | Array<string>): Array<string> {\n if (!Array.isArray(source)) {\n return source.includes(',') ? source.split(',') : [source];\n }\n\n return source;\n}\n\n/** @internal */\nfunction formatScalar(source: unknown): unknown {\n if (typeof source !== 'string') {\n return source;\n } else if (INT.test(source)) {\n return Number.parseInt(source, 10);\n } else if (BOOL.test(source)) {\n return TRUE.test(source);\n } else if (NULL.test(source)) {\n return null;\n } else if (DATE.test(source)) {\n return new Date(source);\n }\n\n return source;\n}\n\n/**\n * A query parameter's value. A comma-separated list becomes an array\n * (`filter[id]=1,2` matches either). Values are data: unlike member names,\n * they are never camelized.\n *\n * @internal\n */\nfunction formatValue(source: string): unknown {\n if (source.includes(',')) {\n return source.split(',').map(formatScalar);\n }\n\n return formatScalar(source);\n}\n\n/** @internal */\nexport function formatSort(sort: string): string {\n if (sort.startsWith('-')) {\n return `-${memberName(sort.substr(1))}`;\n }\n\n return memberName(sort);\n}\n\n/** @internal */\nexport function formatFields(\n fields: Record<string, unknown>\n): Record<string, Array<string>> {\n // Keys are resource types and stay as written; values are member names,\n // camelized like `sort` (`created-at` -> `createdAt`). An empty value is an\n // empty fieldset, which the spec defines as \"no fields\".\n return entries(fields).reduce<Record<string, Array<string>>>(\n (result, [key, value]) => ({\n ...result,\n [key]: makeArray(value as string | Array<string>)\n .filter(Boolean)\n .map(memberName)\n }),\n {}\n );\n}\n\n/**\n * Relationship paths, with each member name camelized\n * (`comments.blog-author` -> `comments.blogAuthor`).\n *\n * @internal\n */\nexport function formatInclude(include: string | Array<string>): Array<string> {\n return makeArray(include).map(path =>\n path.split('.').map(memberName).join('.')\n );\n}\n\n/**\n * Format query parameters: keys are camelized (they are member names, e.g.\n * `filter[is-public]`), values are coerced (`123`, `true`, `null`, ISO dates)\n * and split on commas, but otherwise left as written.\n *\n * @internal\n */\nexport default function format(\n params: Record<string, unknown>\n): Record<string, unknown> {\n const result = entries(params).reduce<Record<string, unknown>>(\n (obj, [key, value]) => {\n const name = key.replace(BRACKETS, '');\n\n if (Array.isArray(value)) {\n return { ...obj, [name]: value.map(formatScalar) };\n } else if (value && typeof value === 'object') {\n return { ...obj, [name]: format(value as Record<string, any>) };\n } else if (typeof value === 'string') {\n return { ...obj, [name]: formatValue(value) };\n }\n\n return { ...obj, [name]: isNull(value) ? null : value };\n },\n {}\n );\n\n return camelizeKeys(result, true);\n}\n", "export const INT = /^\\d+$/;\nexport const NULL = /^null$/;\nexport const BOOL = /^(?:true|false)$/;\nexport const DATE = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}(Z|\\+\\d{4})$/;\nexport const TRUE = /^true$/;\nexport const BRACKETS = /(?:\\[])/g;\n", "import { camelize, dasherize } from 'inflection';\n\nimport entries from './entries';\nimport underscore from './underscore';\n\ntype Transformer = (key: string) => string;\n\n/**\n * Rewrites an object's keys with `transformer`.\n *\n * Overloaded rather than Flow's `T -> T`, which was inaccurate: transforming\n * keys produces a differently-shaped object, so the object form returns\n * `Record<string, unknown>`. Arrays are passed through as a shallow copy (their\n * keys are not transformed), so they keep their element type.\n *\n * @private\n */\nexport function transformKeys<T>(\n source: T[],\n transformer: Transformer,\n deep?: boolean\n): T[];\nexport function transformKeys(\n source: object,\n transformer: Transformer,\n deep?: boolean\n): Record<string, unknown>;\nexport function transformKeys(\n source: object | unknown[],\n transformer: Transformer,\n deep: boolean = false\n): object | unknown[] {\n if (Array.isArray(source)) {\n return source.slice(0);\n } else if (source && typeof source === 'object') {\n return entries(source as Record<string, unknown>).reduce<\n Record<string, unknown>\n >((result, [key, value]) => {\n const recurse =\n deep &&\n value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n !(value instanceof Date);\n\n if (recurse) {\n return {\n ...result,\n [transformer(key)]: transformKeys(value as object, transformer, true)\n };\n }\n\n return {\n ...result,\n [transformer(key)]: value\n };\n }, {});\n }\n\n return {};\n}\n\n/**\n * @private\n */\nexport function camelizeKeys<T>(source: T[], deep?: boolean): T[];\nexport function camelizeKeys(\n source: object,\n deep?: boolean\n): Record<string, unknown>;\nexport function camelizeKeys(\n source: object | unknown[],\n deep?: boolean\n): object | unknown[] {\n return transformKeys(\n source as object,\n key => camelize(underscore(key), true),\n deep\n );\n}\n\n/**\n * @private\n */\nexport function dasherizeKeys<T>(source: T[], deep?: boolean): T[];\nexport function dasherizeKeys(\n source: object,\n deep?: boolean\n): Record<string, unknown>;\nexport function dasherizeKeys(\n source: object | unknown[],\n deep?: boolean\n): object | unknown[] {\n // NOTE: the Flow original passed a second `true` argument to `dasherize`,\n // which takes only one parameter \u2014 it was silently ignored, so dropping it\n // is behaviour-preserving.\n return transformKeys(\n source as object,\n key => dasherize(underscore(key)),\n deep\n );\n}\n\n/**\n * @private\n */\nexport function underscoreKeys<T>(source: T[], deep?: boolean): T[];\nexport function underscoreKeys(\n source: object,\n deep?: boolean\n): Record<string, unknown>;\nexport function underscoreKeys(\n source: object | unknown[],\n deep?: boolean\n): object | unknown[] {\n return transformKeys(source as object, key => underscore(key), deep);\n}\n", "import isObject from '../../../../../utils/is-object';\nimport type { Request } from '../../interfaces';\n\nimport parseNestedObject from './parse-nested-object';\nimport format, { formatSort, formatFields, formatInclude } from './format';\n\n/** @internal */\nexport default function parseRead({\n url: { query }\n}: Request): Record<string, unknown> {\n const { sort, fields, include, ...params } = parseNestedObject(query);\n\n if (sort) {\n params.sort = typeof sort === 'string' ? formatSort(sort) : sort;\n }\n\n if (fields && !isObject(fields)) {\n params.fields = fields;\n }\n\n if (include) {\n params.include = formatInclude(include as string | Array<string>);\n }\n\n const result = format(params);\n\n // Added after `format()`, whose key camelizing would rewrite resource types\n // (`fields[blog-posts]` -> `blogPosts`).\n if (isObject(fields)) {\n result.fields = formatFields(fields);\n }\n\n return result;\n}\n", "import createServerError from '../../../utils/create-server-error';\nimport { line } from '../../../../logger';\n\n/** @internal */\nclass MalformedRequestError extends SyntaxError {\n constructor(expected: string = 'a valid JSON API document') {\n super(line`\n There was an error parsing the request body. Please make sure that the\n request body is ${expected}.\n `);\n }\n}\n\nexport default createServerError(MalformedRequestError, 400, {\n isPublic: true\n});\n", "import isObject from '../../../../../utils/is-object';\nimport { camelizeKeys } from '../../../../../utils/transform-keys';\n\n/** @internal */\nfunction normalizeResource(\n resource: Record<string, unknown>\n): Record<string, unknown> {\n const { attributes, relationships } = resource;\n\n return {\n ...resource,\n ...(isObject(attributes) && { attributes: camelizeKeys(attributes) }),\n ...(isObject(relationships) && {\n relationships: camelizeKeys(relationships)\n })\n };\n}\n\n/**\n * Bring a request document's member names into their internal form: the\n * names of `data.attributes` and `data.relationships` are camelized\n * (`is-public` -> `isPublic`). Nothing else is touched \u2014 in particular no\n * value: attribute values (and keys inside them) are data, and ids and dates\n * are typed by parameter validation, from the columns they are written to.\n *\n * Anything that is not a resource document is passed through for parameter\n * validation to reject.\n *\n * @internal\n */\nexport default function normalizeDocument(document: unknown): unknown {\n if (isObject(document) && isObject(document.data)) {\n return {\n ...document,\n data: normalizeResource(document.data)\n };\n }\n\n return document;\n}\n", "import { MalformedRequestError } from '../errors';\nimport isObject from '../../../../../utils/is-object';\nimport { tryCatchSync } from '../../../../../utils/try-catch';\nimport type { Request } from '../../interfaces';\n\nimport normalizeDocument from './normalize-document';\n\n/**\n * The request body, read to the end as text.\n *\n * @internal\n */\nexport function readBody(req: Request): Promise<string> {\n return new Promise((resolve, reject) => {\n let body = '';\n const cleanUp = () => {\n req.removeAllListeners('end');\n req.removeAllListeners('data');\n req.removeAllListeners('error');\n };\n\n req.on('data', data => {\n body += data.toString();\n });\n\n req.once('end', () => {\n cleanUp();\n resolve(body);\n });\n\n req.once('error', err => {\n cleanUp();\n reject(err);\n });\n });\n}\n\n/**\n * A plain route's body: any JSON, as sent, or `undefined` when there is\n * none. Nothing in it is validated or renamed.\n *\n * @internal\n */\nexport async function parseJSON(req: Request): Promise<unknown> {\n const body = await readBody(req);\n\n if (!body.trim()) {\n return undefined;\n }\n\n const parsed = tryCatchSync(() => ({ value: JSON.parse(body) as unknown }));\n\n if (!parsed) {\n throw new MalformedRequestError('valid JSON');\n }\n\n return parsed.value;\n}\n\n/**\n * A JSON:API document's members, normalized into the request's parameters.\n * The document as sent is also `request.body`.\n *\n * @internal\n */\nexport default async function parseWrite(\n req: Request\n): Promise<Record<string, unknown>> {\n const body = await readBody(req);\n const parsed = tryCatchSync(() => JSON.parse(body) as unknown);\n\n if (!isObject(parsed)) {\n throw new MalformedRequestError();\n }\n\n req.body = parsed;\n\n return normalizeDocument(parsed) as Record<string, unknown>;\n}\n", "import type { Request } from '../interfaces';\n\nimport parseRead from './utils/parse-read';\nimport parseWrite, { parseJSON } from './utils/parse-write';\n\n/**\n * The request's parameters: the query string's, and on `POST` and `PATCH`\n * the body's. A plain route's body is any JSON, kept as `request.body` and\n * not validated; a resource route's is a JSON:API document, normalized into\n * the parameters (`data`) and also kept as `request.body`.\n *\n * @internal\n */\nexport function parseRequest(req: Request): Promise<Record<string, unknown>> {\n switch (req.method) {\n case 'POST':\n case 'PATCH':\n if (req.route?.type === 'custom') {\n return parseJSON(req).then(body => {\n req.body = body;\n return parseRead(req);\n });\n }\n\n return parseWrite(req).then(params => ({\n ...parseRead(req),\n ...params\n }));\n\n default:\n return Promise.resolve(parseRead(req));\n }\n}\n", "import type { Request } from '../interfaces';\n\n/** @internal */\nexport default function getDomain({\n headers,\n\n connection: { encrypted }\n}: Request): string {\n return `http${encrypted ? 's' : ''}://${headers.get('host') || 'localhost'}`;\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * `createResponse` receives the raw Node response object and augments it in\n * place into the framework's `Response` shape; the parameter is genuinely\n * untyped at that boundary.\n */\nimport type { Response, ResponseOptions } from './interfaces';\n\n/** @internal */\nexport function createResponse(res: any, opts: ResponseOptions): Response {\n return Object.assign(res, opts, {\n stats: []\n });\n}\n", "/**\n * The status an error is answered with: its own `statusCode`, or `500`.\n *\n * @internal\n */\nexport default function statusForError(err: unknown): number {\n const { statusCode } = (err || {}) as { statusCode?: unknown };\n\n return parseInt(String(statusCode), 10) || 500;\n}\n", "export const VERSION = '1.0';\nexport const MIME_TYPE = 'application/vnd.api+json';\n", "import { MIME_TYPE } from '../constants';\nimport { line } from '../../logger';\nimport createServerError from '../../server/utils/create-server-error';\n\n/** @internal */\nclass NotAcceptableError extends TypeError {\n constructor(accept: string) {\n super(line`\n Every '${MIME_TYPE}' in Accept: '${accept}' has media type parameters,\n which are not supported. Try your request again with '${MIME_TYPE}'\n without parameters.\n `);\n }\n}\n\nexport default createServerError(NotAcceptableError, 406, { isPublic: true });\n", "import { MIME_TYPE } from '../constants';\nimport { line } from '../../logger';\nimport createServerError from '../../server/utils/create-server-error';\n\n/** @internal */\nclass UnsupportedMediaTypeError extends TypeError {\n constructor(contentType: string) {\n super(line`\n Media type parameters are not supported in Content-Type:\n '${contentType}'. Try your request again with Content-Type:\n '${MIME_TYPE}' without parameters.\n `);\n }\n}\n\nexport default createServerError(UnsupportedMediaTypeError, 415, {\n isPublic: true\n});\n", "import { MIME_TYPE } from '../constants';\nimport { line } from '../../logger';\nimport createServerError from '../../server/utils/create-server-error';\n\n/** @internal */\nclass InvalidContentTypeError extends TypeError {\n constructor(\n contentType: string = 'undefined',\n accepted: Array<string> = [MIME_TYPE]\n ) {\n super(line`\n Content-Type: '${contentType}' is not supported. Try your request again\n with Content-Type: ${accepted.map(type => `'${type}'`).join(' or ')}.\n `);\n }\n}\n\nexport default createServerError(InvalidContentTypeError, 415, {\n isPublic: true\n});\n", "export type MediaType = {\n // `type/subtype`, lowercased \u2014 media types are case-insensitive.\n type: string;\n\n // Media type parameters as written (`name=value`), trimmed.\n params: Array<string>;\n};\n\nconst QUALITY = /^q\\s*=/i;\n\n/**\n * Split `value` on `delimiter`, ignoring delimiters inside quoted strings\n * (parameter values may be quoted and contain `,` or `;`).\n *\n * @internal\n */\nfunction splitUnquoted(value: string, delimiter: string): Array<string> {\n const parts: Array<string> = [];\n let current = '';\n let quoted = false;\n let escaped = false;\n\n for (const char of value) {\n if (escaped) {\n escaped = false;\n } else if (quoted && char === '\\\\') {\n escaped = true;\n } else if (char === '\"') {\n quoted = !quoted;\n } else if (!quoted && char === delimiter) {\n parts.push(current);\n current = '';\n continue;\n }\n\n current += char;\n }\n\n return [...parts, current];\n}\n\n/**\n * Parse a single media type, e.g. a `Content-Type` header value.\n *\n * @internal\n */\nexport function parseMediaType(value: string): MediaType {\n const [type = '', ...params] = splitUnquoted(value, ';').map(part =>\n part.trim()\n );\n\n return {\n type: type.toLowerCase(),\n params: params.filter(Boolean)\n };\n}\n\n/**\n * Parse an `Accept` header into its media ranges.\n *\n * Per RFC 7231 \u00A75.3.2 the `q` weight (and any accept-extension after it) is\n * not a media type parameter, so it is not reported in `params`.\n *\n * @internal\n */\nexport function parseAccept(value: string): Array<MediaType> {\n return splitUnquoted(value, ',')\n .map(range => {\n const { type, params } = parseMediaType(range);\n const quality = params.findIndex(param => QUALITY.test(param));\n\n return {\n type,\n params: quality === -1 ? params : params.slice(0, quality)\n };\n })\n .filter(({ type }) => type.length > 0);\n}\n", "import { MIME_TYPE } from '../constants';\n\nimport { parseMediaType } from './media-type';\n\n/**\n * Whether a media type is the JSON:API media type, ignoring parameters.\n *\n * @internal\n */\nexport default function isJSONAPI(value: string): boolean {\n return parseMediaType(value).type === MIME_TYPE;\n}\n", "import { parseMediaType } from './media-type';\n\n/**\n * Whether a media type (e.g. a `Content-Type` value) carries parameters.\n *\n * @internal\n */\nexport default function hasMediaTypeParams(value: string): boolean {\n return parseMediaType(value).params.length > 0;\n}\n", "const isEnv = (value: string) => (): boolean => process.env.NODE_ENV === value;\n\nexport const isDevelopment: () => boolean = isEnv('development');\nexport const isProduction: () => boolean = isEnv('production');\nexport const isTest: () => boolean = isEnv('test');\n", "import { VERSION } from '../../../jsonapi';\nimport { STATUS_CODES } from '../../constants';\nimport * as env from '../../../../utils/env';\nimport type { JsonApiDocument, JsonApiErrorObject } from '../../../jsonapi';\nimport type { ServerError } from '../../interfaces';\n\nconst PUBLIC = /^\\[public\\]\\s*/i;\n\n/**\n * The error object for `err`, answered with `status`.\n *\n * @internal\n */\nfunction errorObjectFor(\n status: number,\n err?: Partial<ServerError>\n): JsonApiErrorObject {\n const title = err?.title || STATUS_CODES.get(status);\n const errData: JsonApiErrorObject = {\n status: status.toString()\n };\n\n if (err?.id) {\n errData.id = err.id;\n }\n\n if (err?.code) {\n errData.code = err.code;\n }\n\n if (title) {\n errData.title = title;\n }\n\n // `source` only ever points into the client's own request, so unlike\n // `detail` it is safe to expose in every environment \u2014 as are the members\n // an error was explicitly given.\n const source = err?.source;\n\n if (source && (source.pointer || source.parameter)) {\n errData.source = source;\n }\n\n // A message can contain anything (SQL, stored values, internals), so it is\n // shown outside development only when marked public: by the framework's own\n // client errors, which only describe the request, or with `[public]`.\n if (\n err?.message &&\n (env.isDevelopment() || err.isPublic || PUBLIC.test(err.message))\n ) {\n errData.detail = err.message.replace(PUBLIC, '');\n }\n\n if (err?.links?.about) {\n errData.links = { about: err.links.about };\n }\n\n if (err?.meta) {\n errData.meta = err.meta as JsonApiErrorObject['meta'];\n }\n\n return errData;\n}\n\n/** @internal */\nexport default function dataFor(\n status: number,\n err?: Error\n): string | JsonApiDocument {\n if (status < 400 || status > 599) {\n return '';\n }\n\n // An `ErrorList` (several problems with one request) is one error object\n // each, at its own status; the response's status is the list's.\n const { errors } = (err || {}) as { errors?: Array<ServerError> };\n\n return {\n errors: Array.isArray(errors)\n ? errors.map(error => errorObjectFor(error.statusCode || status, error))\n : [errorObjectFor(status, err as Partial<ServerError> | undefined)],\n\n jsonapi: {\n version: VERSION\n }\n };\n}\n", "import { STATUS_CODES } from '../../constants';\nimport stringify from '../../../../utils/stringify';\nimport statusForError from '../../utils/status-for-error';\n\nimport dataFor from './data-for';\n\n/** @internal */\nexport default function normalize(data?: unknown) {\n let normalized;\n let statusCode;\n\n switch (typeof data) {\n case 'boolean':\n if (data) {\n statusCode = 204;\n } else {\n statusCode = 401;\n normalized = dataFor(statusCode);\n }\n break;\n\n case 'number':\n if (STATUS_CODES.has(data)) {\n statusCode = data;\n } else {\n statusCode = 404;\n }\n normalized = dataFor(statusCode);\n break;\n\n case 'object':\n if (!data) {\n statusCode = 404;\n normalized = dataFor(statusCode);\n } else if (data instanceof Error) {\n statusCode = statusForError(data);\n normalized = dataFor(statusCode, data);\n } else {\n normalized = data;\n }\n break;\n\n case 'undefined':\n statusCode = 404;\n normalized = dataFor(statusCode);\n break;\n\n default:\n normalized = data;\n }\n\n return {\n statusCode,\n // The body before it is serialized, which decides its Content-Type.\n body: normalized,\n data: stringify(normalized)\n };\n}\n", "import type { Response } from '../../index';\n\nexport default function hasContentType(res: Response) {\n let contentType = res.getHeader('Content-Type');\n\n if (!contentType) {\n contentType = res.getHeader('content-type');\n }\n\n return Boolean(contentType);\n}\n", "import { MIME_TYPE } from '../../../jsonapi';\nimport isObject from '../../../../utils/is-object';\n\nconst JSON_TYPE = 'application/json';\n\n// Members only a JSON:API document has at its top level. Every document Lumen\n// builds carries `jsonapi`; one an `afterAction` hook rebuilds keeps it when\n// it spreads the original (`{ ...payload, meta }`).\nconst DOCUMENT_MEMBERS = ['jsonapi', 'data', 'errors'];\n\n/**\n * The `Content-Type` of a response body, before it is serialized: the\n * JSON:API media type for a JSON:API document, `application/json` for any\n * other object or array, plain text for a string, and none for an empty body.\n *\n * @internal\n */\nexport default function contentTypeFor(body: unknown): string | undefined {\n if (typeof body === 'string') {\n return body ? 'text/plain; charset=utf-8' : undefined;\n }\n\n if (isObject(body)) {\n return DOCUMENT_MEMBERS.some(key => Object.hasOwn(body, key))\n ? MIME_TYPE\n : JSON_TYPE;\n }\n\n if (Array.isArray(body)) {\n return JSON_TYPE;\n }\n\n return undefined;\n}\n", "import type { Request, Response } from '../index';\n\nimport normalize from './utils/normalize';\nimport hasContentType from './utils/has-content-type';\nimport contentTypeFor from './utils/content-type-for';\n\n/** @internal */\nexport function createResponder(req: Request, res: Response) {\n return function respond(data?: unknown) {\n const normalized = normalize(data);\n\n if (normalized.statusCode) {\n res.statusCode = normalized.statusCode;\n }\n\n // Labelled by what it is, unless the action set a Content-Type of its own\n // (CSV, HTML, \u2026): a JSON:API document, other JSON, plain text, or nothing\n // for an empty body.\n if (res.statusCode !== 204 && !hasContentType(res)) {\n const contentType = contentTypeFor(normalized.body);\n\n if (contentType) {\n res.setHeader('Content-Type', contentType);\n }\n }\n\n res.end(normalized.data);\n };\n}\n", "import createServerError from '../utils/create-server-error';\n\n/**\n * A request whose path exists, but not for its method. The responder's\n * caller sets the `Allow` header listing the methods that are.\n *\n * @internal\n */\nclass MethodNotAllowedError extends Error {\n constructor(method: string, allowed: Array<string>) {\n super(\n `${method} is not allowed here. Allowed methods: ${allowed.join(', ')}.`\n );\n }\n}\n\nexport default createServerError(MethodNotAllowedError, 405, {\n isPublic: true\n});\n", "import { MIME_TYPE, parseAccept, NotAcceptableError } from '../../jsonapi';\n\n/**\n * JSON:API 1.0: respond 406 if the Accept header contains the JSON:API media\n * type and *all* instances of it are modified with media type parameters.\n * An Accept header without the JSON:API media type is left alone.\n *\n * @internal\n */\nexport default function validateAccept(accept?: string): true {\n if (accept) {\n const ranges = parseAccept(accept).filter(({ type }) => type === MIME_TYPE);\n\n if (ranges.length && ranges.every(({ params }) => params.length)) {\n throw new NotAcceptableError(accept);\n }\n }\n\n return true;\n}\n", "import {\n MIME_TYPE,\n isJSONAPI,\n parseMediaType,\n hasMediaTypeParams,\n InvalidContentTypeError,\n UnsupportedMediaTypeError\n} from '../../jsonapi';\n\nconst JSON_TYPE = 'application/json';\n\n/**\n * JSON:API 1.0: respond 415 if the Content-Type is the JSON:API media type\n * with any media type parameters. A missing or different Content-Type is\n * also answered with 415, since that is the only type a resource accepts.\n *\n * A plain route (`json`) takes any JSON body, so `application/json` (with\n * any parameters, such as `charset`) is accepted there too.\n *\n * @internal\n */\nexport default function validateContentType(\n contentType?: string,\n { json = false }: { json?: boolean } = {}\n): true {\n if (json && contentType && parseMediaType(contentType).type === JSON_TYPE) {\n return true;\n }\n\n if (!contentType || !isJSONAPI(contentType)) {\n throw new InvalidContentTypeError(\n contentType,\n json ? [MIME_TYPE, JSON_TYPE] : [MIME_TYPE]\n );\n } else if (hasMediaTypeParams(contentType)) {\n throw new UnsupportedMediaTypeError(contentType);\n }\n\n return true;\n}\n", "import type { Response } from '../index';\nimport type { CorsConfig } from '../interfaces';\n\nexport default function setCORSHeaders(\n res: Response,\n { origin, methods, headers, enabled }: CorsConfig\n) {\n if (!enabled) {\n return;\n }\n\n if (origin) {\n res.setHeader('Access-Control-Allow-Origin', origin);\n }\n\n if (methods) {\n res.setHeader('Access-Control-Allow-Methods', methods.join());\n }\n\n if (headers) {\n res.setHeader('Access-Control-Allow-Headers', headers.join());\n }\n}\n", "import { randomUUID } from 'crypto';\n\nimport type { Request } from '../request/interfaces';\n\n/**\n * What a client-sent `X-Request-Id` may look like to be adopted. Anything\n * else \u2014 too long, or with characters that could forge log lines \u2014 is\n * replaced rather than written to the logs.\n *\n * @internal\n */\nconst REQUEST_ID = /^[\\w.:-]{1,128}$/;\n\n/**\n * The id a request is logged and answered with: the client's (or a proxy's)\n * own `X-Request-Id` when it is well-formed, so a request can be traced\n * across services, otherwise a fresh UUID.\n *\n * @internal\n */\nexport default function requestIdFor({ headers }: Request): string {\n const id = headers.get('x-request-id');\n\n return id && REQUEST_ID.test(id) ? id : randomUUID();\n}\n", "import type { Request } from '../request/interfaces';\n\n/**\n * The client's address. Behind a trusted proxy that is the *last*\n * `X-Forwarded-For` entry \u2014 the one the proxy appended; anything before it\n * came from the client and could be forged. Otherwise it is the connection's\n * own address.\n *\n * @internal\n */\nexport default function clientIpFor(\n { headers, socket }: Request,\n trustProxy = false\n): string | undefined {\n const forwarded = trustProxy ? headers.get('x-forwarded-for') : undefined;\n const proxied = forwarded?.split(',').pop()?.trim();\n\n return proxied || socket.remoteAddress;\n}\n", "import entries from './entries';\nimport isObject from './is-object';\n\n/**\n * @private\n */\nexport default function merge<T extends object, U extends object>(\n dest: T,\n source: U\n): T & U {\n return entries(source as Record<string, unknown>).reduce<\n Record<string, unknown>\n >(\n (result, [key, value]) => {\n if (Object.hasOwn(result, key) && isObject(value)) {\n const currentValue = result[key];\n\n if (isObject(currentValue)) {\n return {\n ...result,\n [key]: merge(currentValue, value)\n };\n }\n }\n\n return {\n ...result,\n [key]: value\n };\n },\n { ...dest } as Record<string, unknown>\n ) as T & U;\n}\n", "import type { ModelClass } from '../../database';\nimport type { RequestParams } from '../../server';\n\ntype ControllerQuery = {\n id?: number | string | Buffer;\n filter?: Record<string, unknown>;\n select: Array<string>;\n page?: number;\n limit?: number;\n sort?: [string, string];\n};\n\n/**\n * Translate request params into the primary query. Only primary data is\n * loaded by it: resource linkage and included resources are batch-loaded by\n * the Serializer.\n *\n * @internal\n */\nexport default function paramsToQuery(\n model: ModelClass,\n { id, page, sort, filter, fields }: RequestParams\n): ControllerQuery {\n let query: ControllerQuery = {\n id,\n filter,\n // A fieldset may also name relationships, which are not columns.\n select: [\n model.primaryKey,\n ...(fields[model.resourceName] as Array<string>).filter(name =>\n model.attributeNames.includes(name)\n )\n ]\n };\n\n if (page) {\n query = {\n ...query,\n page: page.number,\n limit: page.size\n };\n }\n\n if (sort) {\n if (sort.startsWith('-')) {\n query = {\n ...query,\n sort: [sort.substr(1), 'DESC']\n };\n } else {\n query = {\n ...query,\n sort: [sort, 'ASC']\n };\n }\n }\n\n return query;\n}\n", "import merge from '../../../utils/merge';\nimport type { Model, ModelClass, Query } from '../../database';\nimport type { Request } from '../../server';\n\nimport paramsToQuery from './params-to-query';\n\n/** @internal */\nexport default function findOne<T extends Model>(\n model: ModelClass<T>,\n req: Request\n): Query<T> {\n const params = merge(req.defaultParams, req.params);\n const { id, select } = paramsToQuery(model, params);\n\n return model.find(id).select(...select);\n}\n", "import merge from '../../../utils/merge';\nimport type { Model, ModelClass, Query } from '../../database';\nimport type { Request } from '../../server';\n\nimport paramsToQuery from './params-to-query';\n\n/** @internal */\nexport default function findMany<T extends Model>(\n model: ModelClass<T>,\n req: Request\n): Query<Array<Model>> {\n const params = merge(req.defaultParams, req.params);\n const { sort, page, limit, select, filter } = paramsToQuery(model, params);\n\n return model\n .select(...select)\n .limit(limit)\n .page(page)\n .where(filter)\n .order(...(sort as [string, string]));\n}\n", "import entries from '../../../utils/entries';\nimport type { Model, ModelClass } from '../../database';\n\n/** @internal */\nexport default function resolveRelationships<T extends Model>(\n model: ModelClass<T>,\n relationships: Record<string, unknown> = {}\n): Record<string, unknown> {\n return entries(relationships).reduce<Record<string, unknown>>(\n (obj, [key, value]) => {\n let { data = null } = (value as { data?: unknown } | null) || {};\n\n if (data) {\n const opts = model.relationshipFor(key);\n\n if (opts) {\n const Related = opts.model as new (attrs: unknown) => Model;\n\n if (Array.isArray(data)) {\n data = data.map(item => new Related(item));\n } else {\n data = new Related(data);\n }\n }\n }\n\n return {\n ...obj,\n [key]: data\n };\n },\n {}\n );\n}\n", "import createServerError from '../../server/utils/create-server-error';\nimport sourceFor from '../../server/utils/source-for';\nimport stringify from '../../../utils/stringify';\nimport type { ModelClass } from '../../database';\nimport type { ServerErrorSource } from '../../server';\n\n/**\n * JSON:API 1.0: \"A server MUST return 404 Not Found when processing a request\n * that references a related resource that does not exist.\"\n *\n * @internal\n */\nclass RelatedRecordNotFoundError extends Error {\n declare source: ServerErrorSource;\n\n constructor(\n { name, primaryKey }: ModelClass,\n primaryKeyValue: unknown,\n path: string\n ) {\n super(\n `Could not find ${name} with ${primaryKey} ${stringify(primaryKeyValue)}.`\n );\n this.source = sourceFor(path);\n }\n}\n\nexport default createServerError(RelatedRecordNotFoundError, 404, {\n isPublic: true\n});\n", "import type { ModelClass } from '../../database';\n\n/**\n * Thrown at boot for visibility rules that cannot be applied: rules declared\n * on a controller other than a namespace's `ApplicationController`, rules for\n * an unknown type, or a rule that is not a function.\n *\n * @internal\n */\nexport class VisibilityConfigError extends TypeError {\n constructor(problems: Array<string>) {\n super(\n [\n 'Invalid `static visibility` rules:',\n ...problems.map(problem => ` - ${problem}`)\n ].join('\\n')\n );\n }\n}\n\n/**\n * Thrown while serving a request when a visibility rule does something other\n * than narrow its query with conditions. A programming error, so it surfaces\n * as a `500`.\n *\n * @internal\n */\nexport class VisibilityRuleError extends TypeError {\n constructor({ resourceName }: ModelClass, problem: string) {\n super(`The visibility rule for \"${resourceName}\" ${problem}`);\n }\n}\n", "import { CONDITIONS } from '../../database/query';\nimport { Query } from '../../database';\nimport type { Model, ModelClass } from '../../database';\nimport type { Request } from '../../server';\n\nimport { VisibilityRuleError } from './errors';\n\n/**\n * A namespace's visibility rules: per resource type, a function that narrows\n * a `Query` of that type to the rows the request may see.\n */\nexport type Visibility = Record<\n string,\n (query: Query<Array<Model>>, request: Request) => Query<Array<Model>>\n>;\n\n/**\n * Applies a namespace's visibility rules for one request. Every query Lumen\n * issues for the request \u2014 primary data, linkage, `included`, relationship\n * checks on writes \u2014 goes through `apply()`.\n *\n * @internal\n */\nexport class Scope {\n /**\n * Applies no rules. The default wherever no request is involved.\n */\n static readonly none = new Scope({}, null);\n\n declare private readonly rules: Visibility;\n\n declare private readonly request: Request | null;\n\n declare private readonly compiled: Map<ModelClass, Array<Array<unknown>>>;\n\n constructor(rules: Visibility, request: Request | null) {\n Object.assign(this, { rules, request, compiled: new Map() });\n }\n\n /**\n * Whether a rule narrows `model`.\n */\n covers(model: ModelClass): boolean {\n return typeof this.rules[model.resourceName] === 'function';\n }\n\n /**\n * Add the conditions of `query.model`'s rule, if it has one, to `query`.\n *\n * The conditions are added untagged, so `query.unscope()` cannot remove\n * them.\n */\n apply<Q extends Query<unknown>>(query: Q): Q {\n const conditions = this.conditionsFor(query.model);\n\n if (conditions.length) {\n query.snapshots.push(...conditions);\n }\n\n return query;\n }\n\n /**\n * Run `model`'s rule once per request against an empty probe query and keep\n * the conditions it adds. Only conditions are allowed: the same rule has to\n * hold for `count()`, for the narrow selects linkage is loaded with and for\n * existence checks, which a `select`, `order`, `limit`, `include` or join\n * would break.\n */\n private conditionsFor(model: ModelClass): Array<Array<unknown>> {\n const { rules, request, compiled } = this;\n let conditions = compiled.get(model);\n\n if (conditions) {\n return conditions;\n }\n\n const rule = rules[model.resourceName];\n\n if (typeof rule !== 'function') {\n conditions = [];\n } else {\n const result: unknown = rule(new Query(model), request as Request);\n\n // `Query` is a Promise, so test for it first: an `async` rule returns a\n // plain Promise, having already awaited \u2014 and so run \u2014 its query.\n if (!(result instanceof Query) || result.model !== model) {\n throw new VisibilityRuleError(\n model,\n 'must synchronously return the query it is given, narrowed. ' +\n 'Load anything it needs in a `beforeAction` hook instead.'\n );\n }\n\n const invalid = result.snapshots.find(([name]) => !CONDITIONS.has(name));\n\n if (invalid) {\n throw new VisibilityRuleError(\n model,\n `may only add conditions (where, not, whereBetween, whereRaw), ` +\n `not \\`${String(invalid[0])}\\`.`\n );\n }\n\n // Drop the scope name a model scope (`query.isPublic()`) tags its\n // conditions with, which is what `unscope()` matches on.\n conditions = result.snapshots.map(([name, params]) => [name, params]);\n }\n\n compiled.set(model, conditions);\n\n return conditions;\n }\n}\n\nconst scopes = new WeakMap<Request, Scope>();\n\n/**\n * The `Scope` of `request` under `rules`, created once per request so each\n * rule runs at most once however many queries it narrows.\n *\n * @internal\n */\nexport function scopeFor(rules: Visibility, request: Request): Scope {\n let scope = scopes.get(request);\n\n if (!scope) {\n scope = new Scope(rules, request);\n scopes.set(request, scope);\n }\n\n return scope;\n}\n", "import entries from '../../../utils/entries';\nimport { RelatedRecordNotFoundError } from '../errors';\nimport { Scope } from '../visibility';\nimport type { Model, ModelClass } from '../../database';\n\n/**\n * Check that every resource referenced from `data.relationships` exists, so a\n * write cannot leave dangling linkage, or link a record `scope` hides. One\n * query per relationship.\n *\n * @internal\n */\nexport default async function validateRelationships<T extends Model>(\n model: ModelClass<T>,\n relationships: Record<string, unknown> = {},\n scope: Scope = Scope.none\n): Promise<void> {\n await Promise.all(\n entries(relationships).map(async ([key, value]) => {\n const opts = model.relationshipFor(key);\n const { data = null } = (value as { data?: unknown } | null) || {};\n\n if (!opts || !data) {\n return;\n }\n\n const { model: related } = opts;\n const isMany = Array.isArray(data);\n const ids = (isMany ? data : [data]).map(item => Object(item).id);\n\n if (!ids.length) {\n return;\n }\n\n // An item without an id matches nothing and is reported below; knex\n // rejects `undefined` bindings outright. A record hidden from the\n // request by a visibility rule is reported the same way.\n const rows = await scope.apply(\n related.select(related.primaryKey).where({\n [related.primaryKey]: ids.filter(id => id != null)\n })\n );\n\n // Request ids may arrive as strings (to-many items) or numbers (to-one,\n // coerced by parameter validation); rows come back typed by the driver.\n const found = new Set(rows.map(row => String(row.getPrimaryKey())));\n const missing = ids.findIndex(id => !found.has(String(id)));\n\n if (missing >= 0) {\n const path = `data.relationships.${key}.data`;\n\n throw new RelatedRecordNotFoundError(\n related,\n ids[missing],\n isMany ? `${path}.${missing}` : path\n );\n }\n })\n );\n}\n", "import type { BuiltInAction } from './index';\n\nexport const BUILT_IN_ACTIONS: ReadonlyArray<BuiltInAction> = Object.freeze([\n 'show',\n 'index',\n 'create',\n 'update',\n 'destroy'\n]);\n\n/**\n * Settings a controller takes from its namespace's `ApplicationController`\n * (and that one from its parent namespace's) unless it sets them itself.\n */\nexport const NAMESPACE_SETTINGS = [\n 'rejectUnlistedAttributes',\n 'rejectUnlistedRelationships',\n 'maxIncludeDepth'\n] as const;\n", "import { posix } from 'path';\n\nimport { dasherize } from 'inflection';\n\nimport { VERSION } from '../jsonapi';\nimport { freezeProps } from '../freezeable';\nimport closestAncestor from '../loader/resolver/utils/closest-ancestor';\nimport type { BundleNamespace } from '../loader';\nimport underscore from '../../utils/underscore';\nimport { dasherizeKeys } from '../../utils/transform-keys';\nimport type { Model, ModelClass } from '../database';\nimport type {\n JsonApiDocument,\n JsonApiDocumentLinks,\n JsonApiResourceObject,\n JsonApiRelationshipObject,\n JsonApiRelationshipDocument\n} from '../jsonapi';\n\nimport type {\n SerializerFields,\n SerializerOptions,\n SerializerRouted\n} from './interfaces';\nimport { Scope } from '../controller/visibility';\nimport loadLinkage from './utils/load-linkage';\nimport type { Linkage } from './utils/load-linkage';\nimport { createIncludeTree } from './utils/include-tree';\nimport type { IncludeTree } from './utils/include-tree';\n\n/**\n * The base class of an app's serializers. A serializer lists what a\n * resource looks like in a JSON:API document: its `attributes`, and its\n * relationships in `hasOne` (to-one, whether the model's relationship is\n * `hasOne` or `belongsTo`) and `hasMany`.\n *\n * ```javascript\n * // app/serializers/posts.js\n * import { Serializer } from 'lumen-framework';\n *\n * class PostsSerializer extends Serializer {\n * attributes = ['title', 'body', 'createdAt'];\n * hasOne = ['user'];\n * hasMany = ['comments', 'tags'];\n * }\n *\n * export default PostsSerializer;\n * ```\n *\n * Lumen loads only the columns a serializer needs. The lists are also what\n * clients may ask for: `sort` and `filter` default to the attributes,\n * `include` accepts the relationships (nested up to the controller's\n * `maxIncludeDepth`), and `fields[posts]` may name any of them. Each included\n * resource is formatted by its own type's serializer.\n *\n * A namespace may have its own serializer for a type\n * (`app/serializers/admin/posts.js`), used for that type everywhere in the\n * namespace, included resources too; without one, the root serializer is used,\n * unless the namespace's `ApplicationController` sets `serializerFallback =\n * false`. See the\n * [serializers guide](https://github.com/nickschot/lux/blob/main/docs/guides/serializers.md).\n */\nclass Serializer<T extends Model> {\n /**\n * The to-one relationships to serialize \u2014 the model's `hasOne` and\n * `belongsTo` relationships alike.\n *\n * ```javascript\n * class PostsSerializer extends Serializer {\n * hasOne = ['user', 'image'];\n * }\n * ```\n */\n hasOne: Array<string> = [];\n\n /**\n * The to-many relationships to serialize.\n *\n * ```javascript\n * class PostsSerializer extends Serializer {\n * hasMany = ['comments', 'tags'];\n * }\n * ```\n */\n hasMany: Array<string> = [];\n\n /**\n * The model attributes to serialize, camelCase as on the model; documents\n * dasherize them (`createdAt` \u2192 `created-at`). Each must be a column of the\n * model's table: the app refuses to boot when one isn't (a getter, say).\n *\n * ```javascript\n * class PostsSerializer extends Serializer {\n * attributes = ['title', 'body', 'createdAt'];\n * }\n * ```\n */\n attributes: Array<string> = [];\n\n /**\n * The `hasMany` relationships to serialize as links only: without resource\n * linkage (`data`), so a resource with many related records stays small and\n * their ids are not loaded. Clients load them from the relationship's\n * `related` link when needed (ember-data does so for an async `hasMany`).\n *\n * ```javascript\n * class PostsSerializer extends Serializer {\n * hasMany = ['comments', 'tags'];\n *\n * linksOnly = ['comments'];\n * }\n * ```\n *\n * ```json\n * \"comments\": {\n * \"links\": {\n * \"self\": \"https://api.example.com/posts/1/relationships/comments\",\n * \"related\": \"https://api.example.com/posts/1/comments\"\n * }\n * }\n * ```\n *\n * A relationship a request includes (`?include=comments`) keeps its `data`,\n * since JSON:API requires every included resource to be linked from the\n * document. So does one without a related endpoint where it is serialized\n * (a namespace without a resource for the type), which would otherwise be\n * left with nothing to load it from.\n *\n * Each name must be in `hasMany`, and have a related endpoint in at least\n * one namespace that formats this type with this Serializer (the related\n * type's resource routing `index`, this type's routing `show`), or the\n * application refuses to boot.\n */\n linksOnly: Array<string> = [];\n\n /**\n * Allow `attributes`, `hasOne` or `hasMany` to name `type` or `id`.\n *\n * JSON:API forbids a field with either name: they share a namespace with\n * the resource's own `type` and `id`. By default the application refuses\n * to boot when a serializer lists one. Set this for a serializer whose\n * clients already rely on such a field; the application then boots with a\n * warning, and the field is sent as before:\n *\n * ```javascript\n * class ReactionsSerializer extends Serializer {\n * attributes = ['type', 'createdAt'];\n *\n * // `type` breaks JSON:API, but our clients read it.\n * allowReservedNames = true;\n * }\n * ```\n */\n allowReservedNames: boolean = false;\n\n /**\n * The resolved Model that a Serializer instance represents.\n *\n * @internal\n */\n declare model: ModelClass<T>;\n\n /**\n * A reference to the root Serializer for the namespace that a Serializer\n * instance is a member of.\n *\n * @internal\n */\n declare parent: Serializer<Model> | null;\n\n /**\n * The namespace that a Serializer instance is a member of.\n *\n * @internal\n */\n declare namespace: string;\n\n /**\n * Every Serializer of the application, keyed by namespaced path (`posts`,\n * `admin/posts`). Attached once all of them are built, and used by\n * `serializerFor()` to serialize related resources in this Serializer's\n * namespace.\n *\n * @internal\n */\n declare serializers?: BundleNamespace<Serializer<Model>>;\n\n constructor({ model, parent, namespace }: SerializerOptions<T>) {\n Object.assign(this, {\n model,\n parent,\n namespace\n });\n\n freezeProps(this, true, 'model', 'parent', 'namespace');\n }\n\n /**\n * Transform an array of Model instances or a single Model instance into a\n * [JSON API](http://jsonapi.org) document object.\n *\n *\n * @param options - An options object used for building the\n * returned [JSON API](http://jsonapi.org) document object.\n *\n * @param options.data - The Model instance or array of\n * Model instances to transform into the returned [JSON API](\n * http://jsonapi.org) document object.\n *\n * @param options.links - An object containing links to include in\n * the top level links object of the returned [JSON API](http://jsonapi.org)\n * document object.\n *\n * @param options.domain - A string used to build links included in\n * the resource and relationship objects in the returned [JSON API](\n * http://jsonapi.org) document object.\n *\n * @param options.include - An array of relationship paths (e.g.\n * `'comments'` or `'comments.user'`) whose resources should be added to the\n * top level included object of the returned [JSON API](http://jsonapi.org)\n * document object. Intermediate resources of a nested path are included too.\n *\n * @param options.fields - The request's sparse fieldsets, keyed by\n * type. Each narrows the attributes and relationships of every resource of\n * its type in the document; primary data was already loaded with its own.\n *\n * @param options.scope - The visibility rules of the request. Every\n * related record loaded for the document \u2014 its linkage and `included` \u2014 is\n * narrowed by them; primary data was already loaded through them.\n *\n * @param options.meta - Top level meta information of the returned\n * document (`{ total }` for a page of a collection), if any.\n *\n * @param options.namespace - The namespace of the request, i.e. of\n * the Controller handling it. Every link in the document is built in it, and\n * included resources are serialized by their Serializer in it (falling back\n * to the root). Defaults to this Serializer's namespace \u2014 which is the root\n * one when a namespaced Controller has no Serializer of its own, so the\n * Controller passes its namespace explicitly.\n *\n * @param options.routed - Whether the application serves a path\n * (`/posts/:dynamic/relationships/user`). A relationship is only given the\n * links of the endpoints it is served by, since JSON:API requires every\n * relationship `self` link to be served. Without it, none are.\n *\n * @returns Resolves with a [JSON API](http://jsonapi.org) document\n * object.\n *\n * @internal\n */\n async format({\n data,\n meta,\n links,\n domain,\n include,\n fields = {},\n scope = Scope.none,\n namespace = this.namespace,\n routed = notRouted\n }: {\n data: T | Array<T>;\n meta?: JsonApiDocument['meta'];\n links: JsonApiDocumentLinks;\n domain: string;\n include: Array<string>;\n fields?: SerializerFields;\n scope?: Scope;\n namespace?: string;\n routed?: SerializerRouted;\n }): Promise<JsonApiDocument> {\n const tree = createIncludeTree(include);\n const included = new Map<string, JsonApiResourceObject>();\n const records = Array.isArray(data) ? data : [data];\n const names = [...this.hasOne, ...this.hasMany];\n const linksOnly = this.linksOnlyFor(tree, namespace, routed);\n\n // Primary data takes the same path as every include level: its linkage\n // is batch-loaded per relationship, then `included` is built from it.\n const linkage = await loadLinkage(\n this.model,\n records,\n linkedNames(names, fields[this.model.resourceName], tree).filter(\n name => !linksOnly.has(name)\n ),\n scope\n );\n const primary = await Promise.all(\n records.map(item =>\n this.formatOne({\n item,\n domain,\n fields,\n routed,\n linksOnly,\n namespace,\n linkage: linkage.get(String(item.getPrimaryKey())),\n links: Array.isArray(data) ? undefined : false\n })\n )\n );\n\n await this.includeRelated({\n tree,\n names,\n scope,\n domain,\n linkage,\n fields,\n routed,\n included,\n namespace,\n model: this.model\n });\n\n let serialized: Record<string, unknown> = {\n data: Array.isArray(data) ? primary : primary[0]\n };\n\n // A compound document must not repeat a primary resource in `included`.\n primary.forEach(resource => {\n included.delete(resourceKey(resource));\n });\n\n if (included.size) {\n serialized = {\n ...serialized,\n included: Array.from(included.values())\n };\n }\n\n // The document is assembled from dynamic model data; its pieces are typed\n // structurally above, so assert the fully-built JSON:API shape here.\n return {\n ...serialized,\n ...(meta && { meta }),\n links,\n\n jsonapi: {\n version: VERSION\n }\n } as JsonApiDocument;\n }\n\n /**\n * Transform a single Model instance into a [JSON API](http://jsonapi.org)\n * resource object. Its attributes are the ones loaded on `item`, declared by\n * this Serializer and kept by the request's fieldset for its type; its\n * relationships, those declared and kept, are built from `linkage`,\n * batch-loaded by `loadLinkage()`, without touching the database.\n *\n *\n * @param options - An options object used for building the returned\n * [JSON API](http://jsonapi.org) resource object.\n *\n * @param options.item - The Model instance to transform into the\n * returned [JSON API](http://jsonapi.org) resource object.\n *\n * @param options.links - An object containing links to include in\n * the top level links object of the returned [JSON API](http://jsonapi.org)\n * resource object.\n *\n * @param options.domain - A string used to build links included in\n * the top level links object or relationship links objects in the returned\n * [JSON API](http://jsonapi.org) resource object.\n *\n * @param options.linkage - The resource linkage (related primary\n * keys per relationship key) to serialize relationships from.\n *\n * @param options.fields - The request's sparse fieldsets, keyed by\n * type. Only the one for this resource's type applies.\n *\n * @param options.namespace - The namespace to build links in.\n * Defaults to this Serializer's; included resources pass the namespace of\n * the request, so every link in a document points into the same namespace.\n *\n * @param options.routed - Whether the application serves a path;\n * see `format()`.\n *\n * @param options.linksOnly - The relationships to serialize without\n * resource linkage; see `linksOnlyFor()`.\n *\n * @returns Resolves with a [JSON API](http://jsonapi.org) resource\n * object.\n *\n * @internal\n */\n async formatOne({\n item,\n links,\n domain,\n linkage = {},\n fields = {},\n namespace = this.namespace,\n routed = notRouted,\n linksOnly = new Set()\n }: {\n item: T;\n links?: boolean;\n domain: string;\n linkage?: Linkage;\n fields?: SerializerFields;\n namespace?: string;\n routed?: SerializerRouted;\n linksOnly?: Set<string>;\n }): Promise<JsonApiResourceObject> {\n const { resourceName: type } = item;\n const id = String(item.getPrimaryKey());\n const fieldset = fields[type];\n const keep = (name: string) => !fieldset || fieldset.includes(name);\n const names = [...this.hasOne, ...this.hasMany].filter(keep);\n\n const attributes = dasherizeKeys(\n item.getAttributes(\n ...Object.keys(item.rawColumnData).filter(\n key => this.attributes.includes(key) && keep(key)\n )\n )\n );\n\n const serialized: JsonApiResourceObject = {\n id,\n type,\n attributes: attributes as JsonApiResourceObject['attributes']\n };\n\n const relationships = names.reduce<\n Record<string, JsonApiRelationshipObject>\n >(\n (hash, name) => ({\n ...hash,\n [dasherize(underscore(name))]: {\n ...(!linksOnly.has(name) &&\n this.formatLinkage(\n this.model.relationshipFor(name)?.model.resourceName,\n linkage[name]\n )),\n ...this.relationshipLinksFor({\n name,\n type,\n id,\n domain,\n routed,\n namespace\n })\n }\n }),\n {}\n );\n\n if (Object.keys(relationships).length) {\n serialized.relationships = relationships;\n }\n\n if (links || typeof links !== 'boolean') {\n serialized.links = {\n self: this.linkFor(domain, type, id, namespace)\n };\n }\n\n return serialized;\n }\n\n /**\n * The document a relationship endpoint (`/posts/1/relationships/user`)\n * responds with: the relationship of `item` named `name` as resource\n * linkage, narrowed by `scope` like any other linkage, and its links.\n *\n * @internal\n */\n async formatRelationship({\n item,\n name,\n domain,\n scope = Scope.none,\n namespace = this.namespace,\n routed = notRouted\n }: {\n item: T;\n name: string;\n domain: string;\n scope?: Scope;\n namespace?: string;\n routed?: SerializerRouted;\n }): Promise<JsonApiRelationshipDocument> {\n const id = String(item.getPrimaryKey());\n const linkage = await loadLinkage(this.model, [item], [name], scope);\n const { links = {} } = this.relationshipLinksFor({\n id,\n name,\n domain,\n routed,\n namespace,\n type: item.resourceName\n });\n\n return {\n ...this.formatLinkage(\n this.model.relationshipFor(name)?.model.resourceName,\n linkage.get(id)?.[name]\n ),\n links,\n jsonapi: {\n version: VERSION\n }\n };\n }\n\n /**\n * The relationships of `linksOnly` to serialize without resource linkage at\n * one level of a document, whose include tree is `tree`: those not included\n * there (an included resource must be linked from the document) and with a\n * related endpoint in `namespace` to load them from.\n *\n * @internal\n */\n linksOnlyFor(\n tree: IncludeTree,\n namespace: string,\n routed: SerializerRouted\n ): Set<string> {\n const route = this.pathFor(this.model.resourceName, ':dynamic', namespace);\n\n return new Set(\n this.linksOnly.filter(\n name =>\n !tree.has(name) && routed(`${route}/${dasherize(underscore(name))}`)\n )\n );\n }\n\n /**\n * The `links` of the relationship `name` of the resource `type`/`id`: a\n * `self` link to its relationship endpoint (`/posts/1/relationships/user`)\n * and a `related` link to its related endpoint (`/posts/1/user`), each when\n * the application serves it in `namespace` (JSON:API requires every\n * relationship `self` link to be served). Without either the relationship\n * has no links.\n *\n * A related resource's own URL (`/users/2`) is never a relationship's\n * `related` link: that link must not change when the relationship's content\n * does.\n *\n * @internal\n */\n relationshipLinksFor({\n id,\n type,\n name,\n domain,\n routed,\n namespace\n }: {\n id: string;\n type: string;\n name: string;\n domain: string;\n routed: SerializerRouted;\n namespace: string;\n }): Pick<JsonApiRelationshipObject, 'links'> {\n const segment = dasherize(underscore(name));\n const route = this.pathFor(type, ':dynamic', namespace);\n const base = domain + this.pathFor(type, id, namespace);\n const links: NonNullable<JsonApiRelationshipObject['links']> = {};\n\n if (routed(`${route}/relationships/${segment}`)) {\n links.self = `${base}/relationships/${segment}`;\n }\n\n if (routed(`${route}/${segment}`)) {\n links.related = `${base}/${segment}`;\n }\n\n return Object.keys(links).length ? { links } : {};\n }\n\n /**\n * Build a [JSON API](http://jsonapi.org) relationship object from resource\n * linkage: `{ data }`, where `data` is an identifier (or `null`) for a\n * to-one relationship and an array of them for a to-many one. Its links\n * come from `relationshipLinksFor()`.\n *\n * @internal\n */\n formatLinkage(\n type: string | undefined,\n linkage: Array<string> | string | null | undefined\n ): JsonApiRelationshipObject {\n if (Array.isArray(linkage)) {\n return {\n data: type ? linkage.map(id => ({ id, type })) : []\n };\n }\n\n if (linkage == null || !type) {\n return {\n data: null\n };\n }\n\n return {\n data: {\n id: linkage,\n type\n }\n };\n }\n\n /**\n * Add `records` (instances of `model`) to `included` as resource objects,\n * then recurse into the relationships named in `tree`. Each is serialized by\n * `model`'s Serializer in this Serializer's namespace (`serializerFor()`), so\n * `/admin/posts?include=comments` uses `AdminCommentsSerializer` when there\n * is one and `CommentsSerializer` otherwise. The relationships of every level\n * are batch-loaded with one query per relationship, not one per record.\n *\n * @internal\n */\n async addIncluded({\n model,\n records,\n tree,\n scope,\n domain,\n fields,\n routed,\n included,\n namespace\n }: {\n model: ModelClass;\n records: Array<Model>;\n tree: IncludeTree;\n scope: Scope;\n domain: string;\n fields: SerializerFields;\n routed: SerializerRouted;\n included: Map<string, JsonApiResourceObject>;\n namespace: string;\n }): Promise<void> {\n // Resolved in the request's namespace at every level \u2014 never in that of\n // whichever (possibly root, fallback) Serializer serialized the parent.\n const serializer = this.serializerFor(model, namespace);\n const unique = Array.from(\n new Map(records.map(record => [record.getPrimaryKey(), record])).values()\n );\n\n if (!unique.length) {\n return;\n }\n\n const names = [...serializer.hasOne, ...serializer.hasMany];\n const linksOnly = serializer.linksOnlyFor(tree, namespace, routed);\n const linkage = await loadLinkage(\n model,\n unique,\n linkedNames(names, fields[model.resourceName], tree).filter(\n name => !linksOnly.has(name)\n ),\n scope\n );\n\n for (const item of unique) {\n const id = String(item.getPrimaryKey());\n const key = resourceKey({ id, type: item.resourceName });\n\n // Reached through more than one path: the first serialization wins, the\n // linkage is identical either way.\n if (!included.has(key)) {\n included.set(\n key,\n await serializer.formatOne({\n item,\n domain,\n fields,\n routed,\n linksOnly,\n linkage: linkage.get(id),\n namespace\n })\n );\n }\n }\n\n await this.includeRelated({\n tree,\n names,\n model,\n scope,\n domain,\n fields,\n routed,\n linkage,\n included,\n namespace\n });\n }\n\n /**\n * Load the records `linkage` points to through each relationship named in\n * `tree` \u2014 one query per relationship, selecting the attributes their\n * Serializer (narrowed by the request's `fields[type]`) will serialize \u2014\n * and add them to `included` with `addIncluded()`. Only the relationships in\n * `names`, those the parent's Serializer exposes, are followed. The tree is\n * walked in request order, so `included` is deterministic.\n *\n * @internal\n */\n async includeRelated({\n model,\n names,\n linkage,\n tree,\n scope,\n domain,\n fields,\n routed,\n included,\n namespace\n }: {\n model: ModelClass;\n names: Array<string>;\n linkage: Map<string, Linkage>;\n tree: IncludeTree;\n scope: Scope;\n domain: string;\n fields: SerializerFields;\n routed: SerializerRouted;\n included: Map<string, JsonApiResourceObject>;\n namespace: string;\n }): Promise<void> {\n for (const [name, children] of tree) {\n const opts = model.relationshipFor(name);\n\n if (!opts || !names.includes(name)) {\n continue;\n }\n\n const { model: next } = opts;\n const ids = new Set<string>();\n\n linkage.forEach(({ [name]: value }) => {\n (Array.isArray(value) ? value : [value]).forEach(relatedId => {\n if (relatedId != null) {\n ids.add(relatedId);\n }\n });\n });\n\n if (ids.size) {\n // The linkage is already narrowed; applying the rules again costs\n // nothing and keeps a hidden record out even if it were not.\n const records = await scope.apply(\n next\n .select(\n next.primaryKey,\n ...this.attributesFor(next, namespace, fields)\n )\n .where({ [next.primaryKey]: Array.from(ids) })\n );\n\n await this.addIncluded({\n scope,\n domain,\n fields,\n routed,\n records,\n included,\n namespace,\n model: next,\n tree: children\n });\n }\n }\n }\n\n /**\n * The attributes to load for included resources of `model`: those its\n * Serializer in `namespace` declares, narrowed to the request's\n * `fields[type]` when there is one \u2014 possibly to none.\n *\n * @internal\n */\n attributesFor(\n model: ModelClass,\n namespace: string,\n fields: SerializerFields\n ): Array<string> {\n const attributes = this.serializerFor(model, namespace).attributes.filter(\n attr => model.attributeNames.includes(attr)\n );\n const fieldset = fields[model.resourceName];\n\n return fieldset\n ? attributes.filter(attr => fieldset.includes(attr))\n : attributes;\n }\n\n /**\n * Resolve the Serializer for `model` in `namespace` (this Serializer's by\n * default), the way a namespaced Controller resolves its own:\n * `admin/comments` if it exists, otherwise the closest ancestor namespace's,\n * down to the root `comments` Serializer. Falls back to `model.serializer`\n * when this Serializer was not created by an application (e.g. in\n * isolation).\n *\n * Pass the request's namespace when there is one: a Serializer's own\n * namespace is the root one whenever it is a namespaced Controller's\n * fallback.\n *\n * @internal\n */\n serializerFor(\n model: ModelClass,\n namespace: string = this.namespace\n ): Serializer<Model> {\n const { serializers } = this;\n\n if (serializers) {\n const key = posix.join(namespace || '.', model.resourceName);\n const serializer =\n serializers.get(key) || closestAncestor(serializers, key);\n\n if (serializer) {\n return serializer;\n }\n }\n\n return model.serializer;\n }\n\n /** @internal */\n linkFor(\n domain: string,\n type: string,\n id: string,\n namespace: string = this.namespace\n ): string {\n return domain + this.pathFor(type, id, namespace);\n }\n\n /**\n * The path of the resource `type`/`id` in `namespace`.\n *\n * @internal\n */\n pathFor(type: string, id: string, namespace: string = this.namespace) {\n return namespace ? `/${namespace}/${type}/${id}` : `/${type}/${id}`;\n }\n}\n\n/** @internal */\nfunction notRouted(): boolean {\n return false;\n}\n\n/** @internal */\nfunction resourceKey({ id, type }: { id: string; type: string }): string {\n return `${type}:${id}`;\n}\n\n/**\n * The relationships of `names` whose linkage a document needs: those the\n * type's fieldset keeps (all of them without one), and those `include`\n * follows \u2014 which may be left out of the fieldset and still be included.\n *\n * @internal\n */\nfunction linkedNames(\n names: Array<string>,\n fieldset: Array<string> | undefined,\n tree: IncludeTree\n): Array<string> {\n return names.filter(\n name => !fieldset || fieldset.includes(name) || tree.has(name)\n );\n}\n\nexport default Serializer;\n\nexport type { SerializerOptions } from './interfaces';\n", "import { posix } from 'path';\n\nimport type { BundleNamespace } from '../../index';\n\nexport default function closestAncestor<T>(\n source: BundleNamespace<T>,\n key: string\n): T | undefined {\n const name = posix.basename(key);\n let namespace = posix.dirname(key);\n\n if (namespace === '.') {\n return source.get(name);\n }\n\n namespace = posix.dirname(namespace);\n\n const ancestor = source.get(posix.join(namespace, name));\n\n if (ancestor) {\n return ancestor;\n }\n\n return closestAncestor(source, posix.join(posix.dirname(namespace), name));\n}\n", "import { camelize } from 'inflection';\n\nimport { Scope } from '../../controller/visibility';\nimport { readAttribute } from '../../database';\nimport type { Model, ModelClass } from '../../database';\n\n/**\n * The resource linkage of one record: the primary key(s) of the records each\n * named relationship points to \u2014 an array for has-many, otherwise a single id\n * or `null`.\n *\n * @internal\n */\nexport type Linkage = Record<string, Array<string> | string | null>;\n\nconst toId = (value: unknown): string | null =>\n value == null ? null : String(value);\n\n/**\n * Batch-load the resource linkage of the relationships `names` for every one of\n * `records` (all instances of `model`), keyed by each record's primary key.\n *\n * This is what lets included resources carry `relationships` without an N+1:\n * it issues at most one query per relationship \u2014 and a single query for all\n * belongs-to relationships, whose foreign keys live on `model` itself \u2014 however\n * many records there are. The queries mirror the lazy relationship getters in\n * `database/relationship/utils/getters.ts`, which remain the source of truth.\n *\n * `scope` hides related records from the linkage: has-one and has-many queries\n * are narrowed by it directly; belongs-to and has-many-through linkage \u2014 read\n * from foreign keys, not from the related table \u2014 is checked against it\n * afterwards (`dropHidden()`).\n *\n * @internal\n */\nexport default async function loadLinkage(\n model: ModelClass,\n records: Array<Model>,\n names: Array<string>,\n scope: Scope = Scope.none\n): Promise<Map<string, Linkage>> {\n const ids = Array.from(\n new Set(records.map(record => record.getPrimaryKey()))\n );\n const linkage = new Map<string, Linkage>();\n // Linkage read from foreign keys, to check against the related table.\n const unchecked: Array<[string, ModelClass]> = [];\n const belongsTo: Array<[string, string]> = [];\n const queries: Array<Promise<void>> = [];\n\n ids.forEach(id => {\n linkage.set(\n String(id),\n names.reduce<Linkage>((result, name) => {\n const opts = model.relationshipFor(name);\n\n result[name] = opts && opts.type === 'hasMany' ? [] : null;\n return result;\n }, {})\n );\n });\n\n if (!ids.length) {\n return linkage;\n }\n\n // Append `relatedId` to the linkage of the owner identified by `ownerId`.\n const link = (ownerId: unknown, name: string, relatedId: unknown) => {\n const owner = linkage.get(String(ownerId));\n const id = toId(relatedId);\n\n if (!owner || id === null) {\n return;\n }\n\n const current = owner[name];\n\n if (Array.isArray(current)) {\n // A join model can hold the same pair twice; like the getters (which\n // query `WHERE id IN (...)`), each related record is linked once.\n if (!current.includes(id)) {\n current.push(id);\n }\n } else if (current === null) {\n // has-one: like `getHasOne()`, the lowest primary key wins.\n owner[name] = id;\n }\n };\n\n names.forEach(name => {\n const opts = model.relationshipFor(name);\n\n if (!opts) {\n return;\n }\n\n const { type, through, model: related } = opts;\n const foreignKey = camelize(opts.foreignKey, true);\n\n if (type === 'belongsTo') {\n belongsTo.push([name, foreignKey]);\n unchecked.push([name, related]);\n } else if (through) {\n // Mirrors `getHasManyThrough()`: the join model holds a key pointing at\n // the owner (`foreignKey`) and one pointing at the related record (the\n // inverse relationship's foreign key).\n const inverse = related.relationshipFor(opts.inverse);\n\n if (!inverse) {\n return;\n }\n\n const relatedKey = camelize(inverse.foreignKey, true);\n\n // A join row is not the related record: the ids it holds are checked\n // against the related table when a rule could hide some of them.\n if (scope.covers(related)) {\n unchecked.push([name, related]);\n }\n\n queries.push(\n (async () => {\n const rows = await through\n .select(foreignKey, relatedKey)\n .where({ [foreignKey]: ids });\n\n rows.forEach(row => {\n link(\n readAttribute(row, foreignKey),\n name,\n readAttribute(row, relatedKey)\n );\n });\n })()\n );\n } else {\n // has-one and has-many: the foreign key lives on the related model.\n queries.push(\n (async () => {\n const rows = await scope.apply(\n related\n .select(related.primaryKey, foreignKey)\n .where({ [foreignKey]: ids })\n .order(related.primaryKey, 'ASC')\n );\n\n rows.forEach(row => {\n link(readAttribute(row, foreignKey), name, row.getPrimaryKey());\n });\n })()\n );\n }\n });\n\n if (belongsTo.length) {\n queries.push(\n (async () => {\n const rows = await model\n .select(model.primaryKey, ...belongsTo.map(([, key]) => key))\n .where({ [model.primaryKey]: ids });\n\n rows.forEach(row => {\n belongsTo.forEach(([name, key]) => {\n link(row.getPrimaryKey(), name, readAttribute(row, key));\n });\n });\n })()\n );\n }\n\n await Promise.all(queries);\n await dropHidden(linkage, unchecked, scope);\n\n return linkage;\n}\n\n/**\n * Linkage read from foreign keys can point at records the request must not\n * see: a foreign key can outlive the record it points to (no FK constraint,\n * or a row deleted out from under it), and `scope` can hide it. Unlink those \u2014\n * a to-one becomes `null` like the primary query's join made it, a to-many\n * drops the id \u2014 rather than link a resource that is not there. One query per\n * distinct related model.\n *\n * @internal\n */\nasync function dropHidden(\n linkage: Map<string, Linkage>,\n unchecked: Array<[string, ModelClass]>,\n scope: Scope\n): Promise<void> {\n const wanted = new Map<ModelClass, Set<string>>();\n\n unchecked.forEach(([name, related]) => {\n const ids = wanted.get(related) || new Set<string>();\n\n linkage.forEach(({ [name]: value }) => {\n (Array.isArray(value) ? value : [value]).forEach(id => {\n if (typeof id === 'string') {\n ids.add(id);\n }\n });\n });\n\n wanted.set(related, ids);\n });\n\n const existing = new Map<ModelClass, Set<string>>();\n\n await Promise.all(\n Array.from(wanted, async ([related, ids]) => {\n if (!ids.size) {\n existing.set(related, ids);\n return;\n }\n\n const rows = await scope.apply(\n related\n .select(related.primaryKey)\n .where({ [related.primaryKey]: Array.from(ids) })\n );\n\n existing.set(\n related,\n new Set(rows.map(row => String(row.getPrimaryKey())))\n );\n })\n );\n\n unchecked.forEach(([name, related]) => {\n const found = existing.get(related);\n\n linkage.forEach(owner => {\n const value = owner[name];\n\n if (Array.isArray(value)) {\n owner[name] = value.filter(id => found?.has(id));\n } else if (typeof value === 'string' && !found?.has(value)) {\n owner[name] = null;\n }\n });\n });\n}\n", "import type { Model, ModelClass } from '../../database';\nimport type Serializer from '../index';\n\n/**\n * A parsed `include` parameter: each relationship name maps to the tree of\n * relationships to include from the records it points to.\n *\n * @internal\n */\nexport type IncludeTree = Map<string, IncludeTree>;\n\n/**\n * Parse relationship paths (`['comments', 'comments.user', 'user']`) into an\n * include tree. Every prefix of a path is part of the tree, because JSON:API\n * requires the intermediate resources of a multi-part path to be included\n * along with its leaves (`comments.user` includes the comments too).\n *\n * @internal\n */\nexport function createIncludeTree(paths: Array<string> = []): IncludeTree {\n const tree: IncludeTree = new Map();\n\n paths.forEach(path => {\n path\n .split('.')\n .filter(Boolean)\n .reduce((node, name) => {\n let child = node.get(name);\n\n if (!child) {\n child = new Map();\n node.set(name, child);\n }\n\n return child;\n }, tree);\n });\n\n return tree;\n}\n\n/**\n * Enumerate every include path available from `names` (relationships of\n * `model`), down to `depth` levels. Each level continues with the relationships\n * declared by the related model's serializer as `serializerFor` resolves it \u2014\n * the same one its included resources are serialized with (namespaced, with a\n * fallback to the root). Used to build the allowed values of the `include`\n * parameter.\n *\n * @internal\n */\nexport function enumerateIncludePaths(\n model: ModelClass,\n names: Array<string>,\n depth: number,\n serializerFor: (\n model: ModelClass\n ) => Serializer<Model> | undefined = related => related.serializer\n): Array<string> {\n if (depth < 1) {\n return [];\n }\n\n return names.reduce<Array<string>>((paths, name) => {\n const opts = model.relationshipFor(name);\n\n if (!opts) {\n return paths;\n }\n\n const { model: related } = opts;\n const serializer = serializerFor(related);\n\n if (!serializer) {\n return [...paths, name];\n }\n\n const { hasOne, hasMany } = serializer;\n\n return [\n ...paths,\n name,\n ...enumerateIncludePaths(\n related,\n [...hasOne, ...hasMany],\n depth - 1,\n serializerFor\n ).map(path => `${name}.${path}`)\n ];\n }, []);\n}\n\n/**\n * Every resource type a response can contain, with the Serializer each is\n * serialized by: `model` itself (`serializer`), and every type reachable\n * through `include` from it down to `depth` levels \u2014 direct relationships\n * always, as with `include`. Used to build the allowed `fields[TYPE]`.\n *\n * @internal\n */\nexport function enumerateIncludeTypes(\n model: ModelClass,\n serializer: Serializer<Model>,\n depth: number,\n serializerFor: (\n model: ModelClass\n ) => Serializer<Model> | undefined = related => related.serializer\n): Map<string, Serializer<Model>> {\n const types = new Map([[model.resourceName, serializer]]);\n let level: Array<[ModelClass, Serializer<Model>]> = [[model, serializer]];\n\n for (let current = 0; current < Math.max(depth, 1); current += 1) {\n const next: typeof level = [];\n\n level.forEach(([parent, parentSerializer]) => {\n [...parentSerializer.hasOne, ...parentSerializer.hasMany].forEach(\n name => {\n const opts = parent.relationshipFor(name);\n const related = opts && serializerFor(opts.model);\n\n if (opts && related && !types.has(opts.model.resourceName)) {\n types.set(opts.model.resourceName, related);\n next.push([opts.model, related]);\n }\n }\n );\n });\n\n level = next;\n }\n\n return types;\n}\n", "import { NODE_ENV } from '../../constants';\n\nimport type { Config } from './interfaces';\n\nexport function createDefaultConfig(): Config {\n const isTestENV = NODE_ENV === 'test';\n const isProdENV = NODE_ENV === 'production';\n\n return {\n server: {\n cors: {\n enabled: false\n },\n trustProxy: false\n },\n logging: {\n level: isProdENV ? 'INFO' : 'DEBUG',\n format: isProdENV ? 'json' : 'text',\n enabled: !isTestENV,\n requestBody: !isProdENV,\n\n filter: {\n params: []\n }\n }\n };\n}\n\nexport type { Config } from './interfaces';\n", "import cluster from 'cluster';\n\nimport { LUMEN_CONSOLE } from '../../constants';\nimport Database from '../database';\nimport Logger from '../logger';\nimport Router from '../router';\nimport Server from '../server';\nimport { build, createLoader, closestChild } from '../loader';\nimport { freezeProps, deepFreezeProps } from '../freezeable';\nimport ControllerMissingError from '../../errors/controller-missing-error';\n\nimport normalizePort from './utils/normalize-port';\nimport createController from './utils/create-controller';\nimport createSerializer from './utils/create-serializer';\nimport validateNamespacedSerializers from './utils/validate-namespaced-serializers';\nimport validateLinksOnly from './utils/validate-links-only';\nimport validateAttributes from './utils/validate-attributes';\nimport validateReservedNames from './utils/validate-reserved-names';\nimport resolveVisibility from './utils/resolve-visibility';\nimport restrictOpenNamespaces from './utils/restrict-open-namespaces';\nimport warnQueryParamNames from './utils/warn-query-param-names';\n\nimport type Controller from '../controller';\nimport type Serializer from '../serializer';\nimport type { Model, ModelClass } from '../database';\nimport type Application from './index';\nimport type { ApplicationOptions } from './index';\n\n/**\n * In a `lumen serve` worker: close the application gracefully, then exit,\n * when the master asks (`'shutdown'`), when it goes away, or on `SIGTERM` /\n * `SIGINT` \u2014 platforms may signal every process, and Ctrl-C signals the whole\n * process group.\n */\nfunction handleShutdown(app: Application, logger: Logger): void {\n let closing = false;\n\n const stop = () => {\n if (closing) {\n return;\n }\n\n closing = true;\n\n app.close().then(\n () => process.exit(0),\n (err: unknown) => {\n logger.error(err instanceof Error ? err : String(err));\n process.exit(1);\n }\n );\n };\n\n process.on('message', message => {\n if (message === 'shutdown') {\n stop();\n }\n });\n\n process.once('disconnect', stop);\n process.once('SIGTERM', stop);\n process.once('SIGINT', stop);\n}\n\n/** @internal */\nexport default async function initialize<T extends Application>(\n app: T,\n { path, port, logging, database, server: serverConfig }: ApplicationOptions\n): Promise<T> {\n const load = createLoader(path);\n const routes = load('routes');\n const models = load('models');\n const logger = new Logger(logging);\n const normalizedPort = normalizePort(port);\n\n const store = await new Database({\n path,\n models,\n logger,\n config: database,\n checkMigrations: true\n });\n\n const serializers = build<Serializer<Model>>(\n load('serializers'),\n (key, value, parent) =>\n createSerializer(value, {\n key,\n store,\n parent\n })\n );\n\n // Lets a Serializer resolve related resources' Serializers in its own\n // namespace (`Serializer#serializerFor()`), as Controllers do.\n serializers.forEach((serializer: Serializer<Model>) => {\n Object.defineProperty(serializer, 'serializers', {\n value: serializers,\n writable: false,\n enumerable: false,\n configurable: false\n });\n });\n\n models.forEach((model: ModelClass) => {\n Object.defineProperty(model, 'serializer', {\n value: closestChild(serializers, model.resourceName),\n writable: false,\n enumerable: false,\n configurable: false\n });\n });\n\n const controllers = build<Controller>(\n load('controllers'),\n (key, value, parent) =>\n createController(value, {\n key,\n store,\n parent,\n serializers\n })\n );\n\n controllers.forEach((controller: Controller) => {\n Object.defineProperty(controller, 'controllers', {\n value: controllers,\n writable: true,\n enumerable: false,\n configurable: false\n });\n });\n\n validateAttributes(controllers, serializers);\n validateReservedNames(serializers, logger);\n resolveVisibility(controllers, store.models.values());\n // Before the serializers are checked: it lowers `maxIncludeDepth`, which\n // decides how many of them a namespace needs.\n restrictOpenNamespaces(controllers, logger);\n validateNamespacedSerializers(controllers, serializers);\n warnQueryParamNames(controllers, logger);\n\n const ApplicationController = controllers.get('application');\n\n if (!ApplicationController) {\n throw new ControllerMissingError('application');\n }\n\n const router = new Router({\n routes,\n controllers,\n controller: ApplicationController\n });\n\n // Against the routes as built: only a served related endpoint lets a\n // relationship be left without its linkage.\n validateLinksOnly(router, serializers);\n\n const server = new Server({\n router,\n logger,\n ...serverConfig\n });\n\n if (!LUMEN_CONSOLE) {\n if (cluster.isWorker) {\n handleShutdown(app, logger);\n }\n\n server.instance.listen(normalizedPort).once('listening', () => {\n if (typeof process.send === 'function') {\n process.send('ready');\n } else {\n // 'ready' is a custom lifecycle event, not one of Process's typed\n // emit overloads.\n (process as NodeJS.EventEmitter).emit('ready');\n }\n });\n }\n\n Object.assign(app, {\n logger,\n models,\n controllers,\n serializers\n });\n\n deepFreezeProps(app, true, 'logger', 'models', 'controllers', 'serializers');\n\n Object.assign(app, {\n path,\n store,\n router,\n server,\n port: normalizedPort\n });\n\n freezeProps(app, false, 'path', 'port', 'store', 'router', 'server');\n\n Object.freeze(app);\n\n return app;\n}\n", "/** @internal */\nexport default function normalizeName(str: string): string {\n let name = str;\n\n if (name.startsWith('/')) {\n name = name.substr(1);\n }\n\n if (name.endsWith('/')) {\n name = name.substr(0, name.length - 1);\n }\n\n return name;\n}\n", "/** @internal */\nexport default function normalizePath(str: string): string {\n let path = str;\n\n if (!path.startsWith('/')) {\n path = `/${path}`;\n }\n\n if (path.endsWith('/')) {\n path = path.substr(0, path.length - 1);\n }\n\n return path;\n}\n", "import { FreezeableSet, freezeProps } from '../../freezeable';\nimport type Controller from '../../controller';\nimport type { Route, RouterNamespace } from '../index';\n\nimport normalizeName from './utils/normalize-name';\nimport normalizePath from './utils/normalize-path';\nimport type { NamespaceOptions } from './interfaces';\n\n/** @internal */\nclass Namespace extends FreezeableSet<Route | RouterNamespace> {\n declare name: string;\n\n declare path: string;\n\n declare isRoot: boolean;\n\n declare namespace: RouterNamespace;\n\n declare controller: Controller;\n\n declare controllers: Map<string, Controller>;\n\n constructor({\n name,\n path,\n namespace,\n controller,\n controllers\n }: NamespaceOptions) {\n super();\n\n Object.assign(this, {\n controller,\n controllers,\n name: normalizeName(name),\n path: normalizePath(path),\n isRoot: path === '/',\n namespace: namespace || this\n });\n\n freezeProps(this, true, 'name', 'path', 'controller', 'namespace');\n\n freezeProps(this, false, 'isRoot', 'controllers');\n }\n}\n\nexport default Namespace;\n\nexport { default as normalizeName } from './utils/normalize-name';\nexport { default as normalizePath } from './utils/normalize-path';\n\nexport type { NamespaceOptions } from './interfaces';\n", "import type { RequestParams } from '../../../../server';\nimport type { JsonApiDocumentLinks } from '../../../../jsonapi';\n\nconst PAGE_NUMBER = 'page[number]';\n\n/**\n * Percent-encode a query string component, leaving commas \u2014 which separate\n * list values (`include=user,comments`) and are allowed in a query \u2014 as is.\n *\n * @internal\n */\nfunction encode(value: string): string {\n return encodeURIComponent(value).replace(/%2C/gi, ',');\n}\n\n/**\n * A link to `pathname` with the query `pairs`, each key and value\n * percent-encoded, so it is a valid URI however the client spelled the\n * request (`fields[users]` becomes `fields%5Busers%5D`).\n *\n * @internal\n */\nfunction linkTo(\n baseURL: string,\n pairs: Array<[string, string] | Array<string>>\n): string {\n if (!pairs.length) {\n return baseURL;\n }\n\n return `${baseURL}?${pairs\n .map(([key, value]) => `${encode(key)}=${encode(value)}`)\n .join('&')}`;\n}\n\n/**\n * The link to the request itself: its path and its query as the client wrote\n * it (member names, order, values), encoded like page links.\n *\n * @internal\n */\nexport function createSelfLink({\n search,\n domain,\n pathname\n}: {\n search: string;\n domain: string;\n pathname: string;\n}): string {\n return linkTo(\n `${domain}${pathname}`,\n Array.from(new URLSearchParams(search))\n );\n}\n\nfunction createLinkTemplate({\n search,\n domain,\n pathname\n}: {\n search: string;\n domain: string;\n pathname: string;\n}) {\n const baseURL = `${domain}${pathname}`;\n\n // The request's own query, as the client wrote it (member names, order,\n // values), so links round-trip exactly; only the page number varies.\n const query = Array.from(new URLSearchParams(search)).filter(\n ([key]) => key !== PAGE_NUMBER\n );\n\n return function linkTemplate(pageNum: number): string {\n return linkTo(\n baseURL,\n pageNum > 1 ? [...query, [PAGE_NUMBER, String(pageNum)]] : query\n );\n };\n}\n\n/**\n * The top level `links` of a paginated collection. `self` is always the page\n * requested \u2014 even past the last one, where `prev`/`next` are `null` \u2014 and\n * every link keeps the rest of the request's query string as is.\n *\n * @internal\n */\nexport default function createPageLinks(opts: {\n total: number;\n params: RequestParams;\n search: string;\n domain: string;\n pathname: string;\n defaultPerPage: number;\n}): JsonApiDocumentLinks {\n const { page: { number = 1, size = opts.defaultPerPage } = {} } = opts.params;\n const lastPageNum = opts.total > 0 ? Math.ceil(opts.total / size) : 1;\n const linkForPage = createLinkTemplate(opts);\n const inRange = (pageNum: number) => pageNum >= 1 && pageNum <= lastPageNum;\n\n return {\n self: linkForPage(number),\n first: linkForPage(1),\n last: linkForPage(lastPageNum),\n prev: inRange(number - 1) ? linkForPage(number - 1) : null,\n next: inRange(number + 1) ? linkForPage(number + 1) : null\n };\n}\n", "import { Query } from '../../../../database';\nimport { VERSION } from '../../../../jsonapi';\nimport { getDomain } from '../../../../server';\nimport type { Request, Response } from '../../../../server';\nimport { scopeFor } from '../../../../controller/visibility';\nimport type { SerializerFields } from '../../../../serializer/interfaces';\nimport createPageLinks, { createSelfLink } from '../utils/create-page-links';\nimport type { Action } from '../interfaces';\n\n/** @internal */\nexport default function resource(action: Action<unknown>): Action<unknown> {\n const resourceAction = async function (req: Request, res: Response) {\n const {\n route: { action: actionName, type, controller, relationship, related }\n } = req;\n // A related route serves resources of the related type: they are\n // serialized and paged by its controller.\n const target = (type === 'related' && related) || controller;\n const pagedRoute =\n actionName === 'index' ||\n (type === 'related' &&\n controller.model.relationshipFor(relationship || '')?.type ===\n 'hasMany');\n\n if (type === 'related') {\n // The owning resource must exist and be visible (else a 404).\n await controller.showRelationship(req);\n }\n\n const result = action(req, res);\n // A custom collection action is paged when its query is: one built on\n // `index` carries the request's page. (A plain route is not: it takes no\n // `page`, so page links would point at a 400.)\n const paged =\n pagedRoute ||\n (type === 'collection' &&\n result instanceof Query &&\n result.snapshots.some(([name]) => name === 'offset'));\n let links;\n let data;\n let total;\n\n if (paged && result instanceof Query) {\n [data, total] = await Promise.all([result, Query.from(result).count()]);\n } else {\n data = await result;\n }\n\n const domain = getDomain(req);\n const {\n params,\n router,\n url: { pathname, search }\n } = req;\n // The request itself, its query percent-encoded so it is a valid URI.\n const self = createSelfLink({ domain, pathname, search: search || '' });\n\n // An empty to-one relationship.\n if (type === 'related' && data == null) {\n return {\n data: null,\n links: { self },\n jsonapi: { version: VERSION }\n };\n }\n\n if (Array.isArray(data) || (data && data.isModelInstance)) {\n const { namespace } = controller;\n const { serializer, defaultPerPage } = target;\n const scope = scopeFor(controller.visibility, req);\n const routed = (key: string) => router.has(`GET:${key}`);\n\n if (type === 'relationship' && relationship && !Array.isArray(data)) {\n return serializer.formatRelationship({\n scope,\n domain,\n routed,\n namespace,\n item: data,\n name: relationship\n });\n }\n\n const include = params.include || [];\n // Read once so TypeScript can narrow it (`getHeader` is `string | void`).\n const location =\n actionName === 'create' ? res.getHeader('Location') : undefined;\n\n if (paged) {\n links = createPageLinks({\n params,\n domain,\n pathname,\n search: search || '',\n defaultPerPage,\n total: total || 0\n });\n } else if (location) {\n // The created resource, as `Location` says (JSON:API: they match).\n links = {\n self: location\n };\n } else {\n links = {\n self\n };\n }\n\n return serializer.format({\n data,\n links,\n // How many resources match across every page: the count the page\n // links are built from, so it costs no query of its own.\n ...(paged && { meta: { total: total || 0 } }),\n domain,\n include,\n fields: params.fields as SerializerFields,\n scope,\n routed,\n // The request's namespace, not the serializer's: a namespaced\n // controller without its own serializer is given the root one.\n namespace\n });\n }\n\n return data;\n };\n\n Object.defineProperty(resourceAction, 'name', {\n value: action.name\n });\n\n return resourceAction;\n}\n", "export const FINAL_HANDLER = '__FINAL_HANDLER__';\n", "import type { Request } from '../../../../server';\n\n/** @internal */\nexport default function getActionName({ route: { action } }: Request): string {\n return action;\n}\n", "import type { Request } from '../../../../server';\n\n/** @internal */\nexport default function getControllerName({\n route: {\n controller: {\n constructor: { name }\n }\n }\n}: Request): string {\n return name;\n}\n", "import { FINAL_HANDLER } from '../constants';\nimport getActionName from '../utils/get-action-name';\nimport getControllerName from '../utils/get-controller-name';\nimport type { Request, Response } from '../../../../server';\nimport type { Action } from '../interfaces';\n\n/** @internal */\nexport default function trackPerf<T, U extends Action<T>>(\n action: U\n): Action<T> {\n const trackedAction = async function (\n req: Request,\n res: Response,\n data?: unknown\n ) {\n const start = Date.now();\n const result = await action(req, res, data);\n let { name } = action;\n let type = 'middleware';\n\n if (name === FINAL_HANDLER) {\n type = 'action';\n name = getActionName(req);\n } else if (!name) {\n name = 'anonymous';\n }\n\n res.stats.push({\n type,\n name,\n duration: Date.now() - start,\n controller: getControllerName(req)\n });\n\n return result;\n };\n\n Object.defineProperty(trackedAction, 'name', {\n value: action.name\n });\n\n return trackedAction;\n}\n", "import type Controller from '../../../controller';\n\nimport resource from './enhancers/resource';\nimport trackPerf from './enhancers/track-perf';\nimport type { Action } from './interfaces';\n\n/**\n * The handlers of an action: `controller`'s `beforeAction` hooks, the action,\n * then its `afterAction` hooks. A related route (`/posts/1/comments`) also\n * serves the related type, so `related`'s `beforeAction` hooks run too, after\n * the owner's, each hook once (both usually inherit the same ones).\n *\n * @internal\n */\nexport function createAction(\n type: string,\n action: Action<unknown>,\n controller: Controller,\n related?: Controller\n): Array<Action<unknown>> {\n let fn = action.bind(controller);\n\n // Every route of a resource, plain ones included: a model, an array of\n // models or a query they return is serialized; anything else is sent as is.\n if (controller.hasModel && controller.hasSerializer) {\n fn = resource(fn);\n }\n\n const { beforeAction } = controller;\n const handlers: Array<Action<unknown>> = [\n ...beforeAction,\n ...(type === 'related' && related\n ? related.beforeAction.filter(hook => !beforeAction.includes(hook))\n : []),\n\n function __FINAL_HANDLER__(req, res) {\n return fn(req, res);\n },\n ...controller.afterAction\n ];\n\n return handlers.map(trackPerf);\n}\n\nexport { FINAL_HANDLER } from './constants';\nexport { default as createPageLinks } from './utils/create-page-links';\n\nexport type { Action } from './interfaces';\n", "import { line } from '../../../../logger';\nimport createServerError from '../../../../server/utils/create-server-error';\nimport sourceFor, { nameFor } from '../../../../server/utils/source-for';\nimport type { ServerErrorSource } from '../../../../server';\nimport type { ParameterLike } from '../index';\n\n/** @internal */\nclass ParameterTypeError extends TypeError {\n declare source: ServerErrorSource;\n\n constructor(param: ParameterLike, actual: string) {\n const { type, path } = param;\n\n super(line`\n Expected type '${type || 'undefined'}' for parameter '${nameFor(path)}' but got\n '${actual}'.\n `);\n this.source = sourceFor(path);\n }\n}\n\nexport default createServerError(ParameterTypeError, 400, { isPublic: true });\n", "import { line } from '../../../../logger';\nimport createServerError from '../../../../server/utils/create-server-error';\nimport sourceFor, {\n memberPathFor,\n nameFor\n} from '../../../../server/utils/source-for';\nimport type { ServerErrorSource } from '../../../../server';\nimport type { ParameterLike } from '../index';\n\n// Parameters whose values are member names or relationship paths, which the\n// request parser camelized; the message names them as documents do.\nconst MEMBER_VALUED = new Set(['sort', 'fields', 'include']);\n\n/** @internal */\nclass ParameterValueError extends TypeError {\n declare source: ServerErrorSource;\n\n constructor(param: ParameterLike, actual: unknown) {\n const asSent = MEMBER_VALUED.has(param.path.split('.')[0] ?? '')\n ? memberPathFor\n : (value: unknown) => value;\n const expected = param.size ? Array.from(param.values(), asSent) : [];\n\n super(line`\n Expected value for parameter '${nameFor(param.path)}' to be one of\n [${expected.join(', ')}] but got ${String(asSent(actual))}.\n `);\n this.source = sourceFor(param.path);\n }\n}\n\nexport default createServerError(ParameterValueError, 400, { isPublic: true });\n", "import createServerError from '../../../../server/utils/create-server-error';\nimport sourceFor, { nameFor } from '../../../../server/utils/source-for';\nimport type { ServerErrorSource } from '../../../../server';\n\n/** @internal */\nclass InvalidParameterError extends TypeError {\n declare source: ServerErrorSource;\n\n constructor(path: string) {\n super(`'${nameFor(path)}' is not a valid parameter for this resource.`);\n this.source = sourceFor(path);\n }\n}\n\nexport default createServerError(InvalidParameterError, 400, {\n isPublic: true\n});\n", "import createServerError from '../../../../server/utils/create-server-error';\nimport sourceFor, { nameFor } from '../../../../server/utils/source-for';\nimport { line } from '../../../../logger';\nimport type { ServerErrorSource } from '../../../../server';\n\n/** @internal */\nclass ResourceMismatchError extends TypeError {\n declare source: ServerErrorSource;\n\n constructor(path: string, expected: unknown, actual: unknown) {\n let normalized = actual;\n\n if (typeof normalized === 'string') {\n normalized = `'${String(normalized)}'`;\n }\n\n super(line`\n Expected '${String(expected)}' for parameter '${nameFor(path)}' but got\n ${String(normalized)}.\n `);\n this.source = sourceFor(path);\n }\n}\n\nexport default createServerError(ResourceMismatchError, 409, {\n isPublic: true\n});\n", "import createServerError from '../../../../server/utils/create-server-error';\nimport sourceFor, { nameFor } from '../../../../server/utils/source-for';\nimport type { ServerErrorSource } from '../../../../server';\n\n/** @internal */\nclass ParameterRequiredError extends TypeError {\n declare source: ServerErrorSource;\n\n constructor(path: string) {\n super(`Missing required parameter '${nameFor(path)}'.`);\n this.source = sourceFor(path);\n }\n}\n\nexport default createServerError(ParameterRequiredError, 400, {\n isPublic: true\n});\n", "import createServerError from '../../../../server/utils/create-server-error';\nimport sourceFor from '../../../../server/utils/source-for';\nimport type { ServerErrorSource } from '../../../../server';\n\n/**\n * JSON:API 1.0: \"A server MUST return 403 Forbidden in response to an\n * unsupported request to create a resource with a client-generated ID.\"\n *\n * @internal\n */\nclass ClientGeneratedIdError extends TypeError {\n declare source: ServerErrorSource;\n\n constructor() {\n super('Client-generated IDs are not supported for this resource.');\n this.source = sourceFor('data.id');\n }\n}\n\nexport default createServerError(ClientGeneratedIdError, 403, {\n isPublic: true\n});\n", "import { line } from '../../../../logger';\nimport createServerError from '../../../../server/utils/create-server-error';\nimport sourceFor, { nameFor } from '../../../../server/utils/source-for';\nimport type { ServerErrorSource } from '../../../../server';\nimport type Parameter from '../parameter';\n\n/** @internal */\nclass ParameterRangeError extends RangeError {\n declare source: ServerErrorSource;\n\n constructor({ path, min, max }: Parameter, actual: number) {\n const bounds = [\n min === undefined ? '' : `at least ${min}`,\n max === undefined ? '' : `at most ${max}`\n ]\n .filter(Boolean)\n .join(' and ');\n\n super(line`\n Expected value for parameter '${nameFor(path)}' to be ${bounds} but got\n ${String(actual)}.\n `);\n this.source = sourceFor(path);\n }\n}\n\nexport default createServerError(ParameterRangeError, 400, { isPublic: true });\n", "import createServerError from '../../../../server/utils/create-server-error';\nimport sourceFor, { nameFor } from '../../../../server/utils/source-for';\nimport type { ServerErrorSource } from '../../../../server';\n\n/**\n * JSON:API 1.0: \"A server MUST return 403 Forbidden in response to an\n * unsupported request to update a resource or relationship.\" Used for members\n * the model knows about but the controller does not accept (`params`).\n *\n * @internal\n */\nclass ForbiddenParameterError extends TypeError {\n declare source: ServerErrorSource;\n\n constructor(path: string) {\n super(`Setting '${nameFor(path)}' is not supported for this resource.`);\n this.source = sourceFor(path);\n }\n}\n\nexport default createServerError(ForbiddenParameterError, 403, {\n isPublic: true\n});\n", "import createServerError from '../../../../server/utils/create-server-error';\nimport sourceFor, { nameFor } from '../../../../server/utils/source-for';\nimport type { ServerErrorSource } from '../../../../server';\nimport type { ParameterLike } from '../index';\n\n/** @internal */\nclass ParameterNotNullableError extends TypeError {\n declare source: ServerErrorSource;\n\n constructor({ path }: ParameterLike) {\n super(`Parameter '${nameFor(path)}' is not nullable.`);\n this.source = sourceFor(path);\n }\n}\n\nexport default createServerError(ParameterNotNullableError, 400, {\n isPublic: true\n});\n", "/**\n * @private\n */\nexport default function isBuffer(value: unknown): value is Buffer {\n return value instanceof Buffer;\n}\n", "import ParameterTypeError from '../errors/parameter-type-error';\nimport ParameterNotNullableError from '../errors/parameter-not-nullable-error';\nimport isNull from '../../../../../utils/is-null';\nimport isObject from '../../../../../utils/is-object';\nimport isBuffer from '../../../../../utils/is-buffer';\nimport type { ParameterLike } from '../index';\n\n/**\n * The type of `value` as an error message should name it: unlike `typeof`,\n * telling arrays and dates apart from other objects.\n *\n * @internal\n */\nfunction describeType(value: unknown): string {\n if (Array.isArray(value)) {\n return 'array';\n } else if (value instanceof Date) {\n return 'date';\n }\n\n return typeof value;\n}\n\n/** @internal */\nexport default function validateType(\n param: ParameterLike,\n value: unknown\n): true {\n const { type, required } = param;\n const valueIsNull = isNull(value);\n\n if (required && valueIsNull) {\n throw new ParameterNotNullableError(param);\n } else if (valueIsNull || !type) {\n return true;\n }\n\n const valueType = typeof value;\n let isValid: boolean;\n\n switch (type) {\n case 'array':\n isValid = Array.isArray(value);\n break;\n\n case 'buffer':\n isValid = isBuffer(value);\n break;\n\n case 'object':\n isValid = isObject(value) || isNull(value);\n break;\n\n case 'date':\n isValid = value instanceof Date;\n break;\n\n default:\n isValid = type === valueType;\n }\n\n if (!isValid) {\n throw new ParameterTypeError(param, describeType(value));\n }\n\n return true;\n}\n", "import { ParameterRangeError } from '../../errors';\nimport type Parameter from '../index';\n\n/** @internal */\nexport default function validateRange(param: Parameter, value: unknown): true {\n const { min = -Infinity, max = Infinity } = param;\n\n if (typeof value === 'number' && (value < min || value > max)) {\n throw new ParameterRangeError(param, value);\n }\n\n return true;\n}\n", "import isNull from '../../../../../../utils/is-null';\nimport { ParameterValueError, ResourceMismatchError } from '../../errors';\nimport type Parameter from '../index';\n\n/** @internal */\nfunction validateOne<V>(param: Parameter, value: V): V {\n if (!param.required && isNull(value)) {\n return value;\n }\n\n if (!param.has(value)) {\n let expected;\n\n switch (param.path) {\n case 'data.type':\n [expected] = Array.from(param.values());\n throw new ResourceMismatchError(param.path, expected, value);\n\n default:\n throw new ParameterValueError(param, value);\n }\n }\n\n return value;\n}\n\n/** @internal */\nexport default function validateValue<V>(param: Parameter, value: V): V {\n if (Array.isArray(value)) {\n if (param.sanitize) {\n return value.filter(item => param.has(item)) as V;\n }\n\n for (const item of value) {\n validateOne(param, item);\n }\n } else {\n validateOne(param, value);\n }\n\n return value;\n}\n", "import { FreezeableSet } from '../../../../freezeable';\nimport validateType from '../utils/validate-type';\nimport { collectErrors } from '../../../../server/errors/error-list';\n\nimport validateRange from './utils/validate-range';\nimport validateValue from './utils/validate-value';\nimport type { ParameterOptions } from './interfaces';\nimport type { ParameterLike } from '../interfaces';\n\n/** @internal */\nclass Parameter extends FreezeableSet<unknown> {\n declare path: string;\n\n declare type: string;\n\n declare required: boolean;\n\n declare sanitize: boolean;\n\n /**\n * Whether the parameter only accepts the given `values`. A parameter built\n * without `values` accepts any value of its type; one built with `values`\n * accepts only those \u2014 so an empty list accepts nothing. (Both used to look\n * alike as an empty set, which let e.g. `?include=anything` through on a\n * serializer without relationships, where JSON:API requires a 400.)\n */\n declare restricted: boolean;\n\n /**\n * Inclusive bounds of a `number` parameter, when given.\n */\n declare min?: number;\n\n declare max?: number;\n\n /**\n * Converts a value as the client sent it into the parameter's type before\n * it is validated (e.g. a JSON:API string id into a numeric primary key),\n * when given. Values it does not recognize are returned as is, and so fail\n * validation.\n */\n declare parse?: (value: unknown) => unknown;\n\n /**\n * For an `array` parameter, builds the parameter each element is validated\n * with, given the element's path (`data.relationships.tags.data.0`).\n */\n declare items?: (path: string) => ParameterLike;\n\n constructor({\n path,\n type,\n values,\n min,\n max,\n parse,\n items,\n required,\n sanitize\n }: ParameterOptions) {\n super(values);\n\n Object.assign(this, {\n path,\n type,\n min,\n max,\n parse,\n items,\n required: Boolean(required),\n sanitize: Boolean(sanitize),\n restricted: values !== undefined\n });\n\n this.freeze();\n }\n\n validate<V>(value: V): V {\n const parsed = (this.parse ? this.parse(value) : value) as V;\n\n validateType(this, parsed);\n validateRange(this, parsed);\n\n if (this.items && Array.isArray(parsed)) {\n const { items, path } = this;\n\n const validated: Array<unknown> = [];\n\n // Every invalid element is reported, not just the first.\n collectErrors(\n parsed.map((item, index) => () => {\n const param = items(`${path}.${index}`);\n\n // A group lets `null` through; an element must be present.\n validateType(param, item);\n validated[index] = param.validate(item);\n })\n );\n\n return validated as V;\n }\n\n if (this.restricted) {\n return validateValue(this, parsed);\n }\n\n return parsed;\n }\n}\n\nexport default Parameter;\n", "import Parameter from './index';\n\n/**\n * A member the resource has but the controller does not accept (e.g. a\n * read-only `createdAt`). It is dropped from the validated params instead of\n * being rejected, so clients that send whole resources back \u2014 ember-data\n * serializes every attribute \u2014 keep working. A member the resource does not\n * have at all is still a 400. See nickschot/lux#47.\n *\n * @internal\n */\nclass IgnoredParameter extends Parameter {\n constructor(path: string) {\n super({ path });\n }\n}\n\nexport default IgnoredParameter;\n", "import { ParameterRequiredError } from '../../errors';\nimport type { ServerError } from '../../../../../server';\nimport type ParameterGroup from '../index';\n\n/**\n * An error for each required member of `group` that `params` lacks.\n *\n * @internal\n */\nexport default function missingParams(\n group: ParameterGroup,\n params: Record<string, unknown>\n): Array<ServerError> {\n return Array.from(group)\n .filter(([key, { required }]) => required && !(key in params))\n .map(([, { path }]) => new ParameterRequiredError(path));\n}\n", "import { FreezeableMap } from '../../../../freezeable';\nimport { InvalidParameterError } from '../errors';\nimport IgnoredParameter from '../parameter/ignored-parameter';\nimport { collectErrors } from '../../../../server/errors/error-list';\nimport isNull from '../../../../../utils/is-null';\nimport entries from '../../../../../utils/entries';\nimport validateType from '../utils/validate-type';\nimport type { ParameterLike, ParameterLikeOptions } from '../index';\n\nimport missingParams from './utils/missing-params';\n\n/** @internal */\nclass ParameterGroup extends FreezeableMap<string, ParameterLike> {\n declare type: string;\n\n declare path: string;\n\n declare required: boolean;\n\n declare sanitize: boolean;\n\n constructor(\n contents: Array<[string, ParameterLike]>,\n { path, required, sanitize }: ParameterLikeOptions\n ) {\n super(contents);\n\n Object.assign(this, {\n path,\n type: 'object',\n required: Boolean(required),\n sanitize: Boolean(sanitize)\n });\n\n this.freeze();\n }\n\n validate<V>(params: V): V {\n const validated: Record<string, unknown> = {};\n\n if (isNull(params)) {\n return params;\n }\n\n validateType(this, params);\n\n const { sanitize } = this;\n let { path } = this;\n\n if (path.length) {\n path = `${path}.`;\n }\n\n // Every problem with the members is reported, not just the first.\n collectErrors(\n entries(params as Record<string, unknown>).map(([key, value]) => () => {\n const match = this.get(key);\n\n if (match instanceof IgnoredParameter) {\n return;\n } else if (match) {\n validated[key] = match.validate(value);\n } else if (!sanitize) {\n throw new InvalidParameterError(`${path}${key}`);\n }\n }),\n missingParams(this, params as Record<string, unknown>)\n );\n\n return validated as V;\n }\n}\n\nexport default ParameterGroup;\n", "import Parameter from '../parameter';\nimport type { ParameterLike } from '../interfaces';\n\n/** @internal */\nexport default function getURLParams(\n dynamicSegments: Array<string>\n): Array<[string, ParameterLike]> {\n return dynamicSegments.map((param): [string, ParameterLike] => [\n param,\n new Parameter({\n path: param,\n required: true\n })\n ]);\n}\n", "import { ForbiddenParameterError } from '../errors';\n\nimport Parameter from './index';\n\n/**\n * A member the resource has but the controller does not accept. Any value for\n * it is rejected with 403 rather than the 400 an unknown member gets.\n *\n * @internal\n */\nclass ForbiddenParameter extends Parameter {\n constructor(path: string) {\n super({ path });\n }\n\n override validate<V>(): V {\n throw new ForbiddenParameterError(this.path);\n }\n}\n\nexport default ForbiddenParameter;\n", "const INTEGER = /^-?\\d+$/;\n\n// ISO 8601: a date, optionally with a time (seconds and fraction optional)\n// and an offset.\nconst ISO_8601 =\n /^\\d{4}-\\d{2}-\\d{2}(?:[T ]\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d+)?)?(?:Z|[+-]\\d{2}:?\\d{2})?)?$/;\n\n/**\n * Parse an id from a request document. JSON:API ids are strings, so a numeric\n * primary key takes the number a string of digits spells; anything else is\n * returned as is (a number still passes, for lenient clients).\n *\n * @internal\n */\nexport function parseId(type: string | undefined) {\n return (value: unknown): unknown => {\n if (type === 'number' && typeof value === 'string' && INTEGER.test(value)) {\n return Number.parseInt(value, 10);\n }\n\n return value;\n };\n}\n\n/**\n * The parser for attribute values written to a column of `type`, if it needs\n * one. JSON has no dates, so a date column takes an ISO 8601 string; every\n * other value is typed by JSON already and is validated as sent.\n *\n * @internal\n */\nexport function parserFor(\n type: string | undefined\n): ((value: unknown) => unknown) | undefined {\n if (type !== 'date') {\n return undefined;\n }\n\n return (value: unknown): unknown => {\n if (typeof value === 'string' && ISO_8601.test(value)) {\n const date = new Date(value);\n\n if (!Number.isNaN(date.valueOf())) {\n return date;\n }\n }\n\n return value;\n };\n}\n", "import Parameter from '../parameter';\nimport ForbiddenParameter from '../parameter/forbidden-parameter';\nimport IgnoredParameter from '../parameter/ignored-parameter';\nimport ParameterGroup from '../parameter-group';\nimport isNull from '../../../../../utils/is-null';\nimport { typeForColumn } from '../../../../database';\nimport type { ModelClass } from '../../../../database';\nimport type Controller from '../../../../controller';\nimport type { ParameterLike } from '../interfaces';\n\nimport { parseId, parserFor } from './parse-column-value';\n\n/** @internal */\nfunction primaryKeyTypeFor(model: ModelClass): string | undefined {\n const primaryKeyColumn = model.columnFor(model.primaryKey);\n\n return primaryKeyColumn ? typeForColumn(primaryKeyColumn) : 'number';\n}\n\n/**\n * An optional object member the spec allows in a request document (`meta`,\n * `links`, `jsonapi`). It is accepted, not acted on.\n *\n * @internal\n */\nfunction getObjectParam(name: string, path: string): [string, ParameterLike] {\n return [name, new Parameter({ path, type: 'object' })];\n}\n\n/** @internal */\nfunction getIDParam({ model }: Controller): [string, ParameterLike] {\n const type = primaryKeyTypeFor(model);\n\n return [\n 'id',\n new Parameter({\n type,\n path: 'data.id',\n parse: parseId(type),\n required: true\n })\n ];\n}\n\n/** @internal */\nfunction getTypeParam({ model }: Controller): [string, ParameterLike] {\n return [\n 'type',\n new Parameter({\n type: 'string',\n path: 'data.type',\n values: [model.resourceName],\n required: true\n })\n ];\n}\n\n/**\n * Members the model has (`names`) but the controller's `params` do not list:\n * ignored, or answered with 403 when `reject` is set. A name the model does\n * not have at all gets neither and is a 400. See nickschot/lux#47.\n *\n * @internal\n */\nfunction getUnlistedParams(\n names: Array<string>,\n params: Array<string>,\n path: string,\n reject: boolean\n): Array<[string, ParameterLike]> {\n return names\n .filter(name => !params.includes(name))\n .map((name): [string, ParameterLike] => [\n name,\n reject\n ? new ForbiddenParameter(`${path}.${name}`)\n : new IgnoredParameter(`${path}.${name}`)\n ]);\n}\n\n/** @internal */\nfunction getAttributesParam(\n { model, params, rejectUnlistedAttributes }: Controller,\n method: 'PATCH' | 'POST'\n): [string, ParameterLike] {\n const unlisted = getUnlistedParams(\n model.attributeNames,\n params,\n 'data.attributes',\n rejectUnlistedAttributes\n );\n\n return [\n 'attributes',\n new ParameterGroup(\n [\n ...params.reduce<Array<[string, ParameterLike]>>((group, param) => {\n const col = model.columnFor(param);\n\n if (col) {\n const type = typeForColumn(col);\n const path = `data.attributes.${param}`;\n const required =\n method !== 'PATCH' && !col.nullable && isNull(col.defaultValue);\n\n return [\n ...group,\n [\n param,\n new Parameter({ type, path, required, parse: parserFor(type) })\n ]\n ];\n }\n\n return group;\n }, []),\n ...unlisted\n ],\n {\n path: 'data.attributes'\n }\n )\n ];\n}\n\n/**\n * A resource identifier object (`{ id, type }`) of `model` at `path`.\n *\n * @internal\n */\nfunction getIdentifierParam(path: string, model: ModelClass): ParameterGroup {\n const type = primaryKeyTypeFor(model);\n\n return new ParameterGroup(\n [\n [\n 'id',\n new Parameter({\n type,\n path: `${path}.id`,\n parse: parseId(type),\n required: true\n })\n ],\n\n [\n 'type',\n new Parameter({\n type: 'string',\n path: `${path}.type`,\n values: [model.resourceName],\n required: true\n })\n ],\n\n getObjectParam('meta', `${path}.meta`)\n ],\n {\n path,\n required: true\n }\n );\n}\n\n/** @internal */\nfunction getRelationshipsParam({\n model,\n params,\n rejectUnlistedRelationships\n}: Controller): [string, ParameterLike] {\n const unlisted = getUnlistedParams(\n Object.keys(model.relationships),\n params,\n 'data.relationships',\n rejectUnlistedRelationships\n );\n\n return [\n 'relationships',\n new ParameterGroup(\n [\n ...params.reduce<Array<[string, ParameterLike]>>((group, param) => {\n const path = `data.relationships.${param}`;\n const opts = model.relationshipFor(param);\n\n if (!opts) {\n return group;\n }\n\n // Resource linkage: an array of identifiers for a to-many\n // relationship, an identifier (or `null`) for a to-one.\n const data: ParameterLike =\n opts.type === 'hasMany'\n ? new Parameter({\n type: 'array',\n path: `${path}.data`,\n required: true,\n items: itemPath => getIdentifierParam(itemPath, opts.model)\n })\n : getIdentifierParam(`${path}.data`, opts.model);\n\n return [\n ...group,\n [\n param,\n new ParameterGroup(\n [\n ['data', data],\n getObjectParam('links', `${path}.links`),\n getObjectParam('meta', `${path}.meta`)\n ],\n {\n path\n }\n )\n ]\n ];\n }, []),\n ...unlisted\n ],\n {\n path: 'data.relationships'\n }\n )\n ];\n}\n\n/**\n * The top level members of a request document besides `data`.\n *\n * @internal\n */\nexport function getDocumentParams(): Array<[string, ParameterLike]> {\n return [\n getObjectParam('meta', 'meta'),\n getObjectParam('links', 'links'),\n getObjectParam('jsonapi', 'jsonapi')\n ];\n}\n\n/** @internal */\nexport default function getDataParams(\n controller: Controller,\n method: 'PATCH' | 'POST',\n includeID: boolean\n): [string, ParameterLike] {\n let params = [\n getTypeParam(controller),\n getObjectParam('links', 'data.links'),\n getObjectParam('meta', 'data.meta')\n ];\n\n if (controller.hasModel) {\n params = [\n getAttributesParam(controller, method),\n getRelationshipsParam(controller),\n ...params\n ];\n\n if (includeID) {\n params = [getIDParam(controller), ...params];\n }\n }\n\n return [\n 'data',\n new ParameterGroup(params, {\n path: 'data',\n required: true\n })\n ];\n}\n", "import type Controller from '../../../../controller';\n\n/**\n * Without a fieldset, primary data loads every attribute its Serializer\n * declares. Other types need no default: an absent fieldset means all fields.\n *\n * @internal\n */\nexport default function getDefaultMemberParams({\n model,\n serializer: { attributes }\n}: Controller): Record<string, unknown> {\n return {\n fields: {\n [model.resourceName]: attributes\n }\n };\n}\n", "import type Controller from '../../../../controller';\n\nimport getDefaultMemberParams from './get-default-member-params';\n\n/** @internal */\nfunction getDefaultCollectionParams(\n controller: Controller\n): Record<string, unknown> {\n return {\n ...getDefaultMemberParams(controller),\n filter: {},\n sort: 'createdAt',\n page: {\n size: controller.defaultPerPage,\n number: 1\n }\n };\n}\n\nexport default getDefaultCollectionParams;\n", "import Parameter from '../parameter';\nimport ParameterGroup from '../parameter-group';\nimport type Controller from '../../../../controller';\nimport type { ParameterLike } from '../interfaces';\nimport {\n enumerateIncludePaths,\n enumerateIncludeTypes\n} from '../../../../serializer/utils/include-tree';\n\n/** @internal */\nfunction getPageParam({ maxPerPage }: Controller): [string, ParameterLike] {\n return [\n 'page',\n new ParameterGroup(\n [\n [\n 'size',\n new Parameter({\n path: 'page.size',\n type: 'number',\n min: 1,\n max: maxPerPage\n })\n ],\n [\n 'number',\n new Parameter({ path: 'page.number', type: 'number', min: 1 })\n ]\n ],\n {\n path: 'page'\n }\n )\n ];\n}\n\n/** @internal */\nfunction getSortParam({ sort }: Controller): [string, ParameterLike] {\n return [\n 'sort',\n new Parameter({\n path: 'sort',\n type: 'string',\n\n values: [...sort, ...sort.map(value => `-${value}`)]\n })\n ];\n}\n\n/** @internal */\nfunction getFilterParam({ filter }: Controller): [string, ParameterLike] {\n return [\n 'filter',\n new ParameterGroup(\n filter.map(param => [\n param,\n new Parameter({\n path: `filter.${param}`\n })\n ]),\n {\n path: 'filter'\n }\n )\n ];\n}\n\n/**\n * One `fields[TYPE]` parameter per type the response can contain, accepting\n * the fields that type's Serializer exposes: its attributes and relationships.\n * Unknown types are ignored (a client may send the same fieldsets everywhere);\n * an unknown field of a known type is a 400.\n *\n * @internal\n */\nfunction getFieldsParam(controller: Controller): [string, ParameterLike] {\n const { model, serializer, maxIncludeDepth } = controller;\n const types = enumerateIncludeTypes(\n model,\n serializer,\n maxIncludeDepth,\n related => controller.serializerFor(related)\n );\n\n return [\n 'fields',\n new ParameterGroup(\n Array.from(\n types,\n ([type, { attributes, hasOne, hasMany }]): [string, ParameterLike] => [\n type,\n new Parameter({\n path: `fields.${type}`,\n type: 'array',\n values: [...attributes, ...hasOne, ...hasMany]\n })\n ]\n ),\n {\n path: 'fields',\n sanitize: true\n }\n )\n ];\n}\n\n/** @internal */\nfunction getIncludeParam(controller: Controller): [string, ParameterLike] {\n const { model, maxIncludeDepth, serializer } = controller;\n const { hasOne, hasMany } = serializer;\n const relationships = [...hasOne, ...hasMany];\n\n return [\n 'include',\n new Parameter({\n path: 'include',\n type: 'array',\n // Every top level name, plus the nested paths (`comments.user`)\n // reachable through each related serializer in the controller's\n // namespace (at every level, even below a root fallback serializer),\n // down to the controller's `maxIncludeDepth`. At `0`, none: any\n // `include` is a 400.\n values: Array.from(\n new Set([\n ...(maxIncludeDepth < 1 ? [] : relationships),\n ...enumerateIncludePaths(\n model,\n relationships,\n maxIncludeDepth,\n related => controller.serializerFor(related)\n )\n ])\n )\n })\n ];\n}\n\n/** @internal */\nexport function getCustomParams({\n query\n}: Controller): Array<[string, ParameterLike]> {\n return query.map((param): [string, ParameterLike] => [\n param,\n new Parameter({\n path: param\n })\n ]);\n}\n\n/** @internal */\nexport function getMemberQueryParams(\n controller: Controller\n): Array<[string, ParameterLike]> {\n if (controller.hasModel) {\n return [\n getFieldsParam(controller),\n getIncludeParam(controller),\n ...getCustomParams(controller)\n ];\n }\n\n return getCustomParams(controller);\n}\n\n/** @internal */\nexport function getCollectionQueryParams(\n controller: Controller\n): Array<[string, ParameterLike]> {\n if (controller.hasModel) {\n return [\n getPageParam(controller),\n getSortParam(controller),\n getFilterParam(controller),\n getFieldsParam(controller),\n getIncludeParam(controller),\n ...getCustomParams(controller)\n ];\n }\n\n return getCustomParams(controller);\n}\n", "import { ClientGeneratedIdError } from '../errors';\n\n/**\n * Reject `data.id` on a create request before the parameter tree runs, so it\n * is answered with 403 (unsupported client-generated ID) rather than the 400\n * an unknown member gets.\n *\n * @internal\n */\nexport default function validateClientId(params: Record<string, unknown>) {\n const { data } = params;\n\n if (data && typeof data === 'object' && 'id' in data) {\n throw new ClientGeneratedIdError();\n }\n\n return true;\n}\n", "import { ResourceMismatchError } from '../errors';\nimport type { Request } from '../../../../server';\n\n/** @internal */\nexport default function validateResourceId({\n params: {\n id,\n data: { id: resourceId }\n }\n}: Request): true {\n if (id !== resourceId) {\n throw new ResourceMismatchError('data.id', String(id), String(resourceId));\n }\n\n return true;\n}\n", "import type Controller from '../../../controller';\n\nimport ParameterGroup from './parameter-group';\nimport getURLParams from './utils/get-url-params';\nimport getDataParams, { getDocumentParams } from './utils/get-data-params';\nimport getDefaultMemberParams from './utils/get-default-member-params';\nimport getDefaultCollectionParams from './utils/get-default-collection-params';\nimport type { ParamsOptions } from './interfaces';\nimport {\n getMemberQueryParams,\n getCollectionQueryParams,\n getCustomParams\n} from './utils/get-query-params';\n\n/** @internal */\nexport function paramsFor({\n type,\n method,\n controller,\n dynamicSegments\n}: ParamsOptions) {\n let params = getURLParams(dynamicSegments);\n\n if (type === 'member') {\n params = [...params, ...getMemberQueryParams(controller)];\n\n if (method === 'POST' || method === 'PATCH') {\n params = [\n ...params,\n getDataParams(controller, method, true),\n ...getDocumentParams()\n ];\n }\n } else if (type === 'collection') {\n params = [...params, ...getCollectionQueryParams(controller)];\n\n if (method === 'POST' || method === 'PATCH') {\n params = [\n ...params,\n getDataParams(controller, method, false),\n ...getDocumentParams()\n ];\n }\n } else if (type === 'relationship') {\n // The id alone: a relationship endpoint takes no query parameters.\n } else if (type === 'custom') {\n params = [...params, ...getCustomParams(controller)];\n }\n\n return new ParameterGroup(params, {\n path: '',\n required: true\n });\n}\n\n/** @internal */\nexport function defaultParamsFor({\n type,\n controller\n}: {\n type: string;\n controller: Controller;\n}): Record<string, unknown> {\n const { hasModel } = controller;\n\n if (hasModel && type === 'member') {\n return getDefaultMemberParams(controller);\n } else if (hasModel && (type === 'collection' || type === 'custom')) {\n // A plain route takes no query parameters but the controller's `query`;\n // the defaults let it call the built-in actions (`this.index(request)`).\n return getDefaultCollectionParams(controller);\n }\n\n return {};\n}\n\nexport { default as validateClientId } from './utils/validate-client-id';\nexport { default as validateResourceId } from './utils/validate-resource-id';\n\nexport type { ParameterLike, ParameterLikeOptions } from './interfaces';\nexport type { default as Parameter } from './parameter';\nexport type { default as ParameterGroup } from './parameter-group';\n", "export const DYNAMIC_PATTERN = /(:\\w+)/g;\n", "import { DYNAMIC_PATTERN } from '../constants';\n\n/**\n * The route key path of `path`: each dynamic segment (`:id`) becomes\n * `:dynamic`, the form `Router#resolve()` turns request paths into. Only whole\n * segments are replaced \u2014 `/videos/:id` is `/videos/:dynamic`.\n *\n * @internal\n */\nexport default function getStaticPath(path: string): string {\n return path.replace(DYNAMIC_PATTERN, ':dynamic');\n}\n", "import { DYNAMIC_PATTERN } from '../constants';\nimport insert from '../../../../utils/insert';\n\n/** @internal */\nexport default function getDynamicSegments(path: string): Array<string> {\n const matches = path.match(DYNAMIC_PATTERN) || [];\n const dynamicSegments: Array<string> = new Array(matches.length);\n\n insert(\n dynamicSegments,\n matches.map(part => part.substr(1))\n );\n Object.freeze(dynamicSegments);\n\n return dynamicSegments;\n}\n", "import { FreezeableSet, freezeProps, deepFreezeProps } from '../../freezeable';\nimport { primaryKeyType } from '../../database';\nimport type Controller from '../../controller';\nimport type { Request, Response, RequestMethod } from '../../server';\n\nimport { FINAL_HANDLER, createAction } from './action';\nimport {\n paramsFor,\n defaultParamsFor,\n validateClientId,\n validateResourceId\n} from './params';\nimport getStaticPath from './utils/get-static-path';\nimport getDynamicSegments from './utils/get-dynamic-segments';\nimport type { Action } from './action';\nimport type { ParameterGroup } from './params';\nimport type { RouteOptions } from './interfaces';\n\n/** @internal */\nfunction isToMany(controller: Controller, relationship?: string): boolean {\n return (\n Boolean(relationship) &&\n controller.model.relationshipFor(relationship as string)?.type === 'hasMany'\n );\n}\n\n/** @internal */\nclass Route extends FreezeableSet<Action<unknown>> {\n declare type: string;\n\n declare path: string;\n\n declare action: string;\n\n declare params: ParameterGroup;\n\n declare method: RequestMethod;\n\n declare controller: Controller;\n\n declare relationship: string | undefined;\n\n declare related: Controller | undefined;\n\n declare staticPath: string;\n\n declare defaultParams: Record<string, unknown>;\n\n declare dynamicSegments: Array<string>;\n\n constructor({\n type,\n path,\n action,\n method,\n controller,\n relationship,\n related\n }: RouteOptions) {\n const dynamicSegments = getDynamicSegments(path);\n\n if (action && controller) {\n // The action is a controller method named by the route definition.\n const handler = (\n controller as unknown as Record<string, Action<unknown> | undefined>\n )[action];\n\n if (typeof handler === 'function') {\n // A related route takes the query parameters of the related type, as\n // its `show` (to-one) or `index` (to-many) would.\n const query =\n type === 'related' && related\n ? {\n controller: related,\n type: isToMany(controller, relationship)\n ? ('collection' as const)\n : ('member' as const)\n }\n : { controller, type };\n\n const params = paramsFor({\n ...query,\n method,\n dynamicSegments\n });\n\n const staticPath = getStaticPath(path);\n\n const defaultParams = defaultParamsFor(query);\n\n super(createAction(type, handler, controller, related));\n\n Object.assign(this, {\n type,\n path,\n params,\n action,\n method,\n controller,\n staticPath,\n relationship,\n related,\n defaultParams,\n dynamicSegments\n });\n\n freezeProps(this, true, 'type', 'path');\n\n freezeProps(\n this,\n false,\n 'action',\n 'params',\n 'method',\n 'controller',\n 'staticPath',\n 'relationship',\n 'related'\n );\n\n deepFreezeProps(this, false, 'defaultParams', 'dynamicSegments');\n } else {\n const {\n constructor: { name: controllerName }\n } = controller;\n\n throw new TypeError(\n `Handler for ${controllerName}#${action} is not a function.`\n );\n }\n } else {\n throw new TypeError(\n 'Arguments `controller` and `action` must not be undefined'\n );\n }\n\n this.freeze();\n }\n\n /**\n * The ids in the request path, keyed by their dynamic segment: a number for\n * a numeric primary key (or a model-less controller), else as written.\n */\n parseParams(params: Array<string>): Record<string, number | string> {\n const { model } = this.controller;\n const isNumeric = !model || primaryKeyType(model) === 'number';\n\n return params.reduce<Record<string, number | string>>(\n (result, value, idx) => {\n const key = this.dynamicSegments[idx];\n\n if (key) {\n return {\n ...result,\n [key]: isNumeric ? Number.parseInt(value, 10) : value\n };\n }\n\n return result;\n },\n {}\n );\n }\n\n async execHandlers(req: Request, res: Response): Promise<unknown> {\n let calledFinal = false;\n let data: unknown;\n\n for (const handler of this) {\n data = await handler(req, res, data);\n\n if (handler.name === FINAL_HANDLER) {\n calledFinal = true;\n }\n\n if (!calledFinal && typeof data !== 'undefined') {\n break;\n }\n }\n\n return data;\n }\n\n async visit(req: Request, res: Response): Promise<unknown> {\n const { defaultParams } = this;\n let params = {\n ...req.params,\n ...this.parseParams(req.url.params)\n };\n\n if (this.action === 'create' && req.method === 'POST') {\n validateClientId(params);\n }\n\n if (req.method !== 'OPTIONS') {\n params = this.params.validate(params);\n }\n\n Object.assign(req, {\n params,\n defaultParams\n });\n\n if (this.type === 'member' && req.method === 'PATCH') {\n validateResourceId(req);\n }\n\n return this.execHandlers(req, res);\n }\n}\n\nexport default Route;\nexport { DYNAMIC_PATTERN } from './constants';\n\nexport type { Action } from './action';\nexport type { RouteOptions, RouteType } from './interfaces';\n", "import { posix } from 'path';\n\nimport { dasherize, underscore } from 'inflection';\n\nimport Route from '../route';\nimport Resource from '../resource';\nimport { normalizePath } from '../namespace';\nimport type Router from '../index';\nimport type Controller from '../../controller';\nimport type { RouterNamespace } from '../index';\n\nimport { contextFor } from './context';\nimport { addRoute } from './context/utils/create-definition';\nimport type { DefinitionContext } from './context';\n\n/**\n * The relationships of `controller`'s model its Serializer exposes.\n *\n * @internal\n */\nfunction relationshipsFor(controller: Controller): Array<string> {\n const { model, serializer, hasModel, hasSerializer } = controller;\n\n if (!hasModel || !hasSerializer) {\n return [];\n }\n\n return [...serializer.hasOne, ...serializer.hasMany].filter(name =>\n Boolean(model.relationshipFor(name))\n );\n}\n\n/**\n * The controller of the type `controller`'s relationship `name` points to, in\n * `controller`'s own namespace (`admin/users` for `admin/posts`). Only one\n * there can serve related resources: an ancestor namespace's would serialize\n * them with its own Serializers and accept its own `fields` and `include`,\n * which `?include=` in this namespace does not use. It needs a model and a\n * Serializer.\n *\n * @internal\n */\nfunction relatedControllerFor(\n controller: Controller,\n controllers: Map<string, Controller>,\n name: string\n): Controller | undefined {\n const opts = controller.model.relationshipFor(name);\n\n if (!opts) {\n return undefined;\n }\n\n const related = controllers.get(\n posix.join(controller.namespace || '.', opts.model.resourceName)\n );\n\n return related?.hasModel && related.hasSerializer ? related : undefined;\n}\n\n/**\n * For each relationship the resource's Serializer exposes \u2014 narrowed by its\n * `relationships` option (`false` for none, or a list of names) \u2014 a\n * relationship endpoint (`/posts/1/relationships/comments`) and, when the\n * related type has a controller, a related endpoint (`/posts/1/comments`).\n * Naming a relationship the Serializer does not expose is a boot error.\n *\n * Without the option, a namespace without visibility rules serves none:\n * nothing there scopes the related records, whatever the controllers'\n * `index` and `show` do.\n *\n * @internal\n */\nfunction defineRelationships(namespace: Resource): void {\n const { controller, controllers, path } = namespace;\n const relationships =\n namespace.relationships ?? controller.hasVisibilityRules === true;\n const exposed = relationshipsFor(controller);\n\n if (Array.isArray(relationships)) {\n const unknown = relationships.filter(name => !exposed.includes(name));\n\n if (unknown.length) {\n throw new TypeError(\n `The \\`relationships\\` of resource '${path}' must be ones its ` +\n `Serializer exposes, but ${unknown\n .map(name => `'${name}'`)\n .join(', ')} ${unknown.length === 1 ? 'is' : 'are'} not.`\n );\n }\n }\n\n const served = Array.isArray(relationships)\n ? exposed.filter(name => relationships.includes(name))\n : relationships\n ? exposed\n : [];\n\n served.forEach(name => {\n const segment = dasherize(underscore(name));\n const related = relatedControllerFor(controller, controllers, name);\n\n addRoute(namespace, {\n controller,\n type: 'relationship',\n path: normalizePath(`${path}/:id/relationships/${segment}`),\n action: 'showRelationship',\n method: 'GET',\n relationship: name\n });\n\n if (related) {\n addRoute(namespace, {\n controller,\n related,\n type: 'related',\n path: normalizePath(`${path}/:id/${segment}`),\n action: 'showRelated',\n method: 'GET',\n relationship: name\n });\n }\n });\n}\n\n/** @internal */\nexport function build<T extends RouterNamespace>(\n builder: (() => void) | undefined,\n namespace: T\n): T {\n const context = contextFor(build).create(namespace);\n\n if (namespace instanceof Resource) {\n const { only } = namespace;\n\n context.member(function member(this: DefinitionContext) {\n if (only.has('show')) {\n this.get('/', 'show');\n }\n\n if (only.has('update')) {\n this.patch('/', 'update');\n }\n\n if (only.has('destroy')) {\n this.delete('/', 'destroy');\n }\n });\n\n // Relationships are served wherever the resource is shown.\n if (only.has('show')) {\n defineRelationships(namespace);\n }\n\n context.collection(function collection(this: DefinitionContext) {\n if (only.has('index')) {\n this.get('/', 'index');\n }\n\n if (only.has('create')) {\n this.post('/', 'create');\n }\n });\n }\n\n if (builder) {\n builder.call(context);\n }\n\n return namespace;\n}\n\n/** @internal */\nexport function define<T extends RouterNamespace>(router: Router, parent: T) {\n parent.forEach(child => {\n if (child instanceof Route) {\n const { method, staticPath } = child;\n\n router.set(`${method}:${staticPath}`, child);\n } else {\n define(router, child);\n }\n });\n}\n", "import { BUILT_IN_ACTIONS, type BuiltInAction } from '../../../controller';\n\n/** @internal */\nexport default function normalizeOnly(\n only: Array<BuiltInAction>\n): Array<BuiltInAction> {\n return only.filter(action => BUILT_IN_ACTIONS.indexOf(action) >= 0);\n}\n", "import Namespace from '../namespace';\nimport { FreezeableSet } from '../../freezeable';\nimport type { BuiltInAction } from '../../controller';\n\nimport normalizeOnly from './utils/normalize-only';\nimport type { ResourceOptions, ResourceRelationships } from './interfaces';\n\n/** @internal */\nclass Resource extends Namespace {\n declare only: FreezeableSet<BuiltInAction>;\n\n // `undefined` when the route does not say: the default depends on the\n // namespace's visibility rules (see `defineRelationships()`).\n declare relationships: ResourceRelationships | undefined;\n\n constructor({ only, relationships, ...opts }: ResourceOptions) {\n super(opts);\n\n Object.defineProperty(this, 'relationships', {\n value: Array.isArray(relationships)\n ? Object.freeze([...relationships])\n : relationships,\n writable: false,\n enumerable: false,\n configurable: false\n });\n\n Object.defineProperty(this, 'only', {\n value: new FreezeableSet(normalizeOnly(only)),\n writable: false,\n enumerable: false,\n configurable: false\n });\n\n this.only.freeze();\n }\n}\n\nexport default Resource;\n\nexport type { ResourceOptions, ResourceRelationships } from './interfaces';\n", "/**\n * @private\n */\nclass ControllerMissingError extends ReferenceError {\n constructor(resource: string) {\n super(`Could not resolve controller by name '${resource}'`);\n }\n}\n\nexport default ControllerMissingError;\n", "import { Route } from '../../../index';\nimport { normalizeName, normalizePath } from '../../../namespace';\nimport type { RequestMethod } from '../../../../server';\nimport type { RouterNamespace, RouteOptions, RouteType } from '../../../index';\n\n/**\n * Add the route `opts` describes to `namespace`, along with a `HEAD` route\n * for a `GET` and an `OPTIONS` route for its path.\n *\n * @internal\n */\nexport function addRoute(namespace: RouterNamespace, opts: RouteOptions) {\n namespace.add(new Route(opts));\n\n // HEAD is GET without a body (Node drops it), so it runs the GET action.\n if (opts.method === 'GET') {\n namespace.add(new Route({ ...opts, method: 'HEAD' }));\n }\n\n namespace.add(\n new Route({\n ...opts,\n type: 'custom',\n method: 'OPTIONS',\n action: 'preflight'\n })\n );\n}\n\n/** @internal */\nexport default function createDefinition({\n type,\n method,\n namespace\n}: {\n type: RouteType;\n method: RequestMethod;\n namespace: RouterNamespace;\n}) {\n return function define(name: string, action: string = normalizeName(name)) {\n const normalized = normalizeName(name);\n const { controller } = namespace;\n let { path } = namespace;\n\n if (type === 'member') {\n path += `/:id/${normalized}`;\n } else {\n path += `/${normalized}`;\n }\n\n addRoute(namespace, {\n type,\n action,\n method,\n controller,\n path: normalizePath(path)\n });\n };\n}\n", "import { REQUEST_METHODS } from '../../../../server';\nimport type { RouteType, RouterNamespace } from '../../../index';\n\nimport createDefinition from './create-definition';\n\ntype DefinitionFn = (name: string, action?: string) => void;\n\n/** @internal */\nexport default function createDefinitionGroup<T extends RouterNamespace>(\n type: RouteType,\n namespace: T\n): Record<string, DefinitionFn> {\n return REQUEST_METHODS.reduce<Record<string, DefinitionFn>>(\n (methods, method) => ({\n ...methods,\n [method.toLowerCase()]: createDefinition({\n type,\n method,\n namespace\n })\n }),\n {}\n );\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * Normalizes the overloaded `resource(name, opts?, builder?)` argument forms\n * the public route DSL accepts. The input tuple is genuinely untyped until this\n * function resolves it into the structured `[opts, builder]` return shape.\n */\nimport { BUILT_IN_ACTIONS, type BuiltInAction } from '../../../../controller';\n\n/** @internal */\nexport default function normalizeResourceArgs(args: Array<any>): [\n {\n name: string;\n path: string;\n only: Array<BuiltInAction>;\n relationships?: boolean | Array<string>;\n },\n () => void\n] {\n const [name] = args;\n let [, opts, builder] = args;\n\n if (!opts) {\n opts = {\n path: '',\n only: undefined\n };\n }\n\n if (typeof opts === 'function') {\n builder = opts;\n opts = {\n path: '',\n only: undefined\n };\n }\n\n if (typeof builder !== 'function') {\n builder = () => undefined;\n }\n\n opts = {\n ...opts,\n name\n };\n\n if (!opts.path) {\n opts = {\n ...opts,\n path: `/${name}`\n };\n }\n\n if (!opts.only) {\n opts = {\n ...opts,\n only: [...BUILT_IN_ACTIONS]\n };\n }\n\n return [opts, builder];\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * This is the route-definition DSL. `DefinitionContext` collects handler\n * methods with genuinely heterogeneous signatures behind a single index\n * signature, and `resource(...args)` accepts the untyped variadic argument\n * forms the public `resource()` route helper supports; both are normalized at\n * the boundary (see normalize-resource-args). Precise typing here would require\n * full variadic modeling for no real safety gain in internal code.\n */\nimport Resource from '../../resource';\nimport Namespace from '../../namespace';\nimport K from '../../../../utils/k';\nimport type { RouterNamespace } from '../../index';\nimport type { RouterDefinitionBuilder } from '../interfaces';\nimport ControllerMissingError from '../../../../errors/controller-missing-error';\n\nimport createDefinitionGroup from './utils/create-definition-group';\nimport normalizeResourceArgs from './utils/normalize-resource-args';\n\nexport type DefinitionContext = {\n [key: string]: (...args: Array<any>) => unknown;\n};\n\n/** @internal */\nexport function contextFor(build: RouterDefinitionBuilder<RouterNamespace>) {\n return {\n create(namespace: RouterNamespace): DefinitionContext {\n let context: DefinitionContext = {\n member: K,\n resource: K,\n namespace: K,\n collection: K,\n ...createDefinitionGroup('custom', namespace)\n };\n\n if (namespace instanceof Resource) {\n context = {\n ...context,\n\n member(builder: () => void) {\n const childCtx = createDefinitionGroup('member', namespace);\n\n builder.call(childCtx);\n },\n\n collection(builder: () => void) {\n const childCtx = createDefinitionGroup('collection', namespace);\n\n builder.call(childCtx);\n }\n };\n } else {\n context = {\n ...context,\n\n namespace(name: string, builder?: () => void) {\n const { isRoot, controllers } = namespace;\n let { path } = namespace;\n\n path = isRoot ? `/${name}` : `${path}/${name}`;\n\n const controllerKey = `${path.substr(1)}/application`;\n const controller = controllers.get(controllerKey);\n\n if (!controller) {\n throw new ControllerMissingError(controllerKey);\n }\n\n const child = new Namespace({\n name,\n path,\n namespace,\n controller,\n controllers\n });\n\n build(builder, child);\n namespace.add(child);\n },\n\n resource(...args: Array<any>) {\n const { controllers } = namespace;\n const [opts, builder] = normalizeResourceArgs(args);\n let path;\n\n if (namespace.isRoot) {\n path = opts.path;\n } else {\n path = namespace.path + opts.path;\n }\n\n const controllerKey = path\n .split('/')\n .filter(Boolean)\n .reduce<Array<string>>(\n (arr, str, index, parts) => [\n ...arr,\n index === parts.length - 1 ? opts.name : str\n ],\n []\n )\n .join('/');\n\n const controller = controllers.get(controllerKey);\n\n if (!controller) {\n throw new ControllerMissingError(controllerKey);\n }\n\n const child = new Resource({\n ...opts,\n path,\n namespace,\n controller,\n controllers\n });\n\n build(builder, child);\n namespace.add(child);\n }\n };\n }\n\n return context;\n }\n };\n}\n", "import { primaryKeyType } from '../../database';\nimport type Controller from '../../controller';\n\nexport type Replacer = (pathname: string) => {\n // The path with each id replaced by `:dynamic` (`/posts/:dynamic`).\n staticPath: string;\n\n // The ids, in order, as written in the path (percent-decoded).\n params: Array<string>;\n};\n\nconst INTEGER = /^\\d+$/;\n\n/** @internal */\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/** @internal */\nfunction decode(value: string): string {\n try {\n return decodeURIComponent(value);\n } catch {\n return value;\n }\n}\n\n/**\n * The resource name a controller's member routes are addressed by.\n *\n * @internal\n */\nfunction nameFor(controller: Controller): string {\n const { model, namespace } = controller;\n\n if (model) {\n return model.resourceName;\n }\n\n const name = controller.constructor.name\n .replace(/controller/gi, '')\n .toLowerCase();\n\n return namespace\n .split('/')\n .reduce((str, part) => str.replace(new RegExp(part, 'ig'), ''), name);\n}\n\n/**\n * Build the function that finds the ids in a request path: the segment after\n * a resource name. An id must be an integer unless the resource's primary key\n * is not numeric (e.g. a uuid), in which case any segment is one.\n *\n * @internal\n */\nexport default function createReplacer(\n controllers: Map<string, Controller>\n): Replacer {\n // Resources whose ids are not (necessarily) integers, lowercased.\n const anyId = new Set<string>();\n const names = new Set<string>();\n\n controllers.forEach(controller => {\n const name = nameFor(controller);\n\n names.add(name);\n\n if (controller.model && primaryKeyType(controller.model) !== 'number') {\n anyId.add(name.toLowerCase());\n }\n });\n\n if (!names.size) {\n return pathname => ({ staticPath: pathname, params: [] });\n }\n\n const pattern = new RegExp(\n `(^|/)(${Array.from(names, escapeRegExp).join('|')})/([^/]+)`,\n 'gi'\n );\n\n return pathname => {\n const params: Array<string> = [];\n const staticPath = pathname.replace(\n pattern,\n (match: string, separator: string, name: string, id: string) => {\n if (!anyId.has(name.toLowerCase()) && !INTEGER.test(id)) {\n return match;\n }\n\n params.push(decode(id));\n return `${separator}${name}/:dynamic`;\n }\n );\n\n return { staticPath, params };\n };\n}\n", "import { FreezeableMap } from '../freezeable';\nimport { REQUEST_METHODS } from '../server';\nimport type { Request, RequestMethod } from '../server';\n\nimport Namespace from './namespace';\nimport Route, { DYNAMIC_PATTERN } from './route';\nimport { build, define } from './definitions';\nimport createReplacer from './utils/create-replacer';\nimport type { Replacer } from './utils/create-replacer';\nimport type { RouterOptions } from './interfaces';\n\n/**\n * Remove each related route (`/posts/:dynamic/comments`) whose type is not\n * served the way it would serve it: its resource in the same namespace must\n * route `index` for a to-many relationship and `show` for a to-one. A type a\n * namespace does not list (or only lets clients `create`) stays unlisted.\n *\n * @internal\n */\nfunction dropUnservedRelated(router: Router): void {\n router.forEach((route, key) => {\n const { type, controller, related, relationship = '', staticPath } = route;\n\n if (type !== 'related' || !related || !key.startsWith('GET:')) {\n return;\n }\n\n const toMany =\n controller.model.relationshipFor(relationship)?.type === 'hasMany';\n const base = related.namespace ? `/${related.namespace}` : '';\n const path = `${base}/${related.model.resourceName}`;\n\n if (!router.has(`GET:${toMany ? path : `${path}/:dynamic`}`)) {\n ['GET', 'HEAD', 'OPTIONS'].forEach(method => {\n router.delete(`${method}:${staticPath}`);\n });\n }\n });\n}\n\n/** @internal */\nclass Router extends FreezeableMap<string, Route> {\n declare replacer: Replacer;\n\n constructor({ routes, controller, controllers }: RouterOptions) {\n const definitions = build(\n routes,\n new Namespace({\n controller,\n controllers,\n path: '/',\n name: 'root'\n })\n );\n\n super();\n define(this, definitions);\n dropUnservedRelated(this);\n\n Object.defineProperty(this, 'replacer', {\n value: createReplacer(controllers),\n writable: false,\n enumerable: false,\n configurable: false\n });\n\n this.freeze();\n }\n\n /**\n * The route key path of `pathname` and the ids in it. A path some route\n * defines as is (`/users/login`) is static, so it is never read as an id.\n */\n resolve(pathname: string): { staticPath: string; params: Array<string> } {\n if (REQUEST_METHODS.some(method => this.has(`${method}:${pathname}`))) {\n return { staticPath: pathname, params: [] };\n }\n\n return this.replacer(pathname);\n }\n\n match({ method, url }: Request): void | Route {\n const { staticPath, params } = this.resolve(url.pathname);\n\n url.params = params;\n\n return this.get(`${method}:${staticPath}`);\n }\n\n /**\n * The methods some route accepts at the request's path \u2014 empty when no\n * route has the path at all.\n */\n methodsFor({ url }: Request): Array<RequestMethod> {\n const { staticPath } = this.resolve(url.pathname);\n\n return REQUEST_METHODS.filter(method =>\n this.has(`${method}:${staticPath}`)\n );\n }\n}\n\nexport default Router;\nexport { Route, DYNAMIC_PATTERN };\n\nexport type { RouterNamespace } from './interfaces';\nexport type { ResourceOptions } from './resource';\nexport type { NamespaceOptions } from './namespace';\nexport type { Action, RouteOptions, RouteType } from './route';\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * Loads a compiled app bundle (a manifest of user modules keyed by name) and\n * normalizes it into namespaced maps; the module values are genuinely untyped\n * app code (as they were `Object`/`any` in Flow).\n */\nimport { join as joinPath } from 'path';\n\nimport { Migration } from '../../database';\nimport { FreezeableMap } from '../../freezeable';\nimport { createDefaultConfig } from '../../config';\nimport merge from '../../../utils/merge';\nimport chain from '../../../utils/chain';\nimport entries from '../../../utils/entries';\n\nimport formatKey from './format-key';\n\nconst SUFFIX_PATTERN = /^.+(Controller|Down|Serializer|Up)/;\n\ntype Bundle = {\n application?: any;\n routes?: any;\n seed?: any;\n config: Record<string, any>;\n controllers: FreezeableMap<string, any>;\n migrations: FreezeableMap<string, any>;\n models: FreezeableMap<string, any>;\n serializers: FreezeableMap<string, any>;\n};\n\n/**\n * @private\n */\nfunction normalize(manifest: Record<string, any>): Bundle {\n return entries(manifest).reduce<Bundle>(\n (obj, [key, value]) => {\n if (SUFFIX_PATTERN.test(key)) {\n const suffix = key.replace(SUFFIX_PATTERN, '$1');\n const stripSuffix = (source: string) => source.replace(suffix, '');\n\n switch (suffix) {\n case 'Controller':\n obj.controllers.set(formatKey(key, stripSuffix), value);\n break;\n\n case 'Serializer':\n obj.serializers.set(formatKey(key, stripSuffix), value);\n break;\n\n case 'Up':\n case 'Down':\n obj.migrations.set(formatKey(key), new Migration(value));\n break;\n\n default:\n break;\n }\n } else {\n switch (key) {\n case 'Application':\n case 'routes':\n case 'seed':\n // `formatKey` maps these to `application`, `routes` and `seed`.\n obj[formatKey(key) as 'application' | 'routes' | 'seed'] = value;\n break;\n\n case 'config':\n obj.config = {\n ...merge(createDefaultConfig(), {\n ...obj.config,\n ...value\n })\n };\n break;\n\n case 'database':\n obj.config = {\n ...obj.config,\n database: value\n };\n break;\n\n default:\n obj.models.set(formatKey(key), value);\n break;\n }\n }\n\n return obj;\n },\n {\n config: {},\n controllers: new FreezeableMap(),\n migrations: new FreezeableMap(),\n models: new FreezeableMap(),\n serializers: new FreezeableMap()\n }\n );\n}\n\n/**\n * @private\n */\nexport default function bundleFor(path: string): FreezeableMap<string, any> {\n // The app's compiled bundle, resolved at runtime \u2014 not a module import.\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const manifest: Record<string, any> = require(\n joinPath(path, 'dist', 'bundle')\n );\n\n return chain(manifest)\n .pipe(normalize)\n .pipe(entries)\n .pipe(pairs => new FreezeableMap<string, any>(pairs))\n .value()\n .freeze();\n}\n", "import { dasherize } from 'inflection';\n\nimport chain from '../../../utils/chain';\nimport underscore from '../../../utils/underscore';\n\nconst NAMESPACE_DELIMITER = /\\$-/g;\n\n/**\n * @private\n */\nexport default function formatKey(\n key: string,\n formatter?: (source: string) => string\n) {\n return chain(key)\n .pipe(str => {\n if (formatter) {\n return formatter(str);\n }\n\n return str;\n })\n .pipe(underscore)\n .pipe(dasherize)\n .pipe(str => str.replace(NAMESPACE_DELIMITER, '/'))\n .value();\n}\n", "import { posix } from 'path';\n\nimport type { BundleNamespace } from '../../index';\n\nexport default function closestChild<T>(\n source: BundleNamespace<T>,\n key: string\n): T | undefined {\n const [[, result] = []] = Array.from(source)\n .map(([path, value]): [string, T] => [posix.basename(path), value])\n .filter(([resource]) => key === resource);\n\n return result;\n}\n", "import { FreezeableMap } from '../../freezeable';\nimport type { BundleNamespace, BundleNamespaceGroup } from '../index';\n\n/**\n * @private\n */\nexport function resolve<T>(group: BundleNamespace<T>): BundleNamespaceGroup<T> {\n return Array.from(group)\n .map(([key, value]): [string, T, string] => {\n const parts = key.split('/');\n const namespace = parts.slice(0, Math.max(parts.length - 1, 0)).join('/');\n\n if (namespace) {\n return [key.substr(namespace.length + 1), value, namespace];\n }\n\n return [key, value, 'root'];\n })\n .reduce<BundleNamespaceGroup<T>>((map, [key, value, namespace]) => {\n let nsValue = map.get(namespace);\n\n if (!nsValue) {\n nsValue = new FreezeableMap();\n }\n\n return map.set(namespace, nsValue.set(key, value));\n }, new FreezeableMap());\n}\n\nexport { default as closestAncestor } from './utils/closest-ancestor';\nexport { default as closestChild } from './utils/closest-child';\n", "import { posix } from 'path';\n\nimport type { BuilderConstruct, ParentBuilder } from '../interfaces';\nimport type { NamespaceMeta } from '../interfaces';\n\nimport sortByNamespace from './sort-by-namespace';\n\n/**\n * The parent of the closest ancestor namespace of `key` that has been built,\n * or `null` at the root. Walks up past ancestors with no entry of their own\n * (`members` when only `members/v2` has files).\n */\nfunction inheritedParent<T>(\n built: Array<NamespaceMeta<T>>,\n key: string\n): T | null {\n let namespace = key;\n\n while (namespace !== 'root') {\n const dirname = posix.dirname(namespace);\n\n namespace = dirname === '.' ? 'root' : dirname;\n\n const found = built.find(meta => meta.key === namespace);\n\n if (found) {\n return found.parent;\n }\n }\n\n return null;\n}\n\n/**\n * Build each namespace's `application` module and record it as the\n * namespace's parent, constructed with its own parent namespace's. A\n * namespace without an `application` module takes its closest ancestor's, so\n * its modules still get what the ancestors' ApplicationControllers declare\n * (hooks, settings).\n */\nexport default function createParentBuilder<T>(\n construct: BuilderConstruct<T>\n): ParentBuilder<T> {\n return target =>\n Array.from(target)\n .sort(sortByNamespace)\n .reduce<Array<NamespaceMeta<T>>>((result, [key, value]) => {\n const parentClass = value.get('application') || null;\n const inherited = key === 'root' ? null : inheritedParent(result, key);\n const parent = parentClass\n ? construct(`${key}/application`, parentClass, inherited)\n : inherited;\n\n return [\n ...result,\n {\n key,\n value,\n parent\n }\n ];\n }, []);\n}\n", "import type { BundleNamespace } from '../../index';\n\n/**\n * @private\n */\nexport default function sortByNamespace<T>(\n [a]: [string, BundleNamespace<T>],\n [b]: [string, BundleNamespace<T>]\n): number {\n if (a === 'root') {\n return -1;\n } else if (b === 'root') {\n return 1;\n }\n\n return Math.min(Math.max(a.length - b.length, -1), 1);\n}\n", "import type { BuilderConstruct, ChildrenBuilder } from '../interfaces';\n\nexport default function createChildrenBuilder<T>(\n construct: BuilderConstruct<T>\n): ChildrenBuilder<T> {\n return target =>\n target.map(({ key, value, parent }) =>\n Array.from(value).map(([name, constructor]): [string, T] => {\n const normalized = key === 'root' ? name : `${key}/${name}`;\n\n if (parent && normalized.endsWith('application')) {\n return [normalized, parent];\n }\n\n return [normalized, construct(normalized, constructor, parent)];\n })\n );\n}\n", "import { FreezeableMap } from '../../freezeable';\nimport { resolve } from '../resolver';\nimport chain from '../../../utils/chain';\nimport type { BundleNamespace } from '../index';\n\nimport createParentBuilder from './utils/create-parent-builder';\nimport createChildrenBuilder from './utils/create-children-builder';\nimport type { BuilderClass, BuilderConstruct } from './interfaces';\n\n/**\n * @private\n */\nexport function build<T>(\n group: BundleNamespace<BuilderClass<T>>,\n construct: BuilderConstruct<T>\n): BundleNamespace<T> {\n return chain(group)\n .pipe(resolve)\n .pipe(createParentBuilder(construct))\n .pipe(createChildrenBuilder(construct))\n .pipe(arr =>\n arr.reduce<Array<[string, T]>>(\n (result, value) => [...result, ...value],\n []\n )\n )\n .pipe(pairs => new FreezeableMap(pairs))\n .value();\n}\n", "import bundleFor from './utils/bundle-for';\nimport type { Loader } from './interfaces';\n\n/**\n * @private\n */\nexport function createLoader(path: string): Loader {\n let bundle: ReturnType<typeof bundleFor> | undefined;\n\n return function load(type) {\n if (!bundle) {\n bundle = bundleFor(path);\n }\n\n return bundle.get(type);\n };\n}\n\nexport { build } from './builder';\nexport { closestAncestor, closestChild } from './resolver';\n\nexport type {\n Loader,\n BundleNamespace,\n BundleNamespaceGroup\n} from './interfaces';\n", "/** @internal */\nexport default function normalizePort(port?: string | number): number {\n switch (typeof port) {\n case 'string':\n return Number.parseInt(port, 10);\n\n case 'number':\n return Math.abs(port);\n\n default:\n return 4000;\n }\n}\n", "import { posix } from 'path';\n\nimport { deepFreezeProps } from '../../freezeable';\nimport { closestAncestor } from '../../loader';\nimport { tryCatchSync } from '../../../utils/try-catch';\nimport type Database from '../../database';\nimport type { Model, ModelClass } from '../../database';\nimport { NAMESPACE_SETTINGS } from '../../controller';\nimport type Controller from '../../controller';\nimport type Serializer from '../../serializer';\nimport type { BundleNamespace } from '../../loader';\nimport type { ApplicationClass } from '../index';\n\ntype NamespaceSetting = (typeof NAMESPACE_SETTINGS)[number];\n\n/**\n * The `NAMESPACE_SETTINGS` each controller, or a namespace it is in, sets\n * itself. Once inherited, a setting is an own property of every controller,\n * so this is the only record of whether anyone chose its value.\n */\nconst explicitSettings = new WeakMap<Controller, Set<NamespaceSetting>>();\n\n/**\n * Whether `controller`, or the `ApplicationController` of a namespace it is\n * in, sets `setting` itself rather than leaving it at the default.\n *\n * @internal\n */\nexport function setsItself(\n controller: Controller,\n setting: NamespaceSetting\n): boolean {\n return explicitSettings.get(controller)?.has(setting) ?? false;\n}\n\nexport default function createController<T extends Controller>(\n constructor: ApplicationClass<T>,\n opts: {\n key: string;\n store: Database;\n parent?: Controller | null;\n serializers: BundleNamespace<Serializer<Model>>;\n }\n): T {\n const { key, store, serializers } = opts;\n const namespace = posix.dirname(key).replace('.', '');\n let { parent } = opts;\n let model: ModelClass | null | undefined = tryCatchSync(() =>\n store.modelFor(posix.basename(key))\n );\n let serializer = serializers.get(key);\n\n if (!model) {\n model = null;\n }\n\n if (!parent) {\n parent = null;\n }\n\n if (!serializer) {\n serializer = closestAncestor(serializers, key);\n }\n\n const instance: T = new constructor({\n model,\n namespace,\n serializer\n });\n\n if (serializer) {\n if (!instance.filter.length) {\n instance.filter = [...serializer.attributes];\n }\n\n if (!instance.sort.length) {\n instance.sort = [...serializer.attributes];\n }\n }\n\n const ownBefore = instance.beforeAction.map(fn => fn.bind(instance));\n const ownAfter = instance.afterAction.map(fn => fn.bind(instance));\n\n // A namespace's `ApplicationController` that extends its parent namespace's\n // (`AdminApplicationController extends ApplicationController`, to build on\n // `super.visibility`) already has the parent's hooks, as the class fields it\n // inherits \u2014 adding them again would run each one twice. Its own arrays are\n // the namespace's hooks, as with any subclass.\n const inheritsHooks =\n parent !== null &&\n posix.basename(key) === 'application' &&\n instance instanceof parent.constructor;\n\n if (parent && !inheritsHooks) {\n // The parent's hooks are bound to it already (it was created first).\n instance.beforeAction = [...parent.beforeAction, ...ownBefore];\n instance.afterAction = [...ownAfter, ...parent.afterAction];\n } else {\n instance.beforeAction = ownBefore;\n instance.afterAction = ownAfter;\n }\n\n explicitSettings.set(\n instance,\n new Set(\n NAMESPACE_SETTINGS.filter(\n setting =>\n Object.hasOwn(instance, setting) ||\n (parent !== null && setsItself(parent, setting))\n )\n )\n );\n\n if (parent) {\n // Settings the controller does not set itself come from its namespace.\n for (const setting of NAMESPACE_SETTINGS) {\n if (!Object.hasOwn(instance, setting)) {\n Object.defineProperty(instance, setting, {\n value: parent[setting],\n writable: true,\n enumerable: true,\n configurable: true\n });\n }\n }\n }\n\n Object.defineProperty(instance, 'parent', {\n value: parent,\n writable: false,\n enumerable: true,\n configurable: false\n });\n\n return deepFreezeProps(\n instance,\n true,\n 'query',\n 'sort',\n 'filter',\n 'params',\n 'beforeAction',\n 'afterAction'\n );\n}\n", "import { posix } from 'path';\n\nimport { deepFreezeProps } from '../../freezeable';\nimport { tryCatchSync } from '../../../utils/try-catch';\nimport type Serializer from '../../serializer';\nimport type { Model, ModelClass } from '../../database';\nimport type { ApplicationClass, ApplicationFactoryOptions } from '../index';\n\nexport default function createSerializer<T extends Serializer<Model>>(\n constructor: ApplicationClass<T>,\n opts: ApplicationFactoryOptions<T>\n): T {\n const { key, store } = opts;\n const namespace = posix.dirname(key).replace('.', '');\n let { parent } = opts;\n let model: ModelClass | null | undefined = tryCatchSync(() =>\n store.modelFor(posix.basename(key))\n );\n\n if (!model) {\n model = null;\n }\n\n if (!parent) {\n parent = null;\n }\n\n const instance: T = new constructor({\n model,\n parent,\n namespace\n });\n\n Object.defineProperty(instance, 'parent', {\n value: parent,\n writable: false,\n enumerable: true,\n configurable: false\n });\n\n return deepFreezeProps(instance, true, 'hasOne', 'hasMany', 'attributes');\n}\n", "import { posix } from 'path';\n\nimport NamespacedSerializerMissingError from '../../../errors/namespaced-serializer-missing-error';\nimport type Controller from '../../controller';\nimport type Serializer from '../../serializer';\nimport type { Model, ModelClass } from '../../database';\nimport type { BundleNamespace } from '../../loader';\n\n// How many relationships away from a controller's own resource `via` is:\n// `admin/comments` is 0, `admin/posts?include=comments` is 1.\nconst distance = (via: string): number => {\n const [, include] = via.split('?include=');\n\n return include ? include.split('.').length : 0;\n};\n\n/**\n * Enforce `serializerFallback = false`: for every namespace whose\n * ApplicationController sets it, each type its controllers can serialize \u2014 the\n * resource itself, and everything reachable through `include` (and so\n * `fields`) down to the controller's `maxIncludeDepth` \u2014 must have a\n * Serializer in exactly that namespace. Throws listing every gap, so a missing\n * serializer fails the boot instead of silently falling back to the root one.\n *\n * @internal\n */\nexport default function validateNamespacedSerializers(\n controllers: BundleNamespace<Controller> | Map<string, Controller>,\n serializers:\n BundleNamespace<Serializer<Model>> | Map<string, Serializer<Model>>\n): void {\n const missing = new Map<string, string>();\n\n controllers.forEach((controller, key) => {\n const { namespace, model } = controller;\n\n if (!namespace || !model) {\n return;\n }\n\n const application = controllers.get(posix.join(namespace, 'application'));\n\n if (!application || application.serializerFallback !== false) {\n return;\n }\n\n const require = (type: string, via: string) => {\n const serializerKey = posix.join(namespace, type);\n const serializer = serializers.get(serializerKey);\n\n // Report the most direct way a type is reached: by its own controller,\n // else through the shortest include path of any controller.\n if (!serializer) {\n const known = missing.get(serializerKey);\n\n if (known === undefined || distance(via) < distance(known)) {\n missing.set(serializerKey, via);\n }\n }\n\n return serializer;\n };\n\n const own = require(model.resourceName, key);\n\n if (!own) {\n return;\n }\n\n // Breadth-first, so each gap is reported through its shortest include\n // path. Direct relationships are always includable (and\n // `fields`-selectable), even with a `maxIncludeDepth` below 1.\n const depth = Math.max(controller.maxIncludeDepth, 1);\n let level: Array<[ModelClass, Serializer<Model>, Array<string>]> = [\n [model, own, []]\n ];\n\n for (let current = 1; current <= depth && level.length; current += 1) {\n const next: typeof level = [];\n\n level.forEach(([parent, serializer, path]) => {\n [...serializer.hasOne, ...serializer.hasMany].forEach(name => {\n const opts = parent.relationshipFor(name);\n\n if (!opts) {\n return;\n }\n\n const nextPath = [...path, name];\n const related = require(opts.model\n .resourceName, `${key}?include=${nextPath.join('.')}`);\n\n if (related) {\n next.push([opts.model, related, nextPath]);\n }\n });\n });\n\n level = next;\n }\n });\n\n if (missing.size) {\n throw new NamespacedSerializerMissingError(missing);\n }\n}\n", "/**\n * Thrown at boot when a namespace that opted out of serializer fallback\n * (`serializerFallback = false` on its ApplicationController) can reach a type\n * that has no Serializer in that namespace.\n *\n * @private\n */\nclass NamespacedSerializerMissingError extends ReferenceError {\n /**\n * @param missing - Each missing serializer key (`admin/comments`) with an\n * example of how it is reached (`admin/posts?include=comments`).\n */\n constructor(missing: Map<string, string>) {\n const lines = Array.from(missing)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([key, via]) => ` - ${key} (reached from ${via})`);\n\n super(\n [\n 'Missing namespaced serializers. These namespaces set ' +\n '`serializerFallback = false`, so every type their controllers ' +\n 'can serialize or include needs a serializer of its own:',\n ...lines\n ].join('\\n')\n );\n }\n}\n\nexport default NamespacedSerializerMissingError;\n", "import { dasherize, underscore } from 'inflection';\n\nimport LinksOnlyError from '../../../errors/links-only-error';\nimport type Router from '../../router';\nimport type Serializer from '../../serializer';\nimport type { Model } from '../../database';\nimport type { BundleNamespace } from '../../loader';\n\n/**\n * Check every Serializer's `linksOnly` against the built `router`: each\n * relationship must be one of its `hasMany`, and have a related endpoint\n * (`/posts/:id/comments`) in at least one namespace where the Serializer\n * formats its type \u2014 else it could never be left without its linkage.\n * Throws listing every problem.\n *\n * Whatever removes a related endpoint counts: no controller for the related\n * type in the namespace, a related resource without `index`, an owning\n * resource without `show` (or without the relationship in its\n * `relationships`), or a custom route at that path.\n *\n * @internal\n */\nexport default function validateLinksOnly(\n router: Router,\n serializers:\n BundleNamespace<Serializer<Model>> | Map<string, Serializer<Model>>\n): void {\n const problems: Array<string> = [];\n // The relationships each Serializer has a related endpoint for, in some\n // namespace that formats its type with it.\n const served = new Map<Serializer<Model>, Set<string>>();\n\n router.forEach((route, key) => {\n const { type, controller, relationship } = route;\n\n if (type !== 'related' || !relationship || !key.startsWith('GET:')) {\n return;\n }\n\n [controller.serializer, controller.serializerFor(controller.model)].forEach(\n serializer => {\n const names = served.get(serializer) || new Set<string>();\n\n names.add(relationship);\n served.set(serializer, names);\n }\n );\n });\n\n serializers.forEach((serializer, key) => {\n const { model, hasMany, linksOnly } = serializer;\n\n linksOnly.forEach(name => {\n const opts = model?.relationshipFor(name);\n\n if (!hasMany.includes(name) || opts?.type !== 'hasMany') {\n problems.push(`${key}: \\`${name}\\` is not one of its \\`hasMany\\``);\n } else if (!served.get(serializer)?.has(name)) {\n const type = opts.model.resourceName;\n\n problems.push(\n `${key}: \\`${name}\\` has no related endpoint ` +\n `(GET /${model.resourceName}/:id/${dasherize(underscore(name))}) ` +\n 'where this serializer is used \u2014 that namespace needs a ' +\n `\\`${type}\\` resource routing \\`index\\`, and ` +\n `\\`${model.resourceName}\\` must route \\`show\\` with \\`${name}\\` ` +\n 'among its `relationships`'\n );\n }\n });\n });\n\n if (problems.length) {\n throw new LinksOnlyError(problems);\n }\n}\n", "/**\n * Thrown at boot when a Serializer's `linksOnly` names a relationship it\n * cannot serialize as links only.\n *\n * @private\n */\nclass LinksOnlyError extends TypeError {\n /**\n * @param problems - One line per relationship, saying what is wrong.\n */\n constructor(problems: Array<string>) {\n super(\n [\n 'Invalid `linksOnly` relationships. Each must be in the ' +\n \"serializer's `hasMany`, and have a related endpoint for clients \" +\n 'to load it from wherever the serializer is used:',\n ...problems.sort().map(problem => ` - ${problem}`)\n ].join('\\n')\n );\n }\n}\n\nexport default LinksOnlyError;\n", "/**\n * Thrown at boot when a serializer's `attributes`, or a controller's `sort`\n * or `filter`, names something that is not a column of the model's table.\n *\n * @internal\n */\nclass UnknownAttributeError extends TypeError {\n /**\n * @param problems - One line per name, saying where it is listed.\n */\n constructor(problems: Array<string>) {\n super(\n [\n \"Unknown attributes. A serializer's `attributes`, and a controller's \" +\n \"`sort` and `filter`, may only name columns of the model's table \" +\n '(camelCase). To send a computed value, add it in an `afterAction` ' +\n 'hook or a custom action:',\n ...problems.sort().map(problem => ` - ${problem}`)\n ].join('\\n')\n );\n }\n}\n\nexport default UnknownAttributeError;\n", "import UnknownAttributeError from '../../../errors/unknown-attribute-error';\nimport type Controller from '../../controller';\nimport type Serializer from '../../serializer';\nimport type { Model, ModelClass } from '../../database';\nimport type { BundleNamespace } from '../../loader';\n\nconst columnsOf = (model: ModelClass) =>\n `${model.name} (table \\`${model.tableName}\\`)`;\n\n/**\n * Check that every serializer's `attributes`, and every controller's `sort`\n * and `filter`, name columns of their model. Anything else used to be\n * accepted and then silently ignored: missing from responses, and a `sort`\n * or `filter` that did nothing. Throws listing every problem.\n *\n * A controller's `sort` and `filter` default to its serializer's\n * `attributes`, so only names its serializer does not list are reported for\n * the controller.\n *\n * @internal\n */\nexport default function validateAttributes(\n controllers: BundleNamespace<Controller> | Map<string, Controller>,\n serializers:\n BundleNamespace<Serializer<Model>> | Map<string, Serializer<Model>>\n): void {\n const problems: Array<string> = [];\n\n serializers.forEach((serializer, key) => {\n const { model, attributes } = serializer;\n\n if (!model) {\n return;\n }\n\n attributes\n .filter(name => !model.attributeNames.includes(name))\n .forEach(name => {\n problems.push(\n `serializers/${key}: \\`attributes\\` lists \\`${name}\\`, which is ` +\n `not a column of ${columnsOf(model)}`\n );\n });\n });\n\n controllers.forEach((controller, key) => {\n const { model, serializer } = controller;\n\n if (!model) {\n return;\n }\n\n (['sort', 'filter'] as const).forEach(setting => {\n controller[setting]\n .filter(\n name =>\n !model.attributeNames.includes(name) &&\n !serializer?.attributes.includes(name)\n )\n .forEach(name => {\n problems.push(\n `controllers/${key}: \\`${setting}\\` lists \\`${name}\\`, which is ` +\n `not a column of ${columnsOf(model)}`\n );\n });\n });\n });\n\n if (problems.length) {\n throw new UnknownAttributeError(problems);\n }\n}\n", "/**\n * Thrown at boot when a serializer lists a field named `type` or `id`, which\n * JSON:API forbids, without `allowReservedNames`.\n *\n * @internal\n */\nclass ReservedFieldNameError extends TypeError {\n /**\n * @param problems - One line per name, saying where it is listed.\n */\n constructor(problems: Array<string>) {\n super(\n [\n 'Reserved field names. JSON:API forbids an attribute or relationship ' +\n \"named `type` or `id`: they share a namespace with the resource's \" +\n 'own `type` and `id`. Rename the column, or set ' +\n '`allowReservedNames = true` on the serializer to send it anyway:',\n ...problems.sort().map(problem => ` - ${problem}`)\n ].join('\\n')\n );\n }\n}\n\nexport default ReservedFieldNameError;\n", "import { line } from '../../logger';\nimport ReservedFieldNameError from '../../../errors/reserved-field-name-error';\nimport type Logger from '../../logger';\nimport type Serializer from '../../serializer';\nimport type { Model } from '../../database';\nimport type { BundleNamespace } from '../../loader';\n\n// JSON:API 1.0, \"Fields\": a resource's attributes and relationships share a\n// namespace with its `type` and `id`, so neither may be a field's name.\nconst RESERVED = new Set(['type', 'id']);\n\n/**\n * Refuse to boot when a serializer's `attributes`, `hasOne` or `hasMany`\n * names `type` or `id`, listing every one; warn instead for a serializer that\n * sets `allowReservedNames`.\n *\n * @internal\n */\nexport default function validateReservedNames(\n serializers:\n BundleNamespace<Serializer<Model>> | Map<string, Serializer<Model>>,\n logger: Logger\n): void {\n const problems: Array<string> = [];\n\n serializers.forEach((serializer, key) => {\n (['attributes', 'hasOne', 'hasMany'] as const).forEach(setting => {\n const names = serializer[setting].filter(name => RESERVED.has(name));\n\n if (!names.length) {\n return;\n }\n\n const where =\n `serializers/${key}: \\`${setting}\\` lists ` +\n names.map(name => `\\`${name}\\``).join(', ');\n\n if (serializer.allowReservedNames) {\n logger.warn(line`\n ${where}, which JSON:API forbids as a field name. Sent anyway:\n \\`allowReservedNames\\` is set.\n `);\n } else {\n problems.push(where);\n }\n });\n });\n\n if (problems.length) {\n throw new ReservedFieldNameError(problems);\n }\n}\n", "import { posix } from 'path';\n\nimport Controller from '../../controller';\nimport { VisibilityConfigError } from '../../controller/visibility/errors';\nimport type { Visibility } from '../../controller';\nimport type { ModelClass } from '../../database';\nimport type { BundleNamespace } from '../../loader';\n\ntype ControllerClass = { visibility?: Visibility };\n\nconst rulesOf = (controller: Controller): Visibility | undefined =>\n (controller.constructor as ControllerClass).visibility;\n\n/**\n * Whether an `ApplicationController` has rules of its own: declared on its\n * class, or inherited from a class other than `Controller` (whose `{}` is\n * only the default). One extending `Controller` without declaring any \u2014\n * e.g. to add a hook \u2014 has none, and takes its parent namespace's.\n */\nconst declaresRules = (application: Controller): boolean =>\n rulesOf(application) !== Controller.visibility;\n\n/**\n * The rules that govern `key`'s namespace: those of the closest\n * `ApplicationController`, from the namespace's own up, that has rules.\n *\n * Walks up with `dirname()` until it stops changing the path \u2014 at `.` for the\n * relative keys the loader produces, at `/` for anything else \u2014 so the walk\n * ends whatever the key.\n */\nfunction rulesFor(\n controllers: BundleNamespace<Controller> | Map<string, Controller>,\n key: string\n): Visibility | undefined {\n let namespace = posix.dirname(key);\n let previous: string | undefined;\n\n while (namespace !== previous) {\n const application = controllers.get(\n namespace === '.' ? 'application' : `${namespace}/application`\n );\n\n if (application && declaresRules(application)) {\n return rulesOf(application);\n }\n\n previous = namespace;\n namespace = posix.dirname(namespace);\n }\n\n return undefined;\n}\n\n/**\n * Give every controller the visibility rules of its namespace \u2014 the\n * `static visibility` of the namespace's `ApplicationController`, or, when it\n * has none or declares none, the closest ancestor namespace's \u2014 and whether\n * any were declared (`hasVisibilityRules`), and refuse to boot on rules that\n * cannot be applied: rules declared on any other controller (a rule must hold for the\n * whole namespace, since types are included across controllers), rules for a\n * type that has no model, and rules that are not functions.\n *\n * @internal\n */\nexport default function resolveVisibility(\n controllers: BundleNamespace<Controller> | Map<string, Controller>,\n models: Iterable<ModelClass>\n): void {\n const types = new Set(Array.from(models, model => model.resourceName));\n const problems: Array<string> = [];\n\n controllers.forEach((controller, key) => {\n const isApplication = posix.basename(key) === 'application';\n const ctor = controller.constructor;\n\n if (!isApplication && Object.hasOwn(ctor, 'visibility')) {\n problems.push(\n `${key}: declare rules on the namespace's ApplicationController ` +\n 'instead; they apply to every controller in it.'\n );\n }\n\n if (isApplication) {\n const rules = rulesOf(controller) ?? {};\n\n if (typeof rules !== 'object' || rules === null) {\n problems.push(`${key}: \\`visibility\\` must be an object.`);\n } else {\n Object.entries(rules).forEach(([type, rule]) => {\n if (!types.has(type)) {\n problems.push(`${key}: no model for type \"${type}\".`);\n } else if (typeof rule !== 'function') {\n problems.push(`${key}: the rule for \"${type}\" is not a function.`);\n }\n });\n }\n }\n });\n\n if (problems.length) {\n throw new VisibilityConfigError(problems);\n }\n\n controllers.forEach((controller, key) => {\n const rules = rulesFor(controllers, key);\n\n Object.defineProperties(controller, {\n visibility: {\n value: Object.freeze({ ...(rules ?? {}) }),\n writable: false,\n enumerable: false,\n configurable: false\n },\n hasVisibilityRules: {\n value: rules !== undefined,\n writable: false,\n enumerable: false,\n configurable: false\n }\n });\n });\n}\n", "import { line } from '../../logger';\nimport type Logger from '../../logger';\nimport type Controller from '../../controller';\n\nimport { setsItself } from './create-controller';\n\n/**\n * Give the controllers of a namespace without visibility rules \u2014 neither its\n * own nor an ancestor's, run after `resolveVisibility()` \u2014 conservative\n * defaults, and warn once per such namespace that serves records.\n *\n * Without rules, nothing scopes what a request reaches beyond its primary\n * data: an `index` or `show` override, or a hook checking `request.action`,\n * does not apply to included resources or to the relationship and related\n * endpoints. So unless a controller (or its namespace) sets\n * `maxIncludeDepth`, `?include=` is turned off (`0`); the router serves\n * relationship endpoints only where a resource's `relationships` option asks\n * for them. Declaring rules \u2014 `static visibility = {}` for a namespace that\n * may see everything \u2014 lifts both.\n *\n * @internal\n */\nexport default function restrictOpenNamespaces(\n controllers: Map<string, Controller>,\n logger: Logger\n): void {\n const open = new Set<string>();\n\n controllers.forEach(controller => {\n if (controller.hasVisibilityRules) {\n return;\n }\n\n if (!setsItself(controller, 'maxIncludeDepth')) {\n Object.defineProperty(controller, 'maxIncludeDepth', {\n value: 0,\n writable: true,\n enumerable: true,\n configurable: true\n });\n }\n\n if (controller.hasModel) {\n open.add(controller.namespace);\n }\n });\n\n open.forEach(namespace => {\n const file = namespace\n ? `app/controllers/${namespace}/application.js`\n : 'app/controllers/application.js';\n\n logger.warn(line`\n Namespace '/${namespace}' has no visibility rules, so it serves no\n includes and its resources serve no relationship or related endpoints,\n unless a controller or route turns them on. Scoping in an index or show\n override, or in a hook checking request.action, covers only the primary\n data. Declare the rules in ${file}; \\`static visibility = {}\\` if the\n namespace may see everything.\n `);\n });\n}\n", "import { line } from '../../logger';\nimport type Logger from '../../logger';\nimport type Controller from '../../controller';\n\n// JSON:API 1.0, \"Query Parameters\": implementation specific query parameters\n// \"MUST contain at least one non a-z character\".\nconst RESERVED_SHAPE = /^[a-z]+$/;\n\n/**\n * Warn at boot about custom `query` parameters whose names the spec reserves\n * for itself (all lowercase a-z, e.g. `search`). They keep working; a\n * spec-aware client or a future version of the spec may not agree.\n *\n * @internal\n */\nexport default function warnQueryParamNames(\n controllers: Map<string, Controller>,\n logger: Logger\n): void {\n controllers.forEach((controller, key) => {\n const names = controller.query.filter(name => RESERVED_SHAPE.test(name));\n\n if (names.length) {\n logger.warn(line`\n Custom query parameters of '${key}' (${names.join(', ')}) only use the\n characters a-z, a shape JSON:API reserves for its own parameters.\n Rename them to include a non a-z character, e.g. 'search' to\n 'searchTerm' or 'search-term'.\n `);\n }\n });\n}\n", "import { createDefaultConfig } from '../config';\nimport merge from '../../utils/merge';\nimport type Logger from '../logger';\nimport type Router from '../router';\nimport type Server from '../server';\nimport type Controller from '../controller';\nimport type Serializer from '../serializer';\nimport type Database from '../database';\nimport type { Model, ModelClass } from '../database';\nimport type { FreezeableMap } from '../freezeable';\n\nimport initialize from './initialize';\nimport type { ApplicationOptions } from './interfaces';\n\n/**\n * A running Lumen app: its models, controllers, serializers, routes and HTTP\n * server. `app/index.js` exports a subclass, usually empty:\n *\n * ```javascript\n * import { Application } from 'lumen-framework';\n *\n * class Blog extends Application {}\n *\n * export default Blog;\n * ```\n *\n * `lumen serve` builds the app and constructs it; constructing one resolves\n * once the database is connected, every module is loaded and the server is\n * listening.\n */\nclass Application {\n /** The app's root directory. */\n declare path: string;\n\n /** The port the app listens on. */\n declare port: number;\n\n /**\n * A reference to the `Database` instance.\n *\n * @internal\n */\n declare store: Database;\n\n /**\n * A reference to the `Logger` instance.\n *\n * @internal\n */\n declare logger: Logger;\n\n /**\n * A reference to the `Router` instance.\n *\n * @internal\n */\n declare router: Router;\n\n /**\n * A reference to the `Server` instance.\n *\n * @internal\n */\n declare server: Server;\n\n /**\n * A map containing each `Model` class.\n *\n * @internal\n */\n declare models: FreezeableMap<string, ModelClass>;\n\n /**\n * A map containing each `Controller` instance.\n *\n * @internal\n */\n declare controllers: FreezeableMap<string, Controller>;\n\n /**\n * A map containing each `Serializer` instance.\n *\n * @internal\n */\n declare serializers: FreezeableMap<string, Serializer<Model>>;\n\n /**\n * Boot the app. Resolves with the ready instance, though TypeScript types\n * it as the instance itself; `await` it.\n */\n constructor(opts: ApplicationOptions) {\n // Applications construct asynchronously (see Database/Watcher); `new\n // Application()` resolves to the ready instance, and TS cannot type a\n // Promise-returning constructor.\n return initialize(\n this,\n merge(createDefaultConfig(), opts)\n ) as unknown as Application;\n }\n\n /**\n * Stop the application gracefully: the server stops accepting connections\n * and closes idle ones, the requests in flight finish, and then the\n * database connections close. Resolves once all of that is done.\n *\n * `lumen serve` calls it in each worker when the process is asked to stop\n * (`SIGTERM`, `SIGINT`); call it yourself when you construct an\n * application in a script or a test.\n */\n async close(): Promise<void> {\n const { server, store } = this;\n\n if (server.instance.listening) {\n await new Promise<void>((resolve, reject) => {\n server.instance.close(err => (err ? reject(err) : resolve()));\n // Keep-alive connections with no request in flight would otherwise\n // hold `close()` open until they time out.\n server.instance.closeIdleConnections();\n });\n }\n\n await store.connection.destroy();\n }\n}\n\nexport default Application;\nexport type {\n ApplicationOptions,\n ApplicationClass,\n ApplicationFactoryOptions\n} from './interfaces';\n", "import type { Response } from '../../server';\n\n/**\n * Create a Proxy that will trap typical node middleware callback invocations\n * and route them to the appropriate Promise callback (resolve or reject).\n *\n * @internal\n */\nexport default function createResponseProxy(\n res: Response,\n resolve: (result: unknown) => void\n): Response {\n return new Proxy(res, {\n get(target, key) {\n switch (key) {\n case 'end':\n case 'send':\n case 'json':\n return resolve;\n\n default:\n // eslint-disable-next-line no-restricted-properties -- proxy forwarding\n return Reflect.get(target, key);\n }\n }\n });\n}\n", "import type { Action } from '../router';\nimport type { Request, Response } from '../server';\n\nimport createResponseProxy from './utils/create-response-proxy';\n\n/**\n * Wrap Connect-style middleware \u2014 `(req, res, next)`, the Express\n * convention \u2014 as a {@link Controller.beforeAction} hook.\n *\n * ```javascript\n * import { Controller, lumenify } from 'lumen-framework';\n *\n * function poweredBy(req, res, next) {\n * res.setHeader('X-Powered-By', 'lumen');\n * next();\n * }\n *\n * class ApplicationController extends Controller {\n * beforeAction = [lumenify(poweredBy)];\n * }\n * ```\n *\n * `next()` continues the request and `next(error)` ends it with that error;\n * ending the response in the middleware ends the request too.\n *\n * @param middleware - The middleware to wrap.\n * @returns A hook that resolves when the middleware calls `next`.\n */\nexport default function lumenify(\n middleware: (req: Request, res: Response, next: (err?: Error) => void) => void\n): Action<unknown> {\n const result = function (req: Request, res: Response) {\n return new Promise<unknown>((resolve, reject) => {\n middleware(req, createResponseProxy(res, resolve), (err?: Error) => {\n if (err && err instanceof Error) {\n reject(err);\n } else {\n resolve(undefined);\n }\n });\n });\n };\n\n Object.defineProperty(result, 'name', {\n value: middleware.name\n });\n\n return result;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["format", "format", "stat", "format", "Client", "resolve", "resolve", "initialize", "pluralize", "camelize", "scopes", "camelize", "camelize", "singularize", "resolve", "camelize", "singularize", "resolve", "resolve", "camelize", "scopes", "camelize", "camelize", "camelize", "camelize", "camelize", "camelize", "_", "createRunner", "camelize", "dasherize", "singularize", "normalize", "normalize", "scopes", "dasherize", "camelize", "singularize", "dasherize", "dasherize", "initialize", "createRunner", "resolve", "scopes", "pluralize", "initialize", "camelize", "camelize", "camelize", "dasherize", "camelize", "dasherize", "memberName", "camelize", "resource", "resolve", "DOCUMENT_MEMBERS", "JSON_TYPE", "validateRelationships", "camelize", "validateRelationships", "posix", "dasherize", "camelize", "camelize", "resource", "dasherize", "base", "posix", "cluster", "pairs", "validateType", "validateOne", "validateType", "validateType", "paramsFor", "paramsFor", "posix", "dasherize", "underscore", "resource", "define", "build", "posix", "dasherize", "underscore", "INTEGER", "nameFor", "base", "joinPath", "dasherize", "dasherize", "normalize", "joinPath", "pairs", "posix", "resource", "map", "posix", "posix", "build", "pairs", "posix", "posix", "posix", "posix", "posix", "posix", "require", "dasherize", "underscore", "dasherize", "underscore", "posix", "posix", "initialize", "build", "cluster", "initialize", "resolve", "resolve", "resolve"]
7
7
  }