@8medusa/framework 2.7.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 (274) hide show
  1. package/README.md +0 -0
  2. package/dist/build-tools/compiler.d.ts +64 -0
  3. package/dist/build-tools/compiler.d.ts.map +1 -0
  4. package/dist/build-tools/compiler.js +419 -0
  5. package/dist/build-tools/compiler.js.map +1 -0
  6. package/dist/build-tools/index.d.ts +2 -0
  7. package/dist/build-tools/index.d.ts.map +1 -0
  8. package/dist/build-tools/index.js +18 -0
  9. package/dist/build-tools/index.js.map +1 -0
  10. package/dist/config/config.d.ts +34 -0
  11. package/dist/config/config.d.ts.map +1 -0
  12. package/dist/config/config.js +134 -0
  13. package/dist/config/config.js.map +1 -0
  14. package/dist/config/index.d.ts +5 -0
  15. package/dist/config/index.d.ts.map +1 -0
  16. package/dist/config/index.js +21 -0
  17. package/dist/config/index.js.map +1 -0
  18. package/dist/config/loader.d.ts +11 -0
  19. package/dist/config/loader.d.ts.map +1 -0
  20. package/dist/config/loader.js +35 -0
  21. package/dist/config/loader.js.map +1 -0
  22. package/dist/config/types.d.ts +2 -0
  23. package/dist/config/types.d.ts.map +1 -0
  24. package/dist/config/types.js +3 -0
  25. package/dist/config/types.js.map +1 -0
  26. package/dist/container.d.ts +3 -0
  27. package/dist/container.d.ts.map +1 -0
  28. package/dist/container.js +21 -0
  29. package/dist/container.js.map +1 -0
  30. package/dist/database/index.d.ts +3 -0
  31. package/dist/database/index.d.ts.map +1 -0
  32. package/dist/database/index.js +19 -0
  33. package/dist/database/index.js.map +1 -0
  34. package/dist/database/pg-connection-loader.d.ts +6 -0
  35. package/dist/database/pg-connection-loader.d.ts.map +1 -0
  36. package/dist/database/pg-connection-loader.js +43 -0
  37. package/dist/database/pg-connection-loader.js.map +1 -0
  38. package/dist/feature-flags/feature-flag-loader.d.ts +8 -0
  39. package/dist/feature-flags/feature-flag-loader.d.ts.map +1 -0
  40. package/dist/feature-flags/feature-flag-loader.js +81 -0
  41. package/dist/feature-flags/feature-flag-loader.js.map +1 -0
  42. package/dist/feature-flags/flag-router.d.ts +32 -0
  43. package/dist/feature-flags/flag-router.d.ts.map +1 -0
  44. package/dist/feature-flags/flag-router.js +67 -0
  45. package/dist/feature-flags/flag-router.js.map +1 -0
  46. package/dist/feature-flags/index.d.ts +5 -0
  47. package/dist/feature-flags/index.d.ts.map +1 -0
  48. package/dist/feature-flags/index.js +21 -0
  49. package/dist/feature-flags/index.js.map +1 -0
  50. package/dist/feature-flags/types.d.ts +31 -0
  51. package/dist/feature-flags/types.d.ts.map +1 -0
  52. package/dist/feature-flags/types.js +3 -0
  53. package/dist/feature-flags/types.js.map +1 -0
  54. package/dist/http/express-loader.d.ts +8 -0
  55. package/dist/http/express-loader.d.ts.map +1 -0
  56. package/dist/http/express-loader.js +128 -0
  57. package/dist/http/express-loader.js.map +1 -0
  58. package/dist/http/index.d.ts +15 -0
  59. package/dist/http/index.d.ts.map +1 -0
  60. package/dist/http/index.js +31 -0
  61. package/dist/http/index.js.map +1 -0
  62. package/dist/http/middleware-file-loader.d.ts +33 -0
  63. package/dist/http/middleware-file-loader.d.ts.map +1 -0
  64. package/dist/http/middleware-file-loader.js +173 -0
  65. package/dist/http/middleware-file-loader.js.map +1 -0
  66. package/dist/http/middlewares/apply-default-filters.d.ts +3 -0
  67. package/dist/http/middlewares/apply-default-filters.d.ts.map +1 -0
  68. package/dist/http/middlewares/apply-default-filters.js +32 -0
  69. package/dist/http/middlewares/apply-default-filters.js.map +1 -0
  70. package/dist/http/middlewares/apply-params-as-filters.d.ts +5 -0
  71. package/dist/http/middlewares/apply-params-as-filters.d.ts.map +1 -0
  72. package/dist/http/middlewares/apply-params-as-filters.js +14 -0
  73. package/dist/http/middlewares/apply-params-as-filters.js.map +1 -0
  74. package/dist/http/middlewares/authenticate-middleware.d.ts +13 -0
  75. package/dist/http/middlewares/authenticate-middleware.d.ts.map +1 -0
  76. package/dist/http/middlewares/authenticate-middleware.js +136 -0
  77. package/dist/http/middlewares/authenticate-middleware.js.map +1 -0
  78. package/dist/http/middlewares/bodyparser.d.ts +13 -0
  79. package/dist/http/middlewares/bodyparser.d.ts.map +1 -0
  80. package/dist/http/middlewares/bodyparser.js +62 -0
  81. package/dist/http/middlewares/bodyparser.js.map +1 -0
  82. package/dist/http/middlewares/clear-filters-by-key.d.ts +3 -0
  83. package/dist/http/middlewares/clear-filters-by-key.d.ts.map +1 -0
  84. package/dist/http/middlewares/clear-filters-by-key.js +12 -0
  85. package/dist/http/middlewares/clear-filters-by-key.js.map +1 -0
  86. package/dist/http/middlewares/ensure-publishable-api-key.d.ts +3 -0
  87. package/dist/http/middlewares/ensure-publishable-api-key.d.ts.map +1 -0
  88. package/dist/http/middlewares/ensure-publishable-api-key.js +45 -0
  89. package/dist/http/middlewares/ensure-publishable-api-key.js.map +1 -0
  90. package/dist/http/middlewares/error-handler.d.ts +21 -0
  91. package/dist/http/middlewares/error-handler.d.ts.map +1 -0
  92. package/dist/http/middlewares/error-handler.js +85 -0
  93. package/dist/http/middlewares/error-handler.js.map +1 -0
  94. package/dist/http/middlewares/exception-formatter.d.ts +9 -0
  95. package/dist/http/middlewares/exception-formatter.d.ts.map +1 -0
  96. package/dist/http/middlewares/exception-formatter.js +36 -0
  97. package/dist/http/middlewares/exception-formatter.js.map +1 -0
  98. package/dist/http/middlewares/index.d.ts +8 -0
  99. package/dist/http/middlewares/index.d.ts.map +1 -0
  100. package/dist/http/middlewares/index.js +24 -0
  101. package/dist/http/middlewares/index.js.map +1 -0
  102. package/dist/http/middlewares/set-context.d.ts +3 -0
  103. package/dist/http/middlewares/set-context.d.ts.map +1 -0
  104. package/dist/http/middlewares/set-context.js +18 -0
  105. package/dist/http/middlewares/set-context.js.map +1 -0
  106. package/dist/http/router.d.ts +28 -0
  107. package/dist/http/router.d.ts.map +1 -0
  108. package/dist/http/router.js +252 -0
  109. package/dist/http/router.js.map +1 -0
  110. package/dist/http/routes-finder.d.ts +22 -0
  111. package/dist/http/routes-finder.d.ts.map +1 -0
  112. package/dist/http/routes-finder.js +62 -0
  113. package/dist/http/routes-finder.js.map +1 -0
  114. package/dist/http/routes-loader.d.ts +30 -0
  115. package/dist/http/routes-loader.d.ts.map +1 -0
  116. package/dist/http/routes-loader.js +203 -0
  117. package/dist/http/routes-loader.js.map +1 -0
  118. package/dist/http/routes-sorter.d.ts +105 -0
  119. package/dist/http/routes-sorter.d.ts.map +1 -0
  120. package/dist/http/routes-sorter.js +146 -0
  121. package/dist/http/routes-sorter.js.map +1 -0
  122. package/dist/http/types.d.ts +164 -0
  123. package/dist/http/types.d.ts.map +1 -0
  124. package/dist/http/types.js +16 -0
  125. package/dist/http/types.js.map +1 -0
  126. package/dist/http/utils/define-middlewares.d.ts +22 -0
  127. package/dist/http/utils/define-middlewares.d.ts.map +1 -0
  128. package/dist/http/utils/define-middlewares.js +27 -0
  129. package/dist/http/utils/define-middlewares.js.map +1 -0
  130. package/dist/http/utils/get-query-config.d.ts +42 -0
  131. package/dist/http/utils/get-query-config.d.ts.map +1 -0
  132. package/dist/http/utils/get-query-config.js +183 -0
  133. package/dist/http/utils/get-query-config.js.map +1 -0
  134. package/dist/http/utils/http-compression.d.ts +5 -0
  135. package/dist/http/utils/http-compression.d.ts.map +1 -0
  136. package/dist/http/utils/http-compression.js +33 -0
  137. package/dist/http/utils/http-compression.js.map +1 -0
  138. package/dist/http/utils/maybe-apply-link-filter.d.ts +8 -0
  139. package/dist/http/utils/maybe-apply-link-filter.d.ts.map +1 -0
  140. package/dist/http/utils/maybe-apply-link-filter.js +68 -0
  141. package/dist/http/utils/maybe-apply-link-filter.js.map +1 -0
  142. package/dist/http/utils/refetch-entities.d.ts +5 -0
  143. package/dist/http/utils/refetch-entities.d.ts.map +1 -0
  144. package/dist/http/utils/refetch-entities.js +29 -0
  145. package/dist/http/utils/refetch-entities.js.map +1 -0
  146. package/dist/http/utils/restricted-fields.d.ts +6 -0
  147. package/dist/http/utils/restricted-fields.d.ts.map +1 -0
  148. package/dist/http/utils/restricted-fields.js +30 -0
  149. package/dist/http/utils/restricted-fields.js.map +1 -0
  150. package/dist/http/utils/unless-path.d.ts +9 -0
  151. package/dist/http/utils/unless-path.d.ts.map +1 -0
  152. package/dist/http/utils/unless-path.js +19 -0
  153. package/dist/http/utils/unless-path.js.map +1 -0
  154. package/dist/http/utils/validate-body.d.ts +5 -0
  155. package/dist/http/utils/validate-body.d.ts.map +1 -0
  156. package/dist/http/utils/validate-body.js +23 -0
  157. package/dist/http/utils/validate-body.js.map +1 -0
  158. package/dist/http/utils/validate-query.d.ts +6 -0
  159. package/dist/http/utils/validate-query.d.ts.map +1 -0
  160. package/dist/http/utils/validate-query.js +79 -0
  161. package/dist/http/utils/validate-query.js.map +1 -0
  162. package/dist/http/utils/wrap-handler.d.ts +3 -0
  163. package/dist/http/utils/wrap-handler.d.ts.map +1 -0
  164. package/dist/http/utils/wrap-handler.js +26 -0
  165. package/dist/http/utils/wrap-handler.js.map +1 -0
  166. package/dist/index.d.ts +17 -0
  167. package/dist/index.d.ts.map +1 -0
  168. package/dist/index.js +35 -0
  169. package/dist/index.js.map +1 -0
  170. package/dist/jobs/index.d.ts +2 -0
  171. package/dist/jobs/index.d.ts.map +1 -0
  172. package/dist/jobs/index.js +18 -0
  173. package/dist/jobs/index.js.map +1 -0
  174. package/dist/jobs/job-loader.d.ts +42 -0
  175. package/dist/jobs/job-loader.d.ts.map +1 -0
  176. package/dist/jobs/job-loader.js +78 -0
  177. package/dist/jobs/job-loader.js.map +1 -0
  178. package/dist/links/index.d.ts +2 -0
  179. package/dist/links/index.d.ts.map +1 -0
  180. package/dist/links/index.js +18 -0
  181. package/dist/links/index.js.map +1 -0
  182. package/dist/links/link-loader.d.ts +10 -0
  183. package/dist/links/link-loader.d.ts.map +1 -0
  184. package/dist/links/link-loader.js +74 -0
  185. package/dist/links/link-loader.js.map +1 -0
  186. package/dist/logger/index.d.ts +3 -0
  187. package/dist/logger/index.d.ts.map +1 -0
  188. package/dist/logger/index.js +9 -0
  189. package/dist/logger/index.js.map +1 -0
  190. package/dist/medusa-app-loader.d.ts +51 -0
  191. package/dist/medusa-app-loader.d.ts.map +1 -0
  192. package/dist/medusa-app-loader.js +189 -0
  193. package/dist/medusa-app-loader.js.map +1 -0
  194. package/dist/migrations/index.d.ts +3 -0
  195. package/dist/migrations/index.d.ts.map +1 -0
  196. package/dist/migrations/index.js +19 -0
  197. package/dist/migrations/index.js.map +1 -0
  198. package/dist/migrations/migrator.d.ts +38 -0
  199. package/dist/migrations/migrator.d.ts.map +1 -0
  200. package/dist/migrations/migrator.js +129 -0
  201. package/dist/migrations/migrator.js.map +1 -0
  202. package/dist/migrations/run-migration-scripts.d.ts +17 -0
  203. package/dist/migrations/run-migration-scripts.d.ts.map +1 -0
  204. package/dist/migrations/run-migration-scripts.js +94 -0
  205. package/dist/migrations/run-migration-scripts.js.map +1 -0
  206. package/dist/mikro-orm-cli/bin.d.ts +14 -0
  207. package/dist/mikro-orm-cli/bin.d.ts.map +1 -0
  208. package/dist/mikro-orm-cli/bin.js +54 -0
  209. package/dist/mikro-orm-cli/bin.js.map +1 -0
  210. package/dist/modules-sdk/index.d.ts +2 -0
  211. package/dist/modules-sdk/index.d.ts.map +1 -0
  212. package/dist/modules-sdk/index.js +18 -0
  213. package/dist/modules-sdk/index.js.map +1 -0
  214. package/dist/orchestration/index.d.ts +2 -0
  215. package/dist/orchestration/index.d.ts.map +1 -0
  216. package/dist/orchestration/index.js +18 -0
  217. package/dist/orchestration/index.js.map +1 -0
  218. package/dist/subscribers/index.d.ts +3 -0
  219. package/dist/subscribers/index.d.ts.map +1 -0
  220. package/dist/subscribers/index.js +19 -0
  221. package/dist/subscribers/index.js.map +1 -0
  222. package/dist/subscribers/subscriber-loader.d.ts +12 -0
  223. package/dist/subscribers/subscriber-loader.d.ts.map +1 -0
  224. package/dist/subscribers/subscriber-loader.js +147 -0
  225. package/dist/subscribers/subscriber-loader.js.map +1 -0
  226. package/dist/subscribers/types.d.ts +15 -0
  227. package/dist/subscribers/types.d.ts.map +1 -0
  228. package/dist/subscribers/types.js +3 -0
  229. package/dist/subscribers/types.js.map +1 -0
  230. package/dist/telemetry/index.d.ts +50 -0
  231. package/dist/telemetry/index.d.ts.map +1 -0
  232. package/dist/telemetry/index.js +81 -0
  233. package/dist/telemetry/index.js.map +1 -0
  234. package/dist/types/container.d.ts +62 -0
  235. package/dist/types/container.d.ts.map +1 -0
  236. package/dist/types/container.js +3 -0
  237. package/dist/types/container.js.map +1 -0
  238. package/dist/types/index.d.ts +2 -0
  239. package/dist/types/index.d.ts.map +1 -0
  240. package/dist/types/index.js +18 -0
  241. package/dist/types/index.js.map +1 -0
  242. package/dist/utils/index.d.ts +3 -0
  243. package/dist/utils/index.d.ts.map +1 -0
  244. package/dist/utils/index.js +19 -0
  245. package/dist/utils/index.js.map +1 -0
  246. package/dist/utils/resource-loader.d.ts +26 -0
  247. package/dist/utils/resource-loader.d.ts.map +1 -0
  248. package/dist/utils/resource-loader.js +78 -0
  249. package/dist/utils/resource-loader.js.map +1 -0
  250. package/dist/workflows/index.d.ts +3 -0
  251. package/dist/workflows/index.d.ts.map +1 -0
  252. package/dist/workflows/index.js +19 -0
  253. package/dist/workflows/index.js.map +1 -0
  254. package/dist/workflows/workflow-loader.d.ts +12 -0
  255. package/dist/workflows/workflow-loader.d.ts.map +1 -0
  256. package/dist/workflows/workflow-loader.js +24 -0
  257. package/dist/workflows/workflow-loader.js.map +1 -0
  258. package/dist/workflows-sdk/composer.d.ts +2 -0
  259. package/dist/workflows-sdk/composer.d.ts.map +1 -0
  260. package/dist/workflows-sdk/composer.js +18 -0
  261. package/dist/workflows-sdk/composer.js.map +1 -0
  262. package/dist/workflows-sdk/index.d.ts +3 -0
  263. package/dist/workflows-sdk/index.d.ts.map +1 -0
  264. package/dist/workflows-sdk/index.js +19 -0
  265. package/dist/workflows-sdk/index.js.map +1 -0
  266. package/dist/zod/index.d.ts +2 -0
  267. package/dist/zod/index.d.ts.map +1 -0
  268. package/dist/zod/index.js +18 -0
  269. package/dist/zod/index.js.map +1 -0
  270. package/dist/zod/zod-helpers.d.ts +3 -0
  271. package/dist/zod/zod-helpers.d.ts.map +1 -0
  272. package/dist/zod/zod-helpers.js +95 -0
  273. package/dist/zod/zod-helpers.js.map +1 -0
  274. package/package.json +133 -0
