@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,134 @@
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 __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
8
+ if (kind === "m") throw new TypeError("Private method is not writable");
9
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
10
+ 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");
11
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
12
+ };
13
+ var _ConfigManager_instances, _ConfigManager_baseDir, _ConfigManager_isProduction_get, _ConfigManager_envWorkMode_get, _ConfigManager_config;
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.ConfigManager = void 0;
16
+ const utils_1 = require("@8medusa/utils");
17
+ const logger_1 = require("../logger");
18
+ class ConfigManager {
19
+ get config() {
20
+ if (!__classPrivateFieldGet(this, _ConfigManager_config, "f")) {
21
+ this.rejectErrors(`Config not loaded. Make sure the config have been loaded first using the 'configLoader' or 'configManager.loadConfig'.`);
22
+ }
23
+ return __classPrivateFieldGet(this, _ConfigManager_config, "f");
24
+ }
25
+ get baseDir() {
26
+ return __classPrivateFieldGet(this, _ConfigManager_baseDir, "f");
27
+ }
28
+ get isProduction() {
29
+ return __classPrivateFieldGet(this, _ConfigManager_instances, "a", _ConfigManager_isProduction_get);
30
+ }
31
+ constructor() {
32
+ _ConfigManager_instances.add(this);
33
+ /**
34
+ * Root dir from where to start
35
+ * @private
36
+ */
37
+ _ConfigManager_baseDir.set(this, void 0);
38
+ /**
39
+ * The config object after loading it
40
+ * @private
41
+ */
42
+ _ConfigManager_config.set(this, void 0);
43
+ }
44
+ /**
45
+ * Rejects an error either by throwing when in production or by logging the error as a warning
46
+ * @param error
47
+ * @protected
48
+ */
49
+ rejectErrors(error) {
50
+ if (__classPrivateFieldGet(this, _ConfigManager_instances, "a", _ConfigManager_isProduction_get)) {
51
+ throw new Error(`[config] ⚠️ ${error}`);
52
+ }
53
+ logger_1.logger.warn(error);
54
+ }
55
+ /**
56
+ * Builds the http config object and assign the defaults if needed
57
+ * @param projectConfig
58
+ * @protected
59
+ */
60
+ buildHttpConfig(projectConfig) {
61
+ const http = (projectConfig.http ??
62
+ {});
63
+ http.jwtExpiresIn = http?.jwtExpiresIn ?? "1d";
64
+ http.authCors = http.authCors ?? "";
65
+ http.storeCors = http.storeCors ?? "";
66
+ http.adminCors = http.adminCors ?? "";
67
+ http.jwtSecret = http?.jwtSecret ?? process.env.JWT_SECRET;
68
+ if (!http.jwtSecret) {
69
+ this.rejectErrors(`http.jwtSecret not found.${__classPrivateFieldGet(this, _ConfigManager_instances, "a", _ConfigManager_isProduction_get) ? "" : "Using default 'supersecret'."}`);
70
+ http.jwtSecret = "supersecret";
71
+ }
72
+ http.cookieSecret = (projectConfig.http?.cookieSecret ??
73
+ process.env.COOKIE_SECRET);
74
+ if (!http.cookieSecret) {
75
+ this.rejectErrors(`http.cookieSecret not found.${__classPrivateFieldGet(this, _ConfigManager_instances, "a", _ConfigManager_isProduction_get) ? "" : " Using default 'supersecret'."}`);
76
+ http.cookieSecret = "supersecret";
77
+ }
78
+ return http;
79
+ }
80
+ /**
81
+ * Normalizes the project config object and assign the defaults if needed
82
+ * @param projectConfig
83
+ * @protected
84
+ */
85
+ normalizeProjectConfig(projectConfig) {
86
+ const outputConfig = (0, utils_1.deepCopy)(projectConfig);
87
+ if (!outputConfig?.redisUrl) {
88
+ console.log(`redisUrl not found. A fake redis instance will be used.`);
89
+ }
90
+ outputConfig.http = this.buildHttpConfig(projectConfig);
91
+ let workerMode = outputConfig?.workerMode;
92
+ if (!(0, utils_1.isDefined)(workerMode)) {
93
+ const env = __classPrivateFieldGet(this, _ConfigManager_instances, "a", _ConfigManager_envWorkMode_get);
94
+ if ((0, utils_1.isDefined)(env)) {
95
+ const workerModes = ["shared", "worker", "server"];
96
+ if (workerModes.includes(env)) {
97
+ workerMode = env;
98
+ }
99
+ }
100
+ else {
101
+ workerMode = "shared";
102
+ }
103
+ }
104
+ return {
105
+ ...outputConfig,
106
+ workerMode,
107
+ };
108
+ }
109
+ /**
110
+ * Prepare the full configuration after validation and normalization
111
+ */
112
+ loadConfig({ projectConfig = {}, baseDir, }) {
113
+ __classPrivateFieldSet(this, _ConfigManager_baseDir, baseDir, "f");
114
+ const normalizedProjectConfig = this.normalizeProjectConfig(projectConfig.projectConfig ?? {});
115
+ __classPrivateFieldSet(this, _ConfigManager_config, {
116
+ projectConfig: normalizedProjectConfig,
117
+ admin: projectConfig.admin ?? {
118
+ path: "/app",
119
+ },
120
+ modules: projectConfig.modules ?? {},
121
+ featureFlags: projectConfig.featureFlags ?? {},
122
+ plugins: projectConfig.plugins ?? [],
123
+ }, "f");
124
+ return __classPrivateFieldGet(this, _ConfigManager_config, "f");
125
+ }
126
+ }
127
+ exports.ConfigManager = ConfigManager;
128
+ _ConfigManager_baseDir = new WeakMap(), _ConfigManager_config = new WeakMap(), _ConfigManager_instances = new WeakSet(), _ConfigManager_isProduction_get = function _ConfigManager_isProduction_get() {
129
+ return ["production", "prod"].includes(process.env.NODE_ENV || "");
130
+ }, _ConfigManager_envWorkMode_get = function _ConfigManager_envWorkMode_get() {
131
+ return process.env
132
+ .MEDUSA_WORKER_MODE;
133
+ };
134
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import "../types/container";
2
+ export * from "./loader";
3
+ export * from "./config";
4
+ export * from "./types";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,CAAA;AAE3B,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ require("../types/container");
18
+ __exportStar(require("./loader"), exports);
19
+ __exportStar(require("./config"), exports);
20
+ __exportStar(require("./types"), exports);
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8BAA2B;AAE3B,2CAAwB;AACxB,2CAAwB;AACxB,0CAAuB"}
@@ -0,0 +1,11 @@
1
+ import { ConfigModule } from "./types";
2
+ import { ConfigManager } from "./config";
3
+ export declare const configManager: ConfigManager;
4
+ /**
5
+ * Loads the config file and returns the config module after validating, normalizing the configurations
6
+ *
7
+ * @param entryDirectory The directory to find the config file from
8
+ * @param configFileName The name of the config file to search for in the entry directory
9
+ */
10
+ export declare function configLoader(entryDirectory: string, configFileName: string): Promise<ConfigModule>;
11
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AAGtC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAYxC,eAAO,MAAM,aAAa,eAAsB,CAAA;AAOhD;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,YAAY,CAAC,CAcvB"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.configManager = void 0;
4
+ exports.configLoader = configLoader;
5
+ const utils_1 = require("@8medusa/utils");
6
+ const logger_1 = require("../logger");
7
+ const config_1 = require("./config");
8
+ const container_1 = require("../container");
9
+ const awilix_1 = require("awilix");
10
+ const handleConfigError = (error) => {
11
+ logger_1.logger.error(`Error in loading config: ${error.message}`);
12
+ if (error.stack) {
13
+ logger_1.logger.error(error.stack);
14
+ }
15
+ process.exit(1);
16
+ };
17
+ exports.configManager = new config_1.ConfigManager();
18
+ container_1.container.register(utils_1.ContainerRegistrationKeys.CONFIG_MODULE, (0, awilix_1.asFunction)(() => exports.configManager.config));
19
+ /**
20
+ * Loads the config file and returns the config module after validating, normalizing the configurations
21
+ *
22
+ * @param entryDirectory The directory to find the config file from
23
+ * @param configFileName The name of the config file to search for in the entry directory
24
+ */
25
+ async function configLoader(entryDirectory, configFileName) {
26
+ const config = await (0, utils_1.getConfigFile)(entryDirectory, configFileName);
27
+ if (config.error) {
28
+ handleConfigError(config.error);
29
+ }
30
+ return exports.configManager.loadConfig({
31
+ projectConfig: config.configModule,
32
+ baseDir: entryDirectory,
33
+ });
34
+ }
35
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":";;;AA4BA,oCAiBC;AA5CD,0CAAyE;AACzE,sCAAkC;AAClC,qCAAwC;AACxC,4CAAwC;AACxC,mCAAmC;AAEnC,MAAM,iBAAiB,GAAG,CAAC,KAAY,EAAQ,EAAE;IAC/C,eAAM,CAAC,KAAK,CAAC,4BAA4B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;IACzD,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,eAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAC3B,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAA;AAEY,QAAA,aAAa,GAAG,IAAI,sBAAa,EAAE,CAAA;AAEhD,qBAAS,CAAC,QAAQ,CAChB,iCAAyB,CAAC,aAAa,EACvC,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,qBAAa,CAAC,MAAM,CAAC,CACvC,CAAA;AAED;;;;;GAKG;AACI,KAAK,UAAU,YAAY,CAChC,cAAsB,EACtB,cAAsB;IAEtB,MAAM,MAAM,GAAG,MAAM,IAAA,qBAAa,EAChC,cAAc,EACd,cAAc,CACf,CAAA;IAED,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACjC,CAAC;IAED,OAAO,qBAAa,CAAC,UAAU,CAAC;QAC9B,aAAa,EAAE,MAAM,CAAC,YAAa;QACnC,OAAO,EAAE,cAAc;KACxB,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { AdminOptions, SessionOptions, ProjectConfigOptions, HttpCompressionOptions, ConfigModule, PluginDetails, } from "@8medusa/types";
2
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,sBAAsB,EACtB,YAAY,EACZ,aAAa,GACd,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export * from "./types/container";
2
+ export declare const container: import("@8medusa/types").MedusaContainer;
3
+ //# sourceMappingURL=container.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA;AAGjC,eAAO,MAAM,SAAS,0CAA0B,CAAA"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.container = void 0;
18
+ __exportStar(require("./types/container"), exports);
19
+ const utils_1 = require("@8medusa/utils");
20
+ exports.container = (0, utils_1.createMedusaContainer)();
21
+ //# sourceMappingURL=container.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.js","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,oDAAiC;AACjC,0CAAsD;AAEzC,QAAA,SAAS,GAAG,IAAA,6BAAqB,GAAE,CAAA"}
@@ -0,0 +1,3 @@
1
+ import "../types/container";
2
+ export * from "./pg-connection-loader";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/database/index.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,CAAA;AAC3B,cAAc,wBAAwB,CAAA"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ require("../types/container");
18
+ __exportStar(require("./pg-connection-loader"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/database/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8BAA2B;AAC3B,yDAAsC"}
@@ -0,0 +1,6 @@
1
+ import { ModulesSdkUtils } from "@8medusa/utils";
2
+ /**
3
+ * Initialize a knex connection that can then be shared to any resources if needed
4
+ */
5
+ export declare function pgConnectionLoader(): ReturnType<typeof ModulesSdkUtils.createPgConnection>;
6
+ //# sourceMappingURL=pg-connection-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pg-connection-loader.d.ts","sourceRoot":"","sources":["../../src/database/pg-connection-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAK3E;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,UAAU,CAC9C,OAAO,eAAe,CAAC,kBAAkB,CAC1C,CA2CA"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pgConnectionLoader = pgConnectionLoader;
4
+ const utils_1 = require("@8medusa/utils");
5
+ const awilix_1 = require("awilix");
6
+ const container_1 = require("../container");
7
+ const config_1 = require("../config");
8
+ /**
9
+ * Initialize a knex connection that can then be shared to any resources if needed
10
+ */
11
+ function pgConnectionLoader() {
12
+ if (container_1.container.hasRegistration(utils_1.ContainerRegistrationKeys.PG_CONNECTION)) {
13
+ return container_1.container.resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION);
14
+ }
15
+ const configModule = config_1.configManager.config;
16
+ // Share a knex connection to be consumed by the shared modules
17
+ const connectionString = configModule.projectConfig.databaseUrl;
18
+ const driverOptions = {
19
+ ...(configModule.projectConfig.databaseDriverOptions || {}),
20
+ };
21
+ const schema = configModule.projectConfig.databaseSchema || "public";
22
+ const idleTimeoutMillis = driverOptions.pool?.idleTimeoutMillis ?? undefined; // prevent null to be passed
23
+ const poolMin = driverOptions.pool?.min ?? 2;
24
+ const poolMax = driverOptions.pool?.max;
25
+ const reapIntervalMillis = driverOptions.pool?.reapIntervalMillis ?? undefined;
26
+ const createRetryIntervalMillis = driverOptions.pool?.createRetryIntervalMillis ?? undefined;
27
+ delete driverOptions.pool;
28
+ const pgConnection = utils_1.ModulesSdkUtils.createPgConnection({
29
+ clientUrl: connectionString,
30
+ schema,
31
+ driverOptions,
32
+ pool: {
33
+ min: poolMin,
34
+ max: poolMax,
35
+ idleTimeoutMillis,
36
+ reapIntervalMillis,
37
+ createRetryIntervalMillis,
38
+ },
39
+ });
40
+ container_1.container.register(utils_1.ContainerRegistrationKeys.PG_CONNECTION, (0, awilix_1.asValue)(pgConnection));
41
+ return pgConnection;
42
+ }
43
+ //# sourceMappingURL=pg-connection-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pg-connection-loader.js","sourceRoot":"","sources":["../../src/database/pg-connection-loader.ts"],"names":[],"mappings":";;AAQA,gDA6CC;AArDD,0CAA2E;AAC3E,mCAAgC;AAChC,4CAAwC;AACxC,sCAAyC;AAEzC;;GAEG;AACH,SAAgB,kBAAkB;IAGhC,IAAI,qBAAS,CAAC,eAAe,CAAC,iCAAyB,CAAC,aAAa,CAAC,EAAE,CAAC;QACvE,OAAO,qBAAS,CAAC,OAAO,CACtB,iCAAyB,CAAC,aAAa,CAC4B,CAAA;IACvE,CAAC;IAED,MAAM,YAAY,GAAG,sBAAa,CAAC,MAAM,CAAA;IAEzC,+DAA+D;IAC/D,MAAM,gBAAgB,GAAG,YAAY,CAAC,aAAa,CAAC,WAAW,CAAA;IAC/D,MAAM,aAAa,GAAQ;QACzB,GAAG,CAAC,YAAY,CAAC,aAAa,CAAC,qBAAqB,IAAI,EAAE,CAAC;KAC5D,CAAA;IACD,MAAM,MAAM,GAAG,YAAY,CAAC,aAAa,CAAC,cAAc,IAAI,QAAQ,CAAA;IACpE,MAAM,iBAAiB,GAAG,aAAa,CAAC,IAAI,EAAE,iBAAiB,IAAI,SAAS,CAAA,CAAC,4BAA4B;IACzG,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAA;IAC5C,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,EAAE,GAAG,CAAA;IACvC,MAAM,kBAAkB,GAAG,aAAa,CAAC,IAAI,EAAE,kBAAkB,IAAI,SAAS,CAAA;IAC9E,MAAM,yBAAyB,GAC7B,aAAa,CAAC,IAAI,EAAE,yBAAyB,IAAI,SAAS,CAAA;IAE5D,OAAO,aAAa,CAAC,IAAI,CAAA;IAEzB,MAAM,YAAY,GAAG,uBAAe,CAAC,kBAAkB,CAAC;QACtD,SAAS,EAAE,gBAAgB;QAC3B,MAAM;QACN,aAAa;QACb,IAAI,EAAE;YACJ,GAAG,EAAE,OAAO;YACZ,GAAG,EAAE,OAAO;YACZ,iBAAiB;YACjB,kBAAkB;YAClB,yBAAyB;SAC1B;KACF,CAAC,CAAA;IAEF,qBAAS,CAAC,QAAQ,CAChB,iCAAyB,CAAC,aAAa,EACvC,IAAA,gBAAO,EAAC,YAAY,CAAC,CACtB,CAAA;IAED,OAAO,YAAY,CAAA;AACrB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { FlagRouter } from "@8medusa/utils";
2
+ export declare const featureFlagRouter: FlagRouter;
3
+ /**
4
+ * Load feature flags from a directory and from the already loaded config under the hood
5
+ * @param sourcePath
6
+ */
7
+ export declare function featureFlagsLoader(sourcePath?: string): Promise<FlagRouter>;
8
+ //# sourceMappingURL=feature-flag-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-flag-loader.d.ts","sourceRoot":"","sources":["../../src/feature-flags/feature-flag-loader.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,UAAU,EAOX,MAAM,gBAAgB,CAAA;AAQvB,eAAO,MAAM,iBAAiB,YAAqB,CAAA;AA+DnD;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,UAAU,CAAC,CAuCrB"}
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.featureFlagRouter = void 0;
4
+ exports.featureFlagsLoader = featureFlagsLoader;
5
+ const telemetry_1 = require("@8medusa/telemetry");
6
+ const utils_1 = require("@8medusa/utils");
7
+ const awilix_1 = require("awilix");
8
+ const path_1 = require("path");
9
+ const config_1 = require("../config");
10
+ const container_1 = require("../container");
11
+ const logger_1 = require("../logger");
12
+ exports.featureFlagRouter = new utils_1.FlagRouter({});
13
+ container_1.container.register(utils_1.ContainerRegistrationKeys.FEATURE_FLAG_ROUTER, (0, awilix_1.asFunction)(() => exports.featureFlagRouter));
14
+ const excludedFiles = ["index.js", "index.ts"];
15
+ const excludedExtensions = [".d.ts", ".d.ts.map", ".js.map"];
16
+ const flagConfig = {};
17
+ function registerFlag(flag, projectConfigFlags) {
18
+ flagConfig[flag.key] = (0, utils_1.isTruthy)(flag.default_val);
19
+ let from;
20
+ if ((0, utils_1.isDefined)(process.env[flag.env_key])) {
21
+ from = "environment";
22
+ const envVal = process.env[flag.env_key];
23
+ // MEDUSA_FF_ANALYTICS="true"
24
+ flagConfig[flag.key] = (0, utils_1.isTruthy)(process.env[flag.env_key]);
25
+ const parsedFromEnv = (0, utils_1.isString)(envVal) ? envVal.split(",") : [];
26
+ // MEDUSA_FF_WORKFLOWS=createProducts,deleteProducts
27
+ if (parsedFromEnv.length > 1) {
28
+ flagConfig[flag.key] = (0, utils_1.objectFromStringPath)(parsedFromEnv);
29
+ }
30
+ }
31
+ else if ((0, utils_1.isDefined)(projectConfigFlags[flag.key])) {
32
+ from = "project config";
33
+ // featureFlags: { analytics: "true" | true }
34
+ flagConfig[flag.key] = (0, utils_1.isTruthy)(projectConfigFlags[flag.key]);
35
+ // featureFlags: { workflows: { createProducts: true } }
36
+ if ((0, utils_1.isObject)(projectConfigFlags[flag.key])) {
37
+ flagConfig[flag.key] = projectConfigFlags[flag.key];
38
+ }
39
+ }
40
+ if (logger_1.logger && from) {
41
+ logger_1.logger.info(`Using flag ${flag.env_key} from ${from} with value ${flagConfig[flag.key]}`);
42
+ }
43
+ if (flagConfig[flag.key]) {
44
+ (0, telemetry_1.trackFeatureFlag)(flag.key);
45
+ }
46
+ exports.featureFlagRouter.setFlag(flag.key, flagConfig[flag.key]);
47
+ }
48
+ /**
49
+ * Load feature flags from a directory and from the already loaded config under the hood
50
+ * @param sourcePath
51
+ */
52
+ async function featureFlagsLoader(sourcePath) {
53
+ const { featureFlags: projectConfigFlags = {} } = config_1.configManager.config;
54
+ if (!sourcePath) {
55
+ return exports.featureFlagRouter;
56
+ }
57
+ const flagDir = (0, path_1.normalize)(sourcePath);
58
+ await (0, utils_1.readDirRecursive)(flagDir).then(async (files) => {
59
+ if (!files?.length) {
60
+ return;
61
+ }
62
+ files.map(async (file) => {
63
+ if (file.isDirectory()) {
64
+ return await featureFlagsLoader((0, path_1.join)(flagDir, file.name));
65
+ }
66
+ if (excludedExtensions.some((ext) => file.name.endsWith(ext)) ||
67
+ excludedFiles.includes(file.name)) {
68
+ return;
69
+ }
70
+ const fileExports = await (0, utils_1.dynamicImport)((0, path_1.join)(flagDir, file.name));
71
+ const featureFlag = fileExports.default;
72
+ if (!featureFlag) {
73
+ return;
74
+ }
75
+ registerFlag(featureFlag, projectConfigFlags);
76
+ return;
77
+ });
78
+ });
79
+ return exports.featureFlagRouter;
80
+ }
81
+ //# sourceMappingURL=feature-flag-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-flag-loader.js","sourceRoot":"","sources":["../../src/feature-flags/feature-flag-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { FeatureFlagsResponse, IFlagRouter } from "./types";
2
+ export declare class FlagRouter implements IFlagRouter {
3
+ private readonly flags;
4
+ constructor(flags: Record<string, boolean | Record<string, boolean>>);
5
+ /**
6
+ * Check if a feature flag is enabled.
7
+ * There are two ways of using this method:
8
+ * 1. `isFeatureEnabled("myFeatureFlag")`
9
+ * 2. `isFeatureEnabled({ myNestedFeatureFlag: "someNestedFlag" })`
10
+ * We use 1. for top-level feature flags and 2. for nested feature flags. Almost all flags are top-level.
11
+ * An example of a nested flag is workflows. To use it, you would do:
12
+ * `isFeatureEnabled({ workflows: Workflows.CreateCart })`
13
+ * @param flag - The flag to check
14
+ * @return {boolean} - Whether the flag is enabled or not
15
+ */
16
+ isFeatureEnabled(flag: string | string[] | Record<string, string>): boolean;
17
+ /**
18
+ * Sets a feature flag.
19
+ * Flags take two shapes:
20
+ * `setFlag("myFeatureFlag", true)`
21
+ * `setFlag("myFeatureFlag", { nestedFlag: true })`
22
+ * These shapes are used for top-level and nested flags respectively, as explained in isFeatureEnabled.
23
+ * @param key - The key of the flag to set.
24
+ * @param value - The value of the flag to set.
25
+ * @return {void} - void
26
+ */
27
+ setFlag(key: string, value: boolean | {
28
+ [key: string]: boolean;
29
+ }): void;
30
+ listFlags(): FeatureFlagsResponse;
31
+ }
32
+ //# sourceMappingURL=flag-router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flag-router.d.ts","sourceRoot":"","sources":["../../src/feature-flags/flag-router.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAE3D,qBAAa,UAAW,YAAW,WAAW;IAC5C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwD;gBAElE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAIpE;;;;;;;;;;OAUG;IACI,gBAAgB,CACrB,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/C,OAAO;IAkBV;;;;;;;;;OASG;IACI,OAAO,CACZ,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,GAAG;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,GAC1C,IAAI;IAgBA,SAAS,IAAI,oBAAoB;CAMzC"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FlagRouter = void 0;
4
+ const utils_1 = require("@8medusa/utils");
5
+ class FlagRouter {
6
+ constructor(flags) {
7
+ this.flags = {};
8
+ this.flags = flags;
9
+ }
10
+ /**
11
+ * Check if a feature flag is enabled.
12
+ * There are two ways of using this method:
13
+ * 1. `isFeatureEnabled("myFeatureFlag")`
14
+ * 2. `isFeatureEnabled({ myNestedFeatureFlag: "someNestedFlag" })`
15
+ * We use 1. for top-level feature flags and 2. for nested feature flags. Almost all flags are top-level.
16
+ * An example of a nested flag is workflows. To use it, you would do:
17
+ * `isFeatureEnabled({ workflows: Workflows.CreateCart })`
18
+ * @param flag - The flag to check
19
+ * @return {boolean} - Whether the flag is enabled or not
20
+ */
21
+ isFeatureEnabled(flag) {
22
+ if ((0, utils_1.isObject)(flag)) {
23
+ const [nestedFlag, value] = Object.entries(flag)[0];
24
+ if (typeof this.flags[nestedFlag] === "boolean") {
25
+ return this.flags[nestedFlag];
26
+ }
27
+ return !!this.flags[nestedFlag]?.[value];
28
+ }
29
+ const flags = (Array.isArray(flag) ? flag : [flag]);
30
+ return flags.every((flag_) => {
31
+ if (!(0, utils_1.isString)(flag_)) {
32
+ throw Error("Flag must be a string an array of string or an object");
33
+ }
34
+ return !!this.flags[flag_];
35
+ });
36
+ }
37
+ /**
38
+ * Sets a feature flag.
39
+ * Flags take two shapes:
40
+ * `setFlag("myFeatureFlag", true)`
41
+ * `setFlag("myFeatureFlag", { nestedFlag: true })`
42
+ * These shapes are used for top-level and nested flags respectively, as explained in isFeatureEnabled.
43
+ * @param key - The key of the flag to set.
44
+ * @param value - The value of the flag to set.
45
+ * @return {void} - void
46
+ */
47
+ setFlag(key, value) {
48
+ if ((0, utils_1.isObject)(value)) {
49
+ const existing = this.flags[key];
50
+ if (!existing) {
51
+ this.flags[key] = value;
52
+ return;
53
+ }
54
+ this.flags[key] = { ...this.flags[key], ...value };
55
+ return;
56
+ }
57
+ this.flags[key] = value;
58
+ }
59
+ listFlags() {
60
+ return Object.entries(this.flags || {}).map(([key, value]) => ({
61
+ key,
62
+ value,
63
+ }));
64
+ }
65
+ }
66
+ exports.FlagRouter = FlagRouter;
67
+ //# sourceMappingURL=flag-router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flag-router.js","sourceRoot":"","sources":["../../src/feature-flags/flag-router.ts"],"names":[],"mappings":";;;AAAA,0CAAmD;AAGnD,MAAa,UAAU;IAGrB,YAAY,KAAwD;QAFnD,UAAK,GAAsD,EAAE,CAAA;QAG5E,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;IAED;;;;;;;;;;OAUG;IACI,gBAAgB,CACrB,IAAgD;QAEhD,IAAI,IAAA,gBAAQ,EAAC,IAAI,CAAC,EAAE,CAAC;YACnB,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;YACnD,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,SAAS,EAAE,CAAC;gBAChD,OAAO,IAAI,CAAC,KAAK,CAAC,UAAU,CAAY,CAAA;YAC1C,CAAC;YACD,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,CAAC,CAAA;QAC1C,CAAC;QAED,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAa,CAAA;QAC/D,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YAC3B,IAAI,CAAC,IAAA,gBAAQ,EAAC,KAAK,CAAC,EAAE,CAAC;gBACrB,MAAM,KAAK,CAAC,uDAAuD,CAAC,CAAA;YACtE,CAAC;YACD,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QAC5B,CAAC,CAAC,CAAA;IACJ,CAAC;IAED;;;;;;;;;OASG;IACI,OAAO,CACZ,GAAW,EACX,KAA2C;QAE3C,IAAI,IAAA,gBAAQ,EAAC,KAAK,CAAC,EAAE,CAAC;YACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAEhC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;gBACvB,OAAM;YACR,CAAC;YAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,EAAE,GAAG,KAAK,EAAE,CAAA;YAC9D,OAAM;QACR,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;IACzB,CAAC;IAEM,SAAS;QACd,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;YAC7D,GAAG;YACH,KAAK;SACN,CAAC,CAAC,CAAA;IACL,CAAC;CACF;AAzED,gCAyEC"}
@@ -0,0 +1,5 @@
1
+ import "../types/container";
2
+ export * from "./types";
3
+ export * from "./feature-flag-loader";
4
+ export * from "./flag-router";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/feature-flags/index.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,CAAA;AAE3B,cAAc,SAAS,CAAA;AACvB,cAAc,uBAAuB,CAAA;AACrC,cAAc,eAAe,CAAA"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ require("../types/container");
18
+ __exportStar(require("./types"), exports);
19
+ __exportStar(require("./feature-flag-loader"), exports);
20
+ __exportStar(require("./flag-router"), exports);
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/feature-flags/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8BAA2B;AAE3B,0CAAuB;AACvB,wDAAqC;AACrC,gDAA6B"}