lumen-framework 3.1.0 → 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 +3284 -1720
  6. package/dist/index.js.map +4 -4
  7. package/dist/index.mjs +3263 -1699
  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
package/dist/cli.cjs.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/packages/cli/commands/index.ts", "../src/packages/cli/commands/build.ts", "../src/constants.ts", "../src/packages/compiler/index.ts", "../src/packages/fs/index.ts", "../src/packages/fs/watcher/index.ts", "../src/packages/fs/watcher/initialize.ts", "../src/utils/exec.ts", "../src/utils/k.ts", "../src/utils/try-catch.ts", "../src/packages/fs/utils/is-js-file.ts", "../src/packages/freezeable/constants.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/fs/utils/create-resolver.ts", "../src/packages/fs/utils/create-path-remover.ts", "../src/packages/fs/utils/rmrf.ts", "../src/packages/fs/utils/exists.ts", "../src/packages/fs/utils/parse-path.ts", "../src/utils/chain.ts", "../src/packages/compiler/utils/create-manifest.ts", "../src/utils/underscore.ts", "../src/utils/compose.ts", "../src/packages/compiler/utils/format-name.ts", "../src/packages/compiler/utils/create-boot-script.ts", "../src/packages/template/utils/insert-values.ts", "../src/packages/template/index.ts", "../src/packages/cli/commands/create.ts", "../src/packages/cli/utils/driver-for.ts", "../src/packages/cli/templates/application.ts", "../src/packages/cli/templates/config.ts", "../src/packages/cli/templates/routes.ts", "../src/packages/cli/utils/indent.ts", "../src/packages/cli/templates/database.ts", "../src/packages/cli/templates/seed.ts", "../package.json", "../src/packages/cli/templates/package-json.ts", "../src/packages/cli/templates/eslint-config.ts", "../src/packages/cli/templates/readme.ts", "../src/packages/cli/templates/license.ts", "../src/packages/cli/templates/gitignore.ts", "../src/packages/cli/generator/index.ts", "../src/packages/cli/utils/create-prompt.ts", "../src/packages/cli/generator/utils/generate-type.ts", "../src/packages/cli/generator/constants.ts", "../src/packages/database/errors/invalid-driver-error.ts", "../src/packages/database/constants.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/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/database/utils/pending-migrations.ts", "../src/packages/database/utils/normalize-model-name.ts", "../src/packages/database/model/index.ts", "../src/packages/database/query/index.ts", "../src/packages/database/query/utils/format-select.ts", "../src/packages/database/query/errors/record-not-found-error.ts", "../src/packages/database/query/runner/utils/build-results.ts", "../src/packages/database/relationship/index.ts", "../src/packages/database/relationship/utils/getters.ts", "../src/packages/database/model/initialize-class.ts", "../src/packages/server/utils/source-for.ts", "../src/packages/database/validation/errors/validation-error.ts", "../src/packages/database/migration/utils/generate-timestamp.ts", "../src/packages/database/migration/index.ts", "../src/packages/database/index.ts", "../src/packages/cli/templates/model.ts", "../src/packages/cli/templates/serializer.ts", "../src/packages/cli/templates/controller.ts", "../src/packages/cli/templates/empty-migration.ts", "../src/packages/cli/templates/model-migration.ts", "../src/packages/cli/templates/middleware.ts", "../src/packages/cli/templates/util.ts", "../src/packages/cli/generator/utils/log.ts", "../src/packages/cli/generator/utils/create-generator.ts", "../src/packages/cli/generator/utils/migration-conflict.ts", "../src/packages/cli/generator/utils/generator-for.ts", "../src/packages/cli/commands/generate.ts", "../src/packages/cli/commands/dbcreate.ts", "../src/utils/github.ts", "../src/packages/cli/constants.ts", "../src/packages/cli/errors/database-config-missing.ts", "../src/packages/loader/utils/bundle-for.ts", "../src/packages/config/index.ts", "../src/utils/merge.ts", "../src/packages/loader/utils/format-key.ts", "../src/packages/loader/index.ts", "../src/packages/cli/commands/dbdrop.ts", "../src/packages/cli/commands/dbmigrate.ts", "../src/packages/cli/commands/dbrollback.ts", "../src/packages/cli/commands/dbseed.ts", "../src/packages/cli/commands/destroy.ts", "../src/packages/cli/commands/repl.ts", "../src/packages/cli/commands/serve.ts", "../src/packages/pm/cluster/index.ts", "../src/utils/range.ts", "../src/packages/pm/index.ts", "../src/packages/cli/commands/test.ts"],
4
- "sourcesContent": ["export { build } from './build';\nexport { create } from './create';\nexport { dbcreate } from './dbcreate';\nexport { dbdrop } from './dbdrop';\nexport { dbmigrate } from './dbmigrate';\nexport { dbrollback } from './dbrollback';\nexport { dbseed } from './dbseed';\nexport { destroy } from './destroy';\nexport { generate } from './generate';\nexport { repl } from './repl';\nexport { serve } from './serve';\nexport { test } from './test';\n", "import Ora from 'ora';\n\nimport { CWD, NODE_ENV } from '../../../constants';\nimport { compile } from '../../compiler';\n\nexport async function build(useStrict: boolean = false): Promise<void> {\n const spinner = new Ora({\n text: 'Building your application...',\n spinner: 'dots'\n });\n\n spinner.start();\n\n await compile(CWD, NODE_ENV, {\n useStrict\n });\n\n spinner.stop();\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", "import path from 'path';\n\nimport * as esbuild from 'esbuild';\n\nimport { mkdir, rmrf, readdir, readdirRec, isJSFile } from '../fs';\nimport tryCatch from '../../utils/try-catch';\n\nimport createManifest from './utils/create-manifest';\nimport createBootScript from './utils/create-boot-script';\n\n/**\n * @private\n */\ntype CompileOptions = {\n useStrict?: boolean;\n};\n\n/**\n * @private\n */\nexport async function compile(\n dir: string,\n env: string,\n opts: CompileOptions = {}\n): Promise<void> {\n const { useStrict = false } = opts;\n // The framework is consumed as its built ESM bundle (sibling of the CLI\n // bundle in `dist/`), not as raw source \u2014 so the app compiler is decoupled\n // from the framework's source language.\n const local = path.join(__dirname, 'index.mjs');\n const entry = path.join(dir, 'dist', 'index.js');\n\n const assets = await Promise.all([\n readdir(path.join(dir, 'app', 'models')),\n readdir(path.join(dir, 'db', 'migrate')),\n readdirRec(path.join(dir, 'app', 'controllers')),\n readdirRec(path.join(dir, 'app', 'serializers'))\n ]).then(types => {\n let [models, migrations, controllers, serializers] = types;\n\n models = models.filter(isJSFile);\n migrations = migrations.filter(isJSFile);\n controllers = controllers.filter(isJSFile);\n serializers = serializers.filter(isJSFile);\n\n return new Map<string, Array<string> | string>([\n ['Application', path.join('app', 'index.js')],\n ['config', path.join('config', 'environments', `${env}.js`)],\n ['controllers', controllers],\n ['database', path.join('config', 'database.js')],\n ['migrations', migrations],\n ['models', models],\n ['routes', path.join('app', 'routes.js')],\n ['seed', path.join('db', 'seed.js')],\n ['serializers', serializers]\n ]);\n });\n\n // Both writers below target `dist/`, so it must exist before they run\n // concurrently \u2014 otherwise on a fresh checkout the boot script can race\n // ahead of the manifest's own `mkdir` and fail with ENOENT.\n await tryCatch(() => mkdir(path.join(dir, 'dist')));\n\n await Promise.all([\n createManifest(dir, assets, { useStrict }),\n createBootScript(dir, { useStrict })\n ]);\n\n await esbuild.build({\n entryPoints: [entry],\n outfile: path.join(dir, 'dist', 'bundle.js'),\n bundle: true,\n platform: 'node',\n format: 'cjs',\n target: 'node20',\n sourcemap: true,\n // Reproduces `rollup-plugin-lumen`: preserves each class's `.name` (Lumen keys\n // models/controllers/serializers off it) against esbuild's own renaming.\n keepNames: true,\n // Bare specifiers stay external (knex, inflection, the app's own deps);\n // relative paths and the two aliases below are bundled in. This matches the\n // old `is-external` split, with the framework itself pulled in via LUMEN_LOCAL.\n packages: 'external',\n alias: {\n // Apps import the framework as `import { Model } from 'LUMEN_LOCAL'`.\n LUMEN_LOCAL: local,\n // ...and their own tree as `app/...`.\n app: path.join(dir, 'app')\n }\n });\n\n await rmrf(entry);\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 { exec as nativeExec } from 'child_process';\nimport type { ExecOptions } from 'child_process';\n\n/**\n * @private\n */\nexport default function exec(\n cmd: string,\n opts?: ExecOptions\n): Promise<[string, string]> {\n return new Promise((resolve, reject) => {\n // `utf8` is already child_process.exec's default; passing it explicitly\n // selects the string-returning overload, so callers get `string` rather\n // than `string | Buffer` (which `ExecOptions` alone would permit).\n nativeExec(cmd, { ...opts, encoding: 'utf8' }, (err, stdout, stderr) => {\n if (err) {\n reject(err);\n return;\n }\n\n resolve([stdout, stderr]);\n });\n });\n}\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", "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", "import { extname } from 'path';\n\n/**\n * @private\n */\nexport default function isJSFile(target: string): boolean {\n return extname(target) === '.js';\n}\n", "export const FREEZER = new WeakSet<object>();\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", "/* 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 { PLATFORM } from '../../../constants';\n\n/**\n * @private\n */\nfunction createPathRemover(path: string): (src: string) => string {\n let pattern = new RegExp(`${path}(/)?(.+)`);\n\n if (PLATFORM.startsWith('win')) {\n const sep = '\\\\\\\\';\n\n pattern = new RegExp(`${path.replace(/\\\\/g, sep)}(${sep})?(.+)`);\n }\n\n return source => source.replace(pattern, '$2');\n}\n\nexport default createPathRemover;\n", "import path from 'path';\n\nimport { stat, rmdir, readdir, unlink } from '../index';\n\n/**\n * @private\n */\nfunction rmrf(target: string): Promise<boolean> {\n return stat(target)\n .then(stats => {\n if (stats && stats.isDirectory()) {\n return readdir(target);\n } else if (stats && stats.isFile()) {\n return unlink(target).then(() => []);\n }\n\n return [];\n })\n .then(files =>\n Promise.all(files.map(file => rmrf(path.join(target, file))))\n )\n .then(() => rmdir(target))\n .catch(err => {\n if (err.code === 'ENOENT') {\n return Promise.resolve();\n }\n\n return Promise.reject(err);\n })\n .then(() => true);\n}\n\nexport default rmrf;\n", "import { stat, readdir } from '../index';\n\n/**\n * @private\n */\nexport default async function exists(\n path: string | RegExp,\n dir?: string\n): Promise<boolean> {\n if (path instanceof RegExp) {\n const pattern = path;\n let files: Array<string> = [];\n\n if (dir) {\n files = await readdir(dir);\n }\n\n return files.some(file => pattern.test(file));\n }\n\n return stat(path).then(\n () => true,\n () => false\n );\n}\n", "import path from 'path';\n\nimport { CWD } from '../../../constants';\nimport chain from '../../../utils/chain';\nimport type { fs$ParsedPath } from '../index';\n\n/**\n * @private\n */\nexport default function resolvePath(\n cwd: string = CWD,\n dir: string = '',\n name: string = ''\n): fs$ParsedPath {\n return chain(name.split('/'))\n .pipe(parts => path.join(cwd, dir, ...parts))\n .pipe(path.parse)\n .pipe(({ base, ...etc }) => ({\n base,\n ...etc,\n relative: path.join(etc.dir.substr(etc.dir.indexOf(dir)), base),\n absolute: path.join(etc.dir, base)\n }))\n .value();\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 { sep, posix, basename, join as joinPath } from 'path';\n\nimport { camelize, capitalize, pluralize } from 'inflection';\n\nimport { mkdir, writeFile, appendFile } from '../../fs';\nimport chain from '../../../utils/chain';\nimport tryCatch from '../../../utils/try-catch';\nimport underscore from '../../../utils/underscore';\nimport { compose } from '../../../utils/compose';\n\nimport formatName from './format-name';\n\n/**\n * @private\n */\nfunction createExportStatement(\n name: string,\n path: string,\n isDefault: boolean = true\n): string {\n const normalized = posix.join(...path.split(sep));\n\n if (isDefault) {\n return `export {\\n default as ${name}\\n} from '../${normalized}';\\n\\n`;\n }\n\n return `export {\\n ${name}\\n} from '../${normalized}';\\n\\n`;\n}\n\n/**\n * @private\n */\nfunction createWriter(file: string) {\n const writerFor =\n (type: string, handleWrite?: (value: string) => Promise<void>) =>\n (value: Array<string>) => {\n const formatSymbol = compose(\n (str: string) => str + capitalize(type),\n formatName\n );\n\n return Promise.all(\n value.map(item => {\n if (handleWrite) {\n return handleWrite(item);\n }\n\n const path = joinPath('app', pluralize(type), item);\n const symbol = formatSymbol(item);\n\n return appendFile(file, createExportStatement(symbol, path));\n })\n );\n };\n\n return {\n controllers: writerFor('controller'),\n serializers: writerFor('serializer'),\n\n models: writerFor('model', async item => {\n const path = joinPath('app', 'models', item);\n const name = formatName(item);\n\n return appendFile(file, createExportStatement(name, path));\n }),\n\n migrations: writerFor('migration', async item => {\n const path = joinPath('db', 'migrate', item);\n const name = chain(item)\n .pipe(str => basename(str, '.js'))\n .pipe(underscore)\n .pipe(str => str.substr(17))\n .pipe(str => camelize(str, true))\n .value();\n\n await appendFile(\n file,\n createExportStatement(`up as ${name}Up`, path, false)\n );\n\n await appendFile(\n file,\n createExportStatement(`down as ${name}Down`, path, false)\n );\n })\n };\n}\n\n/**\n * @private\n */\nexport default async function createManifest(\n dir: string,\n assets: Map<string, Array<string> | string>,\n { useStrict }: { useStrict: boolean }\n): Promise<void> {\n const dist = joinPath(dir, 'dist');\n const file = joinPath(dist, 'index.js');\n const writer = createWriter(file);\n\n await tryCatch(() => mkdir(dist));\n await writeFile(file, useStrict ? \"'use strict';\\n\\n\" : '');\n\n await Promise.all(\n Array.from(assets).map(([key, value]) => {\n const write = Reflect.get(writer, key);\n\n if (write) {\n return write(value);\n } else if (!write && typeof value === 'string') {\n return appendFile(file, createExportStatement(key, value));\n }\n\n return Promise.resolve();\n })\n );\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", "/* 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 { posix, dirname, basename } from 'path';\n\nimport { camelize } from 'inflection';\n\nimport underscore from '../../../utils/underscore';\nimport { compose } from '../../../utils/compose';\n\nconst DOUBLE_COLON = /::/g;\n\n/**\n * @private\n */\nconst formatName: (source: string) => string = compose(\n (name: string) => name.replace(DOUBLE_COLON, '$'),\n camelize,\n underscore,\n (name: string) => posix.join(dirname(name), basename(name, '.js'))\n);\n\nexport default formatName;\n", "import path from 'path';\n\nimport template from '../../template';\nimport { writeFile } from '../../fs';\n\n/**\n * @private\n */\nexport default async function createBootScript(\n dir: string,\n {\n useStrict\n }: {\n useStrict: boolean;\n }\n): Promise<void> {\n let data = template`\n const CWD = process.cwd();\n const { env: { PORT } } = process;\n const { Application, config, database } = require('./bundle');\n\n module.exports = new Application(\n Object.assign(config, {\n database,\n path: CWD,\n port: PORT\n })\n ).catch(err => {\n process.send({\n error: err ? err.stack : void 0,\n message: 'error'\n });\n });\n `;\n\n if (useStrict) {\n data = `'use strict';\\n\\n${data}`;\n }\n\n await writeFile(path.join(dir, 'dist', 'boot.js'), data);\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 './utils/insert-values';\n\nconst bodyPattern = /^\\n([\\s\\S]+)\\s{2}$/gm;\nconst trailingWhitespace = /\\s+$/;\n\n/**\n * Used as a template tag, so `strings` arrives as a TemplateStringsArray \u2014\n * typed as `readonly string[]`, which also accepts a plain array.\n *\n * @private\n */\nexport default function template(\n strings: readonly string[],\n ...values: unknown[]\n): string {\n const compiled = insertValues(strings, ...values);\n let [body] = compiled.match(bodyPattern) || [];\n let indentLevel = /^\\s{0,4}(.+)$/g;\n\n if (!body) {\n body = compiled;\n indentLevel = /^\\s{0,2}(.+)$/g;\n }\n\n return body\n .split('\\n')\n .slice(1)\n .map(line => {\n let str = line.replace(indentLevel, '$1');\n\n if (trailingWhitespace.test(str)) {\n str = str.replace(trailingWhitespace, '');\n }\n\n return str;\n })\n .join('\\n');\n}\n\nexport { default as insertValues } from './utils/insert-values';\n", "import { EOL } from 'os';\n\nimport Ora from 'ora';\nimport { green } from 'chalk';\n\nimport { CWD } from '../../../constants';\nimport { mkdir, writeFile } from '../../fs';\nimport template from '../../template';\nimport exec from '../../../utils/exec';\nimport driverFor from '../utils/driver-for';\nimport appTemplate from '../templates/application';\nimport configTemplate from '../templates/config';\nimport routesTemplate from '../templates/routes';\nimport dbTemplate from '../templates/database';\nimport seedTemplate from '../templates/seed';\nimport pkgJSONTemplate from '../templates/package-json';\nimport eslintConfigTemplate from '../templates/eslint-config';\nimport readmeTemplate from '../templates/readme';\nimport licenseTemplate from '../templates/license';\nimport gitignoreTemplate from '../templates/gitignore';\n\nimport { generate } from './generate';\n\n/**\n * @private\n */\nexport async function create(name: string, database: string) {\n const driver = driverFor(database);\n const project = `${CWD}/${name}`;\n\n await mkdir(project);\n\n await Promise.all([\n mkdir(`${project}/app`),\n mkdir(`${project}/config`),\n mkdir(`${project}/db`)\n ]);\n\n await Promise.all([\n mkdir(`${project}/app/models`),\n mkdir(`${project}/app/serializers`),\n mkdir(`${project}/app/controllers`),\n mkdir(`${project}/app/middleware`),\n mkdir(`${project}/app/utils`),\n mkdir(`${project}/config/environments`),\n mkdir(`${project}/db/migrate`)\n ]);\n\n await Promise.all([\n writeFile(`${project}/app/index.js`, appTemplate(name)),\n\n writeFile(`${project}/app/routes.js`, routesTemplate()),\n\n writeFile(\n `${project}/config/environments/development.js`,\n configTemplate(name, 'development')\n ),\n\n writeFile(\n `${project}/config/environments/test.js`,\n configTemplate(name, 'test')\n ),\n\n writeFile(\n `${project}/config/environments/production.js`,\n configTemplate(name, 'production')\n ),\n\n writeFile(`${project}/config/database.js`, dbTemplate(name, driver)),\n\n writeFile(`${project}/db/seed.js`, seedTemplate()),\n\n writeFile(`${project}/README.md`, readmeTemplate(name)),\n\n writeFile(`${project}/LICENSE`, licenseTemplate()),\n\n writeFile(`${project}/package.json`, pkgJSONTemplate(name, driver)),\n\n writeFile(`${project}/eslint.config.mjs`, eslintConfigTemplate()),\n\n writeFile(`${project}/.gitignore`, gitignoreTemplate())\n ]);\n\n const logOutput = template`\n ${green('create')} app/index.js\n ${green('create')} app/routes.js\n ${green('create')} bin/app.js\n ${green('create')} config/environments/development.js\n ${green('create')} config/environments/test.js\n ${green('create')} config/environments/production.js\n ${green('create')} config/database.js\n ${green('create')} db/migrate\n ${green('create')} db/seed.js\n ${green('create')} README.md\n ${green('create')} LICENSE\n ${green('create')} package.json\n ${green('create')} eslint.config.mjs\n ${green('create')} .gitignore\n `;\n\n process.stdout.write(logOutput.substr(0, logOutput.length - 1));\n process.stdout.write(EOL);\n\n await Promise.all([\n generate({\n cwd: project,\n type: 'serializer',\n name: 'application'\n }),\n\n generate({\n cwd: project,\n type: 'controller',\n name: 'application'\n })\n ]);\n\n await exec('git init && git add .', {\n cwd: project\n });\n\n process.stdout.write(`${green('initialize')} git`);\n process.stdout.write(EOL);\n\n const spinner = new Ora({\n text: 'Installing dependencies from npm...',\n spinner: 'dots'\n });\n\n spinner.start();\n\n // The database driver is already declared in the generated package.json, so a\n // plain install pulls it in \u2014 no separate `npm install --save` needed.\n await exec('npm install', {\n cwd: project\n });\n\n spinner.stop();\n}\n", "const drivers = new Map([\n ['postgres', 'pg'],\n ['sqlite', 'sqlite3'],\n ['mysql', 'mysql2']\n]);\n\nexport default function driverFor(database = 'sqlite') {\n return drivers.get(database) || 'sqlite3';\n}\n", "import { classify } from 'inflection';\n\nimport template from '../../template';\nimport chain from '../../../utils/chain';\nimport underscore from '../../../utils/underscore';\n\n/**\n * @private\n */\nexport default (name: string): string => {\n const normalized = chain(name).pipe(underscore).pipe(classify).value();\n\n return template`\n import { Application } from 'lumen-framework';\n\n class ${normalized} extends Application {\n\n }\n\n export default ${normalized};\n `;\n};\n", "import template from '../../template';\n\n/**\n * @private\n */\nexport default (name: string, env: string): string => {\n const isTestENV = env === 'test';\n const isProdENV = env === 'production';\n\n return template`\n export default {\n logging: {\n level: ${isProdENV ? \"'INFO'\" : \"'DEBUG'\"},\n format: ${isProdENV ? \"'json'\" : \"'text'\"},\n enabled: ${(!isTestENV).toString()},\n\n filter: {\n params: []\n }\n }\n };\n `;\n};\n", "import template from '../../template';\n\n/**\n * @private\n */\nexport default (): string => template`\n export default function routes() {\n\n }\n`;\n", "export default function indent(amount: number = 1): string {\n return ' '.repeat(amount);\n}\n", "import indent from '../utils/indent';\nimport underscore from '../../../utils/underscore';\n\n/**\n * @private\n */\nexport default (name: string, driver: string): string => {\n const schemaName = underscore(name);\n let driverName = driver;\n let template = 'export default {\\n';\n let username: string | undefined;\n\n if (!driverName) {\n driverName = 'sqlite3';\n }\n\n if (driverName === 'pg') {\n username = 'postgres';\n } else if (driverName !== 'pg' && driverName !== 'sqlite3') {\n username = 'root';\n }\n\n ['development', 'test', 'production'].forEach(environment => {\n template += `${indent(2)}${environment}: {\\n`;\n\n if (driverName !== 'sqlite3') {\n template += `${indent(4)}pool: 5,\\n`;\n }\n\n template += `${indent(4)}driver: '${driverName}',\\n`;\n\n if (username) {\n template += `${indent(4)}username: '${username}',\\n`;\n }\n\n switch (environment) {\n case 'development':\n template += `${indent(4)}database: '${schemaName}_dev'\\n`;\n break;\n\n case 'test':\n template += `${indent(4)}database: '${schemaName}_test'\\n`;\n break;\n\n case 'production':\n template += `${indent(4)}database: '${schemaName}_prod'\\n`;\n break;\n\n default:\n template += `${indent(4)}database: '${schemaName}_${environment}'\\n`;\n break;\n }\n\n template += `${indent(2)}}`;\n\n if (environment !== 'production') {\n template += ',\\n\\n';\n }\n });\n\n template += '\\n};\\n';\n\n return template;\n};\n", "import template from '../../template';\n\n/**\n * @private\n */\nexport default (): string => template`\n export default async function seed() {\n\n }\n`;\n", "{\n \"name\": \"lumen-framework\",\n \"version\": \"3.1.0\",\n \"description\": \"Build scalable, Node.js-powered REST APIs with almost no code.\",\n \"keywords\": [\n \"mvc\",\n \"api\",\n \"lux\",\n \"lumen\",\n \"jsonapi\",\n \"json-api\",\n \"rest\",\n \"framework\"\n ],\n \"bugs\": {\n \"url\": \"https://github.com/nickschot/lux/issues\"\n },\n \"repository\": \"github:nickschot/lux\",\n \"license\": \"MIT\",\n \"author\": \"Nick Schot <nickschot@gmail.com>\",\n \"contributors\": [\n {\n \"name\": \"Zachary Golba\",\n \"url\": \"https://github.com/zacharygolba\"\n }\n ],\n \"main\": \"dist/index.js\",\n \"module\": \"dist/index.mjs\",\n \"types\": \"./dist/types/index.d.ts\",\n \"bin\": {\n \"lumen\": \"bin/lumen\"\n },\n \"files\": [\n \"dist\",\n \"bin\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"scripts\": {\n \"build\": \"node build.mjs\",\n \"build:debugger\": \"node test/utils/debugger/build.mjs\",\n \"build:types\": \"tsc -p tsconfig.build.json\",\n \"clean\": \"shx rm -rf coverage dist test/test-app/dist\",\n \"debugger\": \"node --enable-source-maps test/utils/debugger/dist/debug.js\",\n \"format\": \"prettier --write .\",\n \"format:check\": \"prettier --check .\",\n \"lint\": \"eslint .\",\n \"prepack\": \"pnpm run build && pnpm run build:types\",\n \"test\": \"vitest run\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"ansi-regex\": \"^5.0.1\",\n \"chalk\": \"^4.1.2\",\n \"commander\": \"^2.20.3\",\n \"esbuild\": \"^0.28.1\",\n \"fb-watchman\": \"^2.0.2\",\n \"inflection\": \"^1.13.4\",\n \"knex\": \"^3.3.0\",\n \"ora\": \"^5.4.1\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"^9.39.5\",\n \"@types/inflection\": \"1.13.2\",\n \"@types/node\": \"^20.19.43\",\n \"@vitest/coverage-v8\": \"^4.1.10\",\n \"eslint\": \"^9.39.5\",\n \"eslint-config-prettier\": \"^10.1.8\",\n \"faker\": \"4.1.0\",\n \"globals\": \"^17.7.0\",\n \"lumen-framework\": \"link:.\",\n \"node-fetch\": \"^2.7.0\",\n \"prettier\": \"^3.9.5\",\n \"release-plan\": \"^0.18.0\",\n \"shx\": \"^0.3.4\",\n \"sinon\": \"2.2.0\",\n \"typescript\": \"^6.0.3\",\n \"typescript-eslint\": \"^8.64.0\",\n \"vitest\": \"^4.1.10\"\n },\n \"packageManager\": \"pnpm@10.34.5\",\n \"engines\": {\n \"node\": \">= 20\"\n },\n \"volta\": {\n \"node\": \"20.20.2\"\n }\n}\n", "import { version } from '../../../../package.json';\n\nconst LUMEN_VERSION: string = version;\n\n// The knex client name (what `driverFor` returns) -> the npm package + version\n// a generated app needs installed to actually connect. Pinned to the versions\n// CI validates (see test/test-app).\nconst DRIVER_DEPS: Record<string, { name: string; version: string }> = {\n sqlite3: { name: 'sqlite3', version: '^5.1.7' },\n pg: { name: 'pg', version: '^8.16.3' },\n mysql2: { name: 'mysql2', version: '^3.15.3' }\n};\n\n/**\n * @private\n */\nexport default (name: string, driver: string): string => {\n const dbDriver = DRIVER_DEPS[driver] || DRIVER_DEPS.sqlite3;\n\n const pkg: Record<string, unknown> = {\n name,\n version: '0.0.1',\n description: '',\n scripts: {\n start: 'lumen serve',\n test: 'lumen test',\n lint: 'eslint .'\n },\n author: '',\n license: 'MIT',\n dependencies: {\n knex: '^3.3.0',\n 'lumen-framework': LUMEN_VERSION,\n [dbDriver.name]: dbDriver.version\n },\n devDependencies: {\n '@eslint/js': '^9.39.5',\n eslint: '^9.39.5',\n globals: '^17.7.0'\n },\n engines: {\n node: '>= 20'\n }\n };\n\n // sqlite3 ships a native binary; pnpm needs its build approved explicitly.\n if (dbDriver.name === 'sqlite3') {\n pkg.pnpm = { onlyBuiltDependencies: ['sqlite3'] };\n }\n\n return `${JSON.stringify(pkg, null, 2)}\\n`;\n};\n", "/**\n * @private\n */\nexport default (): string => `import js from '@eslint/js';\nimport globals from 'globals';\n\nexport default [\n js.configs.recommended,\n {\n languageOptions: {\n ecmaVersion: 2023,\n sourceType: 'module',\n globals: {\n ...globals.node\n }\n }\n }\n];\n`;\n", "import template from '../../template';\n\n/**\n * @private\n */\nexport default (name: string): string => template`\n # ${name}\n\n ## Installation\n\n * \\`git clone https://github.com/<this-repository>\\`\n * \\`cd ${name}\\`\n * \\`npm install\\`\n\n ## Running / Development\n\n * \\`lumen serve\\`\n\n ## Testing\n\n * \\`lumen test\\`\n\n ## Further Reading / Useful Links\n * [Lumen](https://github.com/nickschot/lux/)\n * [Chai](http://chaijs.com/) / [Mocha](http://mochajs.org/)\n`;\n", "import template from '../../template';\n\n/**\n * @private\n */\nexport default (): string => template`\n The MIT License (MIT)\n\n Copyright (c) 2016\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n`;\n", "import template from '../../template';\n\n/**\n * @private\n */\nexport default (): string => template`\n # See http://help.github.com/ignore-files/ for more about ignoring files.\n\n # dependencies\n /node_modules\n\n # build\n /dist\n\n # logs\n /log\n npm-debug.log\n\n # database\n *.sqlite\n *.sqlite-journal\n *.sqlite-wal\n *.sqlite-shm\n\n # misc\n *.DS_Store\n`;\n", "import { red, green } from 'chalk';\n\nimport createPrompt from '../utils/create-prompt';\n\nimport generatorFor from './utils/generator-for';\nimport type { Generator$opts } from './interfaces';\n\n/**\n * @private\n */\nexport async function runGenerator({\n cwd,\n type,\n name,\n attrs\n}: {\n cwd: Generator$opts['cwd'];\n type: Generator$opts['type'];\n name: Generator$opts['name'];\n attrs: Generator$opts['attrs'];\n}): Promise<void> {\n const generator = generatorFor(type);\n const prompt = createPrompt();\n\n await generator({\n cwd,\n type,\n name,\n attrs,\n onConflict: path =>\n prompt.question(`${green('?')} ${red('Overwrite')} ${path}? (Y/n)\\r`)\n });\n\n prompt.close();\n}\n\nexport type {\n Generator,\n Generator$opts,\n Generator$template\n} from './interfaces';\n", "import { createInterface } from 'readline';\n\nconst YES = /^y(es)?$/i;\n\nexport default function createPrompt() {\n const prompt = createInterface({\n input: process.stdin,\n output: process.stdout\n });\n\n prompt.setPrompt('');\n\n return {\n question(text: string): Promise<boolean> {\n return new Promise(resolve => {\n prompt.question(text, answer => {\n resolve(YES.test(answer));\n });\n });\n },\n\n close(): void {\n prompt.close();\n }\n };\n}\n", "import { posix, join as joinPath } from 'path';\n\nimport { green } from 'chalk';\nimport { pluralize, singularize } from 'inflection';\n\nimport { NAMESPACED_RESOURCE_MESSAGE } from '../constants';\nimport { generateTimestamp } from '../../../database';\nimport { exists, readFile, writeFile } from '../../../fs';\nimport modelTemplate from '../../templates/model';\nimport serializerTemplate from '../../templates/serializer';\nimport controllerTemplate from '../../templates/controller';\nimport emptyMigrationTemplate from '../../templates/empty-migration';\nimport modelMigrationTemplate from '../../templates/model-migration';\nimport middlewareTemplate from '../../templates/middleware';\nimport utilTemplate from '../../templates/util';\nimport chain from '../../../../utils/chain';\nimport type { Generator$opts } from '../index';\n\nimport log from './log';\nimport createGenerator from './create-generator';\nimport { createConflictResolver, detectConflict } from './migration-conflict';\n\n/**\n * @private\n */\nexport async function controller(opts: Generator$opts): Promise<void> {\n const { cwd } = opts;\n let { name } = opts;\n\n const dir = joinPath('app', 'controllers');\n const generate = createGenerator({\n dir,\n template: controllerTemplate\n });\n\n if (!name.endsWith('application')) {\n name = pluralize(name);\n }\n\n await generate({\n ...opts,\n cwd,\n name\n });\n\n const namespace = posix.dirname(name);\n\n if (namespace !== '.') {\n const hasParent = await exists(\n joinPath(cwd, dir, ...[...namespace.split('/'), 'application.js'])\n );\n\n if (!hasParent) {\n await controller({\n ...opts,\n cwd,\n name: `${namespace}/application`,\n attrs: []\n });\n }\n }\n}\n\n/**\n * @private\n */\nexport async function serializer(opts: Generator$opts): Promise<void> {\n const { cwd } = opts;\n let { name } = opts;\n\n const dir = joinPath('app', 'serializers');\n const generate = createGenerator({\n dir,\n template: serializerTemplate\n });\n\n if (!name.endsWith('application')) {\n name = pluralize(name);\n }\n\n await generate({\n ...opts,\n cwd,\n name\n });\n\n const namespace = posix.dirname(name);\n\n if (namespace !== '.') {\n const hasParent = await exists(\n joinPath(cwd, dir, ...[...namespace.split('/'), 'application.js'])\n );\n\n if (!hasParent) {\n await serializer({\n ...opts,\n cwd,\n name: `${namespace}/application`,\n attrs: []\n });\n }\n }\n}\n\n/**\n * @private\n */\nexport function migration(opts: Generator$opts) {\n const { cwd, onConflict } = opts;\n let { name } = opts;\n\n const dir = joinPath('db', 'migrate');\n const generate = createGenerator({\n dir,\n template: emptyMigrationTemplate,\n hasConflict: detectConflict\n });\n\n name = chain(name)\n .pipe(posix.basename)\n .pipe(str => `${generateTimestamp()}-${str}`)\n .value();\n\n return generate({\n ...opts,\n cwd,\n name,\n onConflict: createConflictResolver({\n cwd,\n onConflict\n })\n });\n}\n\n/**\n * @private\n */\nexport function modelMigration(opts: Generator$opts) {\n const { cwd, onConflict } = opts;\n let { name } = opts;\n\n const dir = joinPath('db', 'migrate');\n const generate = createGenerator({\n dir,\n template: modelMigrationTemplate,\n hasConflict: detectConflict\n });\n\n name = chain(name)\n .pipe(posix.basename)\n .pipe(pluralize)\n .pipe(str => `${generateTimestamp()}-create-${str}`)\n .value();\n\n return generate({\n ...opts,\n cwd,\n name,\n onConflict: createConflictResolver({\n cwd,\n onConflict\n })\n });\n}\n\n/**\n * @private\n */\nexport async function model(opts: Generator$opts): Promise<void> {\n let { name } = opts;\n const generate = createGenerator({\n dir: joinPath('app', 'models'),\n template: modelTemplate\n });\n\n await modelMigration({ ...opts, name });\n\n name = chain(name).pipe(posix.basename).pipe(singularize).value();\n\n return generate({\n ...opts,\n name\n });\n}\n\n/**\n * @private\n */\nexport function middleware(opts: Generator$opts) {\n let { name } = opts;\n const parts = name.split('/');\n\n name = parts.pop() || name;\n\n const generate = createGenerator({\n dir: joinPath('app', 'middleware', ...parts),\n template: middlewareTemplate\n });\n\n return generate({\n ...opts,\n name\n });\n}\n\n/**\n * @private\n */\nexport function util(opts: Generator$opts) {\n let { name } = opts;\n const parts = name.split('/');\n\n name = parts.pop() || name;\n\n const generate = createGenerator({\n dir: joinPath('app', 'utils', ...parts),\n template: utilTemplate\n });\n\n return generate({\n ...opts,\n name\n });\n}\n\n/**\n * @private\n */\nexport async function resource(opts: Generator$opts) {\n await model(opts);\n await controller(opts);\n await serializer(opts);\n\n if (posix.dirname(opts.name) !== '.') {\n log(NAMESPACED_RESOURCE_MESSAGE);\n return;\n }\n\n const path = joinPath(opts.cwd, 'app', 'routes.js');\n const routes = chain(await readFile(path))\n .pipe(buf => buf.toString('utf8'))\n .pipe(str => str.split('\\n'))\n .pipe(lines =>\n lines.reduce((result, line, index, arr) => {\n const closeIndex = arr.lastIndexOf('}');\n let str = result;\n\n if (line && index <= closeIndex) {\n str += `${line}\\n`;\n }\n\n if (index + 1 === closeIndex) {\n str += ` this.resource('${pluralize(opts.name)}');\\n`;\n }\n\n return str;\n }, '')\n )\n .value();\n\n await writeFile(path, routes);\n log(`${green('update')} app/routes.js`);\n}\n", "import { dim } from 'chalk';\n\nimport template from '../../template';\n\n/**\n * TODO: Update the 'routes.js' file when generating a resource within a\n * namespace.\n */\nexport const NAMESPACED_RESOURCE_MESSAGE = template`\n\n \uD83C\uDF89 It looks like the resource you generated is within a namespace!\n\n Lumen will only update your 'routes.js' file if you generate a resource at the\\\n root namespace (i.e 'lumen generate resource users').\n\n In order to access the resource you have created, remember to manually update\\\n your 'routes.js' file.\n\n Example:\n\n export default function routes() {\n ${dim('// this resource will be accessible at /users')}\n this.resource('users');\n\n this.namespace('admin', function () {\n ${dim('// this resource will be accessible at /admin/users')}\n this.resource('users');\n });\n }\n\n`;\n", "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 { 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", "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 { 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", "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 * @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 const validName = /^(where(((Not)?(In)?)|(Raw)|(Between)))$/g;\n\n Object.assign(this, {\n shouldCount: true,\n\n snapshots: [\n ['count', '* as countAll'],\n ...this.snapshots.filter(([name]) => validName.test(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", "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", "/* 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 { 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", "/* 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", "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", "function formatInt(int: number): string {\n return (int / 10).toString().replace('.', '').substr(0, 2);\n}\n\nexport function* padding(\n char: string,\n amount: number\n): Generator<string, void, void> {\n for (let i = 0; i < amount; i += 1) {\n yield char;\n }\n}\n\nexport default function generateTimestamp(): string {\n const now = new Date();\n const timestamp =\n now.toISOString().substr(0, 10).split('-').join('') +\n formatInt(now.getHours()) +\n formatInt(now.getMinutes()) +\n formatInt(now.getSeconds()) +\n formatInt(now.getMilliseconds());\n\n return timestamp + Array.from(padding('0', 16 - timestamp.length)).join('');\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 { 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 { EOL } from 'os';\n\nimport { classify, camelize } from 'inflection';\n\nimport template from '../../template';\nimport indent from '../utils/indent';\nimport chain from '../../../utils/chain';\nimport entries from '../../../utils/entries';\nimport underscore from '../../../utils/underscore';\n\nconst VALID_ATTR = /^(\\w|-)+:(\\w|-)+$/;\nconst RELATIONSHIP = /^belongs-to|has-(one|many)$/;\n\n/**\n * @private\n */\nexport default (name: string, attrs: Array<string>) => {\n const normalized = chain(name).pipe(underscore).pipe(classify).value();\n\n return template`\n import { Model } from 'lumen-framework';\n\n class ${normalized} extends Model {\n ${entries(\n (attrs || [])\n .filter(attr => VALID_ATTR.test(attr))\n .map(attr => attr.split(':'))\n .filter(([, type]) => RELATIONSHIP.test(type))\n .reduce(\n (types, [related, type]) => {\n const key = chain(type)\n .pipe(underscore)\n .pipe(str => camelize(str, true))\n .value();\n\n const value = Reflect.get(types, key);\n\n if (value) {\n const inverse = camelize(normalized, true);\n const relatedKey = chain(related)\n .pipe(underscore)\n .pipe(str => camelize(str, true))\n .value();\n\n return {\n ...types,\n [key]: [\n ...value,\n `${indent(8)}${relatedKey}: {${EOL}` +\n `${indent(10)}inverse: '${inverse}'${EOL}` +\n `${indent(8)}}`\n ]\n };\n }\n\n return types;\n },\n {\n hasOne: [],\n hasMany: [],\n belongsTo: []\n }\n )\n )\n .filter(([, value]) => value.length)\n .reduce(\n (result, [key, value], index) =>\n chain(result)\n .pipe(str => {\n if (index && str.length) {\n return `${str}${EOL.repeat(2)}`;\n }\n\n return str;\n })\n .pipe(\n str =>\n str +\n `${indent(index === 0 ? 2 : 6)}static ${key} = {${EOL}` +\n `${value.join(`,${EOL.repeat(2)}`)}${EOL}` +\n `${indent(6)}};`\n )\n .value(),\n ''\n )}\n }\n\n export default ${normalized};\n `;\n};\n", "import { classify, camelize, pluralize } from 'inflection';\n\nimport chain from '../../../utils/chain';\nimport entries from '../../../utils/entries';\nimport underscore from '../../../utils/underscore';\nimport template from '../../template';\nimport indent from '../utils/indent';\n\n/**\n * @private\n */\nexport default (name: string, attrs: Array<string>): string => {\n let normalized = chain(name).pipe(underscore).pipe(classify).value();\n\n if (!normalized.endsWith('Application')) {\n normalized = pluralize(normalized);\n }\n\n const body = entries(\n attrs\n .filter(attr => /^(\\w|-)+:(\\w|-)+$/g.test(attr))\n .map(attr => attr.split(':'))\n .reduce(\n (obj, parts) => {\n const [, type] = parts;\n let [attr] = parts;\n let { hasOne, hasMany, attributes } = obj;\n\n attr = `${indent(8)}'${camelize(underscore(attr), true)}'`;\n\n switch (type) {\n case 'belongs-to':\n case 'has-one':\n hasOne = [...hasOne, attr];\n break;\n\n case 'has-many':\n hasMany = [...hasMany, attr];\n break;\n\n default:\n attributes = [...attributes, attr];\n }\n\n return {\n attributes,\n hasOne,\n hasMany\n };\n },\n {\n // `belongsTo` was a dead accumulator key \u2014 never destructured and, for\n // non-empty attrs, never present in the returned object \u2014 so it emitted\n // nothing. Dropped so the accumulator types cleanly.\n attributes: [] as string[],\n hasOne: [] as string[],\n hasMany: [] as string[]\n }\n )\n ).reduce((result, group, index) => {\n const [key, items] = group;\n let str = result;\n\n if (items.length) {\n const value = items.join(',\\n');\n\n if (index && str.length) {\n str += '\\n\\n';\n }\n\n str +=\n `${indent(index === 0 ? 2 : 6)}${key} = ` +\n `[\\n${value}\\n${indent(6)}];`;\n }\n\n return str;\n }, '');\n\n return template`\n import { Serializer } from 'lumen-framework';\n\n class ${normalized}Serializer extends Serializer {\n ${body}\n }\n\n export default ${normalized}Serializer;\n `;\n};\n", "import { classify, camelize, pluralize } from 'inflection';\n\nimport template from '../../template';\nimport entries from '../../../utils/entries';\nimport indent from '../utils/indent';\nimport chain from '../../../utils/chain';\nimport underscore from '../../../utils/underscore';\n\n/**\n * @private\n */\nexport default (name: string, attrs: Array<string>): string => {\n let normalized = chain(name).pipe(underscore).pipe(classify).value();\n\n if (!normalized.endsWith('Application')) {\n normalized = pluralize(normalized);\n }\n\n const body = entries(\n attrs\n .filter(attr => /^(\\w|-)+:(\\w|-)+$/g.test(attr))\n .map(attr => attr.split(':')[0])\n .reduce(\n (obj, attr) => ({\n ...obj,\n params: [\n ...obj.params,\n `${indent(8)}'${camelize(underscore(attr), true)}'`\n ]\n }),\n { params: [] as string[] }\n )\n ).reduce((result, group, index) => {\n const [key, items] = group;\n let str = result;\n\n if (items.length) {\n const value = items.join(',\\n');\n\n if (index && str.length) {\n str += '\\n\\n';\n }\n\n str +=\n `${indent(index === 0 ? 2 : 6)}${key} = ` +\n `[\\n${value}\\n${indent(6)}];`;\n }\n\n return str;\n }, '');\n\n return template`\n import { Controller } from 'lumen-framework';\n\n class ${normalized}Controller extends Controller {\n ${body}\n }\n\n export default ${normalized}Controller;\n `;\n};\n", "import template from '../../template';\n\n/**\n * @private\n */\nexport default (): string => template`\n export function up(schema) {\n\n }\n\n export function down(schema) {\n\n }\n`;\n", "import { pluralize } from 'inflection';\n\nimport template from '../../template';\nimport chain from '../../../utils/chain';\nimport indent from '../utils/indent';\nimport underscore from '../../../utils/underscore';\n\n/**\n * @private\n */\nexport default (name: string, attrs: Array<string> | string): string => {\n const indices = ['id'];\n const table = chain(name)\n .pipe(str => str.substr(24))\n .pipe(underscore)\n .pipe(pluralize)\n .value();\n\n let body = '';\n\n if (Array.isArray(attrs)) {\n body = attrs\n .filter(attr => /^(\\w|-)+:(\\w|-)+$/g.test(attr))\n .map(attr => attr.split(':'))\n .filter(([, type]) => !/^has-(one|many)$/g.test(type))\n .map(attr => {\n let [column, type] = attr;\n\n column = underscore(column);\n\n if (type === 'belongs-to') {\n type = 'integer';\n column = `${column}_id`;\n\n if (Array.isArray(indices)) {\n indices.push(column);\n }\n }\n\n return [column, type];\n })\n .map((attr, index) => {\n let [column] = attr;\n const [, type] = attr;\n const shouldIndex = indices.indexOf(column) >= 0;\n\n column = `${indent(index > 0 ? 8 : 0)}table.${type}('${column}')`;\n return shouldIndex ? `${column}.index();` : `${column};`;\n })\n .join('\\n');\n }\n\n return template`\n export function up(schema) {\n return schema.createTable('${table}', table => {\n table.increments('id');\n ${body}\n table.timestamps();\n\n table.index('created_at');\n table.index('updated_at');\n });\n }\n\n export function down(schema) {\n return schema.dropTable('${table}');\n }\n `;\n};\n", "import { camelize } from 'inflection';\n\nimport chain from '../../../utils/chain';\nimport underscore from '../../../utils/underscore';\nimport template from '../../template';\n\n/**\n * @private\n */\nexport default (name: string): string => {\n const normalized = chain(name)\n .pipe(underscore)\n .pipe(str => camelize(str, true))\n .value();\n\n return template`\n export default function ${normalized}(/*request, response*/) {\n\n }\n `;\n};\n", "import { camelize } from 'inflection';\n\nimport chain from '../../../utils/chain';\nimport underscore from '../../../utils/underscore';\nimport template from '../../template';\n\n/**\n * @private\n */\nexport default (name: string): string => {\n const normalized = chain(name)\n .pipe(underscore)\n .pipe(str => camelize(str, true))\n .value();\n\n return template`\n export default function ${normalized}() {\n\n }\n `;\n};\n", "/**\n * @private\n */\nexport default function log(data: string | Error): void {\n if (data instanceof Error) {\n process.stdout.write(`${data.stack || data.message}\\n`);\n } else {\n process.stderr.write(`${data}\\n`);\n }\n}\n", "import { join as joinPath } from 'path';\n\nimport { red, green, yellow } from 'chalk';\n\nimport { rmrf, exists, mkdirRec, writeFile, parsePath } from '../../../fs';\nimport type { Generator, Generator$template } from '../index';\n\nimport log from './log';\n\nconst FORWARD_SLASH = /\\//g;\n\n/**\n * @private\n */\nexport default function createGenerator({\n dir,\n template,\n hasConflict = exists\n}: {\n dir: string;\n template: Generator$template;\n hasConflict?: (path: string) => Promise<boolean>;\n}): Generator {\n return async ({ cwd, attrs, onConflict, ...opts }) => {\n const path = parsePath(cwd, dir, `${opts.name}.js`);\n const name = opts.name.replace(FORWARD_SLASH, '-');\n let action = green('create');\n\n await mkdirRec(path.dir);\n\n if (await hasConflict(path.absolute)) {\n const shouldContinue = await onConflict(path.relative);\n\n if (shouldContinue && typeof shouldContinue === 'string') {\n await rmrf(joinPath(path.dir, shouldContinue));\n log(`${red('remove')} ${joinPath(dir, shouldContinue)}`);\n } else if (shouldContinue && typeof shouldContinue === 'boolean') {\n action = yellow('overwrite');\n await rmrf(path.absolute);\n } else {\n log(`${yellow('skip')} ${path.relative}`);\n return;\n }\n }\n\n await writeFile(path.absolute, template(name, attrs));\n log(`${action} ${path.relative}`);\n };\n}\n", "import { exists, readdir, parsePath } from '../../../fs';\nimport type { Generator$opts } from '../index';\n\nexport function detectConflict(path: string): Promise<boolean> {\n const { dir, base } = parsePath(path);\n const pattern = new RegExp(`^\\\\d+-${base.substr(17)}$`);\n\n return exists(pattern, dir);\n}\n\nexport function createConflictResolver({\n cwd,\n onConflict\n}: {\n cwd: Generator$opts['cwd'];\n onConflict: Generator$opts['onConflict'];\n}): Generator$opts['onConflict'] {\n return async (path: string) => {\n if (await onConflict(path)) {\n const parsed = parsePath(cwd, path);\n const migrations = await readdir(parsed.dir);\n\n return (\n migrations.find(file => file.substr(17) === parsed.base.substr(17)) ||\n false\n );\n }\n\n return false;\n };\n}\n", "import type { Generator } from '../index';\n\nimport * as generators from './generate-type';\n\nexport default function generatorFor(type: string): Generator {\n const normalized = type.toLowerCase();\n const generator: void | Generator = Reflect.get(generators, normalized);\n\n if (!generator) {\n throw new Error(`Could not find a generator for '${type}'.`);\n }\n\n return generator;\n}\n", "import { CWD } from '../../../constants';\nimport { runGenerator } from '../generator';\nimport type { Generator$opts } from '../generator';\n\n/**\n * @private\n */\nexport function generate({\n cwd = CWD,\n name,\n type,\n attrs = []\n}: {\n cwd?: Generator$opts['cwd'];\n name: Generator$opts['name'];\n type: Generator$opts['type'];\n attrs?: Generator$opts['attrs'];\n}): Promise<void> {\n return runGenerator({\n cwd,\n name,\n type,\n attrs\n });\n}\n", "import { EOL } from 'os';\n\nimport { CWD, NODE_ENV, DATABASE_URL } from '../../../constants';\nimport { CONNECTION_STRING_MESSAGE } from '../constants';\nimport DatabaseConfigMissingError from '../errors/database-config-missing';\nimport { connect } from '../../database';\nimport { writeFile } from '../../fs';\nimport { createLoader } from '../../loader';\n\n/**\n * @private\n */\nexport function dbcreate() {\n const load = createLoader(CWD);\n const config = Reflect.get(load('config').database, NODE_ENV);\n\n if (!config) {\n throw new DatabaseConfigMissingError(NODE_ENV);\n }\n\n if (config.driver === 'sqlite3') {\n return writeFile(`${CWD}/db/${config.database}_${NODE_ENV}.sqlite`, '');\n }\n\n if (DATABASE_URL || config.url) {\n process.stderr.write(CONNECTION_STRING_MESSAGE);\n process.stderr.write(EOL);\n return Promise.resolve();\n }\n\n const { schema } = connect(CWD, config);\n const query = `CREATE DATABASE ${config.database}`;\n\n // Knex query builders are event emitters at runtime, but `.once` isn't on the\n // `SchemaBuilder` type surface.\n const raw = schema.raw(query) as unknown as {\n once(event: string, listener: () => void): Promise<unknown>;\n };\n\n return raw.once('query', () => {\n process.stdout.write(query);\n process.stdout.write(EOL);\n });\n}\n", "const GITHUB_URL = 'https://github.com/nickschot/lux';\n\ntype Options = {\n line?: number;\n branch?: string;\n};\n\n/**\n * @private\n */\nexport function fileLink(path: string, opts: Options = {}): string {\n const { line, branch = 'master' } = opts;\n let link = `${GITHUB_URL}/blob/${branch}/${path}`;\n\n if (line && line >= 0) {\n link += `#${line}`;\n }\n\n return link;\n}\n", "import template from '../template';\nimport { fileLink } from '../../utils/github';\n\nexport const VALID_DATABASES = [\n 'postgres',\n 'sqlite',\n 'mysql',\n 'mariadb',\n 'oracle'\n];\n\nconst DB_INTERFACE_URL = fileLink('src/packages/database/interfaces.js', {\n line: 17\n});\n\nexport const CONNECTION_STRING_MESSAGE = template`\n\n You're using a URL in your database config (config/database.js).\n\n In that case, Lumen assumes you don't need to create or drop your database.\n If you'd like to create or drop a database, set up your database config\n without the url.\n\n For guidance, see:\n ${DB_INTERFACE_URL}\n`;\n", "class DatabaseConfigMissingError extends ReferenceError {\n constructor(environment: string) {\n super(`Could not find database config for environment \"${environment}\".`);\n }\n}\n\nexport default DatabaseConfigMissingError;\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 { 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", "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 { 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 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", "import { EOL } from 'os';\n\nimport { CWD, NODE_ENV, DATABASE_URL } from '../../../constants';\nimport { CONNECTION_STRING_MESSAGE } from '../constants';\nimport DatabaseConfigMissingError from '../errors/database-config-missing';\nimport { rmrf } from '../../fs';\nimport { connect } from '../../database';\nimport { createLoader } from '../../loader';\n\n/**\n * @private\n */\nexport function dbdrop() {\n const load = createLoader(CWD);\n const config = Reflect.get(load('config').database, NODE_ENV);\n\n if (!config) {\n throw new DatabaseConfigMissingError(NODE_ENV);\n }\n\n if (config.driver === 'sqlite3') {\n return rmrf(`${CWD}/db/${config.database}_${NODE_ENV}.sqlite`);\n }\n\n if (DATABASE_URL || config.url) {\n process.stderr.write(CONNECTION_STRING_MESSAGE);\n process.stderr.write(EOL);\n return Promise.resolve();\n }\n\n const { schema } = connect(CWD, config);\n const query = `DROP DATABASE IF EXISTS ${config.database}`;\n\n // Knex query builders are event emitters at runtime, but `.once` isn't on the\n // `SchemaBuilder` type surface.\n const raw = schema.raw(query) as unknown as {\n once(event: string, listener: () => void): Promise<unknown>;\n };\n\n return raw.once('query', () => {\n process.stdout.write(query);\n process.stdout.write(EOL);\n });\n}\n", "import { EOL } from 'os';\n\nimport { CWD } from '../../../constants';\nimport Database, { pendingMigrations } from '../../database';\nimport Logger, { sql } from '../../logger';\nimport { createLoader } from '../../loader';\nimport { composeAsync } from '../../../utils/compose';\n\n/**\n * @private\n */\nexport async function dbmigrate() {\n const load = createLoader(CWD);\n\n const { database: config } = load('config');\n const models = load('models');\n const migrations = load('migrations');\n\n const { connection, schema } = await new Database({\n config,\n models,\n path: CWD,\n checkMigrations: false,\n\n logger: new Logger({ enabled: false } as ConstructorParameters<\n typeof Logger\n >[0])\n });\n\n const pending = await pendingMigrations(CWD, () => connection('migrations'));\n\n if (pending.length) {\n const runners = pending\n .map(name => {\n const version = name.replace(/^(\\d{16})-.+$/g, '$1');\n const key = name.replace(new RegExp(`${version}-(.+)\\\\.js`), '$1');\n\n return [version, migrations.get(`${key}-up`)];\n })\n .filter(([, migration]) => Boolean(migration))\n .reverse()\n .map(([version, migration]) => () => {\n const query = migration.run(schema());\n\n return query\n .on('query', () => {\n process.stdout.write(sql`${query.toString()}`);\n process.stdout.write(EOL);\n })\n .then(() =>\n connection('migrations').insert({\n version\n })\n );\n });\n\n // `composeAsync`'s variadic signature doesn't model a spread of an array\n // of thunks; the runtime contract is a list of stages returning a runner.\n await (\n composeAsync as unknown as (\n ...fns: Array<() => Promise<unknown>>\n ) => () => Promise<unknown>\n )(...runners)();\n }\n\n return true;\n}\n", "import { EOL } from 'os';\n\nimport { CWD } from '../../../constants';\nimport Database from '../../database';\nimport Logger, { sql } from '../../logger';\nimport { readdir } from '../../fs';\nimport { createLoader } from '../../loader';\n\n/**\n * @private\n */\nexport async function dbrollback() {\n const load = createLoader(CWD);\n\n const { database: config } = load('config');\n const models = load('models');\n const migrations = load('migrations');\n\n const { connection, schema } = await new Database({\n config,\n models,\n path: CWD,\n checkMigrations: false,\n\n logger: new Logger({ enabled: false } as ConstructorParameters<\n typeof Logger\n >[0])\n });\n\n const migrationFiles = await readdir(`${CWD}/db/migrate`);\n\n if (migrationFiles.length) {\n let migration;\n let version = await connection('migrations')\n .orderBy('version', 'desc')\n .first();\n\n if (version && version.version) {\n version = version.version;\n }\n\n const target = migrationFiles.find(m => m.indexOf(version) === 0);\n\n if (target) {\n migration = target.replace(new RegExp(`${version}-(.+)\\\\.js`), '$1');\n migration = migrations.get(`${migration}-down`);\n\n if (migration) {\n const query = migration.run(schema());\n\n await query.on('query', () => {\n process.stdout.write(sql`${query.toString()}`);\n process.stdout.write(EOL);\n });\n\n await connection('migrations')\n .where({\n version\n })\n .del();\n }\n }\n }\n}\n", "import { CWD } from '../../../constants';\nimport Logger from '../../logger';\nimport Database from '../../database';\nimport { createLoader } from '../../loader';\n\n/**\n * @private\n */\nexport function dbseed(): Promise<unknown> {\n const load = createLoader(CWD);\n const { database: config } = load('config');\n const seed = load('seed');\n const models = load('models');\n\n // `new Database(...)` returns a promise for the initialized store at runtime\n // (async-constructor pattern), though its static type is `Database`.\n return (\n new Database({\n config,\n models,\n path: CWD,\n logger: new Logger({\n enabled: false\n } as ConstructorParameters<typeof Logger>[0])\n }) as unknown as Promise<Database>\n ).then(store => store.connection.transaction(seed));\n}\n", "import { EOL } from 'os';\n\nimport { red, green } from 'chalk';\nimport { pluralize, singularize } from 'inflection';\n\nimport { CWD } from '../../../constants';\nimport { rmrf, exists, readdir, readFile, writeFile } from '../../fs';\n\n/**\n * @private\n */\nexport async function destroyType(type: string, name: string) {\n const normalizedType = type.toLowerCase();\n let normalizedName = name;\n let path: string | undefined;\n let migrations: Array<string>;\n\n switch (normalizedType) {\n case 'model':\n normalizedName = singularize(normalizedName);\n path = `app/${pluralize(normalizedType)}/${normalizedName}.js`;\n break;\n\n case 'migration':\n migrations = await readdir(`${CWD}/db/migrate`);\n\n // `find` may return undefined (no matching migration); pre-existing\n // behaviour lets that flow into the path as the string \"undefined\",\n // which then simply fails the `exists` check below.\n normalizedName = migrations.find(\n file => `${normalizedName}.js` === file.substr(17)\n ) as string;\n\n path = `db/migrate/${normalizedName}`;\n break;\n\n case 'controller':\n case 'serializer':\n normalizedName = pluralize(normalizedName);\n path = `app/${pluralize(normalizedType)}/${normalizedName}.js`;\n break;\n\n case 'middleware':\n path = `app/${normalizedType}/${normalizedName}.js`;\n break;\n\n case 'util':\n path = `app/${pluralize(normalizedType)}/${normalizedName}.js`;\n break;\n\n default:\n return;\n }\n\n if (await exists(`${CWD}/${path}`)) {\n await rmrf(`${CWD}/${path}`);\n\n process.stdout.write(`${red('remove')} ${path}`);\n process.stdout.write(EOL);\n }\n}\n\n/**\n * @private\n */\nexport async function destroy({ type, name }: { type: string; name: string }) {\n if (type === 'resource') {\n const routes = (await readFile(`${CWD}/app/routes.js`))\n .toString('utf8')\n .split('\\n')\n .reduce((lines, line) => {\n const pattern = new RegExp(\n `\\\\s*this.resource\\\\(('|\"|\\`)${pluralize(name)}('|\"|\\`)\\\\);?`\n );\n\n return pattern.test(line) ? lines : [...lines, line];\n }, [] as string[])\n .join('\\n');\n\n await Promise.all([\n destroyType('model', name),\n destroyType('migration', `create-${pluralize(name)}`),\n destroyType('serializer', name),\n destroyType('controller', name)\n ]);\n\n await writeFile(`${CWD}/app/routes.js`, routes);\n\n process.stdout.write(`${green('update')} app/routes.js`);\n process.stdout.write(EOL);\n } else if (type === 'model') {\n await Promise.all([\n destroyType(type, name),\n destroyType('migration', `create-${pluralize(name)}`)\n ]);\n } else {\n await destroyType(type, name);\n }\n}\n", "import path from 'path';\nimport { start as startRepl } from 'repl';\n\nimport { CWD } from '../../../constants';\nimport type Application from '../../application';\n\nexport function repl(): Promise<void> {\n // FIXME: this async executor swallows rejections from the `require` below.\n // Pre-existing behaviour, left as-is so the lint migration stays\n // behaviour-neutral \u2014 worth fixing when this file is converted to TypeScript.\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async resolve => {\n const app: Application = await Reflect.apply(require, null, [\n path.join(CWD, 'dist', 'boot')\n ]);\n\n const instance = startRepl({\n prompt: '> '\n });\n\n instance.once('exit', resolve);\n\n Object.assign(instance.context, {\n app,\n logger: app.logger,\n routes: app.router,\n [app.constructor.name]: app,\n\n ...Array.from(app.models).reduce(\n (context, [, model]) => ({\n ...context,\n [model.name]: model\n }),\n {}\n ),\n\n ...Array.from(app.controllers).reduce(\n (context, [, controller]) => ({\n ...context,\n [controller.constructor.name]: controller\n }),\n {}\n ),\n\n ...Array.from(app.serializers).reduce(\n (context, [, serializer]) => ({\n ...context,\n [serializer.constructor.name]: serializer\n }),\n {}\n )\n });\n });\n}\n", "import { cyan } from 'chalk';\n\nimport { CWD, PORT, NODE_ENV } from '../../../constants';\nimport Logger from '../../logger';\nimport { createLoader } from '../../loader';\nimport { createCluster } from '../../pm';\nimport { watch } from '../../fs';\n\nimport { build } from './build';\n\n/**\n * @private\n */\nexport async function serve({\n hot = NODE_ENV === 'development',\n cluster = false,\n useStrict = false\n}: {\n hot: boolean;\n cluster: boolean;\n useStrict: boolean;\n}): Promise<void> {\n const load = createLoader(CWD);\n const { logging } = load('config');\n const logger = new Logger(logging);\n\n if (hot) {\n const watcher = await watch(CWD);\n\n watcher.on('change', async changed => {\n await build(useStrict);\n (process as NodeJS.EventEmitter).emit('update', changed);\n });\n }\n\n createCluster({\n logger,\n path: CWD,\n port: PORT,\n maxWorkers: cluster ? undefined : 1\n }).once('ready', () => {\n logger.info(`Lumen Server listening on port: ${cyan(`${PORT}`)}`);\n });\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * The cluster manager talks to worker processes over Node's untyped IPC\n * channel: the `update` process event and worker `message` payloads carry\n * arbitrary data, so those values are genuinely untyped here (as they were\n * `Object` in Flow).\n */\nimport EventEmitter from 'events';\nimport os from 'os';\nimport cluster, { type Worker } from 'cluster';\nimport { join as joinPath } from 'path';\n\nimport { red, green } from 'chalk';\n\nimport { NODE_ENV } from '../../../constants';\nimport { line } from '../../logger';\nimport omit from '../../../utils/omit';\nimport range from '../../../utils/range';\nimport { composeAsync } from '../../../utils/compose';\nimport type Logger from '../../logger';\n\nimport type { Cluster$opts } from './interfaces';\n\n/**\n * @private\n */\nclass Cluster extends EventEmitter {\n declare path: string;\n\n declare port: number;\n\n declare logger: Logger;\n\n declare workers: Set<Worker>;\n\n declare maxWorkers: number;\n\n constructor({ path, port, logger, maxWorkers }: Cluster$opts) {\n super();\n\n Object.defineProperties(this, {\n path: {\n value: path,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n port: {\n value: port,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n logger: {\n value: logger,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n workers: {\n value: new Set(),\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n maxWorkers: {\n value: maxWorkers || os.cpus().length,\n writable: false,\n enumerable: true,\n configurable: false\n }\n });\n\n cluster.setupMaster({\n exec: joinPath(path, 'dist', 'boot.js')\n });\n\n process.on('update', (changed: Array<{ name: string }>) => {\n changed.forEach(({ name: filename }) => {\n logger.info(`${green('update')} ${filename}`);\n });\n\n this.reload();\n });\n\n this.forkAll().then(() => this.emit('ready'));\n }\n\n fork(retry: boolean = true): Promise<Worker> {\n return new Promise(resolve => {\n if (this.workers.size < this.maxWorkers) {\n const worker = cluster.fork({\n NODE_ENV,\n PORT: this.port\n });\n\n const timeout = setTimeout(() => {\n this.logger.info(line`\n Removing worker process: ${red(`${worker.process.pid}`)}\n `);\n\n clearTimeout(timeout);\n\n worker.removeAllListeners();\n worker.kill();\n\n this.workers.delete(worker);\n\n resolve(worker);\n\n if (retry) {\n this.fork(false);\n }\n }, 30000);\n\n const handleError = (err?: any) => {\n if (err) {\n this.logger.error(err);\n }\n\n this.logger.info(line`\n Removing worker process: ${red(`${worker.process.pid}`)}\n `);\n\n clearTimeout(timeout);\n\n worker.removeAllListeners();\n worker.kill();\n\n this.workers.delete(worker);\n\n resolve(worker);\n };\n\n worker.on('message', (msg: string | Record<string, any>) => {\n let data: Record<string, any> = {};\n let message = msg;\n\n if (typeof message === 'object') {\n data = omit(message, 'message');\n message = message.message;\n }\n\n switch (message) {\n case 'ready':\n this.logger.info(line`\n Adding worker process: ${green(`${worker.process.pid}`)}\n `);\n\n this.workers.add(worker);\n\n clearTimeout(timeout);\n worker.removeListener('error', handleError);\n\n resolve(worker);\n break;\n\n case 'error':\n handleError(data.error);\n break;\n\n default:\n break;\n }\n });\n\n worker.once('error', handleError);\n worker.once('exit', (code: number | null) => {\n const {\n process: { pid }\n } = worker;\n\n if (typeof code === 'number') {\n this.logger.info(line`\n Worker process: ${red(`${pid}`)} exited with code ${code}\n `);\n }\n\n this.logger.info(`Removing worker process: ${red(`${pid}`)}`);\n\n clearTimeout(timeout);\n\n worker.removeAllListeners();\n this.workers.delete(worker);\n\n this.fork();\n });\n }\n });\n }\n\n shutdown<T extends Worker>(worker: T): Promise<T> {\n return new Promise(resolve => {\n this.workers.delete(worker);\n\n const timeout = setTimeout(() => worker.kill(), 5000);\n\n worker.once('disconnect', () => {\n worker.kill();\n });\n\n worker.once('exit', () => {\n resolve(worker);\n clearTimeout(timeout);\n });\n\n worker.send('shutdown');\n worker.disconnect();\n });\n }\n\n reload() {\n if (this.workers.size) {\n const groups = Array.from(this.workers).reduce<\n Array<() => Promise<Array<Worker>>>\n >((arr, item, idx, src) => {\n if ((idx + 1) % 2) {\n const group = src.slice(idx, idx + 2);\n\n return [\n ...arr,\n () => Promise.all(group.map(worker => this.shutdown(worker)))\n ];\n }\n\n return arr;\n }, []);\n\n // groups is non-empty here (guarded by workers.size); composeAsync's\n // fixed-first-param signature can't be spread with a dynamic array.\n return (composeAsync as any)(...groups)();\n }\n\n return this.fork();\n }\n\n forkAll() {\n return Promise.race(\n Array.from(range(1, this.maxWorkers)).map(() => this.fork())\n );\n }\n}\n\nexport default Cluster;\n\nexport type { Cluster$opts } from './interfaces';\n", "/**\n * @private\n */\nexport default function* range(\n start: number,\n end: number\n): Generator<number, void, void> {\n for (let i = start; i <= end; i += 1) {\n yield i;\n }\n}\n", "import Cluster from './cluster';\nimport type { Cluster$opts } from './cluster';\n\n/**\n * @private\n */\nexport function createCluster({\n path,\n port,\n logger,\n maxWorkers\n}: Cluster$opts) {\n return new Cluster({\n path,\n port,\n logger,\n maxWorkers\n });\n}\n", "import { EOL } from 'os';\n\n/**\n * @private\n */\nexport function test(): Promise<void> {\n process.stdout.write('Coming Soon!');\n process.stdout.write(EOL);\n\n return Promise.resolve();\n}\n"],
5
- "mappings": "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",
6
- "names": ["build", "create", "destroy", "import_path", "import_fs", "import_path", "import_fb_watchman", "import_path", "resolve", "nativeExec", "path", "nativeWatch", "resolve", "watch", "joinPath", "EventEmitter", "path", "resolve", "path", "sep", "import_path", "path", "path", "import_path", "path", "path", "resolve", "fs", "resolvePath", "joinPath", "basename", "import_path", "import_inflection", "_", "import_path", "import_inflection", "path", "joinPath", "import_path", "line", "path", "path", "build", "Ora", "import_os", "import_ora", "import_chalk", "import_inflection", "template", "import_chalk", "resolve", "import_path", "import_chalk", "import_inflection", "import_chalk", "import_chalk", "ansiRegex", "createWriter", "import_chalk", "import_chalk", "path", "stat", "controller", "path", "chalk", "path", "createWriter", "import_chalk", "import_path", "path", "joinPath", "version", "migration", "initialize", "path", "cluster", "model", "import_inflection", "import_inflection", "import_inflection", "import_inflection", "import_inflection", "import_inflection", "import_inflection", "import_inflection", "import_inflection", "path", "initialize", "model", "database_default", "import_os", "import_inflection", "model_default", "import_inflection", "import_inflection", "import_inflection", "import_inflection", "import_inflection", "import_path", "import_chalk", "template", "path", "joinPath", "path", "joinPath", "generate", "model_default", "path", "line", "path", "create", "Ora", "import_os", "path", "line", "import_path", "hasOwnProperty", "import_inflection", "path", "joinPath", "path", "import_os", "import_os", "database_default", "version", "migration", "import_os", "database_default", "migration", "version", "database_default", "import_os", "import_chalk", "import_inflection", "path", "destroy", "line", "import_path", "resolve", "path", "startRepl", "model", "controller", "serializer", "import_chalk", "import_events", "import_os", "import_cluster", "import_path", "import_chalk", "EventEmitter", "path", "os", "cluster", "joinPath", "resolve", "path", "cluster", "build", "import_os"]
3
+ "sources": ["../src/packages/cli/commands/index.ts", "../src/packages/cli/utils/create-spinner.ts", "../src/constants.ts", "../src/packages/compiler/index.ts", "../src/packages/fs/index.ts", "../src/packages/fs/watcher/index.ts", "../src/packages/fs/watcher/initialize.ts", "../src/utils/exec.ts", "../src/utils/try-catch.ts", "../src/packages/fs/utils/is-js-file.ts", "../src/packages/freezeable/constants.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/fs/utils/create-resolver.ts", "../src/packages/fs/utils/create-path-remover.ts", "../src/packages/fs/utils/rmrf.ts", "../src/packages/fs/utils/exists.ts", "../src/packages/fs/utils/parse-path.ts", "../src/utils/chain.ts", "../src/packages/compiler/utils/create-manifest.ts", "../src/utils/underscore.ts", "../src/utils/compose.ts", "../src/packages/compiler/utils/format-name.ts", "../src/packages/compiler/utils/create-boot-script.ts", "../src/packages/template/utils/insert-values.ts", "../src/packages/template/index.ts", "../src/packages/cli/commands/build.ts", "../src/packages/cli/commands/create.ts", "../src/utils/chalk.ts", "../src/packages/database/constants.ts", "../src/packages/cli/utils/driver-for.ts", "../src/packages/cli/templates/application.ts", "../src/packages/cli/templates/config.ts", "../src/packages/cli/templates/routes.ts", "../src/packages/cli/utils/indent.ts", "../src/packages/cli/templates/database.ts", "../src/packages/cli/templates/seed.ts", "../package.json", "../src/packages/cli/templates/package-json.ts", "../src/packages/cli/templates/pnpm-workspace.ts", "../src/packages/cli/templates/eslint-config.ts", "../src/packages/cli/templates/readme.ts", "../src/packages/cli/templates/license.ts", "../src/packages/cli/templates/gitignore.ts", "../src/packages/cli/utils/create-prompt.ts", "../src/packages/cli/generator/utils/generate-type.ts", "../src/packages/cli/generator/constants.ts", "../src/utils/k.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/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/database/utils/pending-migrations.ts", "../src/packages/database/utils/validate-relationships.ts", "../src/packages/database/utils/normalize-model-name.ts", "../src/packages/database/model/index.ts", "../src/packages/database/query/index.ts", "../src/packages/database/query/utils/format-select.ts", "../src/packages/database/query/errors/record-not-found-error.ts", "../src/packages/database/query/runner/utils/build-results.ts", "../src/packages/database/relationship/index.ts", "../src/packages/database/relationship/utils/getters.ts", "../src/packages/database/relationship/utils/update-relationship.ts", "../src/packages/database/model/initialize-class.ts", "../src/packages/server/utils/source-for.ts", "../src/packages/database/validation/errors/validation-error.ts", "../src/packages/database/migration/utils/generate-timestamp.ts", "../src/packages/database/migration/index.ts", "../src/packages/database/index.ts", "../src/packages/cli/templates/model.ts", "../src/packages/cli/templates/serializer.ts", "../src/packages/cli/templates/controller.ts", "../src/packages/cli/templates/empty-migration.ts", "../src/packages/cli/templates/model-migration.ts", "../src/packages/cli/templates/middleware.ts", "../src/packages/cli/templates/util.ts", "../src/packages/cli/generator/utils/log.ts", "../src/packages/cli/generator/utils/create-generator.ts", "../src/packages/cli/generator/utils/migration-conflict.ts", "../src/packages/cli/generator/utils/generator-for.ts", "../src/packages/cli/generator/index.ts", "../src/packages/cli/commands/generate.ts", "../src/packages/cli/commands/dbcreate.ts", "../src/utils/github.ts", "../src/packages/cli/constants.ts", "../src/packages/cli/errors/database-config-missing.ts", "../src/packages/loader/utils/bundle-for.ts", "../src/packages/config/index.ts", "../src/utils/merge.ts", "../src/packages/loader/utils/format-key.ts", "../src/packages/loader/index.ts", "../src/packages/cli/utils/server-database.ts", "../src/packages/cli/commands/dbdrop.ts", "../src/packages/cli/utils/print-statements.ts", "../src/packages/cli/commands/dbmigrate.ts", "../src/packages/cli/commands/dbrollback.ts", "../src/packages/cli/commands/dbseed.ts", "../src/packages/cli/commands/destroy.ts", "../src/packages/cli/commands/repl.ts", "../src/packages/pm/cluster/index.ts", "../src/utils/range.ts", "../src/packages/pm/index.ts", "../src/packages/cli/commands/serve.ts"],
4
+ "sourcesContent": ["export { build } from './build';\nexport { create } from './create';\nexport { dbcreate } from './dbcreate';\nexport { dbdrop } from './dbdrop';\nexport { dbmigrate } from './dbmigrate';\nexport { dbrollback } from './dbrollback';\nexport { dbseed } from './dbseed';\nexport { destroy } from './destroy';\nexport { generate } from './generate';\nexport { repl } from './repl';\nexport { serve } from './serve';\n", "import ora, { type Ora } from 'ora';\n\n/**\n * A `dots` spinner on stderr (ora's default stream).\n *\n * ora 9 works out how many lines to clear by dividing by\n * `stream.columns ?? 80`, so a terminal that reports **0** columns \u2014 a pty\n * whose size was never set, as some `docker exec -t`/CI setups give \u2014 clears\n * Infinity lines and hangs the CLI. ora 5 used `columns || 80`. There, fall\n * back to ora's non-interactive output (a single `- text` line), which is\n * what a non-TTY gets anyway.\n *\n * @private\n */\nexport default function createSpinner(text: string): Ora {\n const { isTTY, columns } = process.stderr;\n\n return ora({\n text,\n spinner: 'dots',\n ...(isTTY && !columns ? { isEnabled: false } : {})\n });\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", "import path from 'path';\n\nimport * as esbuild from 'esbuild';\n\nimport { mkdir, rmrf, readdir, readdirRec, isJSFile } from '../fs';\nimport tryCatch from '../../utils/try-catch';\n\nimport createManifest from './utils/create-manifest';\nimport createBootScript from './utils/create-boot-script';\n\n/**\n * @private\n */\ntype CompileOptions = {\n useStrict?: boolean;\n};\n\n/**\n * @private\n */\nexport async function compile(\n dir: string,\n env: string,\n opts: CompileOptions = {}\n): Promise<void> {\n const { useStrict = false } = opts;\n // The framework is consumed as its built ESM bundle (sibling of the CLI\n // bundle in `dist/`), not as raw source \u2014 so the app compiler is decoupled\n // from the framework's source language.\n const local = path.join(__dirname, 'index.mjs');\n const entry = path.join(dir, 'dist', 'index.js');\n\n const assets = await Promise.all([\n readdir(path.join(dir, 'app', 'models')),\n readdir(path.join(dir, 'db', 'migrate')),\n readdirRec(path.join(dir, 'app', 'controllers')),\n readdirRec(path.join(dir, 'app', 'serializers'))\n ]).then(types => {\n let [models, migrations, controllers, serializers] = types;\n\n models = models.filter(isJSFile);\n migrations = migrations.filter(isJSFile);\n controllers = controllers.filter(isJSFile);\n serializers = serializers.filter(isJSFile);\n\n return new Map<string, Array<string> | string>([\n ['Application', path.join('app', 'index.js')],\n ['config', path.join('config', 'environments', `${env}.js`)],\n ['controllers', controllers],\n ['database', path.join('config', 'database.js')],\n ['migrations', migrations],\n ['models', models],\n ['routes', path.join('app', 'routes.js')],\n ['seed', path.join('db', 'seed.js')],\n ['serializers', serializers]\n ]);\n });\n\n // Both writers below target `dist/`, so it must exist before they run\n // concurrently \u2014 otherwise on a fresh checkout the boot script can race\n // ahead of the manifest's own `mkdir` and fail with ENOENT.\n await tryCatch(() => mkdir(path.join(dir, 'dist')));\n\n await Promise.all([\n createManifest(dir, assets, { useStrict }),\n createBootScript(dir, { useStrict })\n ]);\n\n await esbuild.build({\n entryPoints: [entry],\n outfile: path.join(dir, 'dist', 'bundle.js'),\n bundle: true,\n platform: 'node',\n format: 'cjs',\n target: 'node22',\n sourcemap: true,\n // Reproduces `rollup-plugin-lumen`: preserves each class's `.name` (Lumen keys\n // models/controllers/serializers off it) against esbuild's own renaming.\n keepNames: true,\n // Strictness follows `useStrict` alone. Without this, esbuild would apply\n // whatever tsconfig.json it finds above the app (its `strict` implies\n // `alwaysStrict`, even for .js files), silently overriding `--use-weak`.\n tsconfigRaw: { compilerOptions: { alwaysStrict: useStrict } },\n // Bare specifiers stay external (knex, inflection, the app's own deps);\n // relative paths and the two aliases below are bundled in. This matches the\n // old `is-external` split, with the framework itself pulled in via LUMEN_LOCAL.\n packages: 'external',\n alias: {\n // Apps import the framework as `import { Model } from 'LUMEN_LOCAL'`.\n LUMEN_LOCAL: local,\n // ...and their own tree as `app/...`.\n app: path.join(dir, 'app')\n }\n });\n\n await rmrf(entry);\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", "import { exec as nativeExec } from 'child_process';\nimport type { ExecOptions } from 'child_process';\n\n/**\n * @private\n */\nexport default function exec(\n cmd: string,\n opts?: ExecOptions\n): Promise<[string, string]> {\n return new Promise((resolve, reject) => {\n // `utf8` is already child_process.exec's default; passing it explicitly\n // selects the string-returning overload, so callers get `string` rather\n // than `string | Buffer` (which `ExecOptions` alone would permit).\n nativeExec(cmd, { ...opts, encoding: 'utf8' }, (err, stdout, stderr) => {\n if (err) {\n reject(err);\n return;\n }\n\n resolve([stdout, stderr]);\n });\n });\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", "import { extname } from 'path';\n\n/**\n * @private\n */\nexport default function isJSFile(target: string): boolean {\n return extname(target) === '.js';\n}\n", "export const FREEZER = new WeakSet<object>();\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", "/* 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 { PLATFORM } from '../../../constants';\n\n/**\n * @private\n */\nfunction createPathRemover(path: string): (src: string) => string {\n let pattern = new RegExp(`${path}(/)?(.+)`);\n\n if (PLATFORM.startsWith('win')) {\n const sep = '\\\\\\\\';\n\n pattern = new RegExp(`${path.replace(/\\\\/g, sep)}(${sep})?(.+)`);\n }\n\n return source => source.replace(pattern, '$2');\n}\n\nexport default createPathRemover;\n", "import path from 'path';\n\nimport { stat, rmdir, readdir, unlink } from '../index';\n\n/**\n * @private\n */\nfunction rmrf(target: string): Promise<boolean> {\n return stat(target)\n .then(stats => {\n if (stats && stats.isDirectory()) {\n return readdir(target);\n } else if (stats && stats.isFile()) {\n return unlink(target).then(() => []);\n }\n\n return [];\n })\n .then(files =>\n Promise.all(files.map(file => rmrf(path.join(target, file))))\n )\n .then(() => rmdir(target))\n .catch(err => {\n if (err.code === 'ENOENT') {\n return Promise.resolve();\n }\n\n return Promise.reject(err);\n })\n .then(() => true);\n}\n\nexport default rmrf;\n", "import { stat, readdir } from '../index';\n\n/**\n * @private\n */\nexport default async function exists(\n path: string | RegExp,\n dir?: string\n): Promise<boolean> {\n if (path instanceof RegExp) {\n const pattern = path;\n let files: Array<string> = [];\n\n if (dir) {\n files = await readdir(dir);\n }\n\n return files.some(file => pattern.test(file));\n }\n\n return stat(path).then(\n () => true,\n () => false\n );\n}\n", "import path from 'path';\n\nimport { CWD } from '../../../constants';\nimport chain from '../../../utils/chain';\nimport type { ParsedPath } from '../index';\n\n/**\n * @private\n */\nexport default function resolvePath(\n cwd: string = CWD,\n dir: string = '',\n name: string = ''\n): ParsedPath {\n return chain(name.split('/'))\n .pipe(parts => path.join(cwd, dir, ...parts))\n .pipe(path.parse)\n .pipe(({ base, ...etc }) => ({\n base,\n ...etc,\n relative: path.join(etc.dir.substr(etc.dir.indexOf(dir)), base),\n absolute: path.join(etc.dir, base)\n }))\n .value();\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 { sep, posix, basename, join as joinPath } from 'path';\n\nimport { camelize, capitalize, pluralize } from 'inflection';\n\nimport { mkdir, writeFile, appendFile } from '../../fs';\nimport chain from '../../../utils/chain';\nimport tryCatch from '../../../utils/try-catch';\nimport underscore from '../../../utils/underscore';\nimport { compose } from '../../../utils/compose';\n\nimport formatName from './format-name';\n\n/**\n * @private\n */\nfunction createExportStatement(\n name: string,\n path: string,\n isDefault: boolean = true\n): string {\n const normalized = posix.join(...path.split(sep));\n\n if (isDefault) {\n return `export {\\n default as ${name}\\n} from '../${normalized}';\\n\\n`;\n }\n\n return `export {\\n ${name}\\n} from '../${normalized}';\\n\\n`;\n}\n\n/**\n * @private\n */\nfunction createWriter(file: string) {\n const writerFor =\n (type: string, handleWrite?: (value: string) => Promise<void>) =>\n (value: Array<string>) => {\n const formatSymbol = compose(\n (str: string) => str + capitalize(type),\n formatName\n );\n\n return Promise.all(\n value.map(item => {\n if (handleWrite) {\n return handleWrite(item);\n }\n\n const path = joinPath('app', pluralize(type), item);\n const symbol = formatSymbol(item);\n\n return appendFile(file, createExportStatement(symbol, path));\n })\n );\n };\n\n return {\n controllers: writerFor('controller'),\n serializers: writerFor('serializer'),\n\n models: writerFor('model', async item => {\n const path = joinPath('app', 'models', item);\n const name = formatName(item);\n\n return appendFile(file, createExportStatement(name, path));\n }),\n\n migrations: writerFor('migration', async item => {\n const path = joinPath('db', 'migrate', item);\n const name = chain(item)\n .pipe(str => basename(str, '.js'))\n .pipe(underscore)\n .pipe(str => str.substr(17))\n .pipe(str => camelize(str, true))\n .value();\n\n await appendFile(\n file,\n createExportStatement(`up as ${name}Up`, path, false)\n );\n\n await appendFile(\n file,\n createExportStatement(`down as ${name}Down`, path, false)\n );\n })\n };\n}\n\n/**\n * @private\n */\nexport default async function createManifest(\n dir: string,\n assets: Map<string, Array<string> | string>,\n { useStrict }: { useStrict: boolean }\n): Promise<void> {\n const dist = joinPath(dir, 'dist');\n const file = joinPath(dist, 'index.js');\n const writer = createWriter(file);\n\n await tryCatch(() => mkdir(dist));\n await writeFile(file, useStrict ? \"'use strict';\\n\\n\" : '');\n\n await Promise.all(\n Array.from(assets).map(([key, value]) => {\n if (Object.hasOwn(writer, key)) {\n // Every writer key is a directory listing, so `value` is an array.\n return writer[key as keyof typeof writer](value as Array<string>);\n } else if (typeof value === 'string') {\n return appendFile(file, createExportStatement(key, value));\n }\n\n return Promise.resolve();\n })\n );\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", "/* 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 { posix, dirname, basename } from 'path';\n\nimport { camelize } from 'inflection';\n\nimport underscore from '../../../utils/underscore';\nimport { compose } from '../../../utils/compose';\n\nconst DOUBLE_COLON = /::/g;\n\n/**\n * @private\n */\nconst formatName: (source: string) => string = compose(\n (name: string) => name.replace(DOUBLE_COLON, '$'),\n camelize,\n underscore,\n (name: string) => posix.join(dirname(name), basename(name, '.js'))\n);\n\nexport default formatName;\n", "import path from 'path';\n\nimport template from '../../template';\nimport { writeFile } from '../../fs';\n\n/**\n * @private\n */\nexport default async function createBootScript(\n dir: string,\n {\n useStrict\n }: {\n useStrict: boolean;\n }\n): Promise<void> {\n let data = template`\n const CWD = process.cwd();\n const { env: { PORT } } = process;\n const { Application, config, database } = require('./bundle');\n\n module.exports = new Application(\n Object.assign(config, {\n database,\n path: CWD,\n port: PORT\n })\n ).catch(err => {\n process.send({\n error: err ? err.stack : void 0,\n message: 'error'\n });\n });\n `;\n\n if (useStrict) {\n data = `'use strict';\\n\\n${data}`;\n }\n\n await writeFile(path.join(dir, 'dist', 'boot.js'), data);\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 './utils/insert-values';\n\nconst bodyPattern = /^\\n([\\s\\S]+)\\s{2}$/gm;\nconst trailingWhitespace = /\\s+$/;\n\n/**\n * Used as a template tag, so `strings` arrives as a TemplateStringsArray \u2014\n * typed as `readonly string[]`, which also accepts a plain array.\n *\n * @private\n */\nexport default function template(\n strings: readonly string[],\n ...values: unknown[]\n): string {\n const compiled = insertValues(strings, ...values);\n let [body] = compiled.match(bodyPattern) || [];\n let indentLevel = /^\\s{0,4}(.+)$/g;\n\n if (!body) {\n body = compiled;\n indentLevel = /^\\s{0,2}(.+)$/g;\n }\n\n return body\n .split('\\n')\n .slice(1)\n .map(line => {\n let str = line.replace(indentLevel, '$1');\n\n if (trailingWhitespace.test(str)) {\n str = str.replace(trailingWhitespace, '');\n }\n\n return str;\n })\n .join('\\n');\n}\n\nexport { default as insertValues } from './utils/insert-values';\n", "import createSpinner from '../utils/create-spinner';\nimport { CWD, NODE_ENV } from '../../../constants';\nimport { compile } from '../../compiler';\n\nexport async function build(useStrict: boolean = false): Promise<void> {\n const spinner = createSpinner('Building your application...');\n\n spinner.start();\n\n await compile(CWD, NODE_ENV, {\n useStrict\n });\n\n spinner.stop();\n}\n", "import { EOL } from 'os';\n\nimport chalk from '../../../utils/chalk';\nimport { CWD } from '../../../constants';\nimport { mkdir, writeFile } from '../../fs';\nimport template from '../../template';\nimport exec from '../../../utils/exec';\nimport driverFor from '../utils/driver-for';\nimport createSpinner from '../utils/create-spinner';\nimport appTemplate from '../templates/application';\nimport configTemplate from '../templates/config';\nimport routesTemplate from '../templates/routes';\nimport dbTemplate from '../templates/database';\nimport seedTemplate from '../templates/seed';\nimport pkgJSONTemplate from '../templates/package-json';\nimport pnpmWorkspaceTemplate from '../templates/pnpm-workspace';\nimport eslintConfigTemplate from '../templates/eslint-config';\nimport readmeTemplate from '../templates/readme';\nimport licenseTemplate from '../templates/license';\nimport gitignoreTemplate from '../templates/gitignore';\n\nimport { generate } from './generate';\n\n/**\n * @private\n */\nexport async function create(name: string, database: string) {\n const driver = driverFor(database);\n const project = `${CWD}/${name}`;\n\n await mkdir(project);\n\n await Promise.all([\n mkdir(`${project}/app`),\n mkdir(`${project}/config`),\n mkdir(`${project}/db`)\n ]);\n\n await Promise.all([\n mkdir(`${project}/app/models`),\n mkdir(`${project}/app/serializers`),\n mkdir(`${project}/app/controllers`),\n mkdir(`${project}/app/middleware`),\n mkdir(`${project}/app/utils`),\n mkdir(`${project}/config/environments`),\n mkdir(`${project}/db/migrate`)\n ]);\n\n await Promise.all([\n writeFile(`${project}/app/index.js`, appTemplate(name)),\n\n writeFile(`${project}/app/routes.js`, routesTemplate()),\n\n writeFile(\n `${project}/config/environments/development.js`,\n configTemplate(name, 'development')\n ),\n\n writeFile(\n `${project}/config/environments/test.js`,\n configTemplate(name, 'test')\n ),\n\n writeFile(\n `${project}/config/environments/production.js`,\n configTemplate(name, 'production')\n ),\n\n writeFile(`${project}/config/database.js`, dbTemplate(name, driver)),\n\n writeFile(`${project}/db/seed.js`, seedTemplate()),\n\n writeFile(`${project}/README.md`, readmeTemplate(name)),\n\n writeFile(`${project}/LICENSE`, licenseTemplate()),\n\n writeFile(`${project}/package.json`, pkgJSONTemplate(name, driver)),\n\n writeFile(`${project}/eslint.config.mjs`, eslintConfigTemplate()),\n\n writeFile(`${project}/.gitignore`, gitignoreTemplate()),\n\n writeFile(`${project}/pnpm-workspace.yaml`, pnpmWorkspaceTemplate(driver))\n ]);\n\n const logOutput = template`\n ${chalk.green('create')} app/index.js\n ${chalk.green('create')} app/routes.js\n ${chalk.green('create')} config/environments/development.js\n ${chalk.green('create')} config/environments/test.js\n ${chalk.green('create')} config/environments/production.js\n ${chalk.green('create')} config/database.js\n ${chalk.green('create')} db/migrate\n ${chalk.green('create')} db/seed.js\n ${chalk.green('create')} README.md\n ${chalk.green('create')} LICENSE\n ${chalk.green('create')} package.json\n ${chalk.green('create')} eslint.config.mjs\n ${chalk.green('create')} .gitignore\n ${chalk.green('create')} pnpm-workspace.yaml\n `;\n\n process.stdout.write(logOutput.substr(0, logOutput.length - 1));\n process.stdout.write(EOL);\n\n await Promise.all([\n generate({\n cwd: project,\n type: 'serializer',\n name: 'application'\n }),\n\n generate({\n cwd: project,\n type: 'controller',\n name: 'application'\n })\n ]);\n\n await exec('git init && git add .', {\n cwd: project\n });\n\n process.stdout.write(`${chalk.green('initialize')} git`);\n process.stdout.write(EOL);\n\n const spinner = createSpinner('Installing dependencies from npm...');\n\n spinner.start();\n\n // The database driver is already declared in the generated package.json, so a\n // plain install pulls it in \u2014 no separate `npm install --save` needed.\n await exec('npm install', {\n cwd: project\n });\n\n spinner.stop();\n}\n", "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 { SQLITE_DRIVER } from '../../database/constants';\n\nconst drivers = new Map([\n ['postgres', 'pg'],\n ['sqlite', SQLITE_DRIVER],\n ['mysql', 'mysql2']\n]);\n\nexport default function driverFor(database = 'sqlite') {\n return drivers.get(database) || SQLITE_DRIVER;\n}\n", "import { classify } from 'inflection';\n\nimport template from '../../template';\nimport chain from '../../../utils/chain';\nimport underscore from '../../../utils/underscore';\n\n/**\n * @private\n */\nexport default (name: string): string => {\n const normalized = chain(name).pipe(underscore).pipe(classify).value();\n\n return template`\n import { Application } from 'lumen-framework';\n\n class ${normalized} extends Application {\n\n }\n\n export default ${normalized};\n `;\n};\n", "import template from '../../template';\n\n/**\n * @private\n */\nexport default (name: string, env: string): string => {\n const isTestENV = env === 'test';\n const isProdENV = env === 'production';\n\n return template`\n export default {\n logging: {\n level: ${isProdENV ? \"'INFO'\" : \"'DEBUG'\"},\n format: ${isProdENV ? \"'json'\" : \"'text'\"},\n enabled: ${(!isTestENV).toString()},\n requestBody: ${(!isProdENV).toString()},\n\n filter: {\n params: []\n }\n }\n };\n `;\n};\n", "import template from '../../template';\n\n/**\n * @private\n */\nexport default (): string => template`\n export default function routes() {\n\n }\n`;\n", "export default function indent(amount: number = 1): string {\n return ' '.repeat(amount);\n}\n", "import indent from '../utils/indent';\nimport { SQLITE_DRIVER } from '../../database/constants';\nimport underscore from '../../../utils/underscore';\n\nconst SUFFIXES: Record<string, string> = {\n development: 'dev',\n test: 'test',\n production: 'prod'\n};\n\n/**\n * @private\n */\nexport default (name: string, driver: string): string => {\n const schemaName = underscore(name);\n let driverName = driver;\n let template = 'export default {\\n';\n let username: string | undefined;\n\n if (!driverName) {\n driverName = SQLITE_DRIVER;\n }\n\n if (driverName === 'pg') {\n username = 'postgres';\n } else if (driverName !== 'pg' && driverName !== SQLITE_DRIVER) {\n username = 'root';\n }\n\n ['development', 'test', 'production'].forEach(environment => {\n template += `${indent(2)}${environment}: {\\n`;\n\n if (driverName !== SQLITE_DRIVER) {\n template += `${indent(4)}pool: 5,\\n`;\n }\n\n template += `${indent(4)}driver: '${driverName}',\\n`;\n\n if (username) {\n template += `${indent(4)}username: '${username}',\\n`;\n }\n\n // SQLite appends the environment itself (`db/blog_development.sqlite`);\n // a server database's name is used as is.\n if (driverName === SQLITE_DRIVER) {\n template += `${indent(4)}database: '${schemaName}'\\n`;\n } else {\n template += `${indent(4)}database: '${schemaName}_${SUFFIXES[environment]}'\\n`;\n }\n\n template += `${indent(2)}}`;\n\n if (environment !== 'production') {\n template += ',\\n\\n';\n }\n });\n\n template += '\\n};\\n';\n\n return template;\n};\n", "import template from '../../template';\n\n/**\n * @private\n */\nexport default (): string => template`\n export default async function seed() {\n\n }\n`;\n", "{\n \"name\": \"lumen-framework\",\n \"version\": \"4.0.0\",\n \"description\": \"Build scalable, Node.js-powered REST APIs with almost no code.\",\n \"keywords\": [\n \"mvc\",\n \"api\",\n \"lux\",\n \"lumen\",\n \"jsonapi\",\n \"json-api\",\n \"rest\",\n \"framework\"\n ],\n \"bugs\": {\n \"url\": \"https://github.com/nickschot/lux/issues\"\n },\n \"repository\": \"github:nickschot/lux\",\n \"license\": \"MIT\",\n \"author\": \"Nick Schot <nickschot@gmail.com>\",\n \"contributors\": [\n {\n \"name\": \"Zachary Golba\",\n \"url\": \"https://github.com/zacharygolba\"\n }\n ],\n \"main\": \"dist/index.js\",\n \"module\": \"dist/index.mjs\",\n \"types\": \"./dist/types/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/types/index.d.ts\",\n \"module\": \"./dist/index.mjs\",\n \"default\": \"./dist/index.js\"\n },\n \"./testing\": {\n \"types\": \"./dist/types/testing.d.ts\",\n \"module\": \"./dist/testing.mjs\",\n \"default\": \"./dist/testing.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"bin\": {\n \"lumen\": \"bin/lumen\"\n },\n \"files\": [\n \"dist\",\n \"bin\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"scripts\": {\n \"build\": \"node build.mjs\",\n \"build:debugger\": \"node test/utils/debugger/build.mjs\",\n \"build:types\": \"tsc -p tsconfig.build.json\",\n \"clean\": \"shx rm -rf coverage dist docs/api test/test-app/dist\",\n \"debugger\": \"node --enable-source-maps test/utils/debugger/dist/debug.js\",\n \"docs:api\": \"typedoc\",\n \"format\": \"prettier --write .\",\n \"format:check\": \"prettier --check .\",\n \"lint\": \"eslint .\",\n \"prepack\": \"pnpm run build && pnpm run build:types\",\n \"test\": \"vitest run\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"chalk\": \"^6.0.1\",\n \"commander\": \"^15.0.0\",\n \"esbuild\": \"^0.28.2\",\n \"fb-watchman\": \"^2.0.2\",\n \"inflection\": \"^3.0.2\",\n \"knex\": \"^3.3.0\",\n \"ora\": \"^9.4.1\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"^10.0.1\",\n \"@faker-js/faker\": \"^10.6.0\",\n \"@types/node\": \"^22.20.5\",\n \"@vitest/coverage-v8\": \"^5.0.3\",\n \"ajv\": \"^8.20.0\",\n \"ajv-formats\": \"^3.0.1\",\n \"eslint\": \"^10.12.0\",\n \"eslint-config-prettier\": \"^10.1.8\",\n \"globals\": \"^17.13.0\",\n \"lumen-framework\": \"link:.\",\n \"prettier\": \"^3.9.9\",\n \"release-plan\": \"^0.20.1\",\n \"shx\": \"^0.4.0\",\n \"sinon\": \"22.1.0\",\n \"typedoc\": \"^0.28.20\",\n \"typescript\": \"^6.0.3\",\n \"typescript-eslint\": \"^8.71.1\",\n \"vitest\": \"^5.0.3\"\n },\n \"packageManager\": \"pnpm@12.5.1\",\n \"engines\": {\n \"node\": \">= 22.14\"\n },\n \"devEngines\": {\n \"runtime\": [\n {\n \"name\": \"node\",\n \"version\": \"22.23.3\",\n \"onFail\": \"download\"\n },\n {\n \"name\": \"node\",\n \"version\": \">=22.14\",\n \"onFail\": \"warn\"\n }\n ]\n }\n}\n", "import { version } from '../../../../package.json';\nimport { SQLITE_DRIVER } from '../../database/constants';\n\nconst LUMEN_VERSION: string = version;\n\n// The knex client name (what `driverFor` returns) -> the npm package + version\n// a generated app needs installed to actually connect. Pinned to the versions\n// CI validates (see test/test-app).\nconst DRIVER_DEPS: Record<string, { name: string; version: string }> = {\n [SQLITE_DRIVER]: { name: SQLITE_DRIVER, version: '^13.0.3' },\n pg: { name: 'pg', version: '^8.23.1' },\n mysql2: { name: 'mysql2', version: '^3.24.5' }\n};\n\n/**\n * @private\n */\nexport default (name: string, driver: string): string => {\n const dbDriver = DRIVER_DEPS[driver] || DRIVER_DEPS[SQLITE_DRIVER];\n\n const pkg = {\n name,\n version: '0.0.1',\n description: '',\n scripts: {\n start: 'lumen serve',\n lint: 'eslint .'\n },\n author: '',\n license: 'MIT',\n dependencies: {\n knex: '^3.3.0',\n 'lumen-framework': LUMEN_VERSION,\n [dbDriver.name]: dbDriver.version\n },\n devDependencies: {\n '@eslint/js': '^10.0.1',\n eslint: '^10.12.0',\n globals: '^17.13.0'\n },\n engines: {\n node: '>= 22.14'\n }\n };\n\n return `${JSON.stringify(pkg, null, 2)}\\n`;\n};\n", "import { SQLITE_DRIVER } from '../../database/constants';\n\n/**\n * The `pnpm-workspace.yaml` of a new app. pnpm 12 fails an install over a\n * dependency's build script it was not told to run or skip, and reads that\n * from this file only. npm ignores it.\n *\n * - esbuild (a dependency of lumen-framework): its postinstall only links its\n * platform binary over the `esbuild` command; the app compiler uses its\n * JavaScript API, which finds the binary itself.\n * - better-sqlite3 ships prebuilt binaries for every platform it supports, but\n * pnpm would run `node-gyp rebuild` for its `binding.gyp`.\n *\n * @private\n */\nexport default (driver: string): string => {\n const builds = [\n 'esbuild',\n ...(driver === SQLITE_DRIVER ? [SQLITE_DRIVER] : [])\n ];\n\n return [\n '# Build scripts pnpm may skip: these packages work without them.',\n 'allowBuilds:',\n ...builds.map(name => ` ${name}: false`),\n ''\n ].join('\\n');\n};\n", "/**\n * @private\n */\nexport default (): string => `import js from '@eslint/js';\nimport globals from 'globals';\n\nexport default [\n js.configs.recommended,\n {\n languageOptions: {\n ecmaVersion: 2023,\n sourceType: 'module',\n globals: {\n ...globals.node\n }\n }\n }\n];\n`;\n", "import template from '../../template';\n\n/**\n * @private\n */\nexport default (name: string): string => template`\n # ${name}\n\n ## Installation\n\n * \\`git clone https://github.com/<this-repository>\\`\n * \\`cd ${name}\\`\n * \\`npm install\\`\n\n ## Running / Development\n\n * \\`lumen serve\\`\n\n ## Further Reading / Useful Links\n * [Lumen](https://github.com/nickschot/lux/)\n`;\n", "import template from '../../template';\n\n/**\n * @private\n */\nexport default (): string => template`\n The MIT License (MIT)\n\n Copyright (c) 2016\n\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n SOFTWARE.\n`;\n", "import template from '../../template';\n\n/**\n * @private\n */\nexport default (): string => template`\n # See http://help.github.com/ignore-files/ for more about ignoring files.\n\n # dependencies\n /node_modules\n\n # build\n /dist\n\n # logs\n /log\n npm-debug.log\n\n # database\n *.sqlite\n *.sqlite-journal\n *.sqlite-wal\n *.sqlite-shm\n\n # misc\n *.DS_Store\n`;\n", "import { createInterface } from 'readline';\n\nconst YES = /^y(es)?$/i;\n\nexport default function createPrompt() {\n const prompt = createInterface({\n input: process.stdin,\n output: process.stdout\n });\n\n prompt.setPrompt('');\n\n return {\n question(text: string): Promise<boolean> {\n return new Promise(resolve => {\n prompt.question(text, answer => {\n resolve(YES.test(answer));\n });\n });\n },\n\n close(): void {\n prompt.close();\n }\n };\n}\n", "import { posix, join as joinPath } from 'path';\n\nimport { pluralize, singularize } from 'inflection';\n\nimport chalk from '../../../../utils/chalk';\nimport { NAMESPACED_RESOURCE_MESSAGE } from '../constants';\nimport { generateTimestamp } from '../../../database';\nimport { exists, readFile, writeFile } from '../../../fs';\nimport modelTemplate from '../../templates/model';\nimport serializerTemplate from '../../templates/serializer';\nimport controllerTemplate from '../../templates/controller';\nimport emptyMigrationTemplate from '../../templates/empty-migration';\nimport modelMigrationTemplate from '../../templates/model-migration';\nimport middlewareTemplate from '../../templates/middleware';\nimport utilTemplate from '../../templates/util';\nimport chain from '../../../../utils/chain';\nimport type { GeneratorOptions } from '../index';\n\nimport log from './log';\nimport createGenerator from './create-generator';\nimport { createConflictResolver, detectConflict } from './migration-conflict';\n\n/**\n * @private\n */\nexport async function controller(opts: GeneratorOptions): Promise<void> {\n const { cwd } = opts;\n let { name } = opts;\n\n const dir = joinPath('app', 'controllers');\n const generate = createGenerator({\n dir,\n template: controllerTemplate\n });\n\n if (!name.endsWith('application')) {\n name = pluralize(name);\n }\n\n await generate({\n ...opts,\n cwd,\n name\n });\n\n const namespace = posix.dirname(name);\n\n if (namespace !== '.') {\n const hasParent = await exists(\n joinPath(cwd, dir, ...[...namespace.split('/'), 'application.js'])\n );\n\n if (!hasParent) {\n await controller({\n ...opts,\n cwd,\n name: `${namespace}/application`,\n attrs: []\n });\n }\n }\n}\n\n/**\n * @private\n */\nexport async function serializer(opts: GeneratorOptions): Promise<void> {\n const { cwd } = opts;\n let { name } = opts;\n\n const dir = joinPath('app', 'serializers');\n const generate = createGenerator({\n dir,\n template: serializerTemplate\n });\n\n if (!name.endsWith('application')) {\n name = pluralize(name);\n }\n\n await generate({\n ...opts,\n cwd,\n name\n });\n\n const namespace = posix.dirname(name);\n\n if (namespace !== '.') {\n const hasParent = await exists(\n joinPath(cwd, dir, ...[...namespace.split('/'), 'application.js'])\n );\n\n if (!hasParent) {\n await serializer({\n ...opts,\n cwd,\n name: `${namespace}/application`,\n attrs: []\n });\n }\n }\n}\n\n/**\n * @private\n */\nexport function migration(opts: GeneratorOptions) {\n const { cwd, onConflict } = opts;\n let { name } = opts;\n\n const dir = joinPath('db', 'migrate');\n const generate = createGenerator({\n dir,\n template: emptyMigrationTemplate,\n hasConflict: detectConflict\n });\n\n name = chain(name)\n .pipe(posix.basename)\n .pipe(str => `${generateTimestamp()}-${str}`)\n .value();\n\n return generate({\n ...opts,\n cwd,\n name,\n onConflict: createConflictResolver({\n cwd,\n onConflict\n })\n });\n}\n\n/**\n * @private\n */\nexport function modelMigration(opts: GeneratorOptions) {\n const { cwd, onConflict } = opts;\n let { name } = opts;\n\n const dir = joinPath('db', 'migrate');\n const generate = createGenerator({\n dir,\n template: modelMigrationTemplate,\n hasConflict: detectConflict\n });\n\n name = chain(name)\n .pipe(posix.basename)\n .pipe(pluralize)\n .pipe(str => `${generateTimestamp()}-create-${str}`)\n .value();\n\n return generate({\n ...opts,\n cwd,\n name,\n onConflict: createConflictResolver({\n cwd,\n onConflict\n })\n });\n}\n\n/**\n * @private\n */\nexport async function model(opts: GeneratorOptions): Promise<void> {\n let { name } = opts;\n const generate = createGenerator({\n dir: joinPath('app', 'models'),\n template: modelTemplate\n });\n\n await modelMigration({ ...opts, name });\n\n name = chain(name).pipe(posix.basename).pipe(singularize).value();\n\n return generate({\n ...opts,\n name\n });\n}\n\n/**\n * @private\n */\nexport function middleware(opts: GeneratorOptions) {\n let { name } = opts;\n const parts = name.split('/');\n\n name = parts.pop() || name;\n\n const generate = createGenerator({\n dir: joinPath('app', 'middleware', ...parts),\n template: middlewareTemplate\n });\n\n return generate({\n ...opts,\n name\n });\n}\n\n/**\n * @private\n */\nexport function util(opts: GeneratorOptions) {\n let { name } = opts;\n const parts = name.split('/');\n\n name = parts.pop() || name;\n\n const generate = createGenerator({\n dir: joinPath('app', 'utils', ...parts),\n template: utilTemplate\n });\n\n return generate({\n ...opts,\n name\n });\n}\n\n/**\n * @private\n */\nexport async function resource(opts: GeneratorOptions) {\n await model(opts);\n await controller(opts);\n await serializer(opts);\n\n if (posix.dirname(opts.name) !== '.') {\n log(NAMESPACED_RESOURCE_MESSAGE);\n return;\n }\n\n const path = joinPath(opts.cwd, 'app', 'routes.js');\n const routes = chain(await readFile(path))\n .pipe(buf => buf.toString('utf8'))\n .pipe(str => str.split('\\n'))\n .pipe(lines =>\n lines.reduce((result, line, index, arr) => {\n const closeIndex = arr.lastIndexOf('}');\n let str = result;\n\n if (line && index <= closeIndex) {\n str += `${line}\\n`;\n }\n\n if (index + 1 === closeIndex) {\n str += ` this.resource('${pluralize(opts.name)}');\\n`;\n }\n\n return str;\n }, '')\n )\n .value();\n\n await writeFile(path, routes);\n log(`${chalk.green('update')} app/routes.js`);\n}\n", "import chalk from '../../../utils/chalk';\nimport template from '../../template';\n\n/**\n * TODO: Update the 'routes.js' file when generating a resource within a\n * namespace.\n */\nexport const NAMESPACED_RESOURCE_MESSAGE = template`\n\n \uD83C\uDF89 It looks like the resource you generated is within a namespace!\n\n Lumen will only update your 'routes.js' file if you generate a resource at the\\\n root namespace (i.e 'lumen generate resource users').\n\n In order to access the resource you have created, remember to manually update\\\n your 'routes.js' file.\n\n Example:\n\n export default function routes() {\n ${chalk.dim('// this resource will be accessible at /users')}\n this.resource('users');\n\n this.namespace('admin', function () {\n ${chalk.dim('// this resource will be accessible at /admin/users')}\n this.resource('users');\n });\n }\n\n`;\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", "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", "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 { 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", "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", "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", "/* 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 { 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 { 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", "/* 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", "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", "const pad = (int: number): string => String(int).padStart(2, '0');\n\nexport function* padding(\n char: string,\n amount: number\n): Generator<string, void, void> {\n for (let i = 0; i < amount; i += 1) {\n yield char;\n }\n}\n\n/**\n * A migration's version: `YYYYMMDDHHmmssCC` in UTC (`CC` are hundredths of a\n * second), 16 digits. Fixed-width and zero-padded, so versions sort in the\n * order they were generated \u2014 `lumen db:migrate` runs migrations in that\n * order.\n *\n * @private\n */\nexport default function generateTimestamp(now: Date = new Date()): string {\n return (\n String(now.getUTCFullYear()) +\n pad(now.getUTCMonth() + 1) +\n pad(now.getUTCDate()) +\n pad(now.getUTCHours()) +\n pad(now.getUTCMinutes()) +\n pad(now.getUTCSeconds()) +\n pad(Math.floor(now.getUTCMilliseconds() / 10))\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 { 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 { EOL } from 'os';\n\nimport { classify, camelize, pluralize } from 'inflection';\n\nimport template from '../../template';\nimport indent from '../utils/indent';\nimport chain from '../../../utils/chain';\nimport entries from '../../../utils/entries';\nimport underscore from '../../../utils/underscore';\n\nconst VALID_ATTR = /^(\\w|-)+:(\\w|-)+$/;\nconst RELATIONSHIP = /^belongs-to|has-(one|many)$/;\n\n/**\n * @private\n */\nexport default (name: string, attrs: Array<string>) => {\n const normalized = chain(name).pipe(underscore).pipe(classify).value();\n\n return template`\n import { Model } from 'lumen-framework';\n\n class ${normalized} extends Model {\n ${entries(\n (attrs || [])\n .filter(attr => VALID_ATTR.test(attr))\n .map(attr => attr.split(':'))\n .filter(([, type]) => RELATIONSHIP.test(type))\n .reduce<Record<string, Array<string>>>(\n (types, [related, type]) => {\n const key = chain(type)\n .pipe(underscore)\n .pipe(str => camelize(str, true))\n .value();\n\n const value = types[key];\n\n if (value) {\n // The name of this model on the other side: a `belongs-to` is\n // usually the inverse of a `has-many` (`post` belongs to `user`,\n // `user` has many `posts`), while a `has-one`/`has-many` points\n // back at a single owner.\n const singular = camelize(normalized, true);\n const inverse =\n key === 'belongsTo' ? pluralize(singular) : singular;\n const relatedKey = chain(related)\n .pipe(underscore)\n .pipe(str => camelize(str, true))\n .value();\n\n return {\n ...types,\n [key]: [\n ...value,\n `${indent(8)}${relatedKey}: {${EOL}` +\n `${indent(10)}inverse: '${inverse}'${EOL}` +\n `${indent(8)}}`\n ]\n };\n }\n\n return types;\n },\n {\n hasOne: [],\n hasMany: [],\n belongsTo: []\n }\n )\n )\n .filter(([, value]) => value.length)\n .reduce(\n (result, [key, value], index) =>\n chain(result)\n .pipe(str => {\n if (index && str.length) {\n return `${str}${EOL.repeat(2)}`;\n }\n\n return str;\n })\n .pipe(\n str =>\n str +\n `${indent(index === 0 ? 2 : 6)}static ${key} = {${EOL}` +\n `${value.join(`,${EOL.repeat(2)}`)}${EOL}` +\n `${indent(6)}};`\n )\n .value(),\n ''\n )}\n }\n\n export default ${normalized};\n `;\n};\n", "import { classify, camelize, pluralize } from 'inflection';\n\nimport chain from '../../../utils/chain';\nimport entries from '../../../utils/entries';\nimport underscore from '../../../utils/underscore';\nimport template from '../../template';\nimport indent from '../utils/indent';\n\n/**\n * @private\n */\nexport default (name: string, attrs: Array<string>): string => {\n let normalized = chain(name).pipe(underscore).pipe(classify).value();\n\n if (!normalized.endsWith('Application')) {\n normalized = pluralize(normalized);\n }\n\n const body = entries(\n attrs\n .filter(attr => /^(\\w|-)+:(\\w|-)+$/g.test(attr))\n .map(attr => attr.split(':'))\n .reduce(\n (obj, parts) => {\n const [, type] = parts;\n let [attr] = parts;\n let { hasOne, hasMany, attributes } = obj;\n\n attr = `${indent(8)}'${camelize(underscore(attr), true)}'`;\n\n switch (type) {\n case 'belongs-to':\n case 'has-one':\n hasOne = [...hasOne, attr];\n break;\n\n case 'has-many':\n hasMany = [...hasMany, attr];\n break;\n\n default:\n attributes = [...attributes, attr];\n }\n\n return {\n attributes,\n hasOne,\n hasMany\n };\n },\n {\n // `belongsTo` was a dead accumulator key \u2014 never destructured and, for\n // non-empty attrs, never present in the returned object \u2014 so it emitted\n // nothing. Dropped so the accumulator types cleanly.\n attributes: [] as string[],\n hasOne: [] as string[],\n hasMany: [] as string[]\n }\n )\n ).reduce((result, group, index) => {\n const [key, items] = group;\n let str = result;\n\n if (items.length) {\n const value = items.join(',\\n');\n\n if (index && str.length) {\n str += '\\n\\n';\n }\n\n str +=\n `${indent(index === 0 ? 2 : 6)}${key} = ` +\n `[\\n${value}\\n${indent(6)}];`;\n }\n\n return str;\n }, '');\n\n return template`\n import { Serializer } from 'lumen-framework';\n\n class ${normalized}Serializer extends Serializer {\n ${body}\n }\n\n export default ${normalized}Serializer;\n `;\n};\n", "import { classify, camelize, pluralize } from 'inflection';\n\nimport template from '../../template';\nimport entries from '../../../utils/entries';\nimport indent from '../utils/indent';\nimport chain from '../../../utils/chain';\nimport underscore from '../../../utils/underscore';\n\n/**\n * @private\n */\nexport default (name: string, attrs: Array<string>): string => {\n let normalized = chain(name).pipe(underscore).pipe(classify).value();\n\n if (!normalized.endsWith('Application')) {\n normalized = pluralize(normalized);\n }\n\n const body = entries(\n attrs\n .filter(attr => /^(\\w|-)+:(\\w|-)+$/g.test(attr))\n .map(attr => attr.split(':')[0])\n .reduce(\n (obj, attr) => ({\n ...obj,\n params: [\n ...obj.params,\n `${indent(8)}'${camelize(underscore(attr), true)}'`\n ]\n }),\n { params: [] as string[] }\n )\n ).reduce((result, group, index) => {\n const [key, items] = group;\n let str = result;\n\n if (items.length) {\n const value = items.join(',\\n');\n\n if (index && str.length) {\n str += '\\n\\n';\n }\n\n str +=\n `${indent(index === 0 ? 2 : 6)}${key} = ` +\n `[\\n${value}\\n${indent(6)}];`;\n }\n\n return str;\n }, '');\n\n return template`\n import { Controller } from 'lumen-framework';\n\n class ${normalized}Controller extends Controller {\n ${body}\n }\n\n export default ${normalized}Controller;\n `;\n};\n", "import template from '../../template';\n\n/**\n * @private\n */\nexport default (): string => template`\n export function up(schema) {\n\n }\n\n export function down(schema) {\n\n }\n`;\n", "import { pluralize } from 'inflection';\n\nimport template from '../../template';\nimport chain from '../../../utils/chain';\nimport indent from '../utils/indent';\nimport underscore from '../../../utils/underscore';\n\n/**\n * @private\n */\nexport default (name: string, attrs: Array<string> | string): string => {\n const indices = ['id'];\n const table = chain(name)\n .pipe(str => str.substr(24))\n .pipe(underscore)\n .pipe(pluralize)\n .value();\n\n let body = '';\n\n if (Array.isArray(attrs)) {\n body = attrs\n .filter(attr => /^(\\w|-)+:(\\w|-)+$/g.test(attr))\n .map(attr => attr.split(':'))\n .filter(([, type]) => !/^has-(one|many)$/g.test(type))\n .map(attr => {\n let [column, type] = attr;\n\n column = underscore(column);\n\n if (type === 'belongs-to') {\n type = 'integer';\n column = `${column}_id`;\n\n if (Array.isArray(indices)) {\n indices.push(column);\n }\n }\n\n return [column, type];\n })\n .map((attr, index) => {\n let [column] = attr;\n const [, type] = attr;\n const shouldIndex = indices.indexOf(column) >= 0;\n\n column = `${indent(index > 0 ? 8 : 0)}table.${type}('${column}')`;\n return shouldIndex ? `${column}.index();` : `${column};`;\n })\n .join('\\n');\n }\n\n return template`\n export function up(schema) {\n return schema.createTable('${table}', table => {\n table.increments('id');\n ${body}\n table.timestamps();\n\n table.index('created_at');\n table.index('updated_at');\n });\n }\n\n export function down(schema) {\n return schema.dropTable('${table}');\n }\n `;\n};\n", "import { camelize } from 'inflection';\n\nimport chain from '../../../utils/chain';\nimport underscore from '../../../utils/underscore';\nimport template from '../../template';\n\n/**\n * @private\n */\nexport default (name: string): string => {\n const normalized = chain(name)\n .pipe(underscore)\n .pipe(str => camelize(str, true))\n .value();\n\n return template`\n export default function ${normalized}(/*request, response*/) {\n\n }\n `;\n};\n", "import { camelize } from 'inflection';\n\nimport chain from '../../../utils/chain';\nimport underscore from '../../../utils/underscore';\nimport template from '../../template';\n\n/**\n * @private\n */\nexport default (name: string): string => {\n const normalized = chain(name)\n .pipe(underscore)\n .pipe(str => camelize(str, true))\n .value();\n\n return template`\n export default function ${normalized}() {\n\n }\n `;\n};\n", "/**\n * @private\n */\nexport default function log(data: string | Error): void {\n if (data instanceof Error) {\n process.stdout.write(`${data.stack || data.message}\\n`);\n } else {\n process.stderr.write(`${data}\\n`);\n }\n}\n", "import { join as joinPath } from 'path';\n\nimport chalk from '../../../../utils/chalk';\nimport { rmrf, exists, mkdirRec, writeFile, parsePath } from '../../../fs';\nimport type { Generator, GeneratorTemplate } from '../index';\n\nimport log from './log';\n\nconst FORWARD_SLASH = /\\//g;\n\n/**\n * @private\n */\nexport default function createGenerator({\n dir,\n template,\n hasConflict = exists\n}: {\n dir: string;\n template: GeneratorTemplate;\n hasConflict?: (path: string) => Promise<boolean>;\n}): Generator {\n return async ({ cwd, attrs, onConflict, ...opts }) => {\n const path = parsePath(cwd, dir, `${opts.name}.js`);\n const name = opts.name.replace(FORWARD_SLASH, '-');\n let action = chalk.green('create');\n\n await mkdirRec(path.dir);\n\n if (await hasConflict(path.absolute)) {\n const shouldContinue = await onConflict(path.relative);\n\n if (shouldContinue && typeof shouldContinue === 'string') {\n await rmrf(joinPath(path.dir, shouldContinue));\n log(`${chalk.red('remove')} ${joinPath(dir, shouldContinue)}`);\n } else if (shouldContinue && typeof shouldContinue === 'boolean') {\n action = chalk.yellow('overwrite');\n await rmrf(path.absolute);\n } else {\n log(`${chalk.yellow('skip')} ${path.relative}`);\n return;\n }\n }\n\n await writeFile(path.absolute, template(name, attrs));\n log(`${action} ${path.relative}`);\n };\n}\n", "import { exists, readdir, parsePath } from '../../../fs';\nimport type { GeneratorOptions } from '../index';\n\nexport function detectConflict(path: string): Promise<boolean> {\n const { dir, base } = parsePath(path);\n const pattern = new RegExp(`^\\\\d+-${base.substr(17)}$`);\n\n return exists(pattern, dir);\n}\n\nexport function createConflictResolver({\n cwd,\n onConflict\n}: {\n cwd: GeneratorOptions['cwd'];\n onConflict: GeneratorOptions['onConflict'];\n}): GeneratorOptions['onConflict'] {\n return async (path: string) => {\n if (await onConflict(path)) {\n const parsed = parsePath(cwd, path);\n const migrations = await readdir(parsed.dir);\n\n return (\n migrations.find(file => file.substr(17) === parsed.base.substr(17)) ||\n false\n );\n }\n\n return false;\n };\n}\n", "import type { Generator } from '../index';\n\nimport * as generators from './generate-type';\n\nexport default function generatorFor(type: string): Generator {\n const normalized = type.toLowerCase();\n const generator = (generators as Record<string, Generator | undefined>)[\n normalized\n ];\n\n if (!generator) {\n throw new Error(`Could not find a generator for '${type}'.`);\n }\n\n return generator;\n}\n", "import chalk from '../../../utils/chalk';\nimport createPrompt from '../utils/create-prompt';\n\nimport generatorFor from './utils/generator-for';\nimport type { GeneratorOptions } from './interfaces';\n\n/**\n * @private\n */\nexport async function runGenerator({\n cwd,\n type,\n name,\n attrs\n}: {\n cwd: GeneratorOptions['cwd'];\n type: GeneratorOptions['type'];\n name: GeneratorOptions['name'];\n attrs: GeneratorOptions['attrs'];\n}): Promise<void> {\n const generator = generatorFor(type);\n const prompt = createPrompt();\n\n await generator({\n cwd,\n type,\n name,\n attrs,\n onConflict: path =>\n prompt.question(\n `${chalk.green('?')} ${chalk.red('Overwrite')} ${path}? (Y/n)\\r`\n )\n });\n\n prompt.close();\n}\n\nexport type {\n Generator,\n GeneratorOptions,\n GeneratorTemplate\n} from './interfaces';\n", "import { CWD } from '../../../constants';\nimport { runGenerator } from '../generator';\nimport type { GeneratorOptions } from '../generator';\n\n/**\n * @private\n */\nexport function generate({\n cwd = CWD,\n name,\n type,\n attrs = []\n}: {\n cwd?: GeneratorOptions['cwd'];\n name: GeneratorOptions['name'];\n type: GeneratorOptions['type'];\n attrs?: GeneratorOptions['attrs'];\n}): Promise<void> {\n return runGenerator({\n cwd,\n name,\n type,\n attrs\n });\n}\n", "import { EOL } from 'os';\n\nimport { CWD, NODE_ENV, DATABASE_URL } from '../../../constants';\nimport { CONNECTION_STRING_MESSAGE } from '../constants';\nimport DatabaseConfigMissingError from '../errors/database-config-missing';\nimport { writeFile } from '../../fs';\nimport { createLoader } from '../../loader';\nimport { SQLITE_DRIVER } from '../../database/constants';\nimport provision from '../utils/server-database';\n\n/**\n * @private\n */\nexport function dbcreate() {\n const load = createLoader(CWD);\n const config = load('config').database[NODE_ENV];\n\n if (!config) {\n throw new DatabaseConfigMissingError(NODE_ENV);\n }\n\n if (config.driver === SQLITE_DRIVER) {\n return writeFile(`${CWD}/db/${config.database}_${NODE_ENV}.sqlite`, '');\n }\n\n if (DATABASE_URL || config.url) {\n process.stderr.write(CONNECTION_STRING_MESSAGE);\n process.stderr.write(EOL);\n return Promise.resolve();\n }\n\n return provision(CWD, config, 'create');\n}\n", "const GITHUB_URL = 'https://github.com/nickschot/lux';\n\ntype Options = {\n line?: number;\n branch?: string;\n};\n\n/**\n * @private\n */\nexport function fileLink(path: string, opts: Options = {}): string {\n const { line, branch = 'master' } = opts;\n let link = `${GITHUB_URL}/blob/${branch}/${path}`;\n\n if (line && line >= 0) {\n link += `#${line}`;\n }\n\n return link;\n}\n", "import template from '../template';\nimport { fileLink } from '../../utils/github';\n\nexport const VALID_DATABASES = [\n 'postgres',\n 'sqlite',\n 'mysql',\n 'mariadb',\n 'oracle'\n];\n\nconst DB_INTERFACE_URL = fileLink('src/packages/database/interfaces.js', {\n line: 17\n});\n\nexport const CONNECTION_STRING_MESSAGE = template`\n\n You're using a URL in your database config (config/database.js).\n\n In that case, Lumen assumes you don't need to create or drop your database.\n If you'd like to create or drop a database, set up your database config\n without the url.\n\n For guidance, see:\n ${DB_INTERFACE_URL}\n`;\n", "class DatabaseConfigMissingError extends ReferenceError {\n constructor(environment: string) {\n super(`Could not find database config for environment \"${environment}\".`);\n }\n}\n\nexport default DatabaseConfigMissingError;\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 { 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 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 { 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 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", "import { EOL } from 'os';\n\nimport type { Knex } from 'knex';\n\nimport { connect } from '../../database';\nimport type { DatabaseEnvironmentConfig } from '../../database';\n\n/**\n * `config` pointed at the server instead of the app's database, which may not\n * exist yet (`db:create`) or is about to go (`db:drop`): PostgreSQL's\n * `postgres` maintenance database, or no database for MySQL. Every other\n * setting (host, port, credentials, ssl) is kept.\n *\n * @internal\n */\nexport function serverConfigFor(\n config: DatabaseEnvironmentConfig\n): DatabaseEnvironmentConfig {\n return {\n ...config,\n pool: 1,\n database: config.driver === 'pg' ? 'postgres' : undefined\n };\n}\n\n/**\n * The statement that creates or drops `database`, its name quoted as an\n * identifier. A PostgreSQL drop is `WITH (FORCE)` (PostgreSQL 13+), so a\n * server or console still connected doesn't block it; MySQL drops a database\n * with open connections anyway.\n *\n * @internal\n */\nexport function statementFor(\n connection: Knex,\n action: 'create' | 'drop',\n driver: string,\n database: string\n): Knex.Raw {\n if (action === 'create') {\n return connection.raw('CREATE DATABASE ??', [database]);\n }\n\n return connection.raw(\n driver === 'pg'\n ? 'DROP DATABASE IF EXISTS ?? WITH (FORCE)'\n : 'DROP DATABASE IF EXISTS ??',\n [database]\n );\n}\n\n/**\n * Create or drop the database of `config` on its server, printing the\n * statement.\n *\n * @internal\n */\nexport default async function provision(\n path: string,\n config: DatabaseEnvironmentConfig,\n action: 'create' | 'drop'\n): Promise<void> {\n const connection = connect(path, serverConfigFor(config));\n\n try {\n const statement = statementFor(\n connection,\n action,\n config.driver,\n config.database as string\n );\n\n process.stdout.write(`${statement.toString()};${EOL}`);\n await statement;\n } finally {\n await connection.destroy();\n }\n}\n", "import { EOL } from 'os';\n\nimport { CWD, NODE_ENV, DATABASE_URL } from '../../../constants';\nimport { CONNECTION_STRING_MESSAGE } from '../constants';\nimport DatabaseConfigMissingError from '../errors/database-config-missing';\nimport { rmrf } from '../../fs';\nimport { createLoader } from '../../loader';\nimport { SQLITE_DRIVER } from '../../database/constants';\nimport provision from '../utils/server-database';\n\n/**\n * @private\n */\nexport function dbdrop() {\n const load = createLoader(CWD);\n const config = load('config').database[NODE_ENV];\n\n if (!config) {\n throw new DatabaseConfigMissingError(NODE_ENV);\n }\n\n if (config.driver === SQLITE_DRIVER) {\n return rmrf(`${CWD}/db/${config.database}_${NODE_ENV}.sqlite`);\n }\n\n if (DATABASE_URL || config.url) {\n process.stderr.write(CONNECTION_STRING_MESSAGE);\n process.stderr.write(EOL);\n return Promise.resolve();\n }\n\n return provision(CWD, config, 'drop');\n}\n", "import { EOL } from 'os';\n\nimport type { Knex } from 'knex';\n\n/**\n * Print each statement `builder` runs as it runs, with its values. A schema\n * builder can run several (`create table` and then each `create index`), and\n * emits `query` once per statement \u2014 so the statement comes from the event,\n * not from `builder.toString()`, which is all of them at once.\n *\n * @internal\n */\nexport default function printStatements<\n T extends { on(event: 'query', fn: (query: Knex.Sql) => void): unknown }\n>(\n builder: T,\n connection: Knex,\n write: (text: string) => void = text => process.stdout.write(text)\n): T {\n builder.on('query', ({ sql, bindings }: Knex.Sql) => {\n write(`${connection.raw(sql, bindings ?? []).toString()};${EOL}`);\n });\n\n return builder;\n}\n", "import { CWD } from '../../../constants';\nimport Database, { pendingMigrations } from '../../database';\nimport Logger from '../../logger';\nimport { createLoader } from '../../loader';\nimport { composeAsync } from '../../../utils/compose';\nimport printStatements from '../utils/print-statements';\n\n/**\n * @private\n */\nexport async function dbmigrate() {\n const load = createLoader(CWD);\n\n const { database: config } = load('config');\n const models = load('models');\n const migrations = load('migrations');\n\n const { connection, schema } = await new Database({\n config,\n models,\n path: CWD,\n checkMigrations: false,\n checkRelationships: false,\n\n logger: new Logger({ enabled: false } as ConstructorParameters<\n typeof Logger\n >[0])\n });\n\n const pending = await pendingMigrations(CWD, () => connection('migrations'));\n\n if (pending.length) {\n const runners = pending\n .map(name => {\n const version = name.replace(/^(\\d{16})-.+$/g, '$1');\n const key = name.replace(new RegExp(`${version}-(.+)\\\\.js`), '$1');\n\n return [version, migrations.get(`${key}-up`)];\n })\n .filter(([, migration]) => Boolean(migration))\n .reverse()\n .map(([version, migration]) => () => {\n return printStatements(migration.run(schema()), connection).then(() =>\n connection('migrations').insert({\n version\n })\n );\n });\n\n // `composeAsync`'s variadic signature doesn't model a spread of an array\n // of thunks; the runtime contract is a list of stages returning a runner.\n await (\n composeAsync as unknown as (\n ...fns: Array<() => Promise<unknown>>\n ) => () => Promise<unknown>\n )(...runners)();\n }\n\n return true;\n}\n", "import { CWD } from '../../../constants';\nimport Database from '../../database';\nimport Logger from '../../logger';\nimport { readdir } from '../../fs';\nimport { createLoader } from '../../loader';\nimport printStatements from '../utils/print-statements';\n\n/**\n * @private\n */\nexport async function dbrollback() {\n const load = createLoader(CWD);\n\n const { database: config } = load('config');\n const models = load('models');\n const migrations = load('migrations');\n\n const { connection, schema } = await new Database({\n config,\n models,\n path: CWD,\n checkMigrations: false,\n checkRelationships: false,\n\n logger: new Logger({ enabled: false } as ConstructorParameters<\n typeof Logger\n >[0])\n });\n\n const migrationFiles = await readdir(`${CWD}/db/migrate`);\n\n if (migrationFiles.length) {\n let migration;\n let version = await connection('migrations')\n .orderBy('version', 'desc')\n .first();\n\n if (version && version.version) {\n version = version.version;\n }\n\n const target = migrationFiles.find(m => m.indexOf(version) === 0);\n\n if (target) {\n migration = target.replace(new RegExp(`${version}-(.+)\\\\.js`), '$1');\n migration = migrations.get(`${migration}-down`);\n\n if (migration) {\n await printStatements(migration.run(schema()), connection);\n\n await connection('migrations')\n .where({\n version\n })\n .del();\n }\n }\n }\n}\n", "import { CWD } from '../../../constants';\nimport Logger from '../../logger';\nimport Database from '../../database';\nimport { createLoader } from '../../loader';\n\n/**\n * @private\n */\nexport function dbseed(): Promise<unknown> {\n const load = createLoader(CWD);\n const { database: config } = load('config');\n const seed = load('seed');\n const models = load('models');\n\n // `new Database(...)` returns a promise for the initialized store at runtime\n // (async-constructor pattern), though its static type is `Database`.\n return (\n new Database({\n config,\n models,\n path: CWD,\n logger: new Logger({\n enabled: false\n } as ConstructorParameters<typeof Logger>[0])\n }) as unknown as Promise<Database>\n ).then(store => store.connection.transaction(seed));\n}\n", "import { EOL } from 'os';\nimport { posix } from 'path';\n\nimport { pluralize, singularize } from 'inflection';\n\nimport chalk from '../../../utils/chalk';\nimport { CWD } from '../../../constants';\nimport {\n rmrf,\n exists,\n readdir,\n readdirRec,\n readFile,\n writeFile\n} from '../../fs';\n\nfunction log(text: string) {\n process.stdout.write(text);\n process.stdout.write(EOL);\n}\n\n/**\n * @private\n */\nexport async function destroyType(\n type: string,\n name: string,\n cwd: string = CWD\n) {\n const normalizedType = type.toLowerCase();\n let normalizedName = name;\n let path: string | undefined;\n let migrations: Array<string>;\n\n switch (normalizedType) {\n case 'model':\n // `generate` writes a model under its bare name, whatever the\n // namespace: `admin/tag` is `app/models/tag.js`.\n normalizedName = singularize(posix.basename(normalizedName));\n path = `app/${pluralize(normalizedType)}/${normalizedName}.js`;\n break;\n\n case 'migration':\n migrations = await readdir(`${cwd}/db/migrate`);\n\n // `find` may return undefined (no matching migration); pre-existing\n // behaviour lets that flow into the path as the string \"undefined\",\n // which then simply fails the `exists` check below.\n normalizedName = migrations.find(\n file => `${posix.basename(normalizedName)}.js` === file.substring(17)\n ) as string;\n\n path = `db/migrate/${normalizedName}`;\n break;\n\n case 'controller':\n case 'serializer':\n normalizedName = pluralize(normalizedName);\n path = `app/${pluralize(normalizedType)}/${normalizedName}.js`;\n break;\n\n case 'middleware':\n path = `app/${normalizedType}/${normalizedName}.js`;\n break;\n\n case 'util':\n path = `app/${pluralize(normalizedType)}/${normalizedName}.js`;\n break;\n\n default:\n return;\n }\n\n if (await exists(`${cwd}/${path}`)) {\n await rmrf(`${cwd}/${path}`);\n log(`${chalk.red('remove')} ${path}`);\n }\n}\n\n/**\n * The controllers, in any namespace, of the resource `name` other than its\n * own: `admin/tags` for `tags`, and the other way around.\n *\n * @private\n */\nasync function otherControllersOf(name: string, cwd: string) {\n const dir = `${cwd}/app/controllers`;\n const own = `${pluralize(name)}.js`;\n const file = posix.basename(own);\n\n if (!(await exists(dir))) {\n return [];\n }\n\n return (await readdirRec(dir))\n .map(path => path.split('\\\\').join('/'))\n .filter(path => posix.basename(path) === file && path !== own)\n .map(path => `app/controllers/${path}`);\n}\n\n/**\n * @private\n */\nexport async function destroy({\n type,\n name,\n cwd = CWD\n}: {\n type: string;\n name: string;\n cwd?: string;\n}) {\n if (type === 'resource') {\n const model = singularize(posix.basename(name));\n const others = await otherControllersOf(name, cwd);\n\n // One at a time, so the output lists them in a stable order.\n await destroyType('controller', name, cwd);\n await destroyType('serializer', name, cwd);\n\n // Another namespace's resource for the same model still needs it.\n if (others.length) {\n log(\n `${chalk.yellow('keep')} app/models/${model}.js and its migration ` +\n `(used by ${others.join(', ')})`\n );\n } else {\n await destroyType('model', model, cwd);\n await destroyType('migration', `create-${pluralize(model)}`, cwd);\n }\n\n // Only a root resource has a route; `generate` leaves a namespaced one\n // to the app.\n if (posix.dirname(name) === '.') {\n const path = `${cwd}/app/routes.js`;\n const before = (await readFile(path)).toString('utf8');\n const pattern = new RegExp(\n `\\\\s*this.resource\\\\(('|\"|\\`)${pluralize(name)}('|\"|\\`)\\\\);?`\n );\n const after = before\n .split('\\n')\n .filter(line => !pattern.test(line))\n .join('\\n');\n\n if (after !== before) {\n await writeFile(path, after);\n log(`${chalk.green('update')} app/routes.js`);\n }\n }\n } else if (type === 'model') {\n await Promise.all([\n destroyType(type, name, cwd),\n destroyType(\n 'migration',\n `create-${pluralize(singularize(posix.basename(name)))}`,\n cwd\n )\n ]);\n } else {\n await destroyType(type, name, cwd);\n }\n}\n", "import path from 'path';\nimport { start as startRepl } from 'repl';\n\nimport { CWD } from '../../../constants';\nimport type Application from '../../application';\n\nexport function repl(): Promise<void> {\n // FIXME: this async executor swallows rejections from the `require` below.\n // Pre-existing behaviour, left as-is so the lint migration stays\n // behaviour-neutral \u2014 worth fixing when this file is converted to TypeScript.\n // eslint-disable-next-line no-async-promise-executor\n return new Promise(async resolve => {\n // The app's compiled boot script, resolved at runtime.\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const app: Application = await require(path.join(CWD, 'dist', 'boot'));\n\n const instance = startRepl({\n prompt: '> '\n });\n\n instance.once('exit', resolve);\n\n Object.assign(instance.context, {\n app,\n logger: app.logger,\n routes: app.router,\n [app.constructor.name]: app,\n\n ...Array.from(app.models).reduce(\n (context, [, model]) => ({\n ...context,\n [model.name]: model\n }),\n {}\n ),\n\n ...Array.from(app.controllers).reduce(\n (context, [, controller]) => ({\n ...context,\n [controller.constructor.name]: controller\n }),\n {}\n ),\n\n ...Array.from(app.serializers).reduce(\n (context, [, serializer]) => ({\n ...context,\n [serializer.constructor.name]: serializer\n }),\n {}\n )\n });\n });\n}\n", "/* eslint-disable @typescript-eslint/no-explicit-any --\n * The cluster manager talks to worker processes over Node's untyped IPC\n * channel: the `update` process event and worker `message` payloads carry\n * arbitrary data, so those values are genuinely untyped here (as they were\n * `Object` in Flow).\n */\nimport EventEmitter from 'events';\nimport os from 'os';\nimport cluster, { type Worker } from 'cluster';\nimport { join as joinPath } from 'path';\n\nimport chalk from '../../../utils/chalk';\nimport { NODE_ENV } from '../../../constants';\nimport { line } from '../../logger';\nimport omit from '../../../utils/omit';\nimport range from '../../../utils/range';\nimport type Logger from '../../logger';\n\nimport type { ClusterOptions } from './interfaces';\n\n/**\n * How long a worker may take to start listening before it is replaced.\n */\nconst BOOT_TIMEOUT = 30000;\n\n/**\n * How long a worker may take to finish its requests and exit when it is\n * shut down, before it is killed. Below the grace period of common platforms\n * (Docker's 10 s, Heroku's and Kubernetes' 30 s).\n */\nconst SHUTDOWN_TIMEOUT = 8000;\n\n/**\n * Why a worker never started listening.\n *\n * @internal\n */\nexport class WorkerBootError extends Error {\n constructor(pid: number | undefined, reason: string) {\n super(`Worker process ${pid} failed to start: ${reason}`);\n }\n}\n\n/**\n * Forks the application's worker processes, replaces one that crashes, and\n * shuts them down gracefully.\n *\n * Emits `ready` once every worker of the initial fork is listening, and\n * `error` (with a `WorkerBootError`) when one of them fails to start instead \u2014\n * an application that cannot boot should stop, not report it is listening.\n *\n * @internal\n */\nclass Cluster extends EventEmitter {\n declare path: string;\n\n declare port: number;\n\n declare logger: Logger;\n\n declare workers: Set<Worker>;\n\n declare maxWorkers: number;\n\n declare shutdownTimeout: number;\n\n /**\n * Workers being shut down on purpose (a reload or `stop()`), whose exit is\n * not a crash to replace.\n */\n declare retiring: WeakSet<Worker>;\n\n /** Set by `stop()`: no worker is forked or replaced any more. */\n declare stopping: boolean;\n\n constructor({\n path,\n port,\n logger,\n maxWorkers,\n shutdownTimeout = SHUTDOWN_TIMEOUT\n }: ClusterOptions) {\n super();\n\n Object.defineProperties(this, {\n path: {\n value: path,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n port: {\n value: port,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n logger: {\n value: logger,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n workers: {\n value: new Set(),\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n maxWorkers: {\n value: maxWorkers || os.cpus().length,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n shutdownTimeout: {\n value: shutdownTimeout,\n writable: false,\n enumerable: true,\n configurable: false\n },\n\n retiring: {\n value: new WeakSet(),\n writable: false,\n enumerable: false,\n configurable: false\n },\n\n stopping: {\n value: false,\n writable: true,\n enumerable: false,\n configurable: false\n }\n });\n\n cluster.setupMaster({\n exec: joinPath(path, 'dist', 'boot.js')\n });\n\n process.on('update', (changed: Array<{ name: string }>) => {\n changed.forEach(({ name: filename }) => {\n logger.info(`${chalk.green('update')} ${filename}`);\n });\n\n this.reload();\n });\n\n this.forkAll().then(\n () => this.emit('ready'),\n err => {\n // Workers stopped while booting (a signal during start-up) are not a\n // failure to report.\n if (!this.stopping) {\n this.emit('error', err);\n }\n }\n );\n }\n\n /**\n * Fork a worker. Resolves with it once it is listening (or with `null`\n * when the cluster is full or stopping); rejects with a `WorkerBootError`\n * when it fails to start \u2014 it reports an error, exits, or does not listen\n * within `BOOT_TIMEOUT` twice in a row.\n */\n fork(retry: boolean = true): Promise<Worker | null> {\n if (this.stopping || this.workers.size >= this.maxWorkers) {\n return Promise.resolve(null);\n }\n\n return new Promise((resolve, reject) => {\n const worker = cluster.fork({\n NODE_ENV,\n PORT: this.port\n });\n const { pid } = worker.process;\n let booted = false;\n\n const fail = (reason: string) => {\n clearTimeout(timeout);\n worker.removeAllListeners();\n worker.kill();\n this.logger.info(`Removing worker process: ${chalk.red(`${pid}`)}`);\n reject(new WorkerBootError(pid, reason));\n };\n\n const timeout = setTimeout(() => {\n if (retry) {\n clearTimeout(timeout);\n worker.removeAllListeners();\n worker.kill();\n this.logger.info(`Removing worker process: ${chalk.red(`${pid}`)}`);\n this.fork(false).then(resolve, reject);\n } else {\n fail(`not listening after ${BOOT_TIMEOUT / 1000} s`);\n }\n }, BOOT_TIMEOUT);\n\n worker.on('message', (msg: string | Record<string, any>) => {\n let data: Record<string, any> = {};\n let message = msg;\n\n if (typeof message === 'object') {\n data = omit(message, 'message');\n message = message.message;\n }\n\n switch (message) {\n case 'ready':\n booted = true;\n clearTimeout(timeout);\n\n this.logger.info(line`\n Adding worker process: ${chalk.green(`${pid}`)}\n `);\n\n this.workers.add(worker);\n resolve(worker);\n break;\n\n case 'error':\n if (data.error) {\n this.logger.error(data.error);\n }\n\n if (!booted) {\n fail('it reported an error while booting');\n }\n break;\n\n default:\n break;\n }\n });\n\n worker.once('error', (err: Error) => {\n this.logger.error(err);\n\n if (!booted) {\n fail(err.message);\n }\n });\n\n worker.once('exit', (code: number | null, signal: string | null) => {\n clearTimeout(timeout);\n worker.removeAllListeners();\n this.workers.delete(worker);\n\n if (!booted) {\n reject(\n new WorkerBootError(\n pid,\n `it exited with ${code === null ? signal : `code ${code}`}`\n )\n );\n return;\n }\n\n if (this.retiring.has(worker)) {\n return;\n }\n\n // A crash after a successful boot: replace the worker.\n this.logger.info(line`\n Worker process: ${chalk.red(`${pid}`)} exited with\n ${code === null ? `signal ${signal}` : `code ${code}`}\n `);\n\n this.logger.info(`Removing worker process: ${chalk.red(`${pid}`)}`);\n\n this.fork().catch(err => this.replacementFailed(err));\n });\n });\n }\n\n /**\n * A replacement for a crashed worker did not start. With none left, the\n * application is down: stop, so the platform can restart it.\n */\n replacementFailed(err: Error) {\n this.logger.error(err);\n\n if (!this.stopping && !this.workers.size) {\n this.emit('error', err);\n }\n }\n\n /**\n * Shut `worker` down gracefully: it stops accepting connections, finishes\n * the requests in flight, closes its database connections and exits. It is\n * killed if it has not exited after `shutdownTimeout`.\n */\n shutdown<T extends Worker>(worker: T): Promise<T> {\n return new Promise(resolve => {\n this.workers.delete(worker);\n this.retiring.add(worker);\n\n if (worker.isDead()) {\n resolve(worker);\n return;\n }\n\n const timeout = setTimeout(() => {\n this.logger.warn(line`\n Worker process: ${chalk.red(`${worker.process.pid}`)} did not exit\n within ${this.shutdownTimeout} ms; killing it.\n `);\n worker.kill('SIGKILL');\n }, this.shutdownTimeout);\n\n worker.once('exit', () => {\n clearTimeout(timeout);\n resolve(worker);\n });\n\n if (worker.isConnected()) {\n worker.send('shutdown');\n } else {\n worker.kill();\n }\n });\n }\n\n /**\n * Shut every worker down gracefully, booting ones included, and fork no\n * more. Resolves once all have exited.\n */\n async stop(): Promise<void> {\n this.stopping = true;\n\n const workers = Object.values(cluster.workers ?? {}).filter(\n (worker): worker is Worker => Boolean(worker)\n );\n\n await Promise.all(workers.map(worker => this.shutdown(worker)));\n }\n\n /**\n * Replace every worker with one running the rebuilt application, two at a\n * time. A replacement that fails to start is logged, and the cluster keeps\n * watching: saving a fix reloads again.\n */\n async reload(): Promise<void> {\n if (this.stopping) {\n return;\n }\n\n const workers = Array.from(this.workers);\n const failed = (err: Error) => {\n this.logger.error(`${err.message}. Save a fix to reload.`);\n };\n\n if (!workers.length) {\n await this.forkAll().catch(failed);\n return;\n }\n\n for (let i = 0; i < workers.length; i += 2) {\n await Promise.all(\n workers.slice(i, i + 2).map(async worker => {\n await this.shutdown(worker);\n await this.fork().catch(failed);\n })\n );\n }\n }\n\n forkAll(): Promise<Array<Worker | null>> {\n return Promise.all(\n Array.from(range(1, this.maxWorkers)).map(() => this.fork())\n );\n }\n}\n\nexport default Cluster;\n\nexport type { ClusterOptions } from './interfaces';\n", "/**\n * @private\n */\nexport default function* range(\n start: number,\n end: number\n): Generator<number, void, void> {\n for (let i = start; i <= end; i += 1) {\n yield i;\n }\n}\n", "import Cluster from './cluster';\nimport type { ClusterOptions } from './cluster';\n\n/**\n * @private\n */\nexport function createCluster({\n path,\n port,\n logger,\n maxWorkers,\n shutdownTimeout\n}: ClusterOptions) {\n return new Cluster({\n path,\n port,\n logger,\n maxWorkers,\n shutdownTimeout\n });\n}\n", "import chalk from '../../../utils/chalk';\nimport { CWD, PORT, NODE_ENV } from '../../../constants';\nimport Logger from '../../logger';\nimport { createLoader } from '../../loader';\nimport { createCluster } from '../../pm';\nimport { watch } from '../../fs';\n\nimport { build } from './build';\n\n/**\n * @private\n */\nexport async function serve({\n hot = NODE_ENV === 'development',\n cluster = false,\n useStrict = false\n}: {\n hot: boolean;\n cluster: boolean;\n useStrict: boolean;\n}): Promise<void> {\n const load = createLoader(CWD);\n const { logging, server } = load('config');\n const logger = new Logger(logging);\n\n if (hot) {\n const watcher = await watch(CWD);\n\n watcher.on('change', async changed => {\n await build(useStrict);\n (process as NodeJS.EventEmitter).emit('update', changed);\n });\n }\n\n const pm = createCluster({\n logger,\n path: CWD,\n port: PORT,\n maxWorkers: cluster ? undefined : 1,\n shutdownTimeout: server?.shutdownTimeout\n });\n\n let stopping = false;\n\n const stop = async (code: number) => {\n if (stopping) {\n return;\n }\n\n stopping = true;\n await pm.stop();\n logger.info('Lumen Server stopped');\n process.exit(code);\n };\n\n pm.once('ready', () => {\n logger.info(`Lumen Server listening on port: ${chalk.cyan(`${PORT}`)}`);\n });\n\n // The application could not start (or, after a crash, could not be\n // restarted): exit non-zero, so a process manager notices and acts.\n pm.on('error', (err: Error) => {\n // The worker has logged its own error; this says what it means.\n logger.error(err.message);\n stop(1);\n });\n\n (['SIGTERM', 'SIGINT'] as const).forEach(signal => {\n process.once(signal, () => {\n logger.info(`Received ${signal}; finishing requests in flight`);\n stop(0);\n });\n });\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["build", "create", "destroy", "ora", "import_path", "import_fs", "import_path", "import_fb_watchman", "import_path", "resolve", "nativeExec", "path", "nativeWatch", "resolve", "watch", "joinPath", "EventEmitter", "path", "resolve", "path", "sep", "import_path", "path", "path", "import_path", "path", "path", "resolve", "fs", "resolvePath", "joinPath", "basename", "import_path", "import_inflection", "_", "import_path", "import_inflection", "path", "joinPath", "import_path", "line", "path", "path", "build", "import_os", "import_inflection", "template", "resolve", "import_path", "import_inflection", "createWriter", "controller", "path", "stat", "path", "path", "createWriter", "import_path", "path", "joinPath", "version", "migration", "import_inflection", "model", "initialize", "path", "cluster", "model", "import_inflection", "import_inflection", "import_inflection", "import_inflection", "import_inflection", "import_inflection", "import_inflection", "import_inflection", "import_inflection", "import_inflection", "path", "pad", "pad", "initialize", "model", "database_default", "import_os", "import_inflection", "model_default", "import_inflection", "import_inflection", "import_inflection", "import_inflection", "import_inflection", "import_path", "template", "path", "joinPath", "path", "joinPath", "generate", "model_default", "path", "line", "path", "create", "import_os", "path", "line", "import_path", "import_inflection", "path", "joinPath", "pairs", "path", "import_os", "path", "import_os", "import_os", "database_default", "version", "migration", "database_default", "migration", "version", "database_default", "import_os", "import_path", "import_inflection", "log", "path", "destroy", "model", "line", "import_path", "resolve", "path", "startRepl", "model", "controller", "serializer", "import_events", "import_os", "import_cluster", "import_path", "EventEmitter", "path", "os", "cluster", "joinPath", "resolve", "path", "cluster", "build"]
7
7
  }