@@ -0,0 +1,252 @@
1
+ "use strict";
2
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
3
+ if (kind === "m") throw new TypeError("Private method is not writable");
4
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
5
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
6
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
7
+ };
8
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
10
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ var _ApiLoader_instances, _a, _ApiLoader_app, _ApiLoader_sourceDirs, _ApiLoader_loadHttpResources, _ApiLoader_registerExpressHandler, _ApiLoader_assignRestrictedFields, _ApiLoader_createCorsOptions, _ApiLoader_applyCorsMiddleware, _ApiLoader_applyAuthMiddleware, _ApiLoader_applyBodyParserMiddleware, _ApiLoader_assignAdditionalDataValidator, _ApiLoader_applyStorePublishableKeyMiddleware;
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.ApiLoader = void 0;
19
+ const reporter_1 = __importDefault(require("@8medusa/cli/dist/reporter"));
20
+ const cors_1 = __importDefault(require("cors"));
21
+ const utils_1 = require("@8medusa/utils");
22
+ const routes_loader_1 = require("./routes-loader");
23
+ const routes_finder_1 = require("./routes-finder");
24
+ const routes_sorter_1 = require("./routes-sorter");
25
+ const wrap_handler_1 = require("./utils/wrap-handler");
26
+ const middlewares_1 = require("./middlewares");
27
+ const error_handler_1 = require("./middlewares/error-handler");
28
+ const restricted_fields_1 = require("./utils/restricted-fields");
29
+ const middleware_file_loader_1 = require("./middleware-file-loader");
30
+ const bodyparser_1 = require("./middlewares/bodyparser");
31
+ const ensure_publishable_api_key_1 = require("./middlewares/ensure-publishable-api-key");
32
+ const config_1 = require("../config");
33
+ class ApiLoader {
34
+ constructor({ app, sourceDir, baseRestrictedFields = [], }) {
35
+ _ApiLoader_instances.add(this);
36
+ /**
37
+ * An express instance
38
+ * @private
39
+ */
40
+ _ApiLoader_app.set(this, void 0);
41
+ /**
42
+ * Path from where to load the routes from
43
+ * @private
44
+ */
45
+ _ApiLoader_sourceDirs.set(this, void 0);
46
+ __classPrivateFieldSet(this, _ApiLoader_app, app, "f");
47
+ __classPrivateFieldSet(this, _ApiLoader_sourceDirs, Array.isArray(sourceDir) ? sourceDir : [sourceDir], "f");
48
+ __classPrivateFieldGet(this, _ApiLoader_instances, "m", _ApiLoader_assignRestrictedFields).call(this, baseRestrictedFields ?? []);
49
+ }
50
+ async load() {
51
+ const { errorHandler: sourceErrorHandler, middlewares, routes, routesFinder, bodyParserConfigRoutes, additionalDataValidatorRoutes, } = await __classPrivateFieldGet(this, _ApiLoader_instances, "m", _ApiLoader_loadHttpResources).call(this);
52
+ /**
53
+ * Parse request body on all the requests and use the routes finder
54
+ * to pick the best matching config for the given route.
55
+ */
56
+ const bodyParserRoutesFinder = new routes_finder_1.RoutesFinder(new routes_sorter_1.RoutesSorter(bodyParserConfigRoutes).sort([
57
+ "static",
58
+ "params",
59
+ "regex",
60
+ "wildcard",
61
+ "global",
62
+ ]));
63
+ __classPrivateFieldGet(this, _ApiLoader_instances, "m", _ApiLoader_applyBodyParserMiddleware).call(this, "/", bodyParserRoutesFinder);
64
+ /**
65
+ * Use the routes finder to pick the additional data validator
66
+ * to be applied on the current request
67
+ */
68
+ if (additionalDataValidatorRoutes.length) {
69
+ const additionalDataValidatorRoutesFinder = new routes_finder_1.RoutesFinder(new routes_sorter_1.RoutesSorter(additionalDataValidatorRoutes).sort([
70
+ "static",
71
+ "params",
72
+ "regex",
73
+ "wildcard",
74
+ "global",
75
+ ]));
76
+ __classPrivateFieldGet(this, _ApiLoader_instances, "m", _ApiLoader_assignAdditionalDataValidator).call(this, "/", additionalDataValidatorRoutesFinder);
77
+ }
78
+ /**
79
+ * CORS and Auth setup for admin routes
80
+ */
81
+ __classPrivateFieldGet(this, _ApiLoader_instances, "m", _ApiLoader_applyCorsMiddleware).call(this, routesFinder, "/admin", "shouldAppendAdminCors", __classPrivateFieldGet(this, _ApiLoader_instances, "m", _ApiLoader_createCorsOptions).call(this, config_1.configManager.config.projectConfig.http.adminCors));
82
+ __classPrivateFieldGet(this, _ApiLoader_instances, "m", _ApiLoader_applyAuthMiddleware).call(this, routesFinder, "/admin", "user", [
83
+ "bearer",
84
+ "session",
85
+ "api-key",
86
+ ]);
87
+ __classPrivateFieldGet(this, _ApiLoader_instances, "m", _ApiLoader_applyCorsMiddleware).call(this, routesFinder, "/store", "shouldAppendStoreCors", __classPrivateFieldGet(this, _ApiLoader_instances, "m", _ApiLoader_createCorsOptions).call(this, config_1.configManager.config.projectConfig.http.storeCors));
88
+ /**
89
+ * Publishable key check, CORS and auth setup for store routes.
90
+ */
91
+ __classPrivateFieldGet(this, _ApiLoader_instances, "m", _ApiLoader_applyStorePublishableKeyMiddleware).call(this, "/store");
92
+ __classPrivateFieldGet(this, _ApiLoader_instances, "m", _ApiLoader_applyAuthMiddleware).call(this, routesFinder, "/store", "customer", ["bearer", "session"], {
93
+ allowUnauthenticated: true,
94
+ });
95
+ /**
96
+ * Apply CORS middleware for "/auth" routes
97
+ */
98
+ __classPrivateFieldGet(this, _ApiLoader_instances, "m", _ApiLoader_applyCorsMiddleware).call(this, routesFinder, "/auth", "shouldAppendAuthCors", __classPrivateFieldGet(this, _ApiLoader_instances, "m", _ApiLoader_createCorsOptions).call(this, config_1.configManager.config.projectConfig.http.authCors));
99
+ const collectionToSort = []
100
+ .concat(middlewares)
101
+ .concat(routes);
102
+ const sortedRoutes = new routes_sorter_1.RoutesSorter(collectionToSort).sort();
103
+ sortedRoutes.forEach((route) => {
104
+ if ("isRoute" in route) {
105
+ routesFinder.add(route);
106
+ }
107
+ __classPrivateFieldGet(this, _ApiLoader_instances, "m", _ApiLoader_registerExpressHandler).call(this, route);
108
+ });
109
+ /**
110
+ * Registering error handler as the final handler
111
+ */
112
+ __classPrivateFieldGet(this, _ApiLoader_app, "f").use(sourceErrorHandler ?? (0, error_handler_1.errorHandler)());
113
+ }
114
+ }
115
+ exports.ApiLoader = ApiLoader;
116
+ _a = ApiLoader, _ApiLoader_app = new WeakMap(), _ApiLoader_sourceDirs = new WeakMap(), _ApiLoader_instances = new WeakSet(), _ApiLoader_loadHttpResources =
117
+ /**
118
+ * Loads routes, middleware, bodyParserConfig routes, routes that have
119
+ * opted out for Auth and CORS and the error handler.
120
+ */
121
+ async function _ApiLoader_loadHttpResources() {
122
+ const routesLoader = new routes_loader_1.RoutesLoader();
123
+ const middlewareLoader = new middleware_file_loader_1.MiddlewareFileLoader();
124
+ for (let dir of __classPrivateFieldGet(this, _ApiLoader_sourceDirs, "f")) {
125
+ await routesLoader.scanDir(dir);
126
+ await middlewareLoader.scanDir(dir);
127
+ }
128
+ return {
129
+ routes: routesLoader.getRoutes(),
130
+ routesFinder: new routes_finder_1.RoutesFinder(),
131
+ middlewares: middlewareLoader.getMiddlewares(),
132
+ errorHandler: middlewareLoader.getErrorHandler(),
133
+ bodyParserConfigRoutes: middlewareLoader.getBodyParserConfigRoutes(),
134
+ additionalDataValidatorRoutes: middlewareLoader.getAdditionalDataValidatorRoutes(),
135
+ };
136
+ }, _ApiLoader_registerExpressHandler = function _ApiLoader_registerExpressHandler(route) {
137
+ if ("isRoute" in route) {
138
+ reporter_1.default.debug(`registering route ${route.method} ${route.matcher}`);
139
+ const handler = _a.traceRoute
140
+ ? _a.traceRoute(route.handler, {
141
+ route: route.matcher,
142
+ method: route.method,
143
+ })
144
+ : route.handler;
145
+ __classPrivateFieldGet(this, _ApiLoader_app, "f")[route.method.toLowerCase()](route.matcher, (0, wrap_handler_1.wrapHandler)(handler));
146
+ return;
147
+ }
148
+ if (!route.methods) {
149
+ reporter_1.default.debug(`registering global middleware for ${route.matcher}`);
150
+ const handler = _a.traceMiddleware
151
+ ? _a.traceMiddleware(route.handler, {
152
+ route: route.matcher,
153
+ })
154
+ : route.handler;
155
+ __classPrivateFieldGet(this, _ApiLoader_app, "f").use(route.matcher, (0, wrap_handler_1.wrapHandler)(handler));
156
+ return;
157
+ }
158
+ const methods = Array.isArray(route.methods)
159
+ ? route.methods
160
+ : [route.methods];
161
+ methods.forEach((method) => {
162
+ reporter_1.default.debug(`registering route middleware ${method} ${route.matcher}`);
163
+ const handler = _a.traceMiddleware
164
+ ? _a.traceMiddleware((0, wrap_handler_1.wrapHandler)(route.handler), {
165
+ route: route.matcher,
166
+ method: method,
167
+ })
168
+ : (0, wrap_handler_1.wrapHandler)(route.handler);
169
+ __classPrivateFieldGet(this, _ApiLoader_app, "f")[method.toLowerCase()](route.matcher, handler);
170
+ });
171
+ }, _ApiLoader_assignRestrictedFields = function _ApiLoader_assignRestrictedFields(baseRestrictedFields) {
172
+ __classPrivateFieldGet(this, _ApiLoader_app, "f").use("/store", ((req, _, next) => {
173
+ req.restrictedFields = new restricted_fields_1.RestrictedFields();
174
+ req.restrictedFields.add(baseRestrictedFields);
175
+ next();
176
+ }));
177
+ __classPrivateFieldGet(this, _ApiLoader_app, "f").use("/admin", ((req, _, next) => {
178
+ req.restrictedFields = new restricted_fields_1.RestrictedFields();
179
+ next();
180
+ }));
181
+ }, _ApiLoader_createCorsOptions = function _ApiLoader_createCorsOptions(origin) {
182
+ return {
183
+ origin: (0, utils_1.parseCorsOrigins)(origin),
184
+ credentials: true,
185
+ preflightContinue: false,
186
+ };
187
+ }, _ApiLoader_applyCorsMiddleware = function _ApiLoader_applyCorsMiddleware(routesFinder, namespace, toggleKey, corsOptions) {
188
+ const corsFn = (0, cors_1.default)(corsOptions);
189
+ const corsMiddleware = function corsMiddleware(req, res, next) {
190
+ let method = req.method;
191
+ if (req.method === "OPTIONS") {
192
+ method = req.headers["access-control-request-method"] ?? req.method;
193
+ }
194
+ const path = `${namespace}${req.path}`;
195
+ const matchingRoute = routesFinder.find(path, method);
196
+ if (matchingRoute && matchingRoute[toggleKey] === true) {
197
+ return corsFn(req, res, next);
198
+ }
199
+ reporter_1.default.debug(`Skipping CORS middleware ${req.method} ${path}`);
200
+ return next();
201
+ };
202
+ __classPrivateFieldGet(this, _ApiLoader_app, "f").use(namespace, _a.traceMiddleware
203
+ ? _a.traceMiddleware(corsMiddleware, {
204
+ route: namespace,
205
+ })
206
+ : corsMiddleware);
207
+ }, _ApiLoader_applyAuthMiddleware = function _ApiLoader_applyAuthMiddleware(routesFinder, namespace, actorType, authType, options) {
208
+ reporter_1.default.debug(`Registering auth middleware for prefix ${namespace}`);
209
+ const originalFn = (0, middlewares_1.authenticate)(actorType, authType, options);
210
+ const authMiddleware = function authMiddleware(req, res, next) {
211
+ const path = `${namespace}${req.path}`;
212
+ const matchingRoute = routesFinder.find(path, req.method);
213
+ if (matchingRoute && matchingRoute.optedOutOfAuth) {
214
+ reporter_1.default.debug(`Skipping auth ${req.method} ${path}`);
215
+ return next();
216
+ }
217
+ reporter_1.default.debug(`Authenticating route ${req.method} ${path}`);
218
+ return originalFn(req, res, next);
219
+ };
220
+ __classPrivateFieldGet(this, _ApiLoader_app, "f").use(namespace, _a.traceMiddleware
221
+ ? _a.traceMiddleware(authMiddleware, {
222
+ route: namespace,
223
+ })
224
+ : authMiddleware);
225
+ }, _ApiLoader_applyBodyParserMiddleware = function _ApiLoader_applyBodyParserMiddleware(namespace, routesFinder) {
226
+ reporter_1.default.debug(`Registering bodyparser middleware for prefix ${namespace}`);
227
+ __classPrivateFieldGet(this, _ApiLoader_app, "f").use(namespace, (0, bodyparser_1.createBodyParserMiddlewaresStack)(namespace, routesFinder, _a.traceMiddleware));
228
+ }, _ApiLoader_assignAdditionalDataValidator = function _ApiLoader_assignAdditionalDataValidator(namespace, routesFinder) {
229
+ reporter_1.default.debug(`Registering assignAdditionalDataValidator middleware for prefix ${namespace}`);
230
+ const additionalDataValidator = function additionalDataValidator(req, _, next) {
231
+ const matchingRoute = routesFinder.find(req.path, req.method);
232
+ if (matchingRoute && matchingRoute.validator) {
233
+ reporter_1.default.debug(`Using validator to validate additional data on ${req.method} ${req.path}`);
234
+ req.additionalDataValidator = matchingRoute.validator;
235
+ }
236
+ return next();
237
+ };
238
+ __classPrivateFieldGet(this, _ApiLoader_app, "f").use(namespace, _a.traceMiddleware
239
+ ? _a.traceMiddleware(additionalDataValidator, {
240
+ route: namespace,
241
+ })
242
+ : additionalDataValidator);
243
+ }, _ApiLoader_applyStorePublishableKeyMiddleware = function _ApiLoader_applyStorePublishableKeyMiddleware(namespace) {
244
+ reporter_1.default.debug(`Registering publishable key middleware for namespace ${namespace}`);
245
+ let middleware = _a.traceMiddleware
246
+ ? _a.traceMiddleware(ensure_publishable_api_key_1.ensurePublishableApiKeyMiddleware, {
247
+ route: namespace,
248
+ })
249
+ : ensure_publishable_api_key_1.ensurePublishableApiKeyMiddleware;
250
+ __classPrivateFieldGet(this, _ApiLoader_app, "f").use(namespace, middleware);
251
+ };
252
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/http/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { MiddlewareVerb, RouteVerb } from "./types";
2
+ export declare class RoutesFinder<T extends {
3
+ matcher: string;
4
+ methods: MiddlewareVerb | MiddlewareVerb[];
5
+ } | {
6
+ matcher: string;
7
+ method: RouteVerb;
8
+ }> {
9
+ #private;
10
+ constructor(routes?: T[]);
11
+ /**
12
+ * Register route for lookup
13
+ */
14
+ add(route: T): void;
15
+ /**
16
+ * Get the matching route for a given HTTP method and URL
17
+ */
18
+ find(url: string, method: MiddlewareVerb): (T & {
19
+ matchRegex: RegExp;
20
+ }) | null | undefined;
21
+ }
22
+ //# sourceMappingURL=routes-finder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes-finder.d.ts","sourceRoot":"","sources":["../../src/http/routes-finder.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAExD,qBAAa,YAAY,CACvB,CAAC,SACG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,cAAc,GAAG,cAAc,EAAE,CAAA;CAAE,GAC/D;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,CAAA;CAAE;;gBAqB9B,MAAM,CAAC,EAAE,CAAC,EAAE;IAMxB;;OAEG;IACH,GAAG,CAAC,KAAK,EAAE,CAAC;IAOZ;;OAEG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc;oBA/BtB,MAAM;;CAgDzB"}
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
5
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
6
+ };
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ var _RoutesFinder_existingMatches, _RoutesFinder_routes;
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.RoutesFinder = void 0;
13
+ const path_to_regexp_1 = __importDefault(require("path-to-regexp"));
14
+ class RoutesFinder {
15
+ constructor(routes) {
16
+ /**
17
+ * Cache of existing matches to avoid regex tests on every
18
+ * single HTTP request
19
+ */
20
+ _RoutesFinder_existingMatches.set(this, new Map()
21
+ /**
22
+ * Collection of registered routes
23
+ */
24
+ );
25
+ /**
26
+ * Collection of registered routes
27
+ */
28
+ _RoutesFinder_routes.set(this, []);
29
+ if (routes) {
30
+ routes.forEach((route) => this.add(route));
31
+ }
32
+ }
33
+ /**
34
+ * Register route for lookup
35
+ */
36
+ add(route) {
37
+ __classPrivateFieldGet(this, _RoutesFinder_routes, "f").push({
38
+ ...route,
39
+ matchRegex: (0, path_to_regexp_1.default)(route.matcher),
40
+ });
41
+ }
42
+ /**
43
+ * Get the matching route for a given HTTP method and URL
44
+ */
45
+ find(url, method) {
46
+ const key = `${method}:${url}`;
47
+ if (__classPrivateFieldGet(this, _RoutesFinder_existingMatches, "f").has(key)) {
48
+ return __classPrivateFieldGet(this, _RoutesFinder_existingMatches, "f").get(key);
49
+ }
50
+ const result = __classPrivateFieldGet(this, _RoutesFinder_routes, "f").find((route) => {
51
+ if ("methods" in route) {
52
+ return route.methods.includes(method) && route.matchRegex.test(url);
53
+ }
54
+ return route.method === method && route.matchRegex.test(url);
55
+ }) ?? null;
56
+ __classPrivateFieldGet(this, _RoutesFinder_existingMatches, "f").set(key, result);
57
+ return result;
58
+ }
59
+ }
60
+ exports.RoutesFinder = RoutesFinder;
61
+ _RoutesFinder_existingMatches = new WeakMap(), _RoutesFinder_routes = new WeakMap();
62
+ //# sourceMappingURL=routes-finder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes-finder.js","sourceRoot":"","sources":["../../src/http/routes-finder.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oEAAyC;AAGzC,MAAa,YAAY;IAwBvB,YAAY,MAAY;QAnBxB;;;WAGG;QACH,wCAMI,IAAI,GAAG,EAAE;QAEb;;WAEG;UAJU;QAEb;;WAEG;QACH,+BAEO,EAAE,EAAA;QAGP,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA;QAC5C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,KAAQ;QACV,uBAAA,IAAI,4BAAQ,CAAC,IAAI,CAAC;YAChB,GAAG,KAAK;YACR,UAAU,EAAE,IAAA,wBAAY,EAAC,KAAK,CAAC,OAAO,CAAC;SACxC,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,GAAW,EAAE,MAAsB;QACtC,MAAM,GAAG,GAAG,GAAG,MAAM,IAAI,GAAG,EAAE,CAAA;QAC9B,IAAI,uBAAA,IAAI,qCAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,OAAO,uBAAA,IAAI,qCAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACvC,CAAC;QAED,MAAM,MAAM,GACV,uBAAA,IAAI,4BAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;YAC1B,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;gBACvB,OAAO,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACrE,CAAC;YACD,OAAO,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC9D,CAAC,CAAC,IAAI,IAAI,CAAA;QAEZ,uBAAA,IAAI,qCAAiB,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;QACtC,OAAO,MAAM,CAAA;IACf,CAAC;CACF;AA5DD,oCA4DC"}
@@ -0,0 +1,30 @@
1
+ import { type RouteDescriptor } from "./types";
2
+ /**
3
+ * Exposes to API to register routes manually or by scanning the filesystem from a
4
+ * source directory.
5
+ *
6
+ * In case of duplicates routes, the route registered afterwards will override the
7
+ * one registered first.
8
+ */
9
+ export declare class RoutesLoader {
10
+ #private;
11
+ /**
12
+ * Scans a given directory and loads all routes from it. You can access the loaded
13
+ * routes via "getRoutes" method
14
+ */
15
+ scanDir(sourceDir: string): Promise<void>;
16
+ /**
17
+ * Register a route
18
+ */
19
+ registerRoute(route: RouteDescriptor): void;
20
+ /**
21
+ * Register one or more routes
22
+ */
23
+ registerRoutes(routes: RouteDescriptor[]): void;
24
+ /**
25
+ * Returns an array of routes scanned by the routes loader or registered
26
+ * manually.
27
+ */
28
+ getRoutes(): RouteDescriptor[];
29
+ }
30
+ //# sourceMappingURL=routes-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes-loader.d.ts","sourceRoot":"","sources":["../../src/http/routes-loader.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgB,KAAK,eAAe,EAAkB,MAAM,SAAS,CAAA;AAqC5E;;;;;;GAMG;AACH,qBAAa,YAAY;;IAyGvB;;;OAGG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM;IA0C/B;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,eAAe;IAMpC;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,eAAe,EAAE;IAIxC;;;OAGG;IACH,SAAS;CAaV"}
@@ -0,0 +1,203 @@
1
+ "use strict";
2
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
5
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
6
+ };
7
+ var _RoutesLoader_instances, _RoutesLoader_routes, _RoutesLoader_createRoutePath, _RoutesLoader_getRoutesForFile;
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.RoutesLoader = void 0;
10
+ const utils_1 = require("@8medusa/utils");
11
+ const path_1 = require("path");
12
+ const logger_1 = require("../logger");
13
+ const types_1 = require("./types");
14
+ /**
15
+ * File name that is used to indicate that the file is a route file
16
+ */
17
+ const ROUTE_NAME = "route";
18
+ /**
19
+ * Flag that developers can export from their route files to indicate
20
+ * whether or not the routes from this file should be authenticated.
21
+ */
22
+ const AUTHTHENTICATION_FLAG = "AUTHENTICATE";
23
+ /**
24
+ * Flag that developers can export from their route files to indicate
25
+ * whether or not the routes from this file should implement CORS
26
+ * policy.
27
+ */
28
+ const CORS_FLAG = "CORS";
29
+ /**
30
+ * The matcher to use to convert the dynamic params from the filesystem
31
+ * identifier to the express identifier.
32
+ *
33
+ * We capture all words under opening and closing brackets `[]` and mark
34
+ * it as a param via `:`.
35
+ */
36
+ const PARAM_SEGMENT_MATCHER = /\[(\w+)\]/;
37
+ /**
38
+ * Regexes to use to identify if a route is prefixed
39
+ * with "/admin", "/store", or "/auth".
40
+ */
41
+ const ADMIN_ROUTE_MATCH = /(\/admin$|\/admin\/)/;
42
+ const STORE_ROUTE_MATCH = /(\/store$|\/store\/)/;
43
+ const AUTH_ROUTE_MATCH = /(\/auth$|\/auth\/)/;
44
+ /**
45
+ * Exposes to API to register routes manually or by scanning the filesystem from a
46
+ * source directory.
47
+ *
48
+ * In case of duplicates routes, the route registered afterwards will override the
49
+ * one registered first.
50
+ */
51
+ class RoutesLoader {
52
+ constructor() {
53
+ _RoutesLoader_instances.add(this);
54
+ /**
55
+ * Routes collected manually or by scanning directories
56
+ */
57
+ _RoutesLoader_routes.set(this, {}
58
+ /**
59
+ * Creates the route path from its relative file path.
60
+ */
61
+ );
62
+ }
63
+ /**
64
+ * Scans a given directory and loads all routes from it. You can access the loaded
65
+ * routes via "getRoutes" method
66
+ */
67
+ async scanDir(sourceDir) {
68
+ const entries = await (0, utils_1.readDirRecursive)(sourceDir, {
69
+ ignoreMissing: true,
70
+ });
71
+ await Promise.all(entries
72
+ .filter((entry) => {
73
+ if (entry.isDirectory()) {
74
+ return false;
75
+ }
76
+ const { name, ext } = (0, path_1.parse)(entry.name);
77
+ if (name === ROUTE_NAME && [".js", ".ts"].includes(ext)) {
78
+ const routeFilePathSegment = (0, path_1.join)(entry.path, entry.name)
79
+ .replace(sourceDir, "")
80
+ .split(path_1.sep);
81
+ return !routeFilePathSegment.some((segment) => segment.startsWith("_"));
82
+ }
83
+ return false;
84
+ })
85
+ .map(async (entry) => {
86
+ const absolutePath = (0, path_1.join)(entry.path, entry.name);
87
+ const relativePath = absolutePath.replace(sourceDir, "");
88
+ const route = __classPrivateFieldGet(this, _RoutesLoader_instances, "m", _RoutesLoader_createRoutePath).call(this, relativePath);
89
+ const routes = await __classPrivateFieldGet(this, _RoutesLoader_instances, "m", _RoutesLoader_getRoutesForFile).call(this, route, absolutePath);
90
+ routes.forEach((routeConfig) => {
91
+ this.registerRoute({
92
+ absolutePath,
93
+ relativePath,
94
+ ...routeConfig,
95
+ });
96
+ });
97
+ }));
98
+ }
99
+ /**
100
+ * Register a route
101
+ */
102
+ registerRoute(route) {
103
+ __classPrivateFieldGet(this, _RoutesLoader_routes, "f")[route.matcher] = __classPrivateFieldGet(this, _RoutesLoader_routes, "f")[route.matcher] ?? {};
104
+ const trackedRoute = __classPrivateFieldGet(this, _RoutesLoader_routes, "f")[route.matcher];
105
+ trackedRoute[route.method] = route;
106
+ }
107
+ /**
108
+ * Register one or more routes
109
+ */
110
+ registerRoutes(routes) {
111
+ routes.forEach((route) => this.registerRoute(route));
112
+ }
113
+ /**
114
+ * Returns an array of routes scanned by the routes loader or registered
115
+ * manually.
116
+ */
117
+ getRoutes() {
118
+ return Object.keys(__classPrivateFieldGet(this, _RoutesLoader_routes, "f")).reduce((result, routePattern) => {
119
+ const methodsRoutes = __classPrivateFieldGet(this, _RoutesLoader_routes, "f")[routePattern];
120
+ Object.keys(methodsRoutes).forEach((method) => {
121
+ const route = methodsRoutes[method];
122
+ result.push(route);
123
+ });
124
+ return result;
125
+ }, []);
126
+ }
127
+ }
128
+ exports.RoutesLoader = RoutesLoader;
129
+ _RoutesLoader_routes = new WeakMap(), _RoutesLoader_instances = new WeakSet(), _RoutesLoader_createRoutePath = function _RoutesLoader_createRoutePath(relativePath) {
130
+ const segments = relativePath.replace(/route(\.js|\.ts)$/, "").split(path_1.sep);
131
+ const params = {};
132
+ return `/${segments
133
+ .filter((segment) => !!segment)
134
+ .map((segment) => {
135
+ if (segment.startsWith("[")) {
136
+ segment = segment.replace(PARAM_SEGMENT_MATCHER, (_, group) => {
137
+ if (params[group]) {
138
+ logger_1.logger.debug(`Duplicate parameters found in route ${relativePath} (${group})`);
139
+ throw new Error(`Duplicate parameters found in route ${relativePath} (${group}). Make sure that all parameters are unique.`);
140
+ }
141
+ params[group] = true;
142
+ return `:${group}`;
143
+ });
144
+ }
145
+ return segment;
146
+ })
147
+ .join("/")}`;
148
+ }, _RoutesLoader_getRoutesForFile =
149
+ /**
150
+ * Returns the route config by exporting the route file and parsing
151
+ * its exports
152
+ */
153
+ async function _RoutesLoader_getRoutesForFile(routePath, absolutePath) {
154
+ const routeExports = await (0, utils_1.dynamicImport)(absolutePath);
155
+ /**
156
+ * Find the route type based upon its prefix.
157
+ */
158
+ const routeType = ADMIN_ROUTE_MATCH.test(routePath)
159
+ ? "admin"
160
+ : STORE_ROUTE_MATCH.test(routePath)
161
+ ? "store"
162
+ : AUTH_ROUTE_MATCH.test(routePath)
163
+ ? "auth"
164
+ : undefined;
165
+ /**
166
+ * Check if the route file has decided to opt-out of authentication
167
+ */
168
+ const shouldAuthenticate = AUTHTHENTICATION_FLAG in routeExports
169
+ ? !!routeExports[AUTHTHENTICATION_FLAG]
170
+ : true;
171
+ /**
172
+ * Check if the route file has decided to opt-out of CORS
173
+ */
174
+ const shouldApplyCors = CORS_FLAG in routeExports ? !!routeExports[CORS_FLAG] : true;
175
+ /**
176
+ * Loop over all the exports and collect functions that are exported
177
+ * with names after HTTP methods.
178
+ */
179
+ return Object.keys(routeExports)
180
+ .filter((key) => {
181
+ if (typeof routeExports[key] !== "function") {
182
+ return false;
183
+ }
184
+ if (!types_1.HTTP_METHODS.includes(key)) {
185
+ logger_1.logger.debug(`Skipping handler ${key} in ${absolutePath}. Invalid HTTP method: ${key}.`);
186
+ return false;
187
+ }
188
+ return true;
189
+ })
190
+ .map((key) => {
191
+ return {
192
+ isRoute: true,
193
+ matcher: routePath,
194
+ method: key,
195
+ handler: routeExports[key],
196
+ optedOutOfAuth: !shouldAuthenticate,
197
+ shouldAppendAdminCors: shouldApplyCors && routeType === "admin",
198
+ shouldAppendAuthCors: shouldApplyCors && routeType === "auth",
199
+ shouldAppendStoreCors: shouldApplyCors && routeType === "store",
200
+ };
201
+ });
202
+ };
203
+ //# sourceMappingURL=routes-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes-loader.js","sourceRoot":"","sources":["../../src/http/routes-loader.ts"],"names":[],"mappings":"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"